From c7518ecf428e4e810bc4a9d5b34648bc12d4c96f Mon Sep 17 00:00:00 2001 From: gauthier <gauthier@mycompany.com> Date: Tue, 6 Oct 2015 16:24:54 +0000 Subject: [PATCH] SVN to GIT migration (removed EPC software, updated mailing list address in all files) git-svn-id: http://svn.eurecom.fr/openair4G/trunk@7885 818b1a75-f10b-46b9-bf7c-635c3b92a50f --- cmake_targets/CMakeLists.txt | 381 +- cmake_targets/at_commands/CMakeLists.txt | 2 +- cmake_targets/build_oai | 42 +- .../epc_build_oai/CMakeLists.template | 88 - cmake_targets/epc_test/CMakeLists.template | 77 + cmake_targets/hss_build/CMakeLists.txt | 326 -- cmake_targets/hss_build/acl.conf.in | 19 - cmake_targets/hss_build/hss.conf.in | 13 - cmake_targets/hss_build/hss_fd.conf.in | 106 - cmake_targets/tools/build_epc | 302 -- cmake_targets/tools/build_helper | 203 +- cmake_targets/tools/build_hss | 271 -- cmake_targets/tools/build_test_epc_tools | 147 + cmake_targets/tools/check_hss_s6a_certificate | 104 - cmake_targets/tools/check_mme_s6a_certificate | 107 - cmake_targets/tools/create_hss_database | 103 - cmake_targets/tools/epc.conf.in | 163 - cmake_targets/tools/epc.local.enb.conf.in | 130 - .../tools/example_enb_exmimo_mme_hss.txt | 2 +- .../example_oaisim_enb_ue_mme_virtual.txt | 2 +- cmake_targets/tools/indent_source_code | 2 +- cmake_targets/tools/init_exmimo2 | 2 +- cmake_targets/tools/init_nas_nos1 | 2 +- cmake_targets/tools/perf_oai.bash | 2 +- cmake_targets/tools/run_enb_s1_exmimo | 2 +- cmake_targets/tools/run_enb_s1_usrp | 2 +- cmake_targets/tools/run_enb_ue_virt_noS1 | 2 +- cmake_targets/tools/run_enb_ue_virt_s1 | 2 +- cmake_targets/tools/run_epc | 199 - cmake_targets/tools/run_hss | 113 - cmake_targets/tools/s6a.conf.in | 97 - common/utils/COPYING | 702 +-- common/utils/asn1_conversions.h | 56 +- common/utils/assertions.h | 56 +- common/utils/collection/COPYING | 702 +-- common/utils/collection/hashtable/COPYING | 702 +-- common/utils/collection/hashtable/hashtable.c | 56 +- common/utils/collection/hashtable/hashtable.h | 56 +- .../collection/hashtable/obj_hashtable.c | 56 +- .../collection/hashtable/obj_hashtable.h | 56 +- common/utils/itti/COPYING | 702 +-- common/utils/itti/assertions.h | 56 +- common/utils/itti/backtrace.c | 57 +- common/utils/itti/backtrace.h | 56 +- common/utils/itti/intertask_interface.c | 56 +- common/utils/itti/intertask_interface.h | 56 +- common/utils/itti/intertask_interface_dump.c | 56 +- common/utils/itti/intertask_interface_dump.h | 56 +- common/utils/itti/intertask_interface_init.h | 56 +- common/utils/itti/intertask_interface_types.h | 56 +- common/utils/itti/intertask_messages_def.h | 56 +- common/utils/itti/intertask_messages_types.h | 57 +- common/utils/itti/itti_types.h | 56 +- common/utils/itti/memory_pools.c | 56 +- common/utils/itti/memory_pools.h | 56 +- common/utils/itti/messages_def.h | 56 +- common/utils/itti/messages_types.h | 56 +- common/utils/itti/signals.c | 56 +- common/utils/itti/signals.h | 56 +- common/utils/itti/tasks_def.h | 56 +- common/utils/itti/timer.c | 56 +- common/utils/itti/timer.h | 56 +- common/utils/itti/timer_messages_def.h | 57 +- common/utils/itti/timer_messages_types.h | 56 +- common/utils/itti_analyzer/COPYING | 702 +-- common/utils/itti_analyzer/README | 2 +- common/utils/itti_analyzer/common/COPYING | 702 +-- .../utils/itti_analyzer/common/itti_types.h | 56 +- common/utils/itti_analyzer/common/logs.h | 56 +- common/utils/itti_analyzer/common/rc.h | 55 +- common/utils/itti_analyzer/itti_analyzer.c | 57 +- common/utils/itti_analyzer/libbuffers/COPYING | 702 +-- .../utils/itti_analyzer/libbuffers/buffers.c | 57 +- .../utils/itti_analyzer/libbuffers/buffers.h | 57 +- common/utils/itti_analyzer/libbuffers/file.c | 55 +- common/utils/itti_analyzer/libbuffers/file.h | 55 +- .../utils/itti_analyzer/libbuffers/socket.c | 57 +- .../utils/itti_analyzer/libbuffers/socket.h | 57 +- common/utils/itti_analyzer/libparser/COPYING | 702 +-- .../itti_analyzer/libparser/array_type.c | 57 +- .../itti_analyzer/libparser/array_type.h | 55 +- .../utils/itti_analyzer/libparser/enum_type.c | 57 +- .../utils/itti_analyzer/libparser/enum_type.h | 57 +- .../itti_analyzer/libparser/enum_value_type.c | 55 +- .../itti_analyzer/libparser/enum_value_type.h | 57 +- .../itti_analyzer/libparser/field_type.c | 57 +- .../itti_analyzer/libparser/field_type.h | 55 +- .../utils/itti_analyzer/libparser/file_type.c | 57 +- .../utils/itti_analyzer/libparser/file_type.h | 55 +- .../libparser/fundamental_type.c | 57 +- .../libparser/fundamental_type.h | 56 +- .../libparser/intertask_contexts.h | 55 +- .../itti_analyzer/libparser/pointer_type.c | 55 +- .../itti_analyzer/libparser/pointer_type.h | 55 +- .../itti_analyzer/libparser/reference_type.c | 55 +- .../itti_analyzer/libparser/reference_type.h | 55 +- .../itti_analyzer/libparser/struct_type.c | 57 +- .../itti_analyzer/libparser/struct_type.h | 55 +- .../itti_analyzer/libparser/typedef_type.c | 55 +- .../itti_analyzer/libparser/typedef_type.h | 55 +- common/utils/itti_analyzer/libparser/types.c | 55 +- common/utils/itti_analyzer/libparser/types.h | 57 +- .../itti_analyzer/libparser/union_type.c | 57 +- .../itti_analyzer/libparser/union_type.h | 57 +- .../utils/itti_analyzer/libparser/xml_parse.c | 57 +- .../utils/itti_analyzer/libparser/xml_parse.h | 57 +- .../utils/itti_analyzer/libresolver/COPYING | 702 +-- .../itti_analyzer/libresolver/locate_root.c | 57 +- .../itti_analyzer/libresolver/locate_root.h | 57 +- .../itti_analyzer/libresolver/resolvers.c | 57 +- .../itti_analyzer/libresolver/resolvers.h | 57 +- common/utils/itti_analyzer/libui/COPYING | 702 +-- .../utils/itti_analyzer/libui/ui_callbacks.c | 57 +- .../utils/itti_analyzer/libui/ui_callbacks.h | 57 +- common/utils/itti_analyzer/libui/ui_filters.c | 57 +- common/utils/itti_analyzer/libui/ui_filters.h | 57 +- .../utils/itti_analyzer/libui/ui_interface.c | 57 +- .../utils/itti_analyzer/libui/ui_interface.h | 55 +- .../itti_analyzer/libui/ui_main_screen.c | 57 +- .../itti_analyzer/libui/ui_main_screen.h | 57 +- .../utils/itti_analyzer/libui/ui_menu_bar.c | 57 +- .../utils/itti_analyzer/libui/ui_menu_bar.h | 55 +- .../utils/itti_analyzer/libui/ui_notebook.c | 57 +- .../utils/itti_analyzer/libui/ui_notebook.h | 55 +- .../utils/itti_analyzer/libui/ui_notif_dlg.c | 57 +- .../utils/itti_analyzer/libui/ui_notif_dlg.h | 55 +- .../itti_analyzer/libui/ui_notifications.c | 57 +- .../itti_analyzer/libui/ui_notifications.h | 57 +- .../libui/ui_signal_dissect_view.c | 57 +- .../libui/ui_signal_dissect_view.h | 55 +- .../utils/itti_analyzer/libui/ui_tree_view.c | 57 +- .../utils/itti_analyzer/libui/ui_tree_view.h | 57 +- common/utils/msc/msc.c | 55 +- common/utils/msc/msc.h | 56 +- openair-cn/AUTHORS | 1 - openair-cn/COMMON/common_types.h | 55 +- openair-cn/COMMON/gtpv1_u_messages_def.h | 55 +- openair-cn/COMMON/gtpv1_u_messages_types.h | 55 +- openair-cn/COMMON/intertask_interface_conf.h | 55 +- openair-cn/COMMON/ip_forward_messages_def.h | 34 - openair-cn/COMMON/ip_forward_messages_types.h | 96 - openair-cn/COMMON/messages_def.h | 55 +- openair-cn/COMMON/messages_types.h | 55 +- openair-cn/COMMON/mme_app_messages_def.h | 33 - openair-cn/COMMON/mme_app_messages_types.h | 72 - openair-cn/COMMON/nas_messages_def.h | 55 +- openair-cn/COMMON/nas_messages_types.h | 55 +- openair-cn/COMMON/s11_messages_def.h | 29 - openair-cn/COMMON/s11_messages_types.h | 32 - openair-cn/COMMON/s1ap_messages_def.h | 55 +- openair-cn/COMMON/s1ap_messages_types.h | 55 +- openair-cn/COMMON/s6a_messages_def.h | 33 - openair-cn/COMMON/s6a_messages_types.h | 94 - openair-cn/COMMON/sctp_messages_def.h | 55 +- openair-cn/COMMON/sctp_messages_types.h | 55 +- openair-cn/COMMON/security_types.h | 55 +- openair-cn/COMMON/sgw_lite_def.h | 36 - openair-cn/COMMON/sgw_lite_messages_types.h | 928 ---- openair-cn/COMMON/tasks_def.h | 55 +- openair-cn/COMMON/udp_messages_def.h | 55 +- openair-cn/COMMON/udp_messages_types.h | 55 +- openair-cn/ChangeLog | 15 - openair-cn/DOCS/DOXYGEN/Makefile.am | 2 +- openair-cn/DOCS/EPC_User_Guide.docx | Bin 1019641 -> 0 bytes openair-cn/DOCS/EPC_User_Guide.pdf | Bin 706808 -> 0 bytes openair-cn/DOCS/Latex/EPC/Makefile | 2 +- openair-cn/DOCS/Makefile.am | 2 +- openair-cn/GTPV1-U/GTPU_SP/COPYING | 339 -- openair-cn/GTPV1-U/GTPU_SP/INSTALL | 33 - openair-cn/GTPV1-U/GTPU_SP/Makefile | 104 - openair-cn/GTPV1-U/GTPU_SP/README | 80 - openair-cn/GTPV1-U/GTPU_SP/RELEASE_NOTES | 6 - openair-cn/GTPV1-U/GTPU_SP/cmd.sh | 18 - openair-cn/GTPV1-U/GTPU_SP/libxt_GTPUSP.c | 322 -- openair-cn/GTPV1-U/GTPU_SP/xt_GTPUSP.c | 780 --- openair-cn/GTPV1-U/GTPU_SP/xt_GTPUSP.h | 23 - openair-cn/GTPV1-U/Makefile.am | 2 +- openair-cn/GTPV1-U/Makefile.eNB | 2 +- openair-cn/GTPV1-U/gtpv1u.h | 2 +- openair-cn/GTPV1-U/gtpv1u_eNB.c | 2 +- openair-cn/GTPV1-U/gtpv1u_eNB_defs.h | 2 +- openair-cn/GTPV1-U/gtpv1u_eNB_task.h | 2 +- openair-cn/GTPV1-U/gtpv1u_sgw_defs.h | 2 +- openair-cn/GTPV1-U/gtpv1u_task.c | 2 +- openair-cn/GTPV1-U/gtpv1u_teid_pool.c | 2 +- openair-cn/GTPV2-C/Makefile.am | 29 - openair-cn/GTPV2-C/nwgtpv2c-0.11/AUTHORS | 1 - openair-cn/GTPV2-C/nwgtpv2c-0.11/COPYING | 26 - openair-cn/GTPV2-C/nwgtpv2c-0.11/ChangeLog | 0 openair-cn/GTPV2-C/nwgtpv2c-0.11/Makefile.am | 6 - openair-cn/GTPV2-C/nwgtpv2c-0.11/NEWS | 0 openair-cn/GTPV2-C/nwgtpv2c-0.11/README | 168 - openair-cn/GTPV2-C/nwgtpv2c-0.11/configure.ac | 58 - .../nwgtpv2c-0.11/include/NwGtpv2cLog.h | 83 - .../include/NwGtpv2cMsgIeParseInfo.h | 95 - .../nwgtpv2c-0.11/include/NwGtpv2cPrivate.h | 237 - .../nwgtpv2c-0.11/include/NwGtpv2cTrxn.h | 117 - .../nwgtpv2c-0.11/include/NwGtpv2cTunnel.h | 79 - .../GTPV2-C/nwgtpv2c-0.11/include/queue.h | 566 --- .../GTPV2-C/nwgtpv2c-0.11/include/tree.h | 678 --- .../GTPV2-C/nwgtpv2c-0.11/shared/NwError.h | 66 - .../GTPV2-C/nwgtpv2c-0.11/shared/NwGtpv2c.h | 576 --- .../GTPV2-C/nwgtpv2c-0.11/shared/NwGtpv2cIe.h | 159 - .../nwgtpv2c-0.11/shared/NwGtpv2cMsg.h | 626 --- .../nwgtpv2c-0.11/shared/NwGtpv2cMsgParser.h | 153 - .../GTPV2-C/nwgtpv2c-0.11/shared/NwLog.h | 85 - .../GTPV2-C/nwgtpv2c-0.11/shared/NwTypes.h | 83 - .../GTPV2-C/nwgtpv2c-0.11/shared/NwUtils.h | 69 - .../GTPV2-C/nwgtpv2c-0.11/src/Makefile.am | 46 - .../GTPV2-C/nwgtpv2c-0.11/src/NwGtpv2c.c | 1811 ------- .../GTPV2-C/nwgtpv2c-0.11/src/NwGtpv2cMsg.c | 750 --- .../src/NwGtpv2cMsgIeParseInfo.c | 703 --- .../nwgtpv2c-0.11/src/NwGtpv2cMsgParser.c | 293 -- .../GTPV2-C/nwgtpv2c-0.11/src/NwGtpv2cTrxn.c | 389 -- .../nwgtpv2c-0.11/src/NwGtpv2cTunnel.c | 95 - .../nwgtpv2c-0.11/test-app/Makefile.am | 6 - .../test-app/nw-egtping/Makefile.am | 24 - .../test-app/nw-egtping/NwEgtPingMain.c | 280 -- .../nwgtpv2c-0.11/test-app/nw-egtping/NwEvt.h | 80 - .../test-app/nw-egtping/NwMiniLogMgrEntity.c | 70 - .../test-app/nw-egtping/NwMiniLogMgrEntity.h | 89 - .../test-app/nw-egtping/NwMiniTmrMgrEntity.c | 97 - .../test-app/nw-egtping/NwMiniTmrMgrEntity.h | 57 - .../test-app/nw-egtping/NwMiniUdpEntity.c | 218 - .../test-app/nw-egtping/NwMiniUdpEntity.h | 56 - .../test-app/nw-egtping/NwMiniUlpEntity.c | 220 - .../test-app/nw-egtping/NwMiniUlpEntity.h | 54 - .../test-app/nw-helloworld/Makefile.am | 21 - .../test-app/nw-helloworld/NwEvt.h | 80 - .../nw-helloworld/NwMiniLogMgrEntity.c | 71 - .../nw-helloworld/NwMiniLogMgrEntity.h | 89 - .../nw-helloworld/NwMiniTmrMgrEntity.c | 100 - .../nw-helloworld/NwMiniTmrMgrEntity.h | 57 - .../test-app/nw-helloworld/NwMiniUdpEntity.c | 149 - .../test-app/nw-helloworld/NwMiniUdpEntity.h | 51 - .../test-app/nw-helloworld/NwMiniUlpEntity.c | 278 -- .../test-app/nw-helloworld/NwMiniUlpEntity.h | 49 - .../test-app/nw-helloworld/helloworld.c | 179 - openair-cn/INSTALL | 370 -- openair-cn/MME_APP/COPYING | 674 --- openair-cn/MME_APP/Makefile.am | 59 - openair-cn/MME_APP/mme_app_authentication.c | 365 -- openair-cn/MME_APP/mme_app_bearer.c | 906 ---- openair-cn/MME_APP/mme_app_capabilities.c | 62 - openair-cn/MME_APP/mme_app_config.c | 307 -- openair-cn/MME_APP/mme_app_config.h | 41 - openair-cn/MME_APP/mme_app_context.c | 555 --- openair-cn/MME_APP/mme_app_defs.h | 92 - openair-cn/MME_APP/mme_app_extern.h | 36 - openair-cn/MME_APP/mme_app_itti_messaging.h | 81 - openair-cn/MME_APP/mme_app_location.c | 167 - openair-cn/MME_APP/mme_app_main.c | 205 - openair-cn/MME_APP/mme_app_statistics.c | 55 - openair-cn/MME_APP/mme_app_statistics.h | 35 - openair-cn/MME_APP/mme_app_ue_context.h | 265 - openair-cn/MME_APP/s6a_2_nas_cause.c | 96 - openair-cn/Makefile.am | 102 - openair-cn/NAS/COMMON/API/NETWORK/COPYING | 702 +-- openair-cn/NAS/COMMON/API/NETWORK/Makefile | 28 - .../NAS/COMMON/API/NETWORK/as_message.c | 56 +- .../NAS/COMMON/API/NETWORK/l2_message.h | 56 +- .../NAS/COMMON/API/NETWORK/nas_message.c | 56 +- .../NAS/COMMON/API/NETWORK/nas_message.h | 56 +- .../NAS/COMMON/API/NETWORK/network_api.c | 56 +- .../NAS/COMMON/API/NETWORK/network_api.h | 56 +- openair-cn/NAS/COMMON/COPYING | 702 +-- openair-cn/NAS/COMMON/EMM/MSG/AttachAccept.c | 56 +- openair-cn/NAS/COMMON/EMM/MSG/AttachAccept.h | 56 +- .../NAS/COMMON/EMM/MSG/AttachComplete.c | 56 +- .../NAS/COMMON/EMM/MSG/AttachComplete.h | 56 +- openair-cn/NAS/COMMON/EMM/MSG/AttachReject.c | 56 +- openair-cn/NAS/COMMON/EMM/MSG/AttachReject.h | 56 +- openair-cn/NAS/COMMON/EMM/MSG/AttachRequest.c | 56 +- openair-cn/NAS/COMMON/EMM/MSG/AttachRequest.h | 56 +- .../COMMON/EMM/MSG/AuthenticationFailure.c | 56 +- .../COMMON/EMM/MSG/AuthenticationFailure.h | 56 +- .../NAS/COMMON/EMM/MSG/AuthenticationReject.c | 56 +- .../NAS/COMMON/EMM/MSG/AuthenticationReject.h | 56 +- .../COMMON/EMM/MSG/AuthenticationRequest.c | 56 +- .../COMMON/EMM/MSG/AuthenticationRequest.h | 56 +- .../COMMON/EMM/MSG/AuthenticationResponse.c | 56 +- .../COMMON/EMM/MSG/AuthenticationResponse.h | 56 +- openair-cn/NAS/COMMON/EMM/MSG/COPYING | 702 +-- .../COMMON/EMM/MSG/CsServiceNotification.c | 56 +- .../COMMON/EMM/MSG/CsServiceNotification.h | 56 +- openair-cn/NAS/COMMON/EMM/MSG/DetachAccept.c | 56 +- openair-cn/NAS/COMMON/EMM/MSG/DetachAccept.h | 56 +- openair-cn/NAS/COMMON/EMM/MSG/DetachRequest.c | 56 +- openair-cn/NAS/COMMON/EMM/MSG/DetachRequest.h | 56 +- .../NAS/COMMON/EMM/MSG/DownlinkNasTransport.c | 56 +- .../NAS/COMMON/EMM/MSG/DownlinkNasTransport.h | 56 +- .../NAS/COMMON/EMM/MSG/EmmInformation.c | 56 +- .../NAS/COMMON/EMM/MSG/EmmInformation.h | 56 +- openair-cn/NAS/COMMON/EMM/MSG/EmmStatus.c | 56 +- openair-cn/NAS/COMMON/EMM/MSG/EmmStatus.h | 56 +- .../COMMON/EMM/MSG/ExtendedServiceRequest.c | 56 +- .../COMMON/EMM/MSG/ExtendedServiceRequest.h | 56 +- .../COMMON/EMM/MSG/GutiReallocationCommand.c | 56 +- .../COMMON/EMM/MSG/GutiReallocationCommand.h | 56 +- .../COMMON/EMM/MSG/GutiReallocationComplete.c | 56 +- .../COMMON/EMM/MSG/GutiReallocationComplete.h | 56 +- .../NAS/COMMON/EMM/MSG/IdentityRequest.c | 56 +- .../NAS/COMMON/EMM/MSG/IdentityRequest.h | 56 +- .../NAS/COMMON/EMM/MSG/IdentityResponse.c | 56 +- .../NAS/COMMON/EMM/MSG/IdentityResponse.h | 56 +- openair-cn/NAS/COMMON/EMM/MSG/Makefile | 28 - .../COMMON/EMM/MSG/NASSecurityModeCommand.h | 56 +- .../COMMON/EMM/MSG/NASSecurityModeComplete.h | 56 +- .../NAS/COMMON/EMM/MSG/SecurityModeCommand.c | 56 +- .../NAS/COMMON/EMM/MSG/SecurityModeComplete.c | 56 +- .../NAS/COMMON/EMM/MSG/SecurityModeReject.c | 56 +- .../NAS/COMMON/EMM/MSG/SecurityModeReject.h | 56 +- openair-cn/NAS/COMMON/EMM/MSG/ServiceReject.c | 56 +- openair-cn/NAS/COMMON/EMM/MSG/ServiceReject.h | 56 +- .../NAS/COMMON/EMM/MSG/ServiceRequest.c | 56 +- .../NAS/COMMON/EMM/MSG/ServiceRequest.h | 56 +- .../COMMON/EMM/MSG/TrackingAreaUpdateAccept.c | 56 +- .../COMMON/EMM/MSG/TrackingAreaUpdateAccept.h | 56 +- .../EMM/MSG/TrackingAreaUpdateComplete.c | 56 +- .../EMM/MSG/TrackingAreaUpdateComplete.h | 56 +- .../COMMON/EMM/MSG/TrackingAreaUpdateReject.c | 56 +- .../COMMON/EMM/MSG/TrackingAreaUpdateReject.h | 56 +- .../EMM/MSG/TrackingAreaUpdateRequest.c | 56 +- .../EMM/MSG/TrackingAreaUpdateRequest.h | 56 +- .../NAS/COMMON/EMM/MSG/UplinkNasTransport.c | 56 +- .../NAS/COMMON/EMM/MSG/UplinkNasTransport.h | 56 +- openair-cn/NAS/COMMON/EMM/MSG/emm_cause.h | 56 +- openair-cn/NAS/COMMON/EMM/MSG/emm_msg.c | 56 +- openair-cn/NAS/COMMON/EMM/MSG/emm_msg.h | 56 +- openair-cn/NAS/COMMON/EMM/MSG/emm_msgDef.h | 56 +- .../ActivateDedicatedEpsBearerContextAccept.c | 56 +- .../ActivateDedicatedEpsBearerContextAccept.h | 56 +- .../ActivateDedicatedEpsBearerContextReject.c | 56 +- .../ActivateDedicatedEpsBearerContextReject.h | 56 +- ...ActivateDedicatedEpsBearerContextRequest.c | 56 +- ...ActivateDedicatedEpsBearerContextRequest.h | 56 +- .../ActivateDefaultEpsBearerContextAccept.c | 56 +- .../ActivateDefaultEpsBearerContextAccept.h | 56 +- .../ActivateDefaultEpsBearerContextReject.c | 56 +- .../ActivateDefaultEpsBearerContextReject.h | 56 +- .../ActivateDefaultEpsBearerContextRequest.c | 56 +- .../ActivateDefaultEpsBearerContextRequest.h | 56 +- .../ESM/MSG/BearerResourceAllocationReject.c | 56 +- .../ESM/MSG/BearerResourceAllocationReject.h | 56 +- .../ESM/MSG/BearerResourceAllocationRequest.c | 56 +- .../ESM/MSG/BearerResourceAllocationRequest.h | 56 +- .../MSG/BearerResourceModificationReject.c | 56 +- .../MSG/BearerResourceModificationReject.h | 56 +- .../MSG/BearerResourceModificationRequest.c | 56 +- .../MSG/BearerResourceModificationRequest.h | 56 +- openair-cn/NAS/COMMON/ESM/MSG/COPYING | 702 +-- .../MSG/DeactivateEpsBearerContextAccept.c | 56 +- .../MSG/DeactivateEpsBearerContextAccept.h | 56 +- .../MSG/DeactivateEpsBearerContextRequest.c | 56 +- .../MSG/DeactivateEpsBearerContextRequest.h | 56 +- .../COMMON/ESM/MSG/EsmInformationRequest.c | 56 +- .../COMMON/ESM/MSG/EsmInformationRequest.h | 56 +- .../COMMON/ESM/MSG/EsmInformationResponse.c | 56 +- .../COMMON/ESM/MSG/EsmInformationResponse.h | 56 +- openair-cn/NAS/COMMON/ESM/MSG/EsmStatus.c | 56 +- openair-cn/NAS/COMMON/ESM/MSG/EsmStatus.h | 56 +- openair-cn/NAS/COMMON/ESM/MSG/Makefile | 29 +- .../ESM/MSG/ModifyEpsBearerContextAccept.c | 56 +- .../ESM/MSG/ModifyEpsBearerContextAccept.h | 56 +- .../ESM/MSG/ModifyEpsBearerContextReject.c | 56 +- .../ESM/MSG/ModifyEpsBearerContextReject.h | 56 +- .../ESM/MSG/ModifyEpsBearerContextRequest.c | 56 +- .../ESM/MSG/ModifyEpsBearerContextRequest.h | 56 +- .../COMMON/ESM/MSG/PdnConnectivityReject.c | 56 +- .../COMMON/ESM/MSG/PdnConnectivityReject.h | 56 +- .../COMMON/ESM/MSG/PdnConnectivityRequest.c | 56 +- .../COMMON/ESM/MSG/PdnConnectivityRequest.h | 56 +- .../NAS/COMMON/ESM/MSG/PdnDisconnectReject.c | 56 +- .../NAS/COMMON/ESM/MSG/PdnDisconnectReject.h | 56 +- .../NAS/COMMON/ESM/MSG/PdnDisconnectRequest.c | 56 +- .../NAS/COMMON/ESM/MSG/PdnDisconnectRequest.h | 56 +- openair-cn/NAS/COMMON/ESM/MSG/esm_cause.h | 56 +- openair-cn/NAS/COMMON/ESM/MSG/esm_msg.c | 56 +- openair-cn/NAS/COMMON/ESM/MSG/esm_msg.h | 56 +- openair-cn/NAS/COMMON/ESM/MSG/esm_msgDef.h | 56 +- openair-cn/NAS/COMMON/IES/AccessPointName.c | 56 +- openair-cn/NAS/COMMON/IES/AccessPointName.h | 56 +- .../NAS/COMMON/IES/AdditionalUpdateResult.c | 56 +- .../NAS/COMMON/IES/AdditionalUpdateResult.h | 56 +- .../NAS/COMMON/IES/AdditionalUpdateType.c | 56 +- .../NAS/COMMON/IES/AdditionalUpdateType.h | 56 +- .../COMMON/IES/ApnAggregateMaximumBitRate.c | 56 +- .../COMMON/IES/ApnAggregateMaximumBitRate.h | 56 +- .../IES/AuthenticationFailureParameter.c | 56 +- .../IES/AuthenticationFailureParameter.h | 56 +- .../COMMON/IES/AuthenticationParameterAutn.c | 56 +- .../COMMON/IES/AuthenticationParameterAutn.h | 56 +- .../COMMON/IES/AuthenticationParameterRand.c | 56 +- .../COMMON/IES/AuthenticationParameterRand.h | 56 +- .../IES/AuthenticationResponseParameter.c | 56 +- .../IES/AuthenticationResponseParameter.h | 56 +- openair-cn/NAS/COMMON/IES/COPYING | 702 +-- .../COMMON/IES/CipheringKeySequenceNumber.c | 56 +- .../COMMON/IES/CipheringKeySequenceNumber.h | 56 +- openair-cn/NAS/COMMON/IES/Cli.c | 56 +- openair-cn/NAS/COMMON/IES/Cli.h | 56 +- openair-cn/NAS/COMMON/IES/CsfbResponse.c | 56 +- openair-cn/NAS/COMMON/IES/CsfbResponse.h | 56 +- .../NAS/COMMON/IES/DaylightSavingTime.c | 56 +- .../NAS/COMMON/IES/DaylightSavingTime.h | 56 +- openair-cn/NAS/COMMON/IES/DetachType.c | 56 +- openair-cn/NAS/COMMON/IES/DetachType.h | 56 +- openair-cn/NAS/COMMON/IES/DrxParameter.c | 56 +- openair-cn/NAS/COMMON/IES/DrxParameter.h | 56 +- .../NAS/COMMON/IES/EmergencyNumberList.c | 56 +- .../NAS/COMMON/IES/EmergencyNumberList.h | 56 +- openair-cn/NAS/COMMON/IES/EmmCause.c | 56 +- openair-cn/NAS/COMMON/IES/EmmCause.h | 56 +- openair-cn/NAS/COMMON/IES/EpsAttachResult.c | 56 +- openair-cn/NAS/COMMON/IES/EpsAttachResult.h | 56 +- openair-cn/NAS/COMMON/IES/EpsAttachType.c | 56 +- openair-cn/NAS/COMMON/IES/EpsAttachType.h | 56 +- .../NAS/COMMON/IES/EpsBearerContextStatus.c | 56 +- .../NAS/COMMON/IES/EpsBearerContextStatus.h | 56 +- openair-cn/NAS/COMMON/IES/EpsBearerIdentity.c | 56 +- openair-cn/NAS/COMMON/IES/EpsBearerIdentity.h | 56 +- openair-cn/NAS/COMMON/IES/EpsMobileIdentity.c | 56 +- openair-cn/NAS/COMMON/IES/EpsMobileIdentity.h | 56 +- .../NAS/COMMON/IES/EpsNetworkFeatureSupport.c | 56 +- .../NAS/COMMON/IES/EpsNetworkFeatureSupport.h | 56 +- .../NAS/COMMON/IES/EpsQualityOfService.c | 56 +- .../NAS/COMMON/IES/EpsQualityOfService.h | 56 +- openair-cn/NAS/COMMON/IES/EpsUpdateResult.c | 56 +- openair-cn/NAS/COMMON/IES/EpsUpdateResult.h | 56 +- openair-cn/NAS/COMMON/IES/EpsUpdateType.c | 56 +- openair-cn/NAS/COMMON/IES/EpsUpdateType.h | 56 +- openair-cn/NAS/COMMON/IES/EsmCause.c | 56 +- openair-cn/NAS/COMMON/IES/EsmCause.h | 56 +- .../COMMON/IES/EsmInformationTransferFlag.c | 56 +- .../COMMON/IES/EsmInformationTransferFlag.h | 56 +- .../NAS/COMMON/IES/EsmMessageContainer.c | 56 +- .../NAS/COMMON/IES/EsmMessageContainer.h | 56 +- openair-cn/NAS/COMMON/IES/GprsTimer.c | 56 +- openair-cn/NAS/COMMON/IES/GprsTimer.h | 56 +- openair-cn/NAS/COMMON/IES/GutiType.c | 56 +- openair-cn/NAS/COMMON/IES/GutiType.h | 56 +- openair-cn/NAS/COMMON/IES/IdentityType2.c | 56 +- openair-cn/NAS/COMMON/IES/IdentityType2.h | 56 +- openair-cn/NAS/COMMON/IES/ImeisvRequest.c | 56 +- openair-cn/NAS/COMMON/IES/ImeisvRequest.h | 56 +- .../NAS/COMMON/IES/KsiAndSequenceNumber.c | 56 +- .../NAS/COMMON/IES/KsiAndSequenceNumber.h | 56 +- openair-cn/NAS/COMMON/IES/LcsClientIdentity.c | 56 +- openair-cn/NAS/COMMON/IES/LcsClientIdentity.h | 56 +- openair-cn/NAS/COMMON/IES/LcsIndicator.c | 56 +- openair-cn/NAS/COMMON/IES/LcsIndicator.h | 56 +- .../NAS/COMMON/IES/LinkedEpsBearerIdentity.c | 56 +- .../NAS/COMMON/IES/LinkedEpsBearerIdentity.h | 56 +- .../IES/LlcServiceAccessPointIdentifier.c | 56 +- .../IES/LlcServiceAccessPointIdentifier.h | 56 +- .../COMMON/IES/LocationAreaIdentification.c | 56 +- .../COMMON/IES/LocationAreaIdentification.h | 56 +- openair-cn/NAS/COMMON/IES/Makefile | 29 +- openair-cn/NAS/COMMON/IES/MessageType.c | 56 +- openair-cn/NAS/COMMON/IES/MessageType.h | 56 +- openair-cn/NAS/COMMON/IES/MobileIdentity.c | 56 +- openair-cn/NAS/COMMON/IES/MobileIdentity.h | 56 +- .../NAS/COMMON/IES/MobileStationClassmark2.c | 56 +- .../NAS/COMMON/IES/MobileStationClassmark2.h | 56 +- .../NAS/COMMON/IES/MobileStationClassmark3.c | 56 +- .../NAS/COMMON/IES/MobileStationClassmark3.h | 56 +- .../NAS/COMMON/IES/MsNetworkCapability.c | 56 +- .../NAS/COMMON/IES/MsNetworkCapability.h | 56 +- .../NAS/COMMON/IES/MsNetworkFeatureSupport.c | 56 +- .../NAS/COMMON/IES/MsNetworkFeatureSupport.h | 56 +- .../NAS/COMMON/IES/NasKeySetIdentifier.c | 56 +- .../NAS/COMMON/IES/NasKeySetIdentifier.h | 56 +- .../NAS/COMMON/IES/NasMessageContainer.c | 56 +- .../NAS/COMMON/IES/NasMessageContainer.h | 56 +- openair-cn/NAS/COMMON/IES/NasRequestType.c | 56 +- openair-cn/NAS/COMMON/IES/NasRequestType.h | 56 +- .../NAS/COMMON/IES/NasSecurityAlgorithms.c | 56 +- .../NAS/COMMON/IES/NasSecurityAlgorithms.h | 56 +- openair-cn/NAS/COMMON/IES/NetworkName.c | 56 +- openair-cn/NAS/COMMON/IES/NetworkName.h | 56 +- openair-cn/NAS/COMMON/IES/Nonce.c | 56 +- openair-cn/NAS/COMMON/IES/Nonce.h | 56 +- openair-cn/NAS/COMMON/IES/PTmsiSignature.c | 56 +- openair-cn/NAS/COMMON/IES/PTmsiSignature.h | 56 +- .../NAS/COMMON/IES/PacketFlowIdentifier.c | 56 +- .../NAS/COMMON/IES/PacketFlowIdentifier.h | 56 +- openair-cn/NAS/COMMON/IES/PagingIdentity.c | 56 +- openair-cn/NAS/COMMON/IES/PagingIdentity.h | 56 +- openair-cn/NAS/COMMON/IES/PdnAddress.c | 56 +- openair-cn/NAS/COMMON/IES/PdnAddress.h | 56 +- openair-cn/NAS/COMMON/IES/PdnType.c | 56 +- openair-cn/NAS/COMMON/IES/PdnType.h | 56 +- openair-cn/NAS/COMMON/IES/PlmnList.c | 56 +- openair-cn/NAS/COMMON/IES/PlmnList.h | 56 +- .../COMMON/IES/ProcedureTransactionIdentity.c | 56 +- .../COMMON/IES/ProcedureTransactionIdentity.h | 56 +- .../COMMON/IES/ProtocolConfigurationOptions.c | 56 +- .../COMMON/IES/ProtocolConfigurationOptions.h | 56 +- .../NAS/COMMON/IES/ProtocolDiscriminator.c | 56 +- .../NAS/COMMON/IES/ProtocolDiscriminator.h | 56 +- openair-cn/NAS/COMMON/IES/QualityOfService.c | 56 +- openair-cn/NAS/COMMON/IES/QualityOfService.h | 56 +- openair-cn/NAS/COMMON/IES/RadioPriority.c | 56 +- openair-cn/NAS/COMMON/IES/RadioPriority.h | 56 +- .../NAS/COMMON/IES/SecurityHeaderType.c | 56 +- .../NAS/COMMON/IES/SecurityHeaderType.h | 56 +- openair-cn/NAS/COMMON/IES/ServiceType.c | 56 +- openair-cn/NAS/COMMON/IES/ServiceType.h | 56 +- openair-cn/NAS/COMMON/IES/ShortMac.c | 56 +- openair-cn/NAS/COMMON/IES/ShortMac.h | 56 +- openair-cn/NAS/COMMON/IES/SsCode.c | 56 +- openair-cn/NAS/COMMON/IES/SsCode.h | 56 +- .../NAS/COMMON/IES/SupportedCodecList.c | 56 +- .../NAS/COMMON/IES/SupportedCodecList.h | 56 +- openair-cn/NAS/COMMON/IES/TimeZone.c | 56 +- openair-cn/NAS/COMMON/IES/TimeZone.h | 56 +- openair-cn/NAS/COMMON/IES/TimeZoneAndTime.c | 56 +- openair-cn/NAS/COMMON/IES/TimeZoneAndTime.h | 56 +- openair-cn/NAS/COMMON/IES/TmsiStatus.c | 56 +- openair-cn/NAS/COMMON/IES/TmsiStatus.h | 56 +- .../NAS/COMMON/IES/TrackingAreaIdentity.c | 56 +- .../NAS/COMMON/IES/TrackingAreaIdentity.h | 56 +- .../NAS/COMMON/IES/TrackingAreaIdentityList.c | 56 +- .../NAS/COMMON/IES/TrackingAreaIdentityList.h | 56 +- .../IES/TrafficFlowAggregateDescription.c | 56 +- .../IES/TrafficFlowAggregateDescription.h | 56 +- .../NAS/COMMON/IES/TrafficFlowTemplate.c | 56 +- .../NAS/COMMON/IES/TrafficFlowTemplate.h | 56 +- .../NAS/COMMON/IES/TransactionIdentifier.c | 56 +- .../NAS/COMMON/IES/TransactionIdentifier.h | 56 +- .../NAS/COMMON/IES/UeNetworkCapability.c | 56 +- .../NAS/COMMON/IES/UeNetworkCapability.h | 56 +- ...UeRadioCapabilityInformationUpdateNeeded.c | 56 +- ...UeRadioCapabilityInformationUpdateNeeded.h | 56 +- .../NAS/COMMON/IES/UeSecurityCapability.c | 56 +- .../NAS/COMMON/IES/UeSecurityCapability.h | 56 +- .../VoiceDomainPreferenceAndUeUsageSetting.c | 56 +- .../VoiceDomainPreferenceAndUeUsageSetting.h | 56 +- openair-cn/NAS/COMMON/UTIL/COPYING | 702 +-- openair-cn/NAS/COMMON/UTIL/Makefile | 29 +- openair-cn/NAS/COMMON/UTIL/OctetString.c | 56 +- openair-cn/NAS/COMMON/UTIL/OctetString.h | 56 +- openair-cn/NAS/COMMON/UTIL/TLVDecoder.c | 56 +- openair-cn/NAS/COMMON/UTIL/TLVDecoder.h | 56 +- openair-cn/NAS/COMMON/UTIL/TLVEncoder.c | 56 +- openair-cn/NAS/COMMON/UTIL/TLVEncoder.h | 56 +- openair-cn/NAS/COMMON/UTIL/device.c | 56 +- openair-cn/NAS/COMMON/UTIL/device.h | 56 +- openair-cn/NAS/COMMON/UTIL/memory.c | 56 +- openair-cn/NAS/COMMON/UTIL/memory.h | 56 +- openair-cn/NAS/COMMON/UTIL/nas_log.c | 56 +- openair-cn/NAS/COMMON/UTIL/nas_log.h | 56 +- openair-cn/NAS/COMMON/UTIL/nas_timer.c | 56 +- openair-cn/NAS/COMMON/UTIL/nas_timer.h | 56 +- openair-cn/NAS/COMMON/UTIL/parser.c | 56 +- openair-cn/NAS/COMMON/UTIL/parser.h | 56 +- openair-cn/NAS/COMMON/UTIL/socket.c | 56 +- openair-cn/NAS/COMMON/UTIL/socket.h | 56 +- openair-cn/NAS/COMMON/UTIL/stty.c | 56 +- openair-cn/NAS/COMMON/UTIL/tst/Makefile | 29 +- openair-cn/NAS/COMMON/UTIL/tst/timer.c | 56 +- openair-cn/NAS/COMMON/securityDef.h | 56 +- openair-cn/NAS/COMMON/userDef.h | 56 +- openair-cn/NAS/MME/API/MME/COPYING | 674 --- openair-cn/NAS/MME/API/MME/Makefile | 49 - openair-cn/NAS/MME/API/MME/mme_api.c | 569 --- openair-cn/NAS/MME/API/MME/mme_api.h | 146 - openair-cn/NAS/MME/EMM/Attach.c | 1692 ------- openair-cn/NAS/MME/EMM/Authentication.c | 660 --- openair-cn/NAS/MME/EMM/COPYING | 674 --- openair-cn/NAS/MME/EMM/Detach.c | 346 -- openair-cn/NAS/MME/EMM/EmmCommon.c | 514 -- openair-cn/NAS/MME/EMM/EmmCommon.h | 109 - openair-cn/NAS/MME/EMM/EmmStatusHdl.c | 165 - openair-cn/NAS/MME/EMM/Identification.c | 538 --- openair-cn/NAS/MME/EMM/IdleMode.c | 0 openair-cn/NAS/MME/EMM/IdleMode.h | 0 openair-cn/NAS/MME/EMM/LowerLayer.c | 384 -- openair-cn/NAS/MME/EMM/LowerLayer.h | 79 - openair-cn/NAS/MME/EMM/Makefile | 72 - openair-cn/NAS/MME/EMM/SAP/COPYING | 674 --- .../MME/EMM/SAP/EmmCommonProcedureInitiated.c | 186 - openair-cn/NAS/MME/EMM/SAP/EmmDeregistered.c | 157 - .../MME/EMM/SAP/EmmDeregisteredAttachNeeded.c | 0 .../SAP/EmmDeregisteredAttemptingToAttach.c | 0 .../MME/EMM/SAP/EmmDeregisteredInitiated.c | 110 - .../EMM/SAP/EmmDeregisteredLimitedService.c | 0 .../EMM/SAP/EmmDeregisteredNoCellAvailable.c | 0 .../NAS/MME/EMM/SAP/EmmDeregisteredNoImsi.c | 0 .../EMM/SAP/EmmDeregisteredNormalService.c | 0 .../MME/EMM/SAP/EmmDeregisteredPlmnSearch.c | 0 openair-cn/NAS/MME/EMM/SAP/EmmNull.c | 0 openair-cn/NAS/MME/EMM/SAP/EmmRegistered.c | 153 - .../EMM/SAP/EmmRegisteredAttemptingToUpdate.c | 0 .../SAP/EmmRegisteredImsiDetachInitiated.c | 0 .../NAS/MME/EMM/SAP/EmmRegisteredInitiated.c | 0 .../MME/EMM/SAP/EmmRegisteredLimitedService.c | 0 .../EMM/SAP/EmmRegisteredNoCellAvailable.c | 0 .../MME/EMM/SAP/EmmRegisteredNormalService.c | 0 .../NAS/MME/EMM/SAP/EmmRegisteredPlmnSearch.c | 0 .../MME/EMM/SAP/EmmRegisteredUpdateNeeded.c | 0 .../MME/EMM/SAP/EmmServiceRequestInitiated.c | 0 .../SAP/EmmTrackingAreaUpdatingInitiated.c | 0 openair-cn/NAS/MME/EMM/SAP/Makefile | 70 - openair-cn/NAS/MME/EMM/SAP/emm_as.c | 1763 ------- openair-cn/NAS/MME/EMM/SAP/emm_as.h | 72 - openair-cn/NAS/MME/EMM/SAP/emm_asDef.h | 276 -- openair-cn/NAS/MME/EMM/SAP/emm_cn.c | 468 -- openair-cn/NAS/MME/EMM/SAP/emm_cn.h | 56 - openair-cn/NAS/MME/EMM/SAP/emm_cnDef.h | 88 - openair-cn/NAS/MME/EMM/SAP/emm_esm.c | 147 - openair-cn/NAS/MME/EMM/SAP/emm_esm.h | 73 - openair-cn/NAS/MME/EMM/SAP/emm_esmDef.h | 116 - openair-cn/NAS/MME/EMM/SAP/emm_fsm.c | 328 -- openair-cn/NAS/MME/EMM/SAP/emm_fsm.h | 91 - openair-cn/NAS/MME/EMM/SAP/emm_recv.c | 748 --- openair-cn/NAS/MME/EMM/SAP/emm_recv.h | 129 - openair-cn/NAS/MME/EMM/SAP/emm_reg.c | 126 - openair-cn/NAS/MME/EMM/SAP/emm_reg.h | 73 - openair-cn/NAS/MME/EMM/SAP/emm_regDef.h | 138 - openair-cn/NAS/MME/EMM/SAP/emm_sap.c | 154 - openair-cn/NAS/MME/EMM/SAP/emm_sap.h | 171 - openair-cn/NAS/MME/EMM/SAP/emm_send.c | 509 -- openair-cn/NAS/MME/EMM/SAP/emm_send.h | 122 - openair-cn/NAS/MME/EMM/SecurityModeControl.c | 804 --- openair-cn/NAS/MME/EMM/ServiceRequestHdl.c | 93 - openair-cn/NAS/MME/EMM/TrackingAreaUpdate.c | 188 - openair-cn/NAS/MME/EMM/emmData.h | 285 -- openair-cn/NAS/MME/EMM/emm_data_ctx.c | 185 - openair-cn/NAS/MME/EMM/emm_main.c | 138 - openair-cn/NAS/MME/EMM/emm_main.h | 82 - openair-cn/NAS/MME/EMM/emm_proc.h | 199 - openair-cn/NAS/MME/ESM/COPYING | 674 --- .../ESM/DedicatedEpsBearerContextActivation.c | 442 -- .../ESM/DefaultEpsBearerContextActivation.c | 497 -- .../MME/ESM/EpsBearerContextDeactivation.c | 483 -- openair-cn/NAS/MME/ESM/EsmStatusHdl.c | 199 - openair-cn/NAS/MME/ESM/Makefile | 59 - openair-cn/NAS/MME/ESM/PdnConnectivity.c | 556 --- openair-cn/NAS/MME/ESM/PdnDisconnect.c | 299 -- openair-cn/NAS/MME/ESM/SAP/COPYING | 674 --- openair-cn/NAS/MME/ESM/SAP/Makefile | 70 - openair-cn/NAS/MME/ESM/SAP/esm_recv.c | 713 --- openair-cn/NAS/MME/ESM/SAP/esm_recv.h | 129 - openair-cn/NAS/MME/ESM/SAP/esm_sap.c | 799 --- openair-cn/NAS/MME/ESM/SAP/esm_sap.h | 72 - openair-cn/NAS/MME/ESM/SAP/esm_sapDef.h | 179 - openair-cn/NAS/MME/ESM/SAP/esm_send.c | 427 -- openair-cn/NAS/MME/ESM/SAP/esm_send.h | 119 - openair-cn/NAS/MME/ESM/esmData.h | 265 - openair-cn/NAS/MME/ESM/esm_ebr.c | 680 --- openair-cn/NAS/MME/ESM/esm_ebr.h | 89 - openair-cn/NAS/MME/ESM/esm_ebr_context.c | 431 -- openair-cn/NAS/MME/ESM/esm_ebr_context.h | 73 - openair-cn/NAS/MME/ESM/esm_ip.c | 74 - openair-cn/NAS/MME/ESM/esm_main.c | 134 - openair-cn/NAS/MME/ESM/esm_main.h | 73 - openair-cn/NAS/MME/ESM/esm_proc.h | 204 - openair-cn/NAS/MME/ESM/esm_pt.c | 95 - openair-cn/NAS/MME/ESM/esm_pt.h | 74 - openair-cn/NAS/MME/MMEprocess.c | 345 -- openair-cn/NAS/MME/nas_defs.h | 34 - openair-cn/NAS/MME/nas_itti_messaging.c | 211 - openair-cn/NAS/MME/nas_itti_messaging.h | 283 -- openair-cn/NAS/MME/nas_mme_task.c | 226 - openair-cn/NAS/MME/nas_network.c | 208 - openair-cn/NAS/MME/nas_network.h | 81 - openair-cn/NAS/MME/nas_parser.c | 243 - openair-cn/NAS/MME/nas_parser.h | 84 - openair-cn/NAS/MME/nas_proc.c | 443 -- openair-cn/NAS/MME/nas_proc.h | 116 - openair-cn/NAS/TEST/AS_SIMULATOR/Makefile | 2 +- openair-cn/NAS/TEST/NETWORK/Makefile | 2 +- openair-cn/NAS/TEST/USER/Makefile | 2 +- openair-cn/NAS/TOOLS/Makefile | 2 +- openair-cn/NAS/TOOLS/network.h | 2 +- openair-cn/NAS/TOOLS/ue_data.c | 2 +- openair-cn/NAS/TOOLS/usim_data.c | 2 +- openair-cn/NAS/UE/API/USER/Makefile | 2 +- openair-cn/NAS/UE/API/USER/at_command.c | 2 +- openair-cn/NAS/UE/API/USER/at_command.h | 2 +- openair-cn/NAS/UE/API/USER/at_error.c | 2 +- openair-cn/NAS/UE/API/USER/at_error.h | 2 +- openair-cn/NAS/UE/API/USER/at_response.c | 2 +- openair-cn/NAS/UE/API/USER/at_response.h | 2 +- openair-cn/NAS/UE/API/USER/tst/Makefile | 2 +- openair-cn/NAS/UE/API/USER/tst/at_parser.c | 2 +- openair-cn/NAS/UE/API/USER/user_api.c | 2 +- openair-cn/NAS/UE/API/USER/user_api.h | 2 +- openair-cn/NAS/UE/API/USER/user_indication.c | 2 +- openair-cn/NAS/UE/API/USER/user_indication.h | 2 +- openair-cn/NAS/UE/API/USIM/Makefile | 2 +- openair-cn/NAS/UE/API/USIM/aka_functions.h | 2 +- openair-cn/NAS/UE/API/USIM/usim_api.c | 2 +- openair-cn/NAS/UE/API/USIM/usim_api.h | 2 +- openair-cn/NAS/UE/EMM/Attach.c | 2 +- openair-cn/NAS/UE/EMM/Authentication.c | 2 +- openair-cn/NAS/UE/EMM/Detach.c | 2 +- openair-cn/NAS/UE/EMM/EmmStatusHdl.c | 2 +- openair-cn/NAS/UE/EMM/Identification.c | 2 +- openair-cn/NAS/UE/EMM/IdleMode.c | 2 +- openair-cn/NAS/UE/EMM/IdleMode.h | 2 +- openair-cn/NAS/UE/EMM/LowerLayer.c | 2 +- openair-cn/NAS/UE/EMM/LowerLayer.h | 2 +- openair-cn/NAS/UE/EMM/SAP/EmmDeregistered.c | 2 +- .../UE/EMM/SAP/EmmDeregisteredAttachNeeded.c | 2 +- .../SAP/EmmDeregisteredAttemptingToAttach.c | 2 +- .../NAS/UE/EMM/SAP/EmmDeregisteredInitiated.c | 2 +- .../EMM/SAP/EmmDeregisteredLimitedService.c | 2 +- .../EMM/SAP/EmmDeregisteredNoCellAvailable.c | 2 +- .../NAS/UE/EMM/SAP/EmmDeregisteredNoImsi.c | 2 +- .../UE/EMM/SAP/EmmDeregisteredNormalService.c | 2 +- .../UE/EMM/SAP/EmmDeregisteredPlmnSearch.c | 2 +- openair-cn/NAS/UE/EMM/SAP/EmmNull.c | 2 +- openair-cn/NAS/UE/EMM/SAP/EmmRegistered.c | 2 +- .../EMM/SAP/EmmRegisteredAttemptingToUpdate.c | 2 +- .../SAP/EmmRegisteredImsiDetachInitiated.c | 2 +- .../NAS/UE/EMM/SAP/EmmRegisteredInitiated.c | 2 +- .../UE/EMM/SAP/EmmRegisteredLimitedService.c | 2 +- .../UE/EMM/SAP/EmmRegisteredNoCellAvailable.c | 2 +- .../UE/EMM/SAP/EmmRegisteredNormalService.c | 2 +- .../NAS/UE/EMM/SAP/EmmRegisteredPlmnSearch.c | 2 +- .../UE/EMM/SAP/EmmRegisteredUpdateNeeded.c | 2 +- .../UE/EMM/SAP/EmmServiceRequestInitiated.c | 2 +- .../SAP/EmmTrackingAreaUpdatingInitiated.c | 2 +- openair-cn/NAS/UE/EMM/SAP/emm_as.c | 2 +- openair-cn/NAS/UE/EMM/SAP/emm_as.h | 2 +- openair-cn/NAS/UE/EMM/SAP/emm_asDef.h | 2 +- openair-cn/NAS/UE/EMM/SAP/emm_esm.c | 2 +- openair-cn/NAS/UE/EMM/SAP/emm_esm.h | 2 +- openair-cn/NAS/UE/EMM/SAP/emm_esmDef.h | 2 +- openair-cn/NAS/UE/EMM/SAP/emm_fsm.c | 2 +- openair-cn/NAS/UE/EMM/SAP/emm_fsm.h | 2 +- openair-cn/NAS/UE/EMM/SAP/emm_recv.c | 2 +- openair-cn/NAS/UE/EMM/SAP/emm_recv.h | 2 +- openair-cn/NAS/UE/EMM/SAP/emm_reg.c | 2 +- openair-cn/NAS/UE/EMM/SAP/emm_reg.h | 2 +- openair-cn/NAS/UE/EMM/SAP/emm_regDef.h | 2 +- openair-cn/NAS/UE/EMM/SAP/emm_sap.c | 2 +- openair-cn/NAS/UE/EMM/SAP/emm_sap.h | 2 +- openair-cn/NAS/UE/EMM/SAP/emm_send.c | 2 +- openair-cn/NAS/UE/EMM/SAP/emm_send.h | 2 +- openair-cn/NAS/UE/EMM/SecurityModeControl.c | 2 +- openair-cn/NAS/UE/EMM/ServiceRequestHdl.c | 2 +- openair-cn/NAS/UE/EMM/TrackingAreaUpdate.c | 2 +- openair-cn/NAS/UE/EMM/emmData.h | 2 +- openair-cn/NAS/UE/EMM/emm_main.c | 2 +- openair-cn/NAS/UE/EMM/emm_main.h | 2 +- openair-cn/NAS/UE/EMM/emm_proc.h | 2 +- .../ESM/DedicatedEpsBearerContextActivation.c | 2 +- .../ESM/DefaultEpsBearerContextActivation.c | 2 +- .../NAS/UE/ESM/EpsBearerContextDeactivation.c | 2 +- openair-cn/NAS/UE/ESM/EsmStatusHdl.c | 2 +- openair-cn/NAS/UE/ESM/PdnConnectivity.c | 2 +- openair-cn/NAS/UE/ESM/PdnDisconnect.c | 2 +- openair-cn/NAS/UE/ESM/SAP/esm_recv.c | 2 +- openair-cn/NAS/UE/ESM/SAP/esm_recv.h | 2 +- openair-cn/NAS/UE/ESM/SAP/esm_sap.c | 2 +- openair-cn/NAS/UE/ESM/SAP/esm_sap.h | 2 +- openair-cn/NAS/UE/ESM/SAP/esm_sapDef.h | 2 +- openair-cn/NAS/UE/ESM/SAP/esm_send.c | 2 +- openair-cn/NAS/UE/ESM/SAP/esm_send.h | 2 +- openair-cn/NAS/UE/ESM/esmData.h | 2 +- openair-cn/NAS/UE/ESM/esm_ebr.c | 2 +- openair-cn/NAS/UE/ESM/esm_ebr.h | 2 +- openair-cn/NAS/UE/ESM/esm_ebr_context.c | 2 +- openair-cn/NAS/UE/ESM/esm_ebr_context.h | 2 +- openair-cn/NAS/UE/ESM/esm_ip.c | 2 +- openair-cn/NAS/UE/ESM/esm_main.c | 2 +- openair-cn/NAS/UE/ESM/esm_main.h | 2 +- openair-cn/NAS/UE/ESM/esm_proc.h | 2 +- openair-cn/NAS/UE/ESM/esm_pt.c | 2 +- openair-cn/NAS/UE/ESM/esm_pt.h | 2 +- openair-cn/NAS/UE/UEprocess.c | 2 +- openair-cn/NAS/UE/nas_itti_messaging.c | 2 +- openair-cn/NAS/UE/nas_itti_messaging.h | 2 +- openair-cn/NAS/UE/nas_network.c | 2 +- openair-cn/NAS/UE/nas_network.h | 2 +- openair-cn/NAS/UE/nas_parser.c | 2 +- openair-cn/NAS/UE/nas_parser.h | 2 +- openair-cn/NAS/UE/nas_proc.c | 2 +- openair-cn/NAS/UE/nas_proc.h | 2 +- openair-cn/NAS/UE/nas_ue_task.c | 2 +- openair-cn/NAS/UE/nas_user.c | 2 +- openair-cn/NAS/UE/nas_user.h | 2 +- openair-cn/NEWS | 1 - openair-cn/OAISIM_MME/COPYING | 674 --- openair-cn/OAISIM_MME/Makefile.am | 76 - openair-cn/OAISIM_MME/oai_mme_log.c | 53 - openair-cn/OAISIM_MME/oaisim_mme.c | 85 - openair-cn/OAISIM_MME/oaisim_mme.h | 61 - openair-cn/OAI_EPC/COPYING | 674 --- openair-cn/OAI_EPC/Makefile.am | 78 - openair-cn/OAI_EPC/oai_epc.c | 93 - openair-cn/OAI_EPC/oai_epc.h | 61 - openair-cn/OAI_EPC/oai_epc_log.c | 52 - openair-cn/OAI_SGW/COPYING | 674 --- openair-cn/OAI_SGW/Makefile.am | 67 - openair-cn/OAI_SGW/oai_sgw.c | 79 - openair-cn/OAI_SGW/oai_sgw.h | 43 - openair-cn/OAI_SGW/oai_sgw_log.c | 41 - openair-cn/OPENAIRHSS/AUTHORS | 0 openair-cn/OPENAIRHSS/ChangeLog | 0 openair-cn/OPENAIRHSS/INSTALL | 370 -- openair-cn/OPENAIRHSS/Makefile.am | 54 - openair-cn/OPENAIRHSS/NEWS | 0 openair-cn/OPENAIRHSS/README | 24 - .../OPENAIRHSS/access_restriction/COPYING | 674 --- .../OPENAIRHSS/access_restriction/Makefile.am | 37 - .../access_restriction/access_restriction.c | 129 - .../access_restriction/access_restriction.h | 36 - openair-cn/OPENAIRHSS/auc/COPYING | 674 --- openair-cn/OPENAIRHSS/auc/Makefile.am | 42 - openair-cn/OPENAIRHSS/auc/auc.h | 118 - openair-cn/OPENAIRHSS/auc/fx.c | 298 -- openair-cn/OPENAIRHSS/auc/kdf.c | 174 - openair-cn/OPENAIRHSS/auc/random.c | 89 - openair-cn/OPENAIRHSS/auc/rijndael.c | 225 - openair-cn/OPENAIRHSS/auc/sequence_number.c | 88 - openair-cn/OPENAIRHSS/autogen.sh | 2 - openair-cn/OPENAIRHSS/conf/COPYING | 674 --- openair-cn/OPENAIRHSS/conf/demoCA/COPYING | 674 --- openair-cn/OPENAIRHSS/conf/hss.conf.in | 11 - openair-cn/OPENAIRHSS/conf/make_certs.sh | 75 - openair-cn/OPENAIRHSS/configure.ac | 200 - openair-cn/OPENAIRHSS/db/COPYING | 674 --- openair-cn/OPENAIRHSS/db/Makefile.am | 40 - openair-cn/OPENAIRHSS/db/db_connector.c | 702 --- openair-cn/OPENAIRHSS/db/db_epc_equipment.c | 136 - openair-cn/OPENAIRHSS/db/db_proto.h | 206 - .../OPENAIRHSS/db/db_subscription_data.c | 171 - openair-cn/OPENAIRHSS/db/oai_db.sql | 175 - openair-cn/OPENAIRHSS/db/pft_db.sql | 173 - openair-cn/OPENAIRHSS/debian/changelog | 5 - openair-cn/OPENAIRHSS/debian/compat | 1 - openair-cn/OPENAIRHSS/debian/control | 15 - openair-cn/OPENAIRHSS/debian/copyright | 0 openair-cn/OPENAIRHSS/debian/dirs | 1 - openair-cn/OPENAIRHSS/debian/files | 1 - .../OPENAIRHSS/debian/openair-hss.install | 3 - openair-cn/OPENAIRHSS/debian/rules | 12 - openair-cn/OPENAIRHSS/hss_main.c | 68 - openair-cn/OPENAIRHSS/s6a/COPYING | 674 --- openair-cn/OPENAIRHSS/s6a/Makefile.am | 49 - openair-cn/OPENAIRHSS/s6a/s6a_auth_info.c | 301 -- openair-cn/OPENAIRHSS/s6a/s6a_common.c | 66 - openair-cn/OPENAIRHSS/s6a/s6a_error.c | 84 - openair-cn/OPENAIRHSS/s6a/s6a_fd.c | 370 -- openair-cn/OPENAIRHSS/s6a/s6a_in_addr.c | 109 - openair-cn/OPENAIRHSS/s6a/s6a_peers.c | 75 - openair-cn/OPENAIRHSS/s6a/s6a_proto.h | 238 - openair-cn/OPENAIRHSS/s6a/s6a_purge_ue.c | 151 - .../OPENAIRHSS/s6a/s6a_subscription_data.c | 274 -- .../OPENAIRHSS/s6a/s6a_supported_features.c | 40 - .../OPENAIRHSS/s6a/s6a_supported_features.h | 141 - openair-cn/OPENAIRHSS/s6a/s6a_up_loc.c | 432 -- openair-cn/OPENAIRHSS/scripts/COPYING | 674 --- openair-cn/OPENAIRHSS/scripts/install_hss.sh | 145 - openair-cn/OPENAIRHSS/tests/COPYING | 674 --- openair-cn/OPENAIRHSS/tests/Makefile.am | 88 - openair-cn/OPENAIRHSS/tests/test_fd.c | 87 - openair-cn/OPENAIRHSS/tests/test_fd.h | 36 - openair-cn/OPENAIRHSS/tests/test_kdf.c | 132 - openair-cn/OPENAIRHSS/tests/test_security.c | 119 - .../OPENAIRHSS/tests/test_security_f1.c | 121 - .../OPENAIRHSS/tests/test_security_f2_f3_f5.c | 110 - .../tests/test_security_f4_f5star.c | 104 - .../OPENAIRHSS/tests/test_security_kasme.c | 87 - openair-cn/OPENAIRHSS/tests/test_utils.c | 287 -- openair-cn/OPENAIRHSS/tests/test_utils.h | 62 - openair-cn/OPENAIRHSS/tests/up_loc_test.c | 47 - openair-cn/OPENAIRHSS/utils/COPYING | 674 --- openair-cn/OPENAIRHSS/utils/Makefile.am | 40 - openair-cn/OPENAIRHSS/utils/conversion.c | 144 - openair-cn/OPENAIRHSS/utils/conversion.h | 36 - openair-cn/OPENAIRHSS/utils/hss_config.c | 260 - openair-cn/OPENAIRHSS/utils/hss_config.h | 55 - openair-cn/OPENAIRHSS/utils/hss_parser.y | 144 - openair-cn/OPENAIRHSS/utils/hss_scanner.l | 130 - openair-cn/OPENAIRHSS/utils/queue.h | 592 --- openair-cn/README | 128 - openair-cn/S11/COPYING | 674 --- openair-cn/S11/Makefile.am | 54 - openair-cn/S11/s11_common.c | 46 - openair-cn/S11/s11_common.h | 43 - openair-cn/S11/s11_ie_formatter.c | 1164 ----- openair-cn/S11/s11_ie_formatter.h | 208 - openair-cn/S11/s11_mme.h | 34 - openair-cn/S11/s11_mme_peer_manager.c | 32 - openair-cn/S11/s11_mme_session_manager.c | 223 - openair-cn/S11/s11_mme_session_manager.h | 49 - openair-cn/S11/s11_mme_task.c | 322 -- openair-cn/S11/s11_sgw.c | 347 -- openair-cn/S11/s11_sgw.h | 34 - openair-cn/S11/s11_sgw_bearer_manager.c | 237 - openair-cn/S11/s11_sgw_bearer_manager.h | 40 - openair-cn/S11/s11_sgw_session_manager.c | 526 -- openair-cn/S11/s11_sgw_session_manager.h | 48 - openair-cn/S1AP/MESSAGES/ASN1/Makefile.am | 8 - openair-cn/S1AP/MESSAGES/Makefile.am | 805 --- openair-cn/S1AP/MESSAGES/Makefile.inc | 784 --- openair-cn/S1AP/Makefile.am | 70 - openair-cn/S1AP/Makefile.eNB | 163 - openair-cn/S1AP/Makefile.inc | 37 - openair-cn/S1AP/s1ap_common.c | 56 +- openair-cn/S1AP/s1ap_common.h | 56 +- openair-cn/S1AP/s1ap_eNB.c | 2 +- openair-cn/S1AP/s1ap_eNB.h | 2 +- .../s1ap_eNB_context_management_procedures.c | 2 +- .../s1ap_eNB_context_management_procedures.h | 2 +- openair-cn/S1AP/s1ap_eNB_decoder.c | 2 +- openair-cn/S1AP/s1ap_eNB_decoder.h | 2 +- openair-cn/S1AP/s1ap_eNB_default_values.h | 2 +- openair-cn/S1AP/s1ap_eNB_defs.h | 2 +- openair-cn/S1AP/s1ap_eNB_encoder.c | 2 +- openair-cn/S1AP/s1ap_eNB_encoder.h | 2 +- openair-cn/S1AP/s1ap_eNB_handlers.c | 2 +- openair-cn/S1AP/s1ap_eNB_handlers.h | 2 +- openair-cn/S1AP/s1ap_eNB_itti_messaging.c | 28 + openair-cn/S1AP/s1ap_eNB_itti_messaging.h | 2 +- .../S1AP/s1ap_eNB_management_procedures.c | 2 +- .../S1AP/s1ap_eNB_management_procedures.h | 2 +- openair-cn/S1AP/s1ap_eNB_nas_procedures.c | 2 +- openair-cn/S1AP/s1ap_eNB_nas_procedures.h | 2 +- openair-cn/S1AP/s1ap_eNB_nnsf.c | 2 +- openair-cn/S1AP/s1ap_eNB_nnsf.h | 2 +- openair-cn/S1AP/s1ap_eNB_overload.c | 2 +- openair-cn/S1AP/s1ap_eNB_overload.h | 2 +- openair-cn/S1AP/s1ap_eNB_trace.c | 2 +- openair-cn/S1AP/s1ap_eNB_ue_context.c | 2 +- openair-cn/S1AP/s1ap_eNB_ue_context.h | 2 +- openair-cn/S1AP/s1ap_mme.c | 474 -- openair-cn/S1AP/s1ap_mme.h | 185 - openair-cn/S1AP/s1ap_mme_decoder.c | 297 -- openair-cn/S1AP/s1ap_mme_decoder.h | 39 - openair-cn/S1AP/s1ap_mme_encoder.c | 266 - openair-cn/S1AP/s1ap_mme_encoder.h | 38 - openair-cn/S1AP/s1ap_mme_handlers.c | 1212 ----- openair-cn/S1AP/s1ap_mme_handlers.h | 93 - openair-cn/S1AP/s1ap_mme_itti_messaging.c | 88 - openair-cn/S1AP/s1ap_mme_itti_messaging.h | 151 - openair-cn/S1AP/s1ap_mme_nas_procedures.c | 765 --- openair-cn/S1AP/s1ap_mme_nas_procedures.h | 74 - openair-cn/S1AP/s1ap_mme_retransmission.c | 150 - openair-cn/S1AP/s1ap_mme_retransmission.h | 51 - openair-cn/S1AP/s1ap_mme_ta.c | 160 - openair-cn/S1AP/s1ap_mme_ta.h | 44 - openair-cn/S6A/COPYING | 674 --- openair-cn/S6A/Makefile.am | 52 - openair-cn/S6A/freediameter/README.txt | 15 - .../S6A/freediameter/freediameter-1.1.5.patch | 4296 ----------------- .../S6A/freediameter/freediameter-1.2.0.patch | 4245 ---------------- .../S6A/freediameter/install_freediameter.sh | 113 - openair-cn/S6A/freediameter/make_certs.sh | 64 - openair-cn/S6A/freediameter/s6a.conf | 61 - openair-cn/S6A/s6a_apn_conf.c | 28 - openair-cn/S6A/s6a_auth_info.c | 454 -- openair-cn/S6A/s6a_defs.h | 203 - openair-cn/S6A/s6a_dict.c | 182 - openair-cn/S6A/s6a_error.c | 129 - openair-cn/S6A/s6a_messages.h | 46 - openair-cn/S6A/s6a_peer.c | 149 - openair-cn/S6A/s6a_subscription_data.c | 446 -- openair-cn/S6A/s6a_task.c | 187 - openair-cn/S6A/s6a_up_loc.c | 317 -- openair-cn/SCTP/Makefile.am | 52 - openair-cn/SCTP/Makefile.eNB | 71 - openair-cn/SCTP/sctp_common.c | 56 +- openair-cn/SCTP/sctp_common.h | 56 +- openair-cn/SCTP/sctp_default_values.h | 56 +- openair-cn/SCTP/sctp_eNB_defs.h | 2 +- openair-cn/SCTP/sctp_eNB_itti_messaging.c | 2 +- openair-cn/SCTP/sctp_eNB_itti_messaging.h | 2 +- openair-cn/SCTP/sctp_eNB_task.c | 2 +- openair-cn/SCTP/sctp_eNB_task.h | 2 +- openair-cn/SCTP/sctp_itti_messaging.c | 85 - openair-cn/SCTP/sctp_itti_messaging.h | 41 - openair-cn/SCTP/sctp_primitives_client.c | 2 +- openair-cn/SCTP/sctp_primitives_client.h | 2 +- openair-cn/SCTP/sctp_primitives_server.c | 697 --- openair-cn/SCTP/sctp_primitives_server.h | 69 - openair-cn/SECU/Makefile.am | 48 - openair-cn/SECU/Makefile.eNB | 77 - openair-cn/SECU/kdf.c | 2 +- openair-cn/SECU/key_nas_deriver.c | 2 +- openair-cn/SECU/key_nas_encryption.c | 2 +- openair-cn/SECU/nas_stream_eea1.c | 2 +- openair-cn/SECU/nas_stream_eea2.c | 2 +- openair-cn/SECU/nas_stream_eia1.c | 2 +- openair-cn/SECU/nas_stream_eia2.c | 2 +- openair-cn/SECU/rijndael.h | 2 +- openair-cn/SECU/secu_defs.h | 2 +- openair-cn/SECU/snow3g.c | 2 +- openair-cn/SECU/snow3g.h | 2 +- openair-cn/SGW-LITE/COPYING | 674 --- openair-cn/SGW-LITE/Makefile.am | 53 - openair-cn/SGW-LITE/pgw_lite_paa.c | 188 - openair-cn/SGW-LITE/pgw_lite_paa.h | 44 - openair-cn/SGW-LITE/s11_causes.c | 96 - openair-cn/SGW-LITE/s11_causes.h | 51 - openair-cn/SGW-LITE/sgw_lite.h | 93 - .../SGW-LITE/sgw_lite_context_manager.c | 386 -- .../SGW-LITE/sgw_lite_context_manager.h | 241 - openair-cn/SGW-LITE/sgw_lite_defs.h | 59 - openair-cn/SGW-LITE/sgw_lite_handlers.c | 1237 ----- openair-cn/SGW-LITE/sgw_lite_handlers.h | 47 - openair-cn/SGW-LITE/sgw_lite_ie_defs.h | 641 --- openair-cn/SGW-LITE/sgw_lite_task.c | 229 - openair-cn/SGW-LITE/spgw_config.c | 601 --- openair-cn/SGW-LITE/spgw_config.h | 153 - openair-cn/TEST/EPC_TEST/generate_scenario.c | 2 +- openair-cn/TEST/Makefile.am | 2 +- openair-cn/TEST/oaisim_mme_client_test.c | 2 +- openair-cn/TEST/oaisim_mme_itti_test.c | 2 +- openair-cn/TEST/oaisim_mme_list_benchmark.c | 2 +- openair-cn/TEST/oaisim_mme_s1ap_test.c | 2 +- openair-cn/TEST/oaisim_mme_sctp_test.c | 2 +- openair-cn/TEST/oaisim_mme_test_s1c.c | 2 +- openair-cn/TEST/oaisim_mme_test_s1c.h | 2 +- openair-cn/TEST/oaisim_mme_test_s1c_s1ap.c | 2 +- openair-cn/TEST/oaisim_mme_test_s1c_s1ap.h | 2 +- .../TEST/oaisim_mme_test_s1c_scenario.c | 2 +- .../TEST/oaisim_mme_test_s1c_scenario.h | 2 +- .../TEST/oaisim_mme_test_s1c_scenario1.c | 2 +- openair-cn/TEST/test_aes128_cmac_encrypt.c | 2 +- openair-cn/TEST/test_aes128_ctr_decrypt.c | 2 +- openair-cn/TEST/test_aes128_ctr_encrypt.c | 2 +- openair-cn/TEST/test_kdf.c | 2 +- openair-cn/TEST/test_s1ap.c | 2 +- openair-cn/TEST/test_secu.c | 2 +- openair-cn/TEST/test_secu_kenb.c | 2 +- openair-cn/TEST/test_secu_knas.c | 2 +- openair-cn/TEST/test_secu_knas_encrypt_eea1.c | 2 +- openair-cn/TEST/test_secu_knas_encrypt_eea2.c | 2 +- openair-cn/TEST/test_secu_knas_encrypt_eia1.c | 2 +- openair-cn/TEST/test_secu_knas_encrypt_eia2.c | 2 +- openair-cn/TEST/test_secu_knas_stream_int.c | 2 +- openair-cn/UDP/Makefile.am | 45 - openair-cn/UDP/Makefile.eNB | 69 - openair-cn/UDP/udp_eNB_task.c | 2 +- openair-cn/UDP/udp_eNB_task.h | 2 +- openair-cn/UDP/udp_primitives_server.c | 457 -- openair-cn/UDP/udp_primitives_server.h | 45 - openair-cn/UTILS/CONF/COPYING | 674 --- openair-cn/UTILS/COPYING | 702 +-- openair-cn/UTILS/HASHTABLE/COPYING | 674 --- openair-cn/UTILS/HASHTABLE/Makefile.am | 29 +- openair-cn/UTILS/HASHTABLE/Makefile.eNB | 29 +- openair-cn/UTILS/HASHTABLE/hashtable.c | 28 + openair-cn/UTILS/HASHTABLE/hashtable.h | 31 + openair-cn/UTILS/HASHTABLE/obj_hashtable.c | 27 +- openair-cn/UTILS/HASHTABLE/obj_hashtable.h | 28 + openair-cn/UTILS/Makefile.am | 29 +- openair-cn/UTILS/conversions.c | 56 +- openair-cn/UTILS/conversions.h | 56 +- openair-cn/UTILS/enum_string.c | 56 +- openair-cn/UTILS/enum_string.h | 56 +- openair-cn/UTILS/log.c | 56 +- openair-cn/UTILS/log.h | 56 +- openair-cn/UTILS/mcc_mnc_itu.c | 56 +- openair-cn/UTILS/mcc_mnc_itu.h | 56 +- openair-cn/UTILS/mme_config.c | 56 +- openair-cn/UTILS/mme_config.h | 56 +- openair-cn/UTILS/mme_default_values.h | 56 +- openair-cn/autogen.sh | 8 - openair-cn/configure.ac | 427 -- openair-cn/cppcheck.sh | 2 - openair1/MAC_INTERFACE/defs.h | 2 +- openair1/MAC_INTERFACE/extern.h | 2 +- openair1/MAC_INTERFACE/init.c | 2 +- openair1/MAC_INTERFACE/register.c | 2 +- openair1/MAC_INTERFACE/vars.h | 2 +- openair1/PHY/CODING/3gpplte.c | 2 +- openair1/PHY/CODING/3gpplte_sse.c | 2 +- openair1/PHY/CODING/3gpplte_turbo_decoder.c | 2 +- .../PHY/CODING/3gpplte_turbo_decoder_sse.c | 2 +- .../CODING/3gpplte_turbo_decoder_sse_16bit.c | 2 +- .../CODING/3gpplte_turbo_decoder_sse_8bit.c | 2 +- openair1/PHY/CODING/TESTBENCH/ltetest.c | 2 +- openair1/PHY/CODING/TESTBENCH/pdcch_test.c | 2 +- openair1/PHY/CODING/TESTBENCH/viterbi_test.c | 2 +- openair1/PHY/CODING/ccoding_byte.c | 2 +- openair1/PHY/CODING/ccoding_byte_lte.c | 2 +- openair1/PHY/CODING/crc_byte.c | 2 +- openair1/PHY/CODING/defs.h | 2 +- openair1/PHY/CODING/extern.h | 2 +- openair1/PHY/CODING/extern_3GPPinterleaver.h | 2 +- openair1/PHY/CODING/lte_interleaver.h | 2 +- openair1/PHY/CODING/lte_interleaver2.h | 2 +- openair1/PHY/CODING/lte_interleaver_inline.h | 2 +- openair1/PHY/CODING/lte_rate_matching.c | 2 +- openair1/PHY/CODING/lte_segmentation.c | 2 +- openair1/PHY/CODING/rate_matching.c | 2 +- openair1/PHY/CODING/scrambler.h | 2 +- openair1/PHY/CODING/vars.h | 2 +- openair1/PHY/CODING/viterbi.c | 2 +- openair1/PHY/CODING/viterbi_lte.c | 2 +- openair1/PHY/INIT/defs.h | 2 +- openair1/PHY/INIT/extern.h | 2 +- openair1/PHY/INIT/init_top.c | 2 +- openair1/PHY/INIT/lte_init.c | 2 +- openair1/PHY/INIT/lte_parms.c | 2 +- openair1/PHY/INIT/vars.h | 2 +- openair1/PHY/LTE_ESTIMATION/adjust_gain.c | 2 +- openair1/PHY/LTE_ESTIMATION/defs.h | 2 +- openair1/PHY/LTE_ESTIMATION/extern.h | 2 +- openair1/PHY/LTE_ESTIMATION/filt96_32.h | 2 +- .../PHY/LTE_ESTIMATION/freq_equalization.c | 2 +- openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c | 2 +- .../lte_dl_channel_estimation.c | 2 +- .../lte_dl_channel_estimation_emos.c | 2 +- .../lte_dl_mbsfn_channel_estimation.c | 2 +- .../PHY/LTE_ESTIMATION/lte_eNB_measurements.c | 2 +- .../PHY/LTE_ESTIMATION/lte_est_freq_offset.c | 2 +- openair1/PHY/LTE_ESTIMATION/lte_sync_time.c | 2 +- .../PHY/LTE_ESTIMATION/lte_sync_timefreq.c | 2 +- .../PHY/LTE_ESTIMATION/lte_ue_measurements.c | 2 +- .../lte_ul_channel_estimation.c | 2 +- openair1/PHY/LTE_ESTIMATION/pss6144.h | 2 +- openair1/PHY/LTE_ESTIMATION/vars.h | 2 +- openair1/PHY/LTE_REFSIG/defs.h | 2 +- openair1/PHY/LTE_REFSIG/lte_dl_cell_spec.c | 2 +- openair1/PHY/LTE_REFSIG/lte_dl_mbsfn.c | 2 +- openair1/PHY/LTE_REFSIG/lte_dl_uespec.c | 2 +- openair1/PHY/LTE_REFSIG/lte_gold.c | 2 +- openair1/PHY/LTE_REFSIG/lte_gold_mbsfn.c | 2 +- openair1/PHY/LTE_REFSIG/lte_ul_ref.c | 2 +- openair1/PHY/LTE_REFSIG/mod_table.h | 2 +- openair1/PHY/LTE_REFSIG/primary_synch.h | 2 +- openair1/PHY/LTE_TRANSPORT/dci.c | 2 +- openair1/PHY/LTE_TRANSPORT/dci.h | 2 +- openair1/PHY/LTE_TRANSPORT/dci_tools.c | 2 +- openair1/PHY/LTE_TRANSPORT/defs.h | 2 +- openair1/PHY/LTE_TRANSPORT/dlsch_coding.c | 2 +- openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c | 2 +- .../PHY/LTE_TRANSPORT/dlsch_demodulation.c | 2 +- .../PHY/LTE_TRANSPORT/dlsch_llr_computation.c | 2 +- openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c | 2 +- openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c | 2 +- openair1/PHY/LTE_TRANSPORT/dlsch_tbs.h | 2 +- openair1/PHY/LTE_TRANSPORT/dlsch_tbs_full.h | 2 +- openair1/PHY/LTE_TRANSPORT/drs_modulation.c | 2 +- openair1/PHY/LTE_TRANSPORT/extern.h | 2 +- openair1/PHY/LTE_TRANSPORT/group_hopping.c | 2 +- openair1/PHY/LTE_TRANSPORT/initial_sync.c | 2 +- openair1/PHY/LTE_TRANSPORT/lte_mcs.c | 2 +- openair1/PHY/LTE_TRANSPORT/mcs_tbs_tools.h | 2 +- openair1/PHY/LTE_TRANSPORT/pbch.c | 2 +- openair1/PHY/LTE_TRANSPORT/pcfich.c | 2 +- openair1/PHY/LTE_TRANSPORT/phich.c | 2 +- openair1/PHY/LTE_TRANSPORT/pilots.c | 2 +- openair1/PHY/LTE_TRANSPORT/pilots_mbsfn.c | 2 +- openair1/PHY/LTE_TRANSPORT/pmch.c | 2 +- openair1/PHY/LTE_TRANSPORT/power_control.c | 2 +- openair1/PHY/LTE_TRANSPORT/prach.c | 2 +- openair1/PHY/LTE_TRANSPORT/prach.h | 2 +- openair1/PHY/LTE_TRANSPORT/print_stats.c | 2 +- openair1/PHY/LTE_TRANSPORT/proto.h | 2 +- openair1/PHY/LTE_TRANSPORT/pss.c | 2 +- openair1/PHY/LTE_TRANSPORT/pucch.c | 2 +- openair1/PHY/LTE_TRANSPORT/rar_tools.c | 2 +- openair1/PHY/LTE_TRANSPORT/srs_modulation.c | 2 +- openair1/PHY/LTE_TRANSPORT/sss.c | 2 +- openair1/PHY/LTE_TRANSPORT/sss.h | 2 +- openair1/PHY/LTE_TRANSPORT/uci.h | 2 +- openair1/PHY/LTE_TRANSPORT/uci_tools.c | 2 +- openair1/PHY/LTE_TRANSPORT/ulsch_coding.c | 2 +- openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c | 2 +- .../PHY/LTE_TRANSPORT/ulsch_demodulation.c | 2 +- openair1/PHY/LTE_TRANSPORT/ulsch_modulation.c | 2 +- openair1/PHY/LTE_TRANSPORT/vars.h | 2 +- openair1/PHY/MODULATION/defs.h | 2 +- openair1/PHY/MODULATION/extern.h | 2 +- openair1/PHY/MODULATION/kHz_7_5.h | 2 +- openair1/PHY/MODULATION/ofdm_mod.c | 2 +- openair1/PHY/MODULATION/prach625Hz.h | 2 +- openair1/PHY/MODULATION/slot_fep.c | 2 +- openair1/PHY/MODULATION/slot_fep_mbsfn.c | 2 +- openair1/PHY/MODULATION/slot_fep_ul.c | 2 +- openair1/PHY/MODULATION/ul_7_5_kHz.c | 2 +- openair1/PHY/MODULATION/vars.h | 2 +- openair1/PHY/TOOLS/8bit_rxdemux.c | 2 +- openair1/PHY/TOOLS/8bit_txmux.c | 2 +- openair1/PHY/TOOLS/angle.c | 2 +- openair1/PHY/TOOLS/cadd_sv.c | 2 +- openair1/PHY/TOOLS/cadd_vv.c | 2 +- openair1/PHY/TOOLS/cdot_prod.c | 2 +- openair1/PHY/TOOLS/cmult_mm.c | 2 +- openair1/PHY/TOOLS/cmult_sv.c | 2 +- openair1/PHY/TOOLS/cmult_vv.c | 2 +- openair1/PHY/TOOLS/cmult_vvh.c | 2 +- openair1/PHY/TOOLS/costable.h | 2 +- openair1/PHY/TOOLS/dB_routines.c | 2 +- openair1/PHY/TOOLS/dB_routines.h | 2 +- openair1/PHY/TOOLS/defs.h | 2 +- openair1/PHY/TOOLS/extern.h | 2 +- openair1/PHY/TOOLS/file_output.c | 2 +- openair1/PHY/TOOLS/invSqrt.c | 2 +- openair1/PHY/TOOLS/log2_approx.c | 2 +- openair1/PHY/TOOLS/lte_dfts.c | 2 +- openair1/PHY/TOOLS/lte_phy_scope.c | 2 +- openair1/PHY/TOOLS/lte_phy_scope.h | 2 +- openair1/PHY/TOOLS/lut.c | 2 +- openair1/PHY/TOOLS/memory_routines.c | 2 +- openair1/PHY/TOOLS/signal_energy.c | 2 +- openair1/PHY/TOOLS/smbv.c | 2 +- openair1/PHY/TOOLS/smbv.h | 2 +- openair1/PHY/TOOLS/sqrt.c | 2 +- openair1/PHY/TOOLS/time_meas.c | 2 +- openair1/PHY/TOOLS/time_meas.h | 2 +- openair1/PHY/TOOLS/twiddle12288.h | 2 +- openair1/PHY/TOOLS/twiddle1536.h | 2 +- openair1/PHY/TOOLS/twiddle24576.h | 2 +- openair1/PHY/TOOLS/twiddle6144.h | 2 +- openair1/PHY/TOOLS/vars.h | 2 +- openair1/PHY/defs.h | 2 +- openair1/PHY/extern.h | 2 +- openair1/PHY/impl_defs_lte.h | 2 +- openair1/PHY/impl_defs_top.h | 2 +- openair1/PHY/spec_defs.h | 2 +- openair1/PHY/spec_defs_top.h | 2 +- openair1/PHY/sse_intrin.h | 2 +- openair1/PHY/types.h | 2 +- openair1/PHY/vars.h | 2 +- openair1/SCHED/defs.h | 2 +- openair1/SCHED/extern.h | 2 +- openair1/SCHED/phy_procedures_emos.h | 2 +- openair1/SCHED/phy_procedures_lte_common.c | 2 +- openair1/SCHED/phy_procedures_lte_eNb.c | 2 +- openair1/SCHED/phy_procedures_lte_ue.c | 2 +- openair1/SCHED/pucch_pc.c | 2 +- openair1/SCHED/pusch_pc.c | 2 +- openair1/SCHED/rt_compat.h | 2 +- openair1/SCHED/vars.h | 2 +- .../ETH_TRANSPORT/bypass_session_layer.c | 2 +- openair1/SIMULATION/ETH_TRANSPORT/defs.h | 2 +- .../SIMULATION/ETH_TRANSPORT/emu_transport.c | 2 +- openair1/SIMULATION/ETH_TRANSPORT/extern.h | 2 +- .../SIMULATION/ETH_TRANSPORT/multicast_link.c | 2 +- .../SIMULATION/ETH_TRANSPORT/multicast_link.h | 2 +- .../SIMULATION/ETH_TRANSPORT/netlink_init.c | 2 +- openair1/SIMULATION/ETH_TRANSPORT/pgm_link.c | 2 +- openair1/SIMULATION/ETH_TRANSPORT/pgm_link.h | 2 +- openair1/SIMULATION/ETH_TRANSPORT/proto.h | 2 +- openair1/SIMULATION/ETH_TRANSPORT/socket.c | 2 +- openair1/SIMULATION/ETH_TRANSPORT/socket.h | 2 +- openair1/SIMULATION/ETH_TRANSPORT/vars.h | 2 +- .../SIMULATION/LTE_PHY/LTE_Configuration.c | 2 +- .../SIMULATION/LTE_PHY/LTE_Configuration.h | 2 +- openair1/SIMULATION/LTE_PHY/dlsim.c | 2 +- openair1/SIMULATION/LTE_PHY/framegen.c | 2 +- openair1/SIMULATION/LTE_PHY/gpib_send.c | 2 +- openair1/SIMULATION/LTE_PHY/gpib_send.h | 2 +- openair1/SIMULATION/LTE_PHY/mbmssim.c | 2 +- openair1/SIMULATION/LTE_PHY/pbchsim.c | 2 +- openair1/SIMULATION/LTE_PHY/pdcchsim.c | 2 +- openair1/SIMULATION/LTE_PHY/prachsim.c | 2 +- .../SIMULATION/LTE_PHY/pucchsignalgegerator.h | 2 +- .../SIMULATION/LTE_PHY/pucchsignalgenerator.c | 2 +- openair1/SIMULATION/LTE_PHY/pucchsim.c | 2 +- openair1/SIMULATION/LTE_PHY/scansim.c | 2 +- openair1/SIMULATION/LTE_PHY/signalanalyzer.c | 2 +- openair1/SIMULATION/LTE_PHY/signalanalyzer.h | 2 +- openair1/SIMULATION/LTE_PHY/syncsim.c | 2 +- openair1/SIMULATION/LTE_PHY/test.c | 2 +- .../SIMULATION/LTE_PHY/ulsignalgenerator.c | 2 +- .../SIMULATION/LTE_PHY/ulsignalgenerator.h | 2 +- openair1/SIMULATION/LTE_PHY/ulsim.c | 2 +- openair1/SIMULATION/LTE_PHY/ulsim2.c | 2 +- openair1/SIMULATION/RF/adc.c | 2 +- openair1/SIMULATION/RF/dac.c | 2 +- openair1/SIMULATION/RF/defs.h | 2 +- openair1/SIMULATION/RF/rf.c | 2 +- openair1/SIMULATION/TOOLS/abstraction.c | 2 +- openair1/SIMULATION/TOOLS/ch_desc_proto.c | 2 +- openair1/SIMULATION/TOOLS/defs.h | 2 +- openair1/SIMULATION/TOOLS/gauss.c | 2 +- openair1/SIMULATION/TOOLS/llr_quantization.c | 2 +- openair1/SIMULATION/TOOLS/multipath_channel.c | 2 +- .../SIMULATION/TOOLS/multipath_tv_channel.c | 2 +- openair1/SIMULATION/TOOLS/random_channel.c | 2 +- openair1/SIMULATION/TOOLS/rangen_double.c | 2 +- openair1/SIMULATION/TOOLS/scm_corrmat.h | 2 +- openair1/SIMULATION/TOOLS/taus.c | 2 +- openair2/COMMON/as_message.h | 55 +- openair2/COMMON/commonDef.h | 56 +- openair2/COMMON/gtpv1_u_messages_def.h | 2 +- openair2/COMMON/gtpv1_u_messages_types.h | 2 +- openair2/COMMON/intertask_interface_conf.h | 2 +- openair2/COMMON/mac_messages_def.h | 2 +- openair2/COMMON/mac_messages_types.h | 2 +- openair2/COMMON/mac_primitives.h | 2 +- openair2/COMMON/mac_rlc_primitives.h | 2 +- openair2/COMMON/mac_rrc_primitives.h | 2 +- openair2/COMMON/messages_def.h | 2 +- openair2/COMMON/messages_types.h | 2 +- openair2/COMMON/nas_messages_def.h | 2 +- openair2/COMMON/nas_messages_types.h | 2 +- openair2/COMMON/networkDef.h | 56 +- openair2/COMMON/openair_defs.h | 2 +- openair2/COMMON/openair_types.h | 2 +- openair2/COMMON/pdcp_messages_def.h | 2 +- openair2/COMMON/pdcp_messages_types.h | 2 +- openair2/COMMON/phy_messages_def.h | 2 +- openair2/COMMON/phy_messages_types.h | 2 +- openair2/COMMON/platform_constants.h | 2 +- openair2/COMMON/platform_types.h | 2 +- openair2/COMMON/ral_messages_def.h | 2 +- openair2/COMMON/ral_messages_types.h | 2 +- openair2/COMMON/rlc_messages_def.h | 2 +- openair2/COMMON/rlc_messages_types.h | 2 +- openair2/COMMON/rrc_messages_def.h | 2 +- openair2/COMMON/rrc_messages_types.h | 2 +- openair2/COMMON/rrm_config_structs.h | 2 +- openair2/COMMON/rrm_constants.h | 2 +- openair2/COMMON/rtos_header.h | 2 +- openair2/COMMON/s1ap_messages_def.h | 2 +- openair2/COMMON/s1ap_messages_types.h | 2 +- openair2/COMMON/sctp_messages_def.h | 2 +- openair2/COMMON/sctp_messages_types.h | 2 +- openair2/COMMON/tasks_def.h | 2 +- openair2/COMMON/udp_messages_def.h | 2 +- openair2/COMMON/udp_messages_types.h | 2 +- openair2/COMMON/x2ap_messages_def.h | 2 +- openair2/COMMON/x2ap_messages_types.h | 2 +- openair2/ENB_APP/enb_app.c | 2 +- openair2/ENB_APP/enb_app.h | 2 +- openair2/ENB_APP/enb_config.c | 2 +- openair2/ENB_APP/enb_config.h | 2 +- openair2/LAYER2/MAC/config.c | 2 +- openair2/LAYER2/MAC/defs.h | 2 +- openair2/LAYER2/MAC/eNB_scheduler.c | 2 +- openair2/LAYER2/MAC/eNB_scheduler_RA.c | 2 +- openair2/LAYER2/MAC/eNB_scheduler_bch.c | 2 +- openair2/LAYER2/MAC/eNB_scheduler_dlsch.c | 2 +- openair2/LAYER2/MAC/eNB_scheduler_mch.c | 2 +- .../LAYER2/MAC/eNB_scheduler_primitives.c | 2 +- openair2/LAYER2/MAC/eNB_scheduler_ulsch.c | 2 +- openair2/LAYER2/MAC/extern.h | 2 +- openair2/LAYER2/MAC/l1_helpers.c | 2 +- openair2/LAYER2/MAC/lte_transport_init.c | 2 +- openair2/LAYER2/MAC/main.c | 2 +- openair2/LAYER2/MAC/openair2_proc.c | 2 +- openair2/LAYER2/MAC/pre_processor.c | 2 +- openair2/LAYER2/MAC/proto.h | 2 +- openair2/LAYER2/MAC/ra_procedures.c | 2 +- openair2/LAYER2/MAC/rar_tools.c | 2 +- openair2/LAYER2/MAC/ue_procedures.c | 2 +- openair2/LAYER2/MAC/vars.h | 2 +- openair2/LAYER2/PDCP_v10.1.0/pdcp.c | 2 +- openair2/LAYER2/PDCP_v10.1.0/pdcp.h | 2 +- .../PDCP_v10.1.0/pdcp_control_primitive.c | 2 +- .../pdcp_control_primitives_proto_extern.h | 2 +- openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c | 2 +- openair2/LAYER2/PDCP_v10.1.0/pdcp_netlink.c | 2 +- .../LAYER2/PDCP_v10.1.0/pdcp_primitives.c | 2 +- .../LAYER2/PDCP_v10.1.0/pdcp_primitives.h | 2 +- .../LAYER2/PDCP_v10.1.0/pdcp_proto_extern.h | 2 +- openair2/LAYER2/PDCP_v10.1.0/pdcp_security.c | 2 +- .../PDCP_v10.1.0/pdcp_sequence_manager.c | 2 +- .../PDCP_v10.1.0/pdcp_sequence_manager.h | 2 +- openair2/LAYER2/PDCP_v10.1.0/pdcp_thread.c | 2 +- openair2/LAYER2/PDCP_v10.1.0/pdcp_util.c | 2 +- openair2/LAYER2/PDCP_v10.1.0/pdcp_util.h | 2 +- openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c | 2 +- openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.h | 2 +- .../LAYER2/RLC/AM_v9.3.0/rlc_am_constants.h | 2 +- openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_entity.h | 2 +- openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.c | 2 +- openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.h | 2 +- openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c | 2 +- openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.h | 2 +- .../RLC/AM_v9.3.0/rlc_am_proto_extern.h | 2 +- .../LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.c | 2 +- .../LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.h | 2 +- .../LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.c | 2 +- .../LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.h | 2 +- .../LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.c | 2 +- .../LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.h | 2 +- .../LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.c | 2 +- .../LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.h | 2 +- .../LAYER2/RLC/AM_v9.3.0/rlc_am_segment.c | 2 +- .../LAYER2/RLC/AM_v9.3.0/rlc_am_segment.h | 2 +- .../RLC/AM_v9.3.0/rlc_am_segments_holes.c | 2 +- .../RLC/AM_v9.3.0/rlc_am_segments_holes.h | 2 +- .../RLC/AM_v9.3.0/rlc_am_status_report.c | 2 +- .../RLC/AM_v9.3.0/rlc_am_status_report.h | 2 +- .../LAYER2/RLC/AM_v9.3.0/rlc_am_structs.h | 2 +- openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.c | 2 +- openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.h | 2 +- .../AM_v9.3.0/rlc_am_timer_poll_retransmit.c | 2 +- .../AM_v9.3.0/rlc_am_timer_poll_retransmit.h | 2 +- .../RLC/AM_v9.3.0/rlc_am_timer_reordering.c | 2 +- .../RLC/AM_v9.3.0/rlc_am_timer_reordering.h | 2 +- .../AM_v9.3.0/rlc_am_timer_status_prohibit.c | 2 +- .../AM_v9.3.0/rlc_am_timer_status_prohibit.h | 2 +- .../LAYER2/RLC/AM_v9.3.0/rlc_am_windows.c | 2 +- .../LAYER2/RLC/AM_v9.3.0/rlc_am_windows.h | 2 +- openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.c | 2 +- openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.h | 2 +- openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_entity.h | 2 +- openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.c | 2 +- openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.h | 2 +- .../LAYER2/RLC/TM_v9.3.0/rlc_tm_structs.h | 2 +- openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.c | 2 +- openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.h | 2 +- .../LAYER2/RLC/UM_v9.3.0/rlc_um_constants.h | 2 +- .../RLC/UM_v9.3.0/rlc_um_control_primitives.c | 2 +- .../RLC/UM_v9.3.0/rlc_um_control_primitives.h | 2 +- openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.c | 2 +- openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.h | 2 +- openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_entity.h | 2 +- openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_fsm.c | 2 +- openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_fsm.h | 2 +- .../LAYER2/RLC/UM_v9.3.0/rlc_um_reassembly.c | 2 +- .../LAYER2/RLC/UM_v9.3.0/rlc_um_reassembly.h | 2 +- .../LAYER2/RLC/UM_v9.3.0/rlc_um_receiver.c | 2 +- .../LAYER2/RLC/UM_v9.3.0/rlc_um_receiver.h | 2 +- .../LAYER2/RLC/UM_v9.3.0/rlc_um_segment.c | 2 +- .../LAYER2/RLC/UM_v9.3.0/rlc_um_segment.h | 2 +- .../LAYER2/RLC/UM_v9.3.0/rlc_um_structs.h | 2 +- openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.c | 2 +- openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.h | 2 +- .../RLC/UM_v9.3.0/rlc_um_very_simple_test.c | 2 +- .../RLC/UM_v9.3.0/rlc_um_very_simple_test.h | 2 +- openair2/LAYER2/RLC/rlc.c | 2 +- openair2/LAYER2/RLC/rlc.h | 2 +- openair2/LAYER2/RLC/rlc_def.h | 2 +- openair2/LAYER2/RLC/rlc_def_lte.h | 2 +- openair2/LAYER2/RLC/rlc_mac.c | 2 +- openair2/LAYER2/RLC/rlc_mpls.c | 2 +- openair2/LAYER2/RLC/rlc_primitives.h | 2 +- openair2/LAYER2/RLC/rlc_rrc.c | 2 +- openair2/LAYER2/layer2_top.c | 2 +- openair2/LAYER2/openair2_proc.c | 2 +- openair2/LAYER2/register.c | 2 +- openair2/LAYER2/register.h | 2 +- openair2/Makefile | 2 +- openair2/NAS/nas_ue_task.h | 2 +- .../NETWORK_DRIVER/LITE/RB_TOOL/rb_tool.c | 2 +- openair2/NETWORK_DRIVER/LITE/classifier.c | 2 +- openair2/NETWORK_DRIVER/LITE/common.c | 2 +- openair2/NETWORK_DRIVER/LITE/constant.h | 2 +- openair2/NETWORK_DRIVER/LITE/device.c | 2 +- openair2/NETWORK_DRIVER/LITE/ioctl.c | 2 +- openair2/NETWORK_DRIVER/LITE/ioctl.h | 2 +- openair2/NETWORK_DRIVER/LITE/local.h | 2 +- openair2/NETWORK_DRIVER/LITE/netlink.c | 2 +- openair2/NETWORK_DRIVER/LITE/proto_extern.h | 2 +- openair2/NETWORK_DRIVER/LITE/sap.h | 2 +- openair2/NETWORK_DRIVER/LITE/tool.c | 2 +- .../NETWORK_DRIVER/MESH/RB_TOOL/rb_tool.c | 2 +- openair2/NETWORK_DRIVER/MESH/classifier.c | 2 +- openair2/NETWORK_DRIVER/MESH/common.c | 2 +- openair2/NETWORK_DRIVER/MESH/constant.h | 2 +- openair2/NETWORK_DRIVER/MESH/device.c | 2 +- openair2/NETWORK_DRIVER/MESH/ioctl.c | 2 +- openair2/NETWORK_DRIVER/MESH/local.h | 2 +- openair2/NETWORK_DRIVER/MESH/mesh.c | 2 +- openair2/NETWORK_DRIVER/MESH/netlink.c | 2 +- openair2/NETWORK_DRIVER/MESH/proto_extern.h | 2 +- .../NETWORK_DRIVER/MESH/rrc_nas_primitives.h | 2 +- openair2/NETWORK_DRIVER/MESH/sap.h | 2 +- openair2/NETWORK_DRIVER/MESH/tool.c | 2 +- openair2/NETWORK_DRIVER/UE_IP/common.c | 2 +- openair2/NETWORK_DRIVER/UE_IP/constant.h | 2 +- openair2/NETWORK_DRIVER/UE_IP/device.c | 2 +- openair2/NETWORK_DRIVER/UE_IP/local.h | 2 +- openair2/NETWORK_DRIVER/UE_IP/netlink.c | 2 +- openair2/NETWORK_DRIVER/UE_IP/proto_extern.h | 2 +- openair2/NETWORK_DRIVER/UE_IP/sap.h | 2 +- openair2/PHY_INTERFACE/defs.h | 2 +- openair2/PHY_INTERFACE/extern.h | 2 +- openair2/PHY_INTERFACE/mac_phy_primitives.c | 2 +- openair2/PHY_INTERFACE/mac_phy_primitives.h | 2 +- openair2/PHY_INTERFACE/vars.h | 2 +- .../L2_INTERFACE/openair_rrc_L2_interface.c | 2 +- .../L2_INTERFACE/openair_rrc_L2_interface.h | 2 +- openair2/RRC/LITE/L2_interface.c | 2 +- openair2/RRC/LITE/MESSAGES/asn1_msg.c | 2 +- openair2/RRC/LITE/MESSAGES/asn1_msg.h | 2 +- openair2/RRC/LITE/defs.h | 2 +- openair2/RRC/LITE/extern.h | 2 +- openair2/RRC/LITE/proto.h | 2 +- openair2/RRC/LITE/rrc_2_rrm_msg.c | 2 +- openair2/RRC/LITE/rrc_UE.c | 2 +- openair2/RRC/LITE/rrc_UE_ral.c | 2 +- openair2/RRC/LITE/rrc_UE_ral.h | 2 +- openair2/RRC/LITE/rrc_common.c | 2 +- openair2/RRC/LITE/rrc_config.c | 2 +- openair2/RRC/LITE/rrc_eNB.c | 2 +- openair2/RRC/LITE/rrc_eNB_GTPV1U.c | 2 +- openair2/RRC/LITE/rrc_eNB_GTPV1U.h | 2 +- openair2/RRC/LITE/rrc_eNB_S1AP.c | 2 +- openair2/RRC/LITE/rrc_eNB_S1AP.h | 2 +- openair2/RRC/LITE/rrc_eNB_UE_context.c | 2 +- openair2/RRC/LITE/rrc_eNB_UE_context.h | 2 +- openair2/RRC/LITE/rrc_eNB_ral.c | 2 +- openair2/RRC/LITE/rrc_eNB_ral.h | 2 +- openair2/RRC/LITE/rrc_rrm_interface.c | 2 +- openair2/RRC/LITE/rrc_rrm_interface.h | 2 +- openair2/RRC/LITE/rrc_types.h | 2 +- openair2/RRC/LITE/rrm_2_rrc_msg.c | 2 +- openair2/RRC/LITE/utils.c | 2 +- openair2/RRC/LITE/vars.h | 2 +- openair2/RRC/NAS/nas_config.c | 2 +- openair2/RRC/NAS/nas_config.h | 2 +- openair2/RRC/NAS/rb_config.c | 2 +- openair2/RRC/NAS/rb_config.h | 2 +- openair2/RRM_4_RRC_LITE/src/platform.h | 2 +- .../RRM_4_RRC_LITE/src/platform_constants.h | 2 +- .../RRM_4_RRC_LITE/src/platform_defines.h | 2 +- .../src/radio_resources/Asn1Utils.cpp | 2 +- .../src/radio_resources/Asn1Utils.h | 2 +- .../src/radio_resources/Command.cpp | 2 +- .../src/radio_resources/Command.h | 2 +- .../src/radio_resources/DataRadioBearer.cpp | 2 +- .../src/radio_resources/DataRadioBearer.h | 2 +- .../src/radio_resources/ENodeB.cpp | 2 +- .../src/radio_resources/ENodeB.h | 2 +- .../src/radio_resources/Exceptions.h | 2 +- .../src/radio_resources/LogicalChannel.cpp | 2 +- .../src/radio_resources/LogicalChannel.h | 2 +- .../src/radio_resources/Mobile.cpp | 2 +- .../src/radio_resources/Mobile.h | 2 +- .../src/radio_resources/RadioBearer.cpp | 2 +- .../src/radio_resources/RadioBearer.h | 2 +- .../src/radio_resources/RadioResources.cpp | 2 +- .../src/radio_resources/RadioResources.h | 2 +- .../radio_resources/SignallingRadioBearer.cpp | 2 +- .../radio_resources/SignallingRadioBearer.h | 2 +- .../src/radio_resources/Transaction.cpp | 2 +- .../src/radio_resources/Transaction.h | 2 +- .../src/radio_resources/Transactions.cpp | 2 +- .../src/radio_resources/Transactions.h | 2 +- openair2/RRM_4_RRC_LITE/src/rrm.cpp | 2 +- openair2/UTIL/AT_COMMANDS/parser.c | 2 +- openair2/UTIL/AT_COMMANDS/parser.h | 2 +- openair2/UTIL/BIGPHYS/bigphys.c | 2 +- openair2/UTIL/BIGPHYS/defs.h | 2 +- openair2/UTIL/CLI/cli.c | 2 +- openair2/UTIL/CLI/cli.h | 2 +- openair2/UTIL/CLI/cli_cmd.c | 2 +- openair2/UTIL/CLI/cli_if.h | 2 +- openair2/UTIL/CLI/cli_server.c | 2 +- openair2/UTIL/FIFO/pad_list.c | 2 +- openair2/UTIL/FIFO/pad_list.h | 2 +- openair2/UTIL/FIFO/types.h | 2 +- openair2/UTIL/LISTS/list.c | 2 +- openair2/UTIL/LOG/log.c | 2 +- openair2/UTIL/LOG/log.h | 2 +- openair2/UTIL/LOG/log_extern.h | 2 +- openair2/UTIL/LOG/log_if.h | 2 +- openair2/UTIL/LOG/vcd_signal_dumper.c | 2 +- openair2/UTIL/LOG/vcd_signal_dumper.h | 2 +- openair2/UTIL/MATH/crc_byte.c | 2 +- openair2/UTIL/MATH/oml.c | 2 +- openair2/UTIL/MATH/oml.h | 2 +- openair2/UTIL/MATH/random.c | 2 +- openair2/UTIL/MATH/random_proto_extern.h | 2 +- openair2/UTIL/MATH/taus.c | 2 +- openair2/UTIL/MEM/mem_block.c | 2 +- openair2/UTIL/MEM/mem_block.h | 2 +- openair2/UTIL/MEM/mem_mngt.c | 2 +- openair2/UTIL/MEM/mem_mngt_proto_extern.h | 2 +- openair2/UTIL/MEM/mem_pool.h | 2 +- openair2/UTIL/OCG/OCG.c | 2 +- openair2/UTIL/OCG/OCG.h | 2 +- openair2/UTIL/OCG/OCG_call_emu.h | 2 +- openair2/UTIL/OCG/OCG_config_mobi.c | 2 +- openair2/UTIL/OCG/OCG_config_mobi.h | 2 +- openair2/UTIL/OCG/OCG_create_dir.c | 2 +- openair2/UTIL/OCG/OCG_create_dir.h | 2 +- openair2/UTIL/OCG/OCG_detect_file.c | 2 +- openair2/UTIL/OCG/OCG_detect_file.h | 2 +- openair2/UTIL/OCG/OCG_extern.h | 2 +- openair2/UTIL/OCG/OCG_generate_report.c | 2 +- openair2/UTIL/OCG/OCG_generate_report.h | 2 +- openair2/UTIL/OCG/OCG_get_opt.c | 2 +- openair2/UTIL/OCG/OCG_get_opt.h | 2 +- openair2/UTIL/OCG/OCG_if.h | 2 +- openair2/UTIL/OCG/OCG_parse_XML.c | 2 +- openair2/UTIL/OCG/OCG_parse_XML.h | 2 +- openair2/UTIL/OCG/OCG_parse_filename.c | 2 +- openair2/UTIL/OCG/OCG_parse_filename.h | 2 +- openair2/UTIL/OCG/OCG_save_XML.c | 2 +- openair2/UTIL/OCG/OCG_save_XML.h | 2 +- openair2/UTIL/OCG/OCG_vars.h | 2 +- openair2/UTIL/OMG/TraCIConstants.h | 2 +- openair2/UTIL/OMG/client_traci_OMG.c | 2 +- openair2/UTIL/OMG/client_traci_OMG.h | 2 +- openair2/UTIL/OMG/common.c | 2 +- openair2/UTIL/OMG/defs.h | 2 +- openair2/UTIL/OMG/grid.c | 2 +- openair2/UTIL/OMG/grid.h | 2 +- openair2/UTIL/OMG/id_manager.c | 2 +- openair2/UTIL/OMG/id_manager.h | 2 +- openair2/UTIL/OMG/job.c | 2 +- openair2/UTIL/OMG/mobility_parser.c | 2 +- openair2/UTIL/OMG/mobility_parser.h | 2 +- openair2/UTIL/OMG/omg.c | 2 +- openair2/UTIL/OMG/omg.h | 2 +- openair2/UTIL/OMG/omg_constants.h | 2 +- openair2/UTIL/OMG/omg_hashtable.c | 2 +- openair2/UTIL/OMG/omg_hashtable.h | 2 +- openair2/UTIL/OMG/omg_vars.h | 2 +- openair2/UTIL/OMG/rwalk.c | 2 +- openair2/UTIL/OMG/rwalk.h | 2 +- openair2/UTIL/OMG/rwp.c | 2 +- openair2/UTIL/OMG/rwp.h | 2 +- openair2/UTIL/OMG/socket_traci_OMG.c | 2 +- openair2/UTIL/OMG/socket_traci_OMG.h | 2 +- openair2/UTIL/OMG/static.c | 2 +- openair2/UTIL/OMG/static.h | 2 +- openair2/UTIL/OMG/steadystaterwp.c | 2 +- openair2/UTIL/OMG/steadystaterwp.h | 2 +- openair2/UTIL/OMG/storage_traci_OMG.c | 2 +- openair2/UTIL/OMG/storage_traci_OMG.h | 2 +- openair2/UTIL/OMG/sumo.c | 2 +- openair2/UTIL/OMG/sumo.h | 2 +- openair2/UTIL/OMG/trace.c | 2 +- openair2/UTIL/OMG/trace.h | 2 +- openair2/UTIL/OMG/trace_hashtable.c | 2 +- openair2/UTIL/OMG/trace_hashtable.h | 2 +- openair2/UTIL/OPT/mac_pcap.h | 2 +- openair2/UTIL/OPT/opt.h | 2 +- openair2/UTIL/OPT/probe.c | 2 +- openair2/UTIL/OPT/socket_sender.c | 2 +- openair2/UTIL/OPT/vars.h | 2 +- openair2/UTIL/OSA/osa_defs.h | 2 +- openair2/UTIL/OSA/osa_internal.h | 2 +- openair2/UTIL/OSA/osa_key_deriver.c | 2 +- openair2/UTIL/OSA/osa_stream_eea.c | 2 +- openair2/UTIL/OSA/osa_stream_eia.c | 2 +- openair2/UTIL/OTG/otg.c | 2 +- openair2/UTIL/OTG/otg.h | 2 +- openair2/UTIL/OTG/otg_config.h | 2 +- openair2/UTIL/OTG/otg_defs.h | 2 +- openair2/UTIL/OTG/otg_externs.h | 2 +- openair2/UTIL/OTG/otg_form.c | 2 +- openair2/UTIL/OTG/otg_form.h | 2 +- openair2/UTIL/OTG/otg_kpi.c | 2 +- openair2/UTIL/OTG/otg_kpi.h | 2 +- openair2/UTIL/OTG/otg_models.c | 2 +- openair2/UTIL/OTG/otg_models.h | 2 +- openair2/UTIL/OTG/otg_rx.c | 2 +- openair2/UTIL/OTG/otg_rx.h | 2 +- openair2/UTIL/OTG/otg_rx_socket.c | 2 +- openair2/UTIL/OTG/otg_rx_socket.h | 2 +- openair2/UTIL/OTG/otg_tx.c | 2 +- openair2/UTIL/OTG/otg_tx.h | 2 +- openair2/UTIL/OTG/otg_tx_socket.c | 2 +- openair2/UTIL/OTG/otg_tx_socket.h | 2 +- openair2/UTIL/OTG/otg_vars.h | 2 +- openair2/UTIL/OTG/traffic_config.h | 2 +- openair2/UTIL/TIMER/umts_timer.c | 2 +- openair2/UTIL/TIMER/umts_timer.h | 2 +- openair2/UTIL/TIMER/umts_timer_proto_extern.h | 2 +- openair2/UTIL/TIMER/umts_timer_struct.h | 2 +- openair2/UTIL/TRACE/fifo_printf.c | 2 +- openair2/UTIL/TRACE/fifo_printf.h | 2 +- .../UTIL/TRACE/fifo_printf_proto_extern.h | 2 +- openair2/UTIL/TRACE/print.h | 2 +- openair2/X2AP/x2ap.c | 2 +- openair2/X2AP/x2ap.h | 2 +- openair2/X2AP/x2ap_common.c | 2 +- openair2/X2AP/x2ap_common.h | 2 +- .../ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c | 2 +- .../ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.h | 2 +- targets/ARCH/COMMON/common_lib.c | 2 +- targets/ARCH/COMMON/common_lib.h | 2 +- .../ETHERNET/USERSPACE/LIB/ethernet_lib.c | 2 +- .../ETHERNET/USERSPACE/LIB/ethernet_lib.h | 2 +- targets/ARCH/EXMIMO/DEFS/openair_device.h | 2 +- targets/ARCH/EXMIMO/DEFS/pcie_interface.h | 2 +- targets/ARCH/EXMIMO/DRIVER/eurecom/defs.h | 2 +- .../ARCH/EXMIMO/DRIVER/eurecom/exmimo_fw.c | 2 +- targets/ARCH/EXMIMO/DRIVER/eurecom/extern.h | 2 +- targets/ARCH/EXMIMO/DRIVER/eurecom/fileops.c | 2 +- targets/ARCH/EXMIMO/DRIVER/eurecom/irq.c | 2 +- .../ARCH/EXMIMO/DRIVER/eurecom/module_main.c | 2 +- targets/ARCH/EXMIMO/DRIVER/eurecom/vars.h | 2 +- targets/ARCH/EXMIMO/DRIVER/exmimo3/defs.h | 2 +- .../ARCH/EXMIMO/DRIVER/exmimo3/exmimo_fw.c | 2 +- targets/ARCH/EXMIMO/DRIVER/exmimo3/extern.h | 2 +- targets/ARCH/EXMIMO/DRIVER/exmimo3/fileops.c | 2 +- targets/ARCH/EXMIMO/DRIVER/exmimo3/irq.c | 2 +- .../ARCH/EXMIMO/DRIVER/exmimo3/module_main.c | 2 +- targets/ARCH/EXMIMO/DRIVER/exmimo3/vars.h | 2 +- .../EXMIMO/DRIVER/telecomparistech/em1_dev.c | 2 +- .../EXMIMO/DRIVER/telecomparistech/em1_drv.c | 2 +- .../EXMIMO/DRIVER/telecomparistech/em1_drv.h | 2 +- .../DRIVER/telecomparistech/em1_fifos.c | 2 +- .../DRIVER/telecomparistech/em1_ioctl.c | 2 +- .../EXMIMO/DRIVER/telecomparistech/em1_mmap.c | 2 +- .../EXMIMO/DRIVER/telecomparistech/em1_rw.c | 2 +- targets/ARCH/EXMIMO/USERSPACE/LIB/example.c | 2 +- .../ARCH/EXMIMO/USERSPACE/LIB/gain_control.c | 2 +- .../ARCH/EXMIMO/USERSPACE/LIB/gain_control.h | 2 +- .../ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c | 2 +- .../ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.h | 2 +- .../ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/elf.h | 2 +- .../EXMIMO/USERSPACE/OAI_FW_INIT/elftypes.h | 2 +- .../EXMIMO/USERSPACE/OAI_FW_INIT/updatefw.c | 2 +- .../EXMIMO/USERSPACE/OAI_FW_INIT/updatefw.h | 2 +- .../ARCH/EXMIMO/USERSPACE/OCTAVE/gpib_send.cc | 2 +- .../USERSPACE/OCTAVE/oarf_config_exmimo.cc | 2 +- .../EXMIMO/USERSPACE/OCTAVE/oarf_get_frame.cc | 2 +- .../OCTAVE/oarf_get_num_detected_cards.cc | 2 +- .../USERSPACE/OCTAVE/oarf_send_frame.cc | 2 +- .../ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_stop.cc | 2 +- .../OCTAVE/oarf_stop_without_reset.cc | 2 +- targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp | 2 +- targets/COMMON/create_tasks.c | 2 +- targets/COMMON/create_tasks.h | 2 +- .../enb.band7.tm1.usrpb210.epc.remote.conf | 10 +- .../PROJECTS/GENERIC-LTE-EPC/interfaces.bash | 2 +- .../PROJECTS/GENERIC-LTE-EPC/networks.bash | 2 +- .../start_enb_and_ue_virt.bash | 2 +- .../PROJECTS/GENERIC-LTE-EPC/start_ue.bash | 2 +- targets/PROJECTS/GENERIC-LTE-EPC/utils.bash | 2 +- .../PROJECTS/GENERIC-LTE-EPC/virtual_box.bash | 2 +- targets/RT/USER/TOOLS/thread_ipc.c | 2 +- targets/RT/USER/TOOLS/thread_ipc.h | 2 +- targets/RT/USER/UE_transport_IQ.c | 2 +- targets/RT/USER/condtest.c | 2 +- targets/RT/USER/eNB_transport_IQ.c | 2 +- targets/RT/USER/emos-raw.c | 2 +- targets/RT/USER/lte-softmodem.c | 2 +- targets/RT/USER/lte-ue.c | 2 +- targets/RT/USER/msg_many.h | 2 +- targets/RT/USER/rrh.c | 2 +- targets/RT/USER/rrh_gw.c | 2 +- targets/RT/USER/rrh_gw.h | 2 +- targets/RT/USER/rrh_gw_externs.h | 2 +- targets/RT/USER/rt_wrapper.c | 2 +- targets/RT/USER/rt_wrapper.h | 2 +- targets/RT/USER/sched_dlsch.c | 2 +- targets/RT/USER/sched_rx_pdsch.c | 2 +- targets/RT/USER/sched_ulsch.c | 2 +- targets/RT/USER/sleeptest.c | 2 +- targets/RT/USER/synctest.c | 2 +- .../install_asn1c_0.9.24.modified.bash | 2 +- targets/SIMU/PROC/Process.c | 2 +- targets/SIMU/PROC/Process.h | 2 +- targets/SIMU/PROC/Tsync.h | 2 +- targets/SIMU/PROC/channel_sim_proc.c | 2 +- targets/SIMU/PROC/channel_sim_proc.h | 2 +- targets/SIMU/PROC/interface.h | 2 +- targets/SIMU/USER/channel_sim.c | 2 +- targets/SIMU/USER/cor_SF_sim.c | 2 +- targets/SIMU/USER/cor_SF_sim.h | 2 +- targets/SIMU/USER/event_handler.c | 2 +- targets/SIMU/USER/event_handler.h | 2 +- targets/SIMU/USER/init_lte.c | 2 +- targets/SIMU/USER/init_lte.h | 2 +- targets/SIMU/USER/oaisim.c | 2 +- targets/SIMU/USER/oaisim.h | 2 +- targets/SIMU/USER/oaisim_config.c | 2 +- targets/SIMU/USER/oaisim_config.h | 2 +- targets/SIMU/USER/oaisim_functions.c | 2 +- targets/SIMU/USER/oaisim_functions.h | 2 +- targets/SIMU/USER/oaisim_pad.c | 2 +- targets/SIMU/USER/sinr_sim.c | 2 +- targets/TEST/OAI/case01.py | 2 +- targets/TEST/OAI/case02.py | 2 +- targets/TEST/OAI/case03.py | 2 +- targets/TEST/OAI/case04.py | 2 +- targets/TEST/OAI/case05.py | 2 +- targets/TEST/OAI/test01.py | 2 +- targets/build_helper.bash | 2 +- targets/build_oai.bash | 2 +- targets/perf_oai.bash | 2 +- 1773 files changed, 13637 insertions(+), 119474 deletions(-) delete mode 100644 cmake_targets/epc_build_oai/CMakeLists.template create mode 100644 cmake_targets/epc_test/CMakeLists.template delete mode 100755 cmake_targets/hss_build/CMakeLists.txt delete mode 100644 cmake_targets/hss_build/acl.conf.in delete mode 100644 cmake_targets/hss_build/hss.conf.in delete mode 100644 cmake_targets/hss_build/hss_fd.conf.in delete mode 100755 cmake_targets/tools/build_epc delete mode 100755 cmake_targets/tools/build_hss create mode 100755 cmake_targets/tools/build_test_epc_tools delete mode 100755 cmake_targets/tools/check_hss_s6a_certificate delete mode 100755 cmake_targets/tools/check_mme_s6a_certificate delete mode 100755 cmake_targets/tools/create_hss_database delete mode 100755 cmake_targets/tools/epc.conf.in delete mode 100755 cmake_targets/tools/epc.local.enb.conf.in delete mode 100755 cmake_targets/tools/run_epc delete mode 100755 cmake_targets/tools/run_hss delete mode 100644 cmake_targets/tools/s6a.conf.in delete mode 100644 openair-cn/AUTHORS delete mode 100755 openair-cn/COMMON/ip_forward_messages_def.h delete mode 100755 openair-cn/COMMON/ip_forward_messages_types.h delete mode 100644 openair-cn/COMMON/mme_app_messages_def.h delete mode 100644 openair-cn/COMMON/mme_app_messages_types.h delete mode 100644 openair-cn/COMMON/s11_messages_def.h delete mode 100644 openair-cn/COMMON/s11_messages_types.h delete mode 100644 openair-cn/COMMON/s6a_messages_def.h delete mode 100644 openair-cn/COMMON/s6a_messages_types.h delete mode 100644 openair-cn/COMMON/sgw_lite_def.h delete mode 100644 openair-cn/COMMON/sgw_lite_messages_types.h delete mode 100644 openair-cn/ChangeLog delete mode 100644 openair-cn/DOCS/EPC_User_Guide.docx delete mode 100644 openair-cn/DOCS/EPC_User_Guide.pdf delete mode 100755 openair-cn/GTPV1-U/GTPU_SP/COPYING delete mode 100755 openair-cn/GTPV1-U/GTPU_SP/INSTALL delete mode 100755 openair-cn/GTPV1-U/GTPU_SP/Makefile delete mode 100755 openair-cn/GTPV1-U/GTPU_SP/README delete mode 100755 openair-cn/GTPV1-U/GTPU_SP/RELEASE_NOTES delete mode 100755 openair-cn/GTPV1-U/GTPU_SP/cmd.sh delete mode 100755 openair-cn/GTPV1-U/GTPU_SP/libxt_GTPUSP.c delete mode 100755 openair-cn/GTPV1-U/GTPU_SP/xt_GTPUSP.c delete mode 100755 openair-cn/GTPV1-U/GTPU_SP/xt_GTPUSP.h delete mode 100644 openair-cn/GTPV2-C/Makefile.am delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/AUTHORS delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/COPYING delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/ChangeLog delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/Makefile.am delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/NEWS delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/README delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/configure.ac delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/include/NwGtpv2cLog.h delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/include/NwGtpv2cMsgIeParseInfo.h delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/include/NwGtpv2cPrivate.h delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/include/NwGtpv2cTrxn.h delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/include/NwGtpv2cTunnel.h delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/include/queue.h delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/include/tree.h delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/shared/NwError.h delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/shared/NwGtpv2c.h delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/shared/NwGtpv2cIe.h delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/shared/NwGtpv2cMsg.h delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/shared/NwGtpv2cMsgParser.h delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/shared/NwLog.h delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/shared/NwTypes.h delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/shared/NwUtils.h delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/src/Makefile.am delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/src/NwGtpv2c.c delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/src/NwGtpv2cMsg.c delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/src/NwGtpv2cMsgIeParseInfo.c delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/src/NwGtpv2cMsgParser.c delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/src/NwGtpv2cTrxn.c delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/src/NwGtpv2cTunnel.c delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/Makefile.am delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-egtping/Makefile.am delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-egtping/NwEgtPingMain.c delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-egtping/NwEvt.h delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-egtping/NwMiniLogMgrEntity.c delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-egtping/NwMiniLogMgrEntity.h delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-egtping/NwMiniTmrMgrEntity.c delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-egtping/NwMiniTmrMgrEntity.h delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-egtping/NwMiniUdpEntity.c delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-egtping/NwMiniUdpEntity.h delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-egtping/NwMiniUlpEntity.c delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-egtping/NwMiniUlpEntity.h delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-helloworld/Makefile.am delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-helloworld/NwEvt.h delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-helloworld/NwMiniLogMgrEntity.c delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-helloworld/NwMiniLogMgrEntity.h delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-helloworld/NwMiniTmrMgrEntity.c delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-helloworld/NwMiniTmrMgrEntity.h delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-helloworld/NwMiniUdpEntity.c delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-helloworld/NwMiniUdpEntity.h delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-helloworld/NwMiniUlpEntity.c delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-helloworld/NwMiniUlpEntity.h delete mode 100644 openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-helloworld/helloworld.c delete mode 100644 openair-cn/INSTALL delete mode 100644 openair-cn/MME_APP/COPYING delete mode 100644 openair-cn/MME_APP/Makefile.am delete mode 100644 openair-cn/MME_APP/mme_app_authentication.c delete mode 100644 openair-cn/MME_APP/mme_app_bearer.c delete mode 100755 openair-cn/MME_APP/mme_app_capabilities.c delete mode 100755 openair-cn/MME_APP/mme_app_config.c delete mode 100755 openair-cn/MME_APP/mme_app_config.h delete mode 100644 openair-cn/MME_APP/mme_app_context.c delete mode 100644 openair-cn/MME_APP/mme_app_defs.h delete mode 100644 openair-cn/MME_APP/mme_app_extern.h delete mode 100644 openair-cn/MME_APP/mme_app_itti_messaging.h delete mode 100755 openair-cn/MME_APP/mme_app_location.c delete mode 100644 openair-cn/MME_APP/mme_app_main.c delete mode 100644 openair-cn/MME_APP/mme_app_statistics.c delete mode 100644 openair-cn/MME_APP/mme_app_statistics.h delete mode 100644 openair-cn/MME_APP/mme_app_ue_context.h delete mode 100644 openair-cn/MME_APP/s6a_2_nas_cause.c delete mode 100644 openair-cn/Makefile.am delete mode 100644 openair-cn/NAS/MME/API/MME/COPYING delete mode 100644 openair-cn/NAS/MME/API/MME/Makefile delete mode 100644 openair-cn/NAS/MME/API/MME/mme_api.c delete mode 100644 openair-cn/NAS/MME/API/MME/mme_api.h delete mode 100644 openair-cn/NAS/MME/EMM/Attach.c delete mode 100644 openair-cn/NAS/MME/EMM/Authentication.c delete mode 100644 openair-cn/NAS/MME/EMM/COPYING delete mode 100644 openair-cn/NAS/MME/EMM/Detach.c delete mode 100644 openair-cn/NAS/MME/EMM/EmmCommon.c delete mode 100644 openair-cn/NAS/MME/EMM/EmmCommon.h delete mode 100644 openair-cn/NAS/MME/EMM/EmmStatusHdl.c delete mode 100644 openair-cn/NAS/MME/EMM/Identification.c delete mode 100644 openair-cn/NAS/MME/EMM/IdleMode.c delete mode 100644 openair-cn/NAS/MME/EMM/IdleMode.h delete mode 100644 openair-cn/NAS/MME/EMM/LowerLayer.c delete mode 100644 openair-cn/NAS/MME/EMM/LowerLayer.h delete mode 100644 openair-cn/NAS/MME/EMM/Makefile delete mode 100644 openair-cn/NAS/MME/EMM/SAP/COPYING delete mode 100644 openair-cn/NAS/MME/EMM/SAP/EmmCommonProcedureInitiated.c delete mode 100644 openair-cn/NAS/MME/EMM/SAP/EmmDeregistered.c delete mode 100644 openair-cn/NAS/MME/EMM/SAP/EmmDeregisteredAttachNeeded.c delete mode 100644 openair-cn/NAS/MME/EMM/SAP/EmmDeregisteredAttemptingToAttach.c delete mode 100644 openair-cn/NAS/MME/EMM/SAP/EmmDeregisteredInitiated.c delete mode 100644 openair-cn/NAS/MME/EMM/SAP/EmmDeregisteredLimitedService.c delete mode 100644 openair-cn/NAS/MME/EMM/SAP/EmmDeregisteredNoCellAvailable.c delete mode 100644 openair-cn/NAS/MME/EMM/SAP/EmmDeregisteredNoImsi.c delete mode 100644 openair-cn/NAS/MME/EMM/SAP/EmmDeregisteredNormalService.c delete mode 100644 openair-cn/NAS/MME/EMM/SAP/EmmDeregisteredPlmnSearch.c delete mode 100644 openair-cn/NAS/MME/EMM/SAP/EmmNull.c delete mode 100644 openair-cn/NAS/MME/EMM/SAP/EmmRegistered.c delete mode 100644 openair-cn/NAS/MME/EMM/SAP/EmmRegisteredAttemptingToUpdate.c delete mode 100644 openair-cn/NAS/MME/EMM/SAP/EmmRegisteredImsiDetachInitiated.c delete mode 100644 openair-cn/NAS/MME/EMM/SAP/EmmRegisteredInitiated.c delete mode 100644 openair-cn/NAS/MME/EMM/SAP/EmmRegisteredLimitedService.c delete mode 100644 openair-cn/NAS/MME/EMM/SAP/EmmRegisteredNoCellAvailable.c delete mode 100644 openair-cn/NAS/MME/EMM/SAP/EmmRegisteredNormalService.c delete mode 100644 openair-cn/NAS/MME/EMM/SAP/EmmRegisteredPlmnSearch.c delete mode 100644 openair-cn/NAS/MME/EMM/SAP/EmmRegisteredUpdateNeeded.c delete mode 100644 openair-cn/NAS/MME/EMM/SAP/EmmServiceRequestInitiated.c delete mode 100644 openair-cn/NAS/MME/EMM/SAP/EmmTrackingAreaUpdatingInitiated.c delete mode 100644 openair-cn/NAS/MME/EMM/SAP/Makefile delete mode 100644 openair-cn/NAS/MME/EMM/SAP/emm_as.c delete mode 100644 openair-cn/NAS/MME/EMM/SAP/emm_as.h delete mode 100644 openair-cn/NAS/MME/EMM/SAP/emm_asDef.h delete mode 100644 openair-cn/NAS/MME/EMM/SAP/emm_cn.c delete mode 100644 openair-cn/NAS/MME/EMM/SAP/emm_cn.h delete mode 100644 openair-cn/NAS/MME/EMM/SAP/emm_cnDef.h delete mode 100644 openair-cn/NAS/MME/EMM/SAP/emm_esm.c delete mode 100644 openair-cn/NAS/MME/EMM/SAP/emm_esm.h delete mode 100644 openair-cn/NAS/MME/EMM/SAP/emm_esmDef.h delete mode 100644 openair-cn/NAS/MME/EMM/SAP/emm_fsm.c delete mode 100644 openair-cn/NAS/MME/EMM/SAP/emm_fsm.h delete mode 100644 openair-cn/NAS/MME/EMM/SAP/emm_recv.c delete mode 100644 openair-cn/NAS/MME/EMM/SAP/emm_recv.h delete mode 100644 openair-cn/NAS/MME/EMM/SAP/emm_reg.c delete mode 100644 openair-cn/NAS/MME/EMM/SAP/emm_reg.h delete mode 100644 openair-cn/NAS/MME/EMM/SAP/emm_regDef.h delete mode 100644 openair-cn/NAS/MME/EMM/SAP/emm_sap.c delete mode 100644 openair-cn/NAS/MME/EMM/SAP/emm_sap.h delete mode 100644 openair-cn/NAS/MME/EMM/SAP/emm_send.c delete mode 100644 openair-cn/NAS/MME/EMM/SAP/emm_send.h delete mode 100644 openair-cn/NAS/MME/EMM/SecurityModeControl.c delete mode 100644 openair-cn/NAS/MME/EMM/ServiceRequestHdl.c delete mode 100644 openair-cn/NAS/MME/EMM/TrackingAreaUpdate.c delete mode 100644 openair-cn/NAS/MME/EMM/emmData.h delete mode 100644 openair-cn/NAS/MME/EMM/emm_data_ctx.c delete mode 100644 openair-cn/NAS/MME/EMM/emm_main.c delete mode 100644 openair-cn/NAS/MME/EMM/emm_main.h delete mode 100644 openair-cn/NAS/MME/EMM/emm_proc.h delete mode 100644 openair-cn/NAS/MME/ESM/COPYING delete mode 100644 openair-cn/NAS/MME/ESM/DedicatedEpsBearerContextActivation.c delete mode 100644 openair-cn/NAS/MME/ESM/DefaultEpsBearerContextActivation.c delete mode 100644 openair-cn/NAS/MME/ESM/EpsBearerContextDeactivation.c delete mode 100644 openair-cn/NAS/MME/ESM/EsmStatusHdl.c delete mode 100644 openair-cn/NAS/MME/ESM/Makefile delete mode 100644 openair-cn/NAS/MME/ESM/PdnConnectivity.c delete mode 100644 openair-cn/NAS/MME/ESM/PdnDisconnect.c delete mode 100644 openair-cn/NAS/MME/ESM/SAP/COPYING delete mode 100644 openair-cn/NAS/MME/ESM/SAP/Makefile delete mode 100644 openair-cn/NAS/MME/ESM/SAP/esm_recv.c delete mode 100644 openair-cn/NAS/MME/ESM/SAP/esm_recv.h delete mode 100644 openair-cn/NAS/MME/ESM/SAP/esm_sap.c delete mode 100644 openair-cn/NAS/MME/ESM/SAP/esm_sap.h delete mode 100644 openair-cn/NAS/MME/ESM/SAP/esm_sapDef.h delete mode 100644 openair-cn/NAS/MME/ESM/SAP/esm_send.c delete mode 100644 openair-cn/NAS/MME/ESM/SAP/esm_send.h delete mode 100644 openair-cn/NAS/MME/ESM/esmData.h delete mode 100644 openair-cn/NAS/MME/ESM/esm_ebr.c delete mode 100644 openair-cn/NAS/MME/ESM/esm_ebr.h delete mode 100644 openair-cn/NAS/MME/ESM/esm_ebr_context.c delete mode 100644 openair-cn/NAS/MME/ESM/esm_ebr_context.h delete mode 100644 openair-cn/NAS/MME/ESM/esm_ip.c delete mode 100644 openair-cn/NAS/MME/ESM/esm_main.c delete mode 100644 openair-cn/NAS/MME/ESM/esm_main.h delete mode 100644 openair-cn/NAS/MME/ESM/esm_proc.h delete mode 100644 openair-cn/NAS/MME/ESM/esm_pt.c delete mode 100644 openair-cn/NAS/MME/ESM/esm_pt.h delete mode 100644 openair-cn/NAS/MME/MMEprocess.c delete mode 100644 openair-cn/NAS/MME/nas_defs.h delete mode 100644 openair-cn/NAS/MME/nas_itti_messaging.c delete mode 100644 openair-cn/NAS/MME/nas_itti_messaging.h delete mode 100644 openair-cn/NAS/MME/nas_mme_task.c delete mode 100644 openair-cn/NAS/MME/nas_network.c delete mode 100644 openair-cn/NAS/MME/nas_network.h delete mode 100644 openair-cn/NAS/MME/nas_parser.c delete mode 100644 openair-cn/NAS/MME/nas_parser.h delete mode 100644 openair-cn/NAS/MME/nas_proc.c delete mode 100644 openair-cn/NAS/MME/nas_proc.h delete mode 100644 openair-cn/NEWS delete mode 100644 openair-cn/OAISIM_MME/COPYING delete mode 100644 openair-cn/OAISIM_MME/Makefile.am delete mode 100644 openair-cn/OAISIM_MME/oai_mme_log.c delete mode 100644 openair-cn/OAISIM_MME/oaisim_mme.c delete mode 100644 openair-cn/OAISIM_MME/oaisim_mme.h delete mode 100644 openair-cn/OAI_EPC/COPYING delete mode 100644 openair-cn/OAI_EPC/Makefile.am delete mode 100644 openair-cn/OAI_EPC/oai_epc.c delete mode 100644 openair-cn/OAI_EPC/oai_epc.h delete mode 100644 openair-cn/OAI_EPC/oai_epc_log.c delete mode 100644 openair-cn/OAI_SGW/COPYING delete mode 100644 openair-cn/OAI_SGW/Makefile.am delete mode 100644 openair-cn/OAI_SGW/oai_sgw.c delete mode 100644 openair-cn/OAI_SGW/oai_sgw.h delete mode 100644 openair-cn/OAI_SGW/oai_sgw_log.c delete mode 100644 openair-cn/OPENAIRHSS/AUTHORS delete mode 100644 openair-cn/OPENAIRHSS/ChangeLog delete mode 100644 openair-cn/OPENAIRHSS/INSTALL delete mode 100644 openair-cn/OPENAIRHSS/Makefile.am delete mode 100644 openair-cn/OPENAIRHSS/NEWS delete mode 100644 openair-cn/OPENAIRHSS/README delete mode 100644 openair-cn/OPENAIRHSS/access_restriction/COPYING delete mode 100644 openair-cn/OPENAIRHSS/access_restriction/Makefile.am delete mode 100644 openair-cn/OPENAIRHSS/access_restriction/access_restriction.c delete mode 100644 openair-cn/OPENAIRHSS/access_restriction/access_restriction.h delete mode 100644 openair-cn/OPENAIRHSS/auc/COPYING delete mode 100644 openair-cn/OPENAIRHSS/auc/Makefile.am delete mode 100644 openair-cn/OPENAIRHSS/auc/auc.h delete mode 100644 openair-cn/OPENAIRHSS/auc/fx.c delete mode 100644 openair-cn/OPENAIRHSS/auc/kdf.c delete mode 100644 openair-cn/OPENAIRHSS/auc/random.c delete mode 100644 openair-cn/OPENAIRHSS/auc/rijndael.c delete mode 100644 openair-cn/OPENAIRHSS/auc/sequence_number.c delete mode 100755 openair-cn/OPENAIRHSS/autogen.sh delete mode 100644 openair-cn/OPENAIRHSS/conf/COPYING delete mode 100644 openair-cn/OPENAIRHSS/conf/demoCA/COPYING delete mode 100644 openair-cn/OPENAIRHSS/conf/hss.conf.in delete mode 100755 openair-cn/OPENAIRHSS/conf/make_certs.sh delete mode 100644 openair-cn/OPENAIRHSS/configure.ac delete mode 100644 openair-cn/OPENAIRHSS/db/COPYING delete mode 100644 openair-cn/OPENAIRHSS/db/Makefile.am delete mode 100644 openair-cn/OPENAIRHSS/db/db_connector.c delete mode 100644 openair-cn/OPENAIRHSS/db/db_epc_equipment.c delete mode 100644 openair-cn/OPENAIRHSS/db/db_proto.h delete mode 100644 openair-cn/OPENAIRHSS/db/db_subscription_data.c delete mode 100644 openair-cn/OPENAIRHSS/db/oai_db.sql delete mode 100644 openair-cn/OPENAIRHSS/db/pft_db.sql delete mode 100644 openair-cn/OPENAIRHSS/debian/changelog delete mode 100644 openair-cn/OPENAIRHSS/debian/compat delete mode 100644 openair-cn/OPENAIRHSS/debian/control delete mode 100644 openair-cn/OPENAIRHSS/debian/copyright delete mode 100644 openair-cn/OPENAIRHSS/debian/dirs delete mode 100644 openair-cn/OPENAIRHSS/debian/files delete mode 100644 openair-cn/OPENAIRHSS/debian/openair-hss.install delete mode 100755 openair-cn/OPENAIRHSS/debian/rules delete mode 100644 openair-cn/OPENAIRHSS/hss_main.c delete mode 100644 openair-cn/OPENAIRHSS/s6a/COPYING delete mode 100644 openair-cn/OPENAIRHSS/s6a/Makefile.am delete mode 100644 openair-cn/OPENAIRHSS/s6a/s6a_auth_info.c delete mode 100644 openair-cn/OPENAIRHSS/s6a/s6a_common.c delete mode 100644 openair-cn/OPENAIRHSS/s6a/s6a_error.c delete mode 100644 openair-cn/OPENAIRHSS/s6a/s6a_fd.c delete mode 100644 openair-cn/OPENAIRHSS/s6a/s6a_in_addr.c delete mode 100644 openair-cn/OPENAIRHSS/s6a/s6a_peers.c delete mode 100644 openair-cn/OPENAIRHSS/s6a/s6a_proto.h delete mode 100644 openair-cn/OPENAIRHSS/s6a/s6a_purge_ue.c delete mode 100644 openair-cn/OPENAIRHSS/s6a/s6a_subscription_data.c delete mode 100644 openair-cn/OPENAIRHSS/s6a/s6a_supported_features.c delete mode 100644 openair-cn/OPENAIRHSS/s6a/s6a_supported_features.h delete mode 100644 openair-cn/OPENAIRHSS/s6a/s6a_up_loc.c delete mode 100644 openair-cn/OPENAIRHSS/scripts/COPYING delete mode 100644 openair-cn/OPENAIRHSS/scripts/install_hss.sh delete mode 100644 openair-cn/OPENAIRHSS/tests/COPYING delete mode 100644 openair-cn/OPENAIRHSS/tests/Makefile.am delete mode 100644 openair-cn/OPENAIRHSS/tests/test_fd.c delete mode 100644 openair-cn/OPENAIRHSS/tests/test_fd.h delete mode 100644 openair-cn/OPENAIRHSS/tests/test_kdf.c delete mode 100644 openair-cn/OPENAIRHSS/tests/test_security.c delete mode 100644 openair-cn/OPENAIRHSS/tests/test_security_f1.c delete mode 100644 openair-cn/OPENAIRHSS/tests/test_security_f2_f3_f5.c delete mode 100644 openair-cn/OPENAIRHSS/tests/test_security_f4_f5star.c delete mode 100644 openair-cn/OPENAIRHSS/tests/test_security_kasme.c delete mode 100644 openair-cn/OPENAIRHSS/tests/test_utils.c delete mode 100644 openair-cn/OPENAIRHSS/tests/test_utils.h delete mode 100644 openair-cn/OPENAIRHSS/tests/up_loc_test.c delete mode 100644 openair-cn/OPENAIRHSS/utils/COPYING delete mode 100644 openair-cn/OPENAIRHSS/utils/Makefile.am delete mode 100644 openair-cn/OPENAIRHSS/utils/conversion.c delete mode 100644 openair-cn/OPENAIRHSS/utils/conversion.h delete mode 100644 openair-cn/OPENAIRHSS/utils/hss_config.c delete mode 100644 openair-cn/OPENAIRHSS/utils/hss_config.h delete mode 100644 openair-cn/OPENAIRHSS/utils/hss_parser.y delete mode 100644 openair-cn/OPENAIRHSS/utils/hss_scanner.l delete mode 100644 openair-cn/OPENAIRHSS/utils/queue.h delete mode 100644 openair-cn/README delete mode 100644 openair-cn/S11/COPYING delete mode 100644 openair-cn/S11/Makefile.am delete mode 100644 openair-cn/S11/s11_common.c delete mode 100644 openair-cn/S11/s11_common.h delete mode 100644 openair-cn/S11/s11_ie_formatter.c delete mode 100644 openair-cn/S11/s11_ie_formatter.h delete mode 100644 openair-cn/S11/s11_mme.h delete mode 100644 openair-cn/S11/s11_mme_peer_manager.c delete mode 100644 openair-cn/S11/s11_mme_session_manager.c delete mode 100644 openair-cn/S11/s11_mme_session_manager.h delete mode 100644 openair-cn/S11/s11_mme_task.c delete mode 100644 openair-cn/S11/s11_sgw.c delete mode 100644 openair-cn/S11/s11_sgw.h delete mode 100644 openair-cn/S11/s11_sgw_bearer_manager.c delete mode 100644 openair-cn/S11/s11_sgw_bearer_manager.h delete mode 100644 openair-cn/S11/s11_sgw_session_manager.c delete mode 100644 openair-cn/S11/s11_sgw_session_manager.h delete mode 100644 openair-cn/S1AP/MESSAGES/ASN1/Makefile.am delete mode 100644 openair-cn/S1AP/MESSAGES/Makefile.am delete mode 100644 openair-cn/S1AP/MESSAGES/Makefile.inc delete mode 100644 openair-cn/S1AP/Makefile.am delete mode 100644 openair-cn/S1AP/Makefile.eNB delete mode 100644 openair-cn/S1AP/Makefile.inc delete mode 100644 openair-cn/S1AP/s1ap_mme.c delete mode 100644 openair-cn/S1AP/s1ap_mme.h delete mode 100644 openair-cn/S1AP/s1ap_mme_decoder.c delete mode 100644 openair-cn/S1AP/s1ap_mme_decoder.h delete mode 100644 openair-cn/S1AP/s1ap_mme_encoder.c delete mode 100644 openair-cn/S1AP/s1ap_mme_encoder.h delete mode 100644 openair-cn/S1AP/s1ap_mme_handlers.c delete mode 100644 openair-cn/S1AP/s1ap_mme_handlers.h delete mode 100644 openair-cn/S1AP/s1ap_mme_itti_messaging.c delete mode 100644 openair-cn/S1AP/s1ap_mme_itti_messaging.h delete mode 100644 openair-cn/S1AP/s1ap_mme_nas_procedures.c delete mode 100644 openair-cn/S1AP/s1ap_mme_nas_procedures.h delete mode 100644 openair-cn/S1AP/s1ap_mme_retransmission.c delete mode 100644 openair-cn/S1AP/s1ap_mme_retransmission.h delete mode 100644 openair-cn/S1AP/s1ap_mme_ta.c delete mode 100644 openair-cn/S1AP/s1ap_mme_ta.h delete mode 100644 openair-cn/S6A/COPYING delete mode 100644 openair-cn/S6A/Makefile.am delete mode 100644 openair-cn/S6A/freediameter/README.txt delete mode 100644 openair-cn/S6A/freediameter/freediameter-1.1.5.patch delete mode 100644 openair-cn/S6A/freediameter/freediameter-1.2.0.patch delete mode 100755 openair-cn/S6A/freediameter/install_freediameter.sh delete mode 100755 openair-cn/S6A/freediameter/make_certs.sh delete mode 100644 openair-cn/S6A/freediameter/s6a.conf delete mode 100644 openair-cn/S6A/s6a_apn_conf.c delete mode 100644 openair-cn/S6A/s6a_auth_info.c delete mode 100644 openair-cn/S6A/s6a_defs.h delete mode 100644 openair-cn/S6A/s6a_dict.c delete mode 100644 openair-cn/S6A/s6a_error.c delete mode 100644 openair-cn/S6A/s6a_messages.h delete mode 100644 openair-cn/S6A/s6a_peer.c delete mode 100644 openair-cn/S6A/s6a_subscription_data.c delete mode 100644 openair-cn/S6A/s6a_task.c delete mode 100644 openair-cn/S6A/s6a_up_loc.c delete mode 100644 openair-cn/SCTP/Makefile.am delete mode 100644 openair-cn/SCTP/Makefile.eNB delete mode 100644 openair-cn/SCTP/sctp_itti_messaging.c delete mode 100644 openair-cn/SCTP/sctp_itti_messaging.h delete mode 100644 openair-cn/SCTP/sctp_primitives_server.c delete mode 100644 openair-cn/SCTP/sctp_primitives_server.h delete mode 100644 openair-cn/SECU/Makefile.am delete mode 100644 openair-cn/SECU/Makefile.eNB delete mode 100644 openair-cn/SGW-LITE/COPYING delete mode 100644 openair-cn/SGW-LITE/Makefile.am delete mode 100755 openair-cn/SGW-LITE/pgw_lite_paa.c delete mode 100755 openair-cn/SGW-LITE/pgw_lite_paa.h delete mode 100644 openair-cn/SGW-LITE/s11_causes.c delete mode 100644 openair-cn/SGW-LITE/s11_causes.h delete mode 100755 openair-cn/SGW-LITE/sgw_lite.h delete mode 100644 openair-cn/SGW-LITE/sgw_lite_context_manager.c delete mode 100644 openair-cn/SGW-LITE/sgw_lite_context_manager.h delete mode 100644 openair-cn/SGW-LITE/sgw_lite_defs.h delete mode 100644 openair-cn/SGW-LITE/sgw_lite_handlers.c delete mode 100644 openair-cn/SGW-LITE/sgw_lite_handlers.h delete mode 100644 openair-cn/SGW-LITE/sgw_lite_ie_defs.h delete mode 100644 openair-cn/SGW-LITE/sgw_lite_task.c delete mode 100755 openair-cn/SGW-LITE/spgw_config.c delete mode 100755 openair-cn/SGW-LITE/spgw_config.h delete mode 100644 openair-cn/UDP/Makefile.am delete mode 100644 openair-cn/UDP/Makefile.eNB delete mode 100644 openair-cn/UDP/udp_primitives_server.c delete mode 100644 openair-cn/UDP/udp_primitives_server.h delete mode 100755 openair-cn/autogen.sh delete mode 100644 openair-cn/configure.ac delete mode 100644 openair-cn/cppcheck.sh diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index fa704030c6..18ef6108e2 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -20,7 +20,7 @@ # Contact Information # OpenAirInterface Admin: openair_admin@eurecom.fr # OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@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 # Author: laurent THOMAS, Lionel GAUTHIER @@ -340,17 +340,7 @@ add_library(S1AP_ENB ${S1AP_DIR}/s1ap_eNB_ue_context.c ) -add_library(S1AP_EPC - ${S1AP_C_DIR}/s1ap_ies_defs.h - ${S1AP_DIR}/s1ap_mme_encoder.c - ${S1AP_DIR}/s1ap_mme_decoder.c - ${S1AP_DIR}/s1ap_mme_handlers.c - ${S1AP_DIR}/s1ap_mme_nas_procedures.c - ${S1AP_DIR}/s1ap_mme.c - ${S1AP_DIR}/s1ap_mme_itti_messaging.c - ${S1AP_DIR}/s1ap_mme_retransmission.c - ${S1AP_DIR}/s1ap_mme_ta.c - ) + #X2AP # Same limitation as described in RRC/S1AP: unknown generated file list @@ -467,8 +457,6 @@ add_boolean_option(USER_MODE True "????") add_boolean_option(OAI_NW_DRIVER_TYPE_ETHERNET False "????") add_boolean_option(DISABLE_USE_NAS False "???") -add_boolean_option(ENABLE_STANDALONE_EPC True "Compile MME, SGW and PGW in a single executable") -add_boolean_option(EPC_BUILD False "???") add_boolean_option(LOWLATENCY True "Use the Linux scheduler SCHED_DEADLINE: kernel >= 3.14") add_boolean_option(NAS_ADDRESS_FIX False "specific to oaisim: for nasmesh driver") add_boolean_option(NAS_NETLINK False "???? Must be True to compile nasmesh driver without rtai") @@ -542,10 +530,8 @@ add_boolean_option(USE_3GPP_ADDR_AS_LINK_ADDR False "As per attribute name") # NAS LAYER OPTIONS ########################## add_boolean_option(ENABLE_NAS_UE_LOGGING True "????") -add_boolean_option(NAS_BUILT_IN_EPC False "MME NAS layer not present in this executable") add_boolean_option(NAS_BUILT_IN_UE True "UE NAS layer present in this executable") add_boolean_option(NAS_UE True "NAS UE INSTANCE (<> NAS_MME)") -add_boolean_option(NAS_MME False "NAS_UE and NAS_MME are incompatible options") ########################## @@ -691,9 +677,6 @@ include_directories("${OPENAIR2_DIR}/UTIL/OMV") include_directories("${OPENAIR2_DIR}/RRC/LITE/MESSAGES") include_directories("${OPENAIRCN_DIR}/GTPV1-U/nw-gtpv1u/shared") include_directories("${OPENAIRCN_DIR}/GTPV1-U/nw-gtpv1u/include") -include_directories("${OPENAIRCN_DIR}/SGW-LITE") -include_directories("${OPENAIRCN_DIR}/MME_APP") -include_directories("${OPENAIRCN_DIR}/S6A") include_directories("${OPENAIR_DIR}") # Utilities Library @@ -1023,42 +1006,6 @@ set (GTPV1U_SRC ) add_library(GTPV1U ${GTPV1U_SRC}) -set(GTPV2C_DIR ${OPENAIRCN_DIR}/GTPV2-C/nwgtpv2c-0.11/src) -add_library(GTPV2C - ${GTPV2C_DIR}/NwGtpv2cTrxn.c - ${GTPV2C_DIR}/NwGtpv2cTunnel.c - ${GTPV2C_DIR}/NwGtpv2cMsg.c - ${GTPV2C_DIR}/NwGtpv2cMsgIeParseInfo.c - ${GTPV2C_DIR}/NwGtpv2cMsgParser.c - ${GTPV2C_DIR}/NwGtpv2c.c - ) -include_directories(${OPENAIRCN_DIR}/GTPV2-C/nwgtpv2c-0.11/include/) -include_directories(${OPENAIRCN_DIR}/GTPV2-C/nwgtpv2c-0.11/shared/) - -execute_process( - COMMAND /sbin/iptables -V - OUTPUT_VARIABLE iptables_version - ) -string(REGEX REPLACE "[a-zA-Z .\r\n]" "" IPTVERSION ${iptables_version}) -string(REGEX REPLACE "[a-zA-Z \r\n]" "" IPTABLES_VERSION_STRING ${iptables_version}) - -# From original Polaris code, added _lib because cmake doesn't accept two targets with the same name -# and the driver is also named xt_GTPUSP -# the _lib suffix is removed during installation in /lib/xtables -add_library(xt_GTPUSP_lib SHARED ${OPENAIRCN_DIR}/GTPV1-U/GTPU_SP/libxt_GTPUSP.c) -target_compile_definitions(xt_GTPUSP_lib PRIVATE --D_LARGEFILE_SOURCE=1 --D_LARGE_FILES --D_FILE_OFFSET_BITS=64 --D_REENTRANT --D_INIT=libxt_GTPUSP_init --DKVERSION=3 --DPIC -IPTVERSION=${IPTVERSION} -DIPTABLES_VERSION_STRING=\"${IPTABLES_VERSION_STRING}\" -) - - - set(SCTP_SRC ${OPENAIRCN_DIR}/SCTP/sctp_common.c ${OPENAIRCN_DIR}/SCTP/sctp_eNB_task.c @@ -1066,64 +1013,8 @@ set(SCTP_SRC ) add_library(SCTP_CLIENT ${SCTP_SRC}) -add_library(SCTP_SERVER - ${OPENAIRCN_DIR}/SCTP/sctp_common.c - ${OPENAIRCN_DIR}/SCTP/sctp_itti_messaging.c - ${OPENAIRCN_DIR}/SCTP/sctp_primitives_server.c - ) - - add_library(UDP ${OPENAIRCN_DIR}/UDP/udp_eNB_task.c) -add_library(UDP_SERVER ${OPENAIRCN_DIR}/UDP/udp_primitives_server.c) - -set(S11_DIR ${OPENAIRCN_DIR}/S11) -add_library(S11 - ${S11_DIR}/s11_common.c - ${S11_DIR}/s11_ie_formatter.c - ${S11_DIR}/s11_mme_task.c - ${S11_DIR}/s11_sgw.c - ${S11_DIR}/s11_mme_session_manager.c - ${S11_DIR}/s11_sgw_session_manager.c - ${S11_DIR}/s11_sgw_bearer_manager.c -) -include_directories(${S11_DIR}) - -set(S6A_DIR ${OPENAIRCN_DIR}/S6A) -add_library(S6A - ${S6A_DIR}/s6a_auth_info.c - ${S6A_DIR}/s6a_dict.c - ${S6A_DIR}/s6a_error.c - ${S6A_DIR}/s6a_peer.c - ${S6A_DIR}/s6a_subscription_data.c - ${S6A_DIR}/s6a_task.c - ${S6A_DIR}/s6a_up_loc.c - ) - -set(SGW_DIR ${OPENAIRCN_DIR}/SGW-LITE) -add_library (SGW - ${SGW_DIR}/spgw_config.c - ${SGW_DIR}/s11_causes.c - ${SGW_DIR}/sgw_lite_task.c - ${SGW_DIR}/sgw_lite_handlers.c - ${SGW_DIR}/sgw_lite_context_manager.c - ${SGW_DIR}/pgw_lite_paa.c - ) - -set(MME_DIR ${OPENAIRCN_DIR}/MME_APP) -add_library(MME_APP - ${MME_DIR}/mme_app_capabilities.c - ${MME_DIR}/mme_app_context.c - ${MME_DIR}/mme_app_main.c - ${MME_DIR}/mme_app_bearer.c - ${MME_DIR}/mme_app_authentication.c - ${MME_DIR}/mme_app_location.c - ${MME_DIR}/mme_app_statistics.c - ${MME_DIR}/s6a_2_nas_cause.c - ) - - - set(NAS_SRC ${OPENAIRCN_DIR}/NAS/) set(libnas_api_OBJS @@ -1383,99 +1274,6 @@ if(NAS_UE) include_directories(${NAS_SRC}UE/ESM/SAP) endif() -if(NAS_MME) - set(libnas_mme_api_OBJS - ${NAS_SRC}MME/API/MME/mme_api.c - ) - set(libnas_mme_emm_OBJS - ${NAS_SRC}MME/EMM/Attach.c - ${NAS_SRC}MME/EMM/Authentication.c - ${NAS_SRC}MME/EMM/Detach.c - ${NAS_SRC}MME/EMM/EmmCommon.c - ${NAS_SRC}MME/EMM/emm_data_ctx.c - ${NAS_SRC}MME/EMM/emm_main.c - ${NAS_SRC}MME/EMM/EmmStatusHdl.c - ${NAS_SRC}MME/EMM/Identification.c - ${NAS_SRC}MME/EMM/IdleMode.c - ${NAS_SRC}MME/EMM/LowerLayer.c - ${NAS_SRC}MME/EMM/SecurityModeControl.c - ${NAS_SRC}MME/EMM/ServiceRequestHdl.c - ${NAS_SRC}MME/EMM/TrackingAreaUpdate.c - ) - set(libnas_mme_emm_sap_OBJS - ${NAS_SRC}MME/EMM/SAP/emm_as.c - ${NAS_SRC}MME/EMM/SAP/emm_cn.c - ${NAS_SRC}MME/EMM/SAP/EmmCommonProcedureInitiated.c - ${NAS_SRC}MME/EMM/SAP/EmmDeregisteredAttachNeeded.c - ${NAS_SRC}MME/EMM/SAP/EmmDeregisteredAttemptingToAttach.c - ${NAS_SRC}MME/EMM/SAP/EmmDeregistered.c - ${NAS_SRC}MME/EMM/SAP/EmmDeregisteredInitiated.c - ${NAS_SRC}MME/EMM/SAP/EmmDeregisteredLimitedService.c - ${NAS_SRC}MME/EMM/SAP/EmmDeregisteredNoCellAvailable.c - ${NAS_SRC}MME/EMM/SAP/EmmDeregisteredNoImsi.c - ${NAS_SRC}MME/EMM/SAP/EmmDeregisteredNormalService.c - ${NAS_SRC}MME/EMM/SAP/EmmDeregisteredPlmnSearch.c - ${NAS_SRC}MME/EMM/SAP/emm_esm.c - ${NAS_SRC}MME/EMM/SAP/emm_fsm.c - ${NAS_SRC}MME/EMM/SAP/EmmNull.c - ${NAS_SRC}MME/EMM/SAP/emm_recv.c - ${NAS_SRC}MME/EMM/SAP/emm_reg.c - ${NAS_SRC}MME/EMM/SAP/EmmRegisteredAttemptingToUpdate.c - ${NAS_SRC}MME/EMM/SAP/EmmRegistered.c - ${NAS_SRC}MME/EMM/SAP/EmmRegisteredImsiDetachInitiated.c - ${NAS_SRC}MME/EMM/SAP/EmmRegisteredInitiated.c - ${NAS_SRC}MME/EMM/SAP/EmmRegisteredLimitedService.c - ${NAS_SRC}MME/EMM/SAP/EmmRegisteredNoCellAvailable.c - ${NAS_SRC}MME/EMM/SAP/EmmRegisteredNormalService.c - ${NAS_SRC}MME/EMM/SAP/EmmRegisteredPlmnSearch.c - ${NAS_SRC}MME/EMM/SAP/EmmRegisteredUpdateNeeded.c - ${NAS_SRC}MME/EMM/SAP/emm_sap.c - ${NAS_SRC}MME/EMM/SAP/emm_send.c - ${NAS_SRC}MME/EMM/SAP/EmmServiceRequestInitiated.c - ${NAS_SRC}MME/EMM/SAP/EmmTrackingAreaUpdatingInitiated.c - ) - set (libnas_mme_esm_OBJS - ${NAS_SRC}MME/ESM/DedicatedEpsBearerContextActivation.c - ${NAS_SRC}MME/ESM/DefaultEpsBearerContextActivation.c - ${NAS_SRC}MME/ESM/EpsBearerContextDeactivation.c - ${NAS_SRC}MME/ESM/esm_ebr.c - ${NAS_SRC}MME/ESM/esm_ebr_context.c - ${NAS_SRC}MME/ESM/esm_ip.c - ${NAS_SRC}MME/ESM/esm_main.c - ${NAS_SRC}MME/ESM/esm_pt.c - ${NAS_SRC}MME/ESM/EsmStatusHdl.c - ${NAS_SRC}MME/ESM/PdnConnectivity.c - ${NAS_SRC}MME/ESM/PdnDisconnect.c - ) - set(libnas_mme_esm_sap_OBJS - ${NAS_SRC}MME/ESM/SAP/esm_recv.c - ${NAS_SRC}MME/ESM/SAP/esm_send.c - ${NAS_SRC}MME/ESM/SAP/esm_sap.c - ) - add_library(LIB_NAS_MME - ${NAS_SRC}MME/nas_itti_messaging.c - ${NAS_SRC}MME/nas_network.c - ${NAS_SRC}MME/nas_parser.c - ${NAS_SRC}MME/nas_proc.c - ${libnas_api_OBJS} - ${libnas_mme_api_OBJS} - ${libnas_emm_msg_OBJS} - ${libnas_esm_msg_OBJS} - ${libnas_ies_OBJS} - ${libnas_utils_OBJS} - ${libnas_mme_emm_OBJS} - ${libnas_mme_emm_sap_OBJS} - ${libnas_mme_esm_OBJS} - ${libnas_mme_esm_sap_OBJS} - ) - include_directories(${NAS_SRC}MME) - include_directories(${NAS_SRC}MME/API/MME) - include_directories(${NAS_SRC}MME/EMM) - include_directories(${NAS_SRC}MME/EMM/SAP) - include_directories(${NAS_SRC}MME/ESM) - include_directories(${NAS_SRC}MME/ESM/SAP) -endif() - # Make lfds as a own source code (even if it is a outside library) @@ -1667,112 +1465,6 @@ target_link_libraries (lte-softmodem-nos1 ${LIBBOOST_LIBRARIES}) -# EPC is ??? nodes implementation in one process -################################ -add_executable(mme_gw - ${OPENAIR_BIN_DIR}/messages_xml.h - ${OPENAIRCN_DIR}/OAI_EPC/oai_epc_log.c - ${OPENAIRCN_DIR}/OAI_EPC/oai_epc.c - ${GTPV1U_DIR}/gtpv1u_task.c - ${OPENAIRCN_DIR}/SCTP/sctp_primitives_server.c - ${OPENAIRCN_DIR}/NAS/MME/nas_mme_task.c - ) -target_link_libraries (mme_gw - -Wl,--start-group - LIB_NAS_MME S1AP_LIB S1AP_EPC GTPV1U GTPV2C SCTP_SERVER UDP_SERVER SECU_CN SECU_OSA S6A SGW MME_APP LFDS ${MSC_LIB} ${ITTI_LIB} CN_UTILS HASHTABLE - -Wl,--end-group - pthread m sctp rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES} fdproto fdcore - ) - - -# Default parameters -# Does not work on simple install (fqdn in /etc/hosts 127.0.1.1) -#cmake_host_system_information(RESULT HSS_FQDN_STR QUERY FQDN) -#cmake_host_system_information(RESULT MME_FQDN_STR QUERY FQDN) -IF( EPC_BUILD ) - INCLUDE(FindFreeDiameter) - # if standalone eNB or UE no need for FreeDiameter - IF( FREEDIAMETER_FOUND ) - IF( NOT FREEDIAMETER_HSS_S6A_ENABLED ) - MESSAGE( SEND_ERROR "FreeDiameter is not enabled for OPENAIRHSS" ) - ENDIF( NOT FREEDIAMETER_HSS_S6A_ENABLED ) - ENDIF( FREEDIAMETER_FOUND ) - - - execute_process(COMMAND hostname --fqdn OUTPUT_VARIABLE HSS_FQDN_STR TIMEOUT 3) - execute_process(COMMAND hostname --fqdn OUTPUT_VARIABLE MME_FQDN_STR TIMEOUT 3) - string(STRIP ${HSS_FQDN_STR} HSS_FQDN_STR) - string(STRIP ${MME_FQDN_STR} MME_FQDN_STR) - - set(HSS_IP 127.0.1.1 CACHE STRING "HSS IP address, default is local") - set(MME_FQDN ${MME_FQDN_STR} CACHE STRING "MME Fully qualified domain name") - set(HSS_FQDN ${HSS_FQDN_STR} CACHE STRING "HSS Fully qualified domain name") - set(TRANSPORT_option "#No_TCP" CACHE STRING "No_TCP or No_SCTP or comment string, FreeDiameter config option") - set(TRANSPORT_PREFER_TCP_option "#Prefer_TCP" CACHE STRING "Prefer_TCP or comment string, FreeDiameter config option") - IF( NOT DEFINED REALM ) - string(FIND ${MME_FQDN} "." pos) - math(EXPR pos1 "${pos}+1") - string(SUBSTRING ${MME_FQDN} ${pos1} -1 realm_string) - message("REALM extracted from MME FQDN is ${realm_string}") - set(REALM ${realm_string} CACHE STRING "EPC realm") - ENDIF( NOT DEFINED REALM ) - message("REALM is ${REALM}") - IF( NOT DEFINED MME_HOSTNAME ) - string(FIND ${MME_FQDN} "." pos) - string(SUBSTRING ${MME_FQDN} 0 ${pos} mme_hostname_string) - message("MME_HOSTNAME extracted from MME FQDN is ${mme_hostname_string}") - set(MME_HOSTNAME ${mme_hostname_string} CACHE STRING "MME hostname") - ENDIF( NOT DEFINED MME_HOSTNAME ) - IF( NOT DEFINED HSS_HOSTNAME ) - string(FIND ${HSS_FQDN} "." pos) - string(SUBSTRING ${HSS_FQDN} 0 ${pos} hss_hostname_string) - message("HSS_HOSTNAME extracted from HSS FQDN is ${hss_hostname_string}") - set(HSS_HOSTNAME ${hss_hostname_string} CACHE STRING "HSS hostname") - ENDIF( NOT DEFINED HSS_HOSTNAME ) - - if ( ${MME_HOSTNAME} STREQUAL ${HSS_HOSTNAME} ) - set(MME_S6A_IS_SERVER 1 ) - endif( ${MME_HOSTNAME} STREQUAL ${HSS_HOSTNAME} ) - - IF( MME_S6A_IS_SERVER ) - set(ConnectPeer "#ConnectPeer" CACHE STRING "HSS connect to MME") - set(DIAMETER_PORT "Port = 3870" CACHE STRING "Diameter bind port, 3868 is always used by default by HSS, even if HSS client") - set(DIAMETER_SEC_PORT "SecPort = 3871" CACHE STRING "Diameter bind sec port") - ELSE( MME_S6A_IS_SERVER ) - set(ConnectPeer "#ConnectPeer" CACHE STRING "HSS act as a server") - set(DIAMETER_PORT "#Port = 3870" CACHE STRING "Diameter bind port") - set(DIAMETER_SEC_PORT "#SecPort = 3871" CACHE STRING "Diameter bind sec port") - ENDIF( MME_S6A_IS_SERVER ) - - execute_process(COMMAND sudo ${OPENAIR_CMAKE}/tools/check_mme_s6a_certificate ${FREEDIAMETER_PATH}/.. ${MME_FQDN} WORKING_DIRECTORY ${OPENAIR_CMAKE}) - - configure_file( - ${OPENAIR_CMAKE}/tools/s6a.conf.in - ${CMAKE_CURRENT_BINARY_DIR}/mme_fd.conf) - configure_file( - ${OPENAIR_CMAKE}/tools/epc.local.enb.conf.in - ${CMAKE_CURRENT_BINARY_DIR}/epc.local.enb.conf) - configure_file( - ${OPENAIR_CMAKE}/tools/epc.conf.in - ${CMAKE_CURRENT_BINARY_DIR}/epc.conf) -ENDIF( EPC_BUILD ) - -# oai_sgw is SGW node implementation -################################ -add_executable(oai_sgw - ${OPENAIR_BIN_DIR}/messages_xml.h - ${OPENAIRCN_DIR}/OAI_SGW/oai_sgw_log.c - ${OPENAIRCN_DIR}/OAI_SGW/oai_sgw.c - ) -target_link_libraries (oai_sgw - -Wl,--start-group - GTPV1U SECU_CN SECU_OSA S6A SGW CN_UTILS LFDS ${MSC_LIB} ${ITTI_LIB} - -Wl,--end-group - pthread m sctp rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES} fdproto fdcore - ) - - - # rrh ################################ set(DRIVER2013) @@ -1918,49 +1610,6 @@ foreach(myExe dlsim ulsim pbchsim scansim mbmssim pdcchsim pucchsim prachsim syn ) endforeach(myExe) -#unitary tests for Core NEtwork pieces -################################# -foreach(myExe s1ap - secu_knas_encrypt_eia1 - secu_kenb - aes128_ctr_encrypt - aes128_ctr_decrypt - secu_knas_encrypt_eea2 - secu_knas secu_knas_encrypt_eea1 - kdf - aes128_cmac_encrypt - secu_knas_encrypt_eia2) - add_executable(test_${myExe} - ${OPENAIRCN_DIR}/TEST/test_util.c - ${OPENAIRCN_DIR}/TEST/test_${myExe}.c - ) - target_link_libraries (test_${myExe} - -Wl,--start-group SECU_CN UTIL LFDS -Wl,--end-group m rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES} fdproto fdcore - ) -endforeach(myExe) - -add_executable(test_s1c_mme - ${OPENAIRCN_DIR}/TEST/oaisim_mme_test_s1c.c - ${OPENAIRCN_DIR}/TEST/oaisim_mme_test_s1c_scenario.h - ${OPENAIRCN_DIR}/TEST/oaisim_mme_test_s1c_scenario1.c - ${OPENAIRCN_DIR}/TEST/oaisim_mme_test_s1c_scenario.c - ${OPENAIRCN_DIR}/TEST/oaisim_mme_test_s1c_scenario.h - ${OPENAIRCN_DIR}/TEST/oaisim_mme_test_s1c_s1ap.c - ${OPENAIRCN_DIR}/TEST/oaisim_mme_test_s1c_s1ap.h - ${OPENAIR2_DIR}/ENB_APP/enb_config.c - ${OPENAIR2_DIR}/ENB_APP/enb_config.h - ${OPENAIR2_DIR}/COMMON/commonDef.h - ${OPENAIR2_DIR}/COMMON/messages_def.h - ${OPENAIR2_DIR}/COMMON/messages_types.h - ${OPENAIRCN_DIR}/S1AP/s1ap_eNB_defs.h - ${S1AP_DIR}/s1ap_eNB_management_procedures.c - ${OPENAIR_BIN_DIR}/messages_xml.h - ) -target_link_libraries (test_s1c_mme - -Wl,--start-group SECU_CN S1AP_LIB SCTP_CLIENT UTIL LFDS ${ITTI_LIB} -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES} fdproto fdcore - ) - - add_executable(test_epc_generate_scenario ${OPENAIRCN_DIR}/TEST/EPC_TEST/generate_scenario.c ${OPENAIR2_DIR}/ENB_APP/enb_config.h @@ -1971,30 +1620,15 @@ add_executable(test_epc_generate_scenario ${OPENAIR_BIN_DIR}/messages_xml.h ) target_link_libraries (test_epc_generate_scenario - -Wl,--start-group SECU_CN S1AP_LIB UTIL S1AP_ENB LIB_NAS_UE LFDS ${ITTI_LIB} -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES} + -Wl,--start-group RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS ${MSC_LIB} L2 -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES} ) - # to be added #../targets/TEST/PDCP/test_pdcp.c #../targets/TEST/PDCP/with_rlc/test_pdcp_rlc.c -# ??? -########################### -#add_executable(oaisim_mme -# ${OPENAIR_BIN_DIR}/messages_xml.h -# ${OPENAIRCN_DIR}/OAISIM_MME/oai_mme_log.c -# ${OPENAIRCN_DIR}/OAISIM_MME/oaisim_mme.c -# ${OPENAIRCN_DIR}/NAS/nas_main.c -#) -#target_link_libraries (oaisim_mme -# -Wl,--start-group -# NAS S1AP_LIB S1AP_EPC GTPV1U GTPV2C SCTP_SERVER UDP_SERVER SECU_CN SECU_OSA S6A S11 SGW MME_APP LFDS MSC ${ITTI_LIB} CN_UTILS HASHTABLE -# -Wl,--end-group -# pthread m sctp rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES} fdproto fdcore -#) ################################################## @@ -2124,15 +1758,6 @@ if(OAI_NW_DRIVER_USE_NETLINK) endif() make_driver(ue_ip ${OPENAIR2_DIR}/NETWORK_DRIVER/UE_IP ${ue_ip_src}) -# GTP -######################## -# KVERSION is not used in the code, but required -set(module_cc_opt "${module_cc_opt} -DKVERSION=3") -make_driver(xt_GTPUSP ${OPENAIRCN_DIR}/GTPV1-U/GTPU_SP "") - -# add the install targets -#install (TARGETS Tutorial DESTINATION bin) -#install (FILES "${PROJECT_BIN_DIR}/TutorialConfig.h" DESTINATION include) # OCTAVE tools ############### diff --git a/cmake_targets/at_commands/CMakeLists.txt b/cmake_targets/at_commands/CMakeLists.txt index cfdb6ec2aa..e03e876bd4 100755 --- a/cmake_targets/at_commands/CMakeLists.txt +++ b/cmake_targets/at_commands/CMakeLists.txt @@ -20,7 +20,7 @@ # Contact Information # OpenAirInterface Admin: openair_admin@eurecom.fr # OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@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 # Author: Lionel GAUTHIER diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai index 24fc3c521f..f9cd26cf86 100755 --- a/cmake_targets/build_oai +++ b/cmake_targets/build_oai @@ -1,30 +1,32 @@ #!/bin/bash ################################################################################ -# 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) anylater version. +# Copyright (c) 2015, EURECOM (www.eurecom.fr) +# All rights reserved. # +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: # -# 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. +# 1. Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. # -# 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/>. +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE +# The views and conclusions contained in the software and documentation are those +# of the authors and should not be interpreted as representing official policies, +# either expressed or implied, of the FreeBSD Project. # ################################################################################ # file build_oai diff --git a/cmake_targets/epc_build_oai/CMakeLists.template b/cmake_targets/epc_build_oai/CMakeLists.template deleted file mode 100644 index da80f6d4d2..0000000000 --- a/cmake_targets/epc_build_oai/CMakeLists.template +++ /dev/null @@ -1,88 +0,0 @@ -cmake_minimum_required(VERSION 2.8) - -set ( CMAKE_BUILD_TYPE "RelWithDebInfo" ) -set ( ADDR_CONF False ) -set ( BYTE_ORDER=LITTLE_ENDIAN ) -set ( DEBUG_OMG False ) -set ( DISABLE_ITTI_DETECT_SUB_TASK_ID True ) -set ( DISABLE_XER_PRINT False ) -set ( DRIVER2013 False ) -set ( EMOS False ) -set ( ENABLE_FXP False ) -set ( ENABLE_ITTI True ) -set ( ENABLE_NAS_UE_LOGGING False ) -set ( ENABLE_NEW_MULTICAST False ) -set ( ENABLE_PGM_TRANSPORT False ) -set ( ENABLE_RAL False ) -set ( ENABLE_SECURITY False ) -set ( ENABLE_STANDALONE_EPC True ) -set ( ENABLE_USE_CPU_EXECUTION_TIME False ) -set ( ENABLE_USE_MME False ) -set ( ENABLE_VCD_FIFO False ) -set ( ENB_MODE False ) -set ( EPC_BUILD True ) -set ( EXMIMO_IOT False ) -set ( FLAG_GTPV1U_KERNEL_THREAD_SOCK_NO_WAIT False) -set ( HARD_RT False ) -set ( JUMBO_FRAME False ) -set ( LARGE_SCALE False ) -set ( LINK_ENB_PDCP_TO_GTPV1U False ) -set ( LINUX_LIST False ) -set ( LINUX False ) -set ( LOCALIZATION False ) -set ( LOG_NO_THREAD False ) -set ( LOWLATENCY False ) -set ( MAC_CONTEXT 1 ) -set ( MAX_NUM_CCs 1 ) -set ( MESSAGE_CHART_GENERATOR True) -set ( MIH_C_MEDIEVAL_EXTENSIONS False ) -set ( MSG_PRINT False ) -set ( MU_RECEIVER False ) -set ( NAS_ADDRESS_FIX False ) -set ( NAS_BUILT_IN_EPC True ) -set ( NAS_DEBUG True ) -set ( NAS_MME True ) -set ( NAS_NETLINK False ) -set ( NAS_UE False ) -set ( NB_ANTENNAS_RX "2" ) -set ( NB_ANTENNAS_TX "2" ) -set ( NB_ANTENNAS_TXRX "2" ) -set ( NEW_FFT False ) -set ( NO_RRM False ) -set ( OAI_EMU False ) -set ( OAISIM False ) -set ( OAI_NW_DRIVER_TYPE_ETHERNET False ) -set ( OAI_NW_DRIVER_USE_NETLINK False ) -set ( OPENAIR1 False ) -set ( OPENAIR2 False ) -set ( OPENAIR_EMU False ) -set ( OPENAIR_LTE False ) -set ( PACKAGE_NAME "EPC" ) -set ( PBS_SIM False ) -set ( PC_DSP False ) -set ( PC_TARGET False ) -set ( PDCP_MSG_PRINT False ) -set ( PERFECT_CE False ) -set ( PHY_ABSTRACTION False ) -set ( PHY_CONTEXT False ) -set ( PHY_EMUL False ) -set ( PHYSIM False ) -set ( PUCCH False ) -set ( RANDOM_BF False ) -set ( RF_BOARD "False" ) -set ( RRC_ASN1_VERSION "Rel10" ) -set ( RLC_STOP_ON_LOST_PDU False ) -set ( RRC_MSG_PRINT False ) -set ( RTAI False ) -set ( S1AP_DEBUG_LIST True ) -set ( SECU False ) -set ( SMBV False ) -set ( SPECTRA False ) -set ( TEST_OMG False ) -set ( UPDATE_RELEASE_9 True) -set ( UPDATE_RELEASE_10 True) -set ( USE_3GPP_ADDR_AS_LINK_ADDR False ) -set ( USE_MME "R10" ) -set ( USER_MODE True ) -set ( XER_PRINT False ) -set ( XFORMS False ) diff --git a/cmake_targets/epc_test/CMakeLists.template b/cmake_targets/epc_test/CMakeLists.template new file mode 100644 index 0000000000..25d94ea852 --- /dev/null +++ b/cmake_targets/epc_test/CMakeLists.template @@ -0,0 +1,77 @@ +cmake_minimum_required(VERSION 2.8) + +set ( CMAKE_BUILD_TYPE "RelWithDebInfo" ) +set ( ADDR_CONF False ) +set ( DEBUG_OMG False ) +set ( DISABLE_XER_PRINT False ) +set ( DRIVER2013 True ) +set ( EMOS False ) +set ( ENABLE_FXP True ) +set ( ENABLE_ITTI True ) +set ( ENABLE_NAS_UE_LOGGING True ) +set ( ENABLE_NEW_MULTICAST True ) +set ( ENABLE_PGM_TRANSPORT True ) +set ( ENABLE_SECURITY True ) +set ( ENABLE_STANDALONE_EPC False) +set ( ENABLE_USE_CPU_EXECUTION_TIME True ) +set ( ENABLE_USE_MME True ) +set ( ENABLE_USE_RAW_SOCKET_FOR_SGI True) +set ( ENABLE_VCD_FIFO False ) +set ( ENB_MODE True ) +set ( EXMIMO_IOT True ) +set ( HARD_RT False ) +set ( JUMBO_FRAME True ) +set ( LARGE_SCALE False ) +set ( LINK_ENB_PDCP_TO_GTPV1U True) +set ( LINUX_LIST False ) +set ( LINUX True ) +set ( LOCALIZATION False ) +set ( LOG_NO_THREAD True ) +set ( LOWLATENCY False ) +set ( MAC_CONTEXT 1 ) +set ( MAX_NUM_CCs 1 ) +set ( MESSAGE_CHART_GENERATOR False) +set ( MIH_C_MEDIEVAL_EXTENSIONS False ) +set ( MSG_PRINT False ) +set ( MU_RECEIVER False ) +set ( NAS_ADDRESS_FIX False ) +set ( NAS_BUILT_IN_UE True) +set ( NAS_MME False ) +set ( NAS_UE True ) +set ( NB_ANTENNAS_RX "2" ) +set ( NB_ANTENNAS_TX "2" ) +set ( NB_ANTENNAS_TXRX "2" ) +set ( NEW_FFT True ) +set ( NO_RRM True ) +set ( OAI_EMU False ) +set ( OAISIM False ) +set ( OAI_NW_DRIVER_TYPE_ETHERNET False ) +set ( OAI_NW_DRIVER_USE_NETLINK True ) +set ( OPENAIR1 False ) +set ( OPENAIR2 False ) +set ( OPENAIR_LTE F ) +set ( PACKAGE_NAME "epc_test" ) +set ( PBS_SIM False ) +set ( PDCP_USE_NETLINK True ) +set ( PC_DSP True ) +set ( PC_TARGET True ) +set ( PDCP_MSG_PRINT False ) +set ( PERFECT_CE False ) +set ( PHY_ABSTRACTION True ) +set ( PHY_CONTEXT False ) +set ( PHY_EMUL False ) +set ( PHYSIM True ) +set ( PUCCH True ) +set ( RANDOM_BF False ) +set ( RF_BOARD "False" ) +set ( RLC_STOP_ON_LOST_PDU False ) +set ( RRC_ASN1_VERSION "Rel10" ) +set ( RRC_DEFAULT_RAB_IS_AM True) +set ( RRC_MSG_PRINT False ) +set ( RTAI False ) +set ( SECU False ) +set ( SMBV False ) +set ( TEST_OMG False ) +set ( USE_MME "R10" ) +set ( USER_MODE True ) +set ( XER_PRINT False ) diff --git a/cmake_targets/hss_build/CMakeLists.txt b/cmake_targets/hss_build/CMakeLists.txt deleted file mode 100755 index ae4655be21..0000000000 --- a/cmake_targets/hss_build/CMakeLists.txt +++ /dev/null @@ -1,326 +0,0 @@ -################################################################################ -# 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@eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE -# Author: Lionel GAUTHIER -############################################################################### -cmake_minimum_required(VERSION 2.8) -set(CMAKE_VERBOSE_MAKEFILE ON) - - -project(HSS) - - -ENABLE_LANGUAGE(C) -#Sends the -std=c99 flag to the gcc compiler -#add_definitions(-std=c99) - -ADD_DEFINITIONS(-D_GNU_SOURCE) - -if( NOT DEFINED OPENAIR_DIR) - message(SEND_ERROR "OPENAIR_DIR not set: ${OPENAIR_DIR}") -endif( NOT DEFINED OPENAIR_DIR) - -set(OPENAIR1_DIR ${OPENAIR_DIR}/openair1) -set(OPENAIR2_DIR ${OPENAIR_DIR}/openair2) -set(OPENAIR3_DIR ${OPENAIR_DIR}/openair3) -set(OPENAIRCN_DIR ${OPENAIR_DIR}/openair-cn) -set(OPENAIR_TARGETS ${OPENAIR_DIR}/targets) -set(OPENAIR_CMAKE_SCRIPTS ${OPENAIR_DIR}/cmake_targets/tools) -set(OPENAIRHSS_DIR ${OPENAIRCN_DIR}/OPENAIRHSS) -set(OPENAIR_BIN_DIR ${OPENAIR_TARGETS}/bin) - - -set(CMAKE_MODULE_PATH "${OPENAIR_DIR}/cmake_targets/tools/MODULES" "${CMAKE_MODULE_PATH}") - -macro(add_option name val helpstr) - if(DEFINED ${name}) - set(value ${${name}}) - else(DEFINED ${name}) - set(value ${val}) - endif() - set(${name} ${value} CACHE STRING "${helpstr}") - add_definitions("-D${name}=${value}") -endmacro(add_option) - - -# compilation flags -# added CMAKER conditional compilation to not bother legacy building system -############################################# -if(NOT CMAKE_BUILD_TYPE) -set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "Choose the type of build, options are: None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel." FORCE) -endif() -set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS Debug Release RelWithDebInfo MinSizeRel) - -# -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse4.2 -std=gnu99 -Wall -Wstrict-prototypes -fno-strict-aliasing -rdynamic -funroll-loops -Wno-packed-bitfield-compat -DCMAKER") -set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -ggdb -DMALLOC_CHECK_=3") -set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -ggdb -DMALLOC_CHECK_=3 -O2") - - -INCLUDE(FindMySQL) -IF( NOT MySQL_FOUND ) - MESSAGE( SEND_ERROR "MySQL Client is required" ) -ENDIF( NOT MySQL_FOUND ) - -INCLUDE(FindNettle) -IF( NOT NETTLE_FOUND ) - MESSAGE( SEND_ERROR "Nettle is required" ) -ENDIF( NOT NETTLE_FOUND ) - - - -INCLUDE(FindFreeDiameter) -IF( NOT FREEDIAMETER_FOUND ) - MESSAGE( SEND_ERROR "FreeDiameter is required (use OAI installer)" ) -ENDIF( NOT FREEDIAMETER_FOUND ) -IF( NOT FREEDIAMETER_HSS_S6A_ENABLED ) - MESSAGE( SEND_ERROR "FreeDiameter is not enabled for OPENAIRHSS" ) -ENDIF( NOT FREEDIAMETER_HSS_S6A_ENABLED ) -add_definitions("-DFREEDIAMETER_VERSION=${FREEDIAMETER_VERSION}") - -find_package(BISON REQUIRED) -find_package(FLEX REQUIRED) - -set(CMAKE_THREAD_PREFER_PTHREAD TRUE) -find_package(Threads REQUIRED) - -#find_package(Subversion) -#if(SUBVERSION_FOUND) -# Subversion_WC_INFO(${OPENAIR_DIR} openair) -# set (PACKAGE_VERSION "${openair_WC_REVISION} - ${openair_WC_LAST_CHANGED_DATE}") -# Subversion_WC_LOG(${OPENAIR_DIR} openair) -# message("Last changed log is ${openair_LAST_CHANGED_LOG}") -# add_definitions("-DPACKAGE_VERSION=\"${PACKAGE_VERSION}\"") -#else() -set (PACKAGE_VERSION "No svn information") -#endif() - -add_definitions("-DPACKAGE_NAME=\"OPENAIRHSS\"") - - -################################################################################ -# ACCESS RESTRICTION LIB -################################################################################ -set(ar_SRC - ${OPENAIRHSS_DIR}/access_restriction/access_restriction.c -) -set(ar_HDR - ${OPENAIRHSS_DIR}/access_restriction/access_restriction.h - ${OPENAIRHSS_DIR}/utils/conversion.h -) - -add_library(hss_access_restriction ${ar_SRC} ${ar_HDR}) -target_include_directories(hss_access_restriction PRIVATE ${OPENAIRHSS_DIR}/utils) - - -################################################################################ -# AUC LIB -################################################################################ -set(auc_SRC - ${OPENAIRHSS_DIR}/auc/fx.c - ${OPENAIRHSS_DIR}/auc/kdf.c - ${OPENAIRHSS_DIR}/auc/random.c - ${OPENAIRHSS_DIR}/auc/rijndael.c - ${OPENAIRHSS_DIR}/auc/sequence_number.c -) -set(auc_HDR - ${OPENAIRHSS_DIR}/auc/auc.h -) - -add_library(hss_auc ${auc_SRC} ${auc_HDR}) - - -################################################################################ -# DB LIB -################################################################################ -set(db_SRC - ${OPENAIRHSS_DIR}/db/db_connector.c - ${OPENAIRHSS_DIR}/db/db_epc_equipment.c - ${OPENAIRHSS_DIR}/db/db_subscription_data.c -) -set(db_HDR - ${OPENAIRHSS_DIR}/db/db_proto.h - ${OPENAIRHSS_DIR}/utils/hss_config.h -) - -add_library(hss_db ${db_SRC} ${db_HDR}) -target_include_directories(hss_db PRIVATE ${OPENAIRHSS_DIR}/utils) - - -################################################################################ -# S6A LIB -################################################################################ -set(s6a_SRC - ${OPENAIRHSS_DIR}/s6a/s6a_auth_info.c - ${OPENAIRHSS_DIR}/s6a/s6a_common.c - ${OPENAIRHSS_DIR}/s6a/s6a_error.c - ${OPENAIRHSS_DIR}/s6a/s6a_fd.c - ${OPENAIRHSS_DIR}/s6a/s6a_in_addr.c - ${OPENAIRHSS_DIR}/s6a/s6a_peers.c - ${OPENAIRHSS_DIR}/s6a/s6a_purge_ue.c - ${OPENAIRHSS_DIR}/s6a/s6a_subscription_data.c - ${OPENAIRHSS_DIR}/s6a/s6a_supported_features.c - ${OPENAIRHSS_DIR}/s6a/s6a_up_loc.c -) -set(s6a_HDR - ${OPENAIRHSS_DIR}/s6a/s6a_proto.h - ${OPENAIRHSS_DIR}/db/db_proto.h - ${OPENAIRHSS_DIR}/utils/hss_config.h - ${OPENAIRHSS_DIR}/auc/auc.h - ${OPENAIRHSS_DIR}/access_restriction/access_restriction.h -) - -add_library(hss_s6a ${s6a_SRC} ${s6a_HDR}) -target_include_directories(hss_s6a PRIVATE ${OPENAIRHSS_DIR}/utils) -target_include_directories(hss_s6a PRIVATE ${OPENAIRHSS_DIR}/db) -target_include_directories(hss_s6a PRIVATE ${OPENAIRHSS_DIR}/auc) -target_include_directories(hss_s6a PRIVATE ${OPENAIRHSS_DIR}/access_restriction) -target_include_directories(hss_s6a PRIVATE ${FREEDIAMETER_INCLUDE_DIR}) - -################################################################################ -# UTILS LIB -################################################################################ -# Create target for the parser - ADD_CUSTOM_TARGET(HSSParser echo "Creating hss_parser.c") - -set(UTILS_GENERATED_DIR ${OPENAIR_BIN_DIR}) - -# Create custom command for flex/lex (note the outputs) - ADD_CUSTOM_COMMAND( - SOURCE ${OPENAIRHSS_DIR}/utils/hss_scanner.l - COMMAND ${FLEX_EXECUTABLE} - ARGS -o${UTILS_GENERATED_DIR}/hss_scanner.c ${OPENAIRHSS_DIR}/utils/hss_scanner.l - TARGET HSSParser - OUTPUTS ${UTILS_GENERATED_DIR}/hss_scanner.c) - -# Create custom command for bison/yacc (note the DEPENDS) - ADD_CUSTOM_COMMAND( - SOURCE ${OPENAIRHSS_DIR}/utils/hss_parser.y - COMMAND ${BISON_EXECUTABLE} - ARGS -y ${OPENAIRHSS_DIR}/utils/hss_parser.y - -o ${UTILS_GENERATED_DIR}/hss_parser.c - TARGET HSSParser - DEPENDS ${UTILS_GENERATED_DIR}/hss_scanner.c - OUTPUTS ${UTILS_GENERATED_DIR}/hss_parser.c) - -set(utils_SRC - ${UTILS_GENERATED_DIR}/hss_scanner.c - ${UTILS_GENERATED_DIR}/hss_parser.c - ${OPENAIRHSS_DIR}/utils/conversion.c - ${OPENAIRHSS_DIR}/utils/hss_config.c -) -set(utils_HDR - ${UTILS_GENERATED_DIR}/hss_parser.h - ${UTILS_GENERATED_DIR}/hss_scanner.h - ${OPENAIRHSS_DIR}/utils/conversion.h - ${OPENAIRHSS_DIR}/utils/hss_config.h - ${OPENAIRHSS_DIR}/utils/queue.h -) -# Since parser.c does not exists yet when cmake is run, mark -# it as generated -SET_SOURCE_FILES_PROPERTIES(${UTILS_GENERATED_DIR}/hss_parser.c GENERATED) -SET_SOURCE_FILES_PROPERTIES(${UTILS_GENERATED_DIR}/hss_scanner.c GENERATED) -SET_SOURCE_FILES_PROPERTIES(${UTILS_GENERATED_DIR}/hss_parser.h GENERATED) -SET_SOURCE_FILES_PROPERTIES(${UTILS_GENERATED_DIR}/hss_scanner.h GENERATED) -SET_SOURCE_FILES_PROPERTIES(${OPENAIRHSS_DIR}/utils/hss_config.c DEPENDS ${UTILS_GENERATED_DIR}/hss_parser.c) -add_library(hss_utils ${utils_SRC} ${utils_HDR}) - -################################################################################ -# EXECUTABLE openair-hss -################################################################################ -include_directories( ${UTILS_GENERATED_DIR} ${OPENAIRHSS_DIR}/utils ${OPENAIRHSS_DIR}/s6a ${OPENAIRHSS_DIR}/db ${OPENAIRHSS_DIR}/auc ${OPENAIRHSS_DIR}/access_restriction) -ADD_EXECUTABLE(openair-hss ${OPENAIRHSS_DIR}/hss_main.c) -target_link_libraries (openair-hss - -Wl,-whole-archive - hss_access_restriction - hss_auc - hss_db - hss_s6a - hss_utils - -Wl,-no-whole-archive - ${MySQL_LIBRARY} - ${NETTLE_LIBRARIES} - ${FREEDIAMETER_LIBRARIES} - ${CMAKE_THREAD_LIBS_INIT} ) - -# Default parameters -# Does not work on simple install (fqdn in /etc/hosts 127.0.1.1) -cmake_host_system_information(RESULT SITE_HSS_FQDN QUERY FQDN) -add_option(HSS_FQDN ${SITE_HSS_FQDN} "HSS Fully qualified domain name") -IF( NOT DEFINED REALM ) - string(FIND ${HSS_FQDN} "." pos) - math(EXPR pos1 "${pos}+1") - string(SUBSTRING ${HSS_FQDN} ${pos1} -1 realm_string) - message("REALM extracted from HSS FQDN is ${realm_string}") - set(REALM ${realm_string} CACHE STRING "HSS realm") -ENDIF( NOT DEFINED REALM ) -set(MYSQL_server "127.0.0.1" CACHE STRING "Database server IP address") -set(MYSQL_admin root CACHE STRING "Database admin login") -set(MYSQL_admin_pass linux CACHE STRING "Database admin password") -set(MYSQL_user hssadmin CACHE STRING "Database username login") -set(MYSQL_pass admin CACHE STRING "Database username password") -set(MYSQL_db oai_db CACHE STRING "Database name") -set(TRANSPORT_option "#No_TCP" CACHE STRING "No_TCP or No_SCTP or comment string, FreeDiameter config option") -set(TRANSPORT_PREFER_TCP_option "#Prefer_TCP" CACHE STRING "Prefer_TCP or comment string, FreeDiameter config option") -set(AppServThreads 2 CACHE STRING "FreeDiameter AppServThreads config option") -set(OPERATOR_key "" CACHE STRING "LTE operator clear text key (hex bytes) example 11111111111111111111111111111111") -set(RANDOM_boolean "true" CACHE STRING "If false, random function returns always 0, else random as usual.") -set(REMOTE_PEER_WHITELIST "*.${REALM}" CACHE STRING "Remote peer whitelist (separated by spaces), for freediameter acl.conf config file") -IF( FD_SERVER_IP_BIND_LIST ) - set(ListenOn "ListenOn = \"${FD_SERVER_IP_BIND_LIST}\"" CACHE STRING "FreeDiameter server IP bind addresses list") -ELSE( FD_SERVER_IP_BIND_LIST ) - set(ListenOn "#ListenOn = \"\"" CACHE STRING "FreeDiameter server IP bind addresses list") -ENDIF( FD_SERVER_IP_BIND_LIST ) - -IF( HSS_CONNECT_TO_MME ) - set(ConnectPeer "ConnectPeer" CACHE STRING "HSS connect to MME") - set(DIAMETER_PORT "#Port = 3868" CACHE STRING "Diameter bind port") - set(DIAMETER_SEC_PORT "#SecPort = 3869" CACHE STRING "Diameter bind sec port") -ELSE( HSS_CONNECT_TO_MME ) - set(ConnectPeer "#ConnectPeer" CACHE STRING "HSS act as a server") - set(DIAMETER_PORT "Port = 3868" CACHE STRING "Diameter bind port") - set(DIAMETER_SEC_PORT "SecPort = 3869" CACHE STRING "Diameter bind sec port") -ENDIF( HSS_CONNECT_TO_MME ) - - -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/hss_fd.conf.in ${CMAKE_CURRENT_BINARY_DIR}/hss_fd.conf) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/hss.conf.in ${CMAKE_CURRENT_BINARY_DIR}/hss.conf) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/acl.conf.in ${CMAKE_CURRENT_BINARY_DIR}/acl.conf) - -execute_process(COMMAND sudo ${OPENAIR_CMAKE_SCRIPTS}/check_hss_s6a_certificate ${FREEDIAMETER_PATH}/.. ${HSS_FQDN} WORKING_DIRECTORY ${OPENAIR_CMAKE_SCRIPTS} TIMEOUT 3) - -# This does not overwrite database if it exist -execute_process(COMMAND ${OPENAIR_CMAKE_SCRIPTS}/create_hss_database - ${MYSQL_admin} ${MYSQL_admin_pass} ${MYSQL_user} ${MYSQL_pass} ${MYSQL_db} - WORKING_DIRECTORY ${OPENAIR_CMAKE_SCRIPTS} - ERROR_VARIABLE ERROR_DB - TIMEOUT 5) - -IF( ERROR_DB ) - MESSAGE( SEND_ERROR "Database setup failed: ${ERROR_DB}" ) -ENDIF( ERROR_DB ) - -install (TARGETS openair-hss DESTINATION ${OPENAIR_TARGETS}/bin) - diff --git a/cmake_targets/hss_build/acl.conf.in b/cmake_targets/hss_build/acl.conf.in deleted file mode 100644 index 7702690f78..0000000000 --- a/cmake_targets/hss_build/acl.conf.in +++ /dev/null @@ -1,19 +0,0 @@ -# Configuration file for the peer whitelist extension. -# -# This extension is meant to allow connection from remote peers, without actively -# maintaining this connection ourselves (as it would be the case by declaring the -# peer in a ConnectPeer directive). -# The format of this file is very simple. It contains a list of peer names -# separated by spaces or newlines. -# -# The peer name must be a fqdn. We allow also a special "*" character as the -# first label of the fqdn, to allow all fqdn with the same domain name. -# Example: *.example.net will allow host1.example.net and host2.example.net -# -# At the beginning of a line, the following flags are allowed (case sensitive) -- either or both can appear: -# ALLOW_OLD_TLS : we accept unprotected CER/CEA exchange with Inband-Security-Id = TLS -# ALLOW_IPSEC : we accept implicitly protected connection with with peer (Inband-Security-Id = IPSec) -# It is specified for example as: -# ALLOW_IPSEC vpn.example.net vpn2.example.net *.vpn.example.net - -ALLOW_OLD_TLS @REMOTE_PEER_WHITELIST@ diff --git a/cmake_targets/hss_build/hss.conf.in b/cmake_targets/hss_build/hss.conf.in deleted file mode 100644 index dd34a117e6..0000000000 --- a/cmake_targets/hss_build/hss.conf.in +++ /dev/null @@ -1,13 +0,0 @@ -## MySQL mandatory options -MYSQL_server = "@MYSQL_server@"; -MYSQL_user = "@MYSQL_user@"; -MYSQL_pass = "@MYSQL_pass@"; -MYSQL_db = "@MYSQL_db@"; - -## HSS options -OPERATOR_key = "@OPERATOR_key@"; - -RANDOM = "@RANDOM_boolean@"; - -## Freediameter options -FD_conf = "@FREEDIAMETER_PATH@/../etc/freeDiameter/hss_fd.conf"; diff --git a/cmake_targets/hss_build/hss_fd.conf.in b/cmake_targets/hss_build/hss_fd.conf.in deleted file mode 100644 index 5d59919c35..0000000000 --- a/cmake_targets/hss_build/hss_fd.conf.in +++ /dev/null @@ -1,106 +0,0 @@ -# -------- Local --------- -# The first parameter in this section is Identity, which will be used to -# identify this peer in the Diameter network. The Diameter protocol mandates -# that the Identity used is a valid FQDN for the peer. This parameter can be -# omitted, in that case the framework will attempt to use system default value -# (as returned by hostname --fqdn). -Identity = "@HSS_FQDN@"; - -# In Diameter, all peers also belong to a Realm. If the realm is not specified, -# the framework uses the part of the Identity after the first dot. -Realm = "@REALM@"; - - -# This parameter is mandatory, even if it is possible to disable TLS for peers -# connections. A valid certificate for this Diameter Identity is expected. -TLS_Cred = "@FREEDIAMETER_PATH@/../etc/freeDiameter/hss.cert.pem", "@FREEDIAMETER_PATH@/../etc/freeDiameter/hss.key.pem"; -TLS_CA = "@FREEDIAMETER_PATH@/../etc/freeDiameter/hss.cacert.pem"; - - -# Disable use of TCP protocol (only listen and connect in SCTP) -# Default : TCP enabled -@TRANSPORT_option@; - - -# This option is ignored if freeDiameter is compiled with DISABLE_SCTP option. -# Prefer TCP instead of SCTP for establishing new connections. -# This setting may be overwritten per peer in peer configuration blocs. -# Default : SCTP is attempted first. -@TRANSPORT_PREFER_TCP_option@; - - -# Disable use of IPv6 addresses (only IP) -# Default : IPv6 enabled -No_IPv6; - - -# Overwrite the number of SCTP streams. This value should be kept low, -# especially if you are using TLS over SCTP, because it consumes a lot of -# resources in that case. See tickets 19 and 27 for some additional details on -# this. -# Limit the number of SCTP streams -SCTP_streams = 3; - - -# By default, freeDiameter acts as a Diameter Relay Agent by forwarding all -# messages it cannot handle locally. This parameter disables this behavior. -NoRelay; - - -TLS_old_method; - - -# Number of parallel threads that will handle incoming application messages. -# This parameter may be deprecated later in favor of a dynamic number of threads -# depending on the load. -AppServThreads = @AppServThreads@; - -# Specify the addresses on which to bind the listening server. This must be -# specified if the framework is unable to auto-detect these addresses, or if the -# auto-detected values are incorrect. Note that the list of addresses is sent -# in CER or CEA message, so one should pay attention to this parameter if some -# adresses should be kept hidden. -@ListenOn@; - -@DIAMETER_PORT@; -@DIAMETER_SEC_PORT@; - - -# -------- Extensions --------- - -# Uncomment (and create rtd.conf) to specify routing table for this peer. -#LoadExtension = "rt_default.fdx" : "rtd.conf"; - -# Uncomment (and create acl.conf) to allow incoming connections from other peers. -LoadExtension = "acl_wl.fdx" : "@FREEDIAMETER_PATH@/../etc/freeDiameter/acl.conf"; - -# Uncomment to display periodic state information -#LoadExtension = "dbg_monitor.fdx"; - -# Uncomment to enable an interactive Python interpreter session. -# (see doc/dbg_interactive.py.sample for more information) -#LoadExtension = "dbg_interactive.fdx"; - -# Load the RFC4005 dictionary objects -#LoadExtension = "dict_nasreq.fdx"; - -LoadExtension = "dict_nas_mipv6.fdx"; -LoadExtension = "dict_s6a.fdx"; - -# Load RFC4072 dictionary objects -#LoadExtension = "dict_eap.fdx"; - -# Load the Diameter EAP server extension (requires diameap.conf) -#LoadExtension = "app_diameap.fdx" : "diameap.conf"; - -# Load the Accounting Server extension (requires app_acct.conf) -#LoadExtension = "app_acct.fdx" : "app_acct.conf"; - -# -------- Peers --------- - -# The framework will actively attempt to establish and maintain a connection -# with the peers listed here. -# For only accepting incoming connections, see the acl_wl.fx extension. - -#ConnectPeer = "ubuntu.localdomain" { ConnectTo = "127.0.0.1"; No_TLS; }; -@ConnectPeer@ = "@MME_FQDN@" { ConnectTo = "@MME_IP@"; Realm = "@REALM@"; No_IPv6; No_TLS ; port = 3870; }; \ No newline at end of file diff --git a/cmake_targets/tools/build_epc b/cmake_targets/tools/build_epc deleted file mode 100755 index 0caeaf2617..0000000000 --- a/cmake_targets/tools/build_epc +++ /dev/null @@ -1,302 +0,0 @@ -#!/bin/bash -################################################################################ -# 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) anylater 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@eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE -# -################################################################################ -# file build_epc -# brief -# author Lionel Gauthier -# company Eurecom -# email: lionel.gauthier@eurecom.fr -# -################################ -# include helper functions -################################ -THIS_SCRIPT_PATH=$(dirname $(readlink -f $0)) -source $THIS_SCRIPT_PATH/build_helper - -function help() -{ - echo_error " " - echo_error "Usage: build_epc [OPTION]..." - echo_error "Build the EPC executable." - echo_error " " - echo_error "Options:" - echo_error "Mandatory arguments to long options are mandatory for short options too." - echo_error " -c, --clean Clean the build generated files (build from scratch)" - echo_error " -C, --conf-files-only Generate only EPC configuration files (no build)" - echo_error " -d, --debug Compile with debug informations." - echo_error " -h, --help Print this help." - echo_error " -g, --gtpu-easy-module Used for debugging GTPU (kernel module can be easily removed, for dev and debug purpose only)" - echo_error " -G, --gtpu-full-speed Best GTPU throughput performance, but cannot be removed (default)." - echo_error " -H, --hss hostname HSS hostname (with FQDN), default is this host (`hostname --fqdn`)." - echo_error " -i, --check-installed-software Check installed software packages necessary to build and run EPC (support Ubuntu 14.04)." - l_realm=`hostname --fqdn` - l_realm=${l_realm#*.} - echo_error " -r, --realm realm Realm of the MME (if not specified, is extracted from this host FQDN ($l_realm))." - echo_error " -s, --transport-sctp-only Diameter use SCTP only (TCP disabled)." - echo_error " -S, --s6a-server MME act as a server on s6a interface (useful when HSS and MME/EPC run on the same host)." - echo_error " -t, --transport-tcp-only Diameter use TCP only (SCTP disabled)." - echo_error " -T, --transport-prefer-tcp Diameter prefer TCP." - echo_error " -v, --verbose Build process verbose." - echo_error " " - echo_error "Examples:" - echo_error " " - echo_error "Case 1 - EPC run on same HSS host" - echo_error "build_epc -d -S -t -T" - echo_error " " - echo_error "Case 2 - EPC and HSS do not run on same host" - echo_error "build_epc -d -s -H my_hss_fqdn" -} - - - -function main() -{ - local -i clean=0 - local -i conf_files_only=0 - local -i verbose=0 - local -i s6a_server=0 - local cmake_args=" " - local make_args="-j $NUM_CPU" - local realm="" - local gtpu_cmake_arg="-DFLAG_GTPV1U_KERNEL_THREAD_SOCK_NO_WAIT=False" - local hss_fqdn="" - local hss_hostname="" - local hss_ip="" - local REL="Rel10" - - - until [ -z "$1" ] - do - case "$1" in - -c | --clean) - clean=1 - echo "Clean the build generated files (build from scratch)" - shift; - ;; - -C | --conf-files-only) - conf_files_only=1 - echo "Generate only conf files (no build)" - shift; - ;; - -d | --debug) - cmake_args="$cmake_args -DDEBUG=1" - echo "Compile with debug informations" - shift; - ;; - -g | --gtpu-easy-module) - gtpu_cmake_arg="-DFLAG_GTPV1U_KERNEL_THREAD_SOCK_NO_WAIT=True" - echo "Compile with not optimized GTPU kernel module option (but kernel module easy to remove)" - shift; - ;; - -G | --gtpu-full-speed) - echo "Compile with best performance GTPU kernel module option" - shift; - ;; - -h | --help) - help - shift; - exit 0 - ;; - -H | --hss) - hss_fqdn=$2 - cmake_args="$cmake_args -DHSS_FQDN=$hss_fqdn" - shift 2; - ;; - -i | --check-installed-software) - echo "Check installed software packages necessary to build and run EPC (support Ubuntu 14.04):" - set_openair_env - check_install_oai_software - check_install_additional_tools - exit 0 - ;; - -r | --realm) - echo "Realm: $2" - realm=$2 - cmake_args="$cmake_args -DREALM=$realm" - shift 2; - ;; - -s | --transport-sctp-only) - echo "Diameter use SCTP (TCP disabled), this is the default option." - cmake_args="$cmake_args -DTRANSPORT_option=No_TCP" - shift; - ;; - -S | --s6a-server) - echo "MME act as a server on s6a" - s6a_server=1 - cmake_args="$cmake_args -DMME_S6A_IS_SERVER=1" - shift 1; - ;; - -t | --transport-tcp-only) - echo "Diameter use TCP (SCTP disabled)." - cmake_args="$cmake_args -DTRANSPORT_option=No_SCTP" - shift; - ;; - -T | --transport-prefer-tcp) - echo "Diameter prefer TCP (TCP, SCTP enabled)." - cmake_args="$cmake_args -DTRANSPORT_PREFER_TCP_option=Prefer_TCP" - shift; - ;; - -v | --verbose) - echo "Make build process verbose" - cmake_args="$cmake_args -DCMAKE_VERBOSE_MAKEFILE=ON" - make_args="VERBOSE=1 $make_args" - verbose=1 - shift; - ;; - *) - echo "Unknown option $1" - help - exit 1 - ;; - esac - done - - cmake_args="$cmake_args $gtpu_cmake_arg" - - # extra arguments processing - if [[ z$hss_fqdn = z ]]; then - hss_fqdn=`hostname --fqdn` - cmake_args="$cmake_args -DHSS_FQDN=$hss_fqdn" - if [[ z$realm = z ]]; then - realm=$hss_fqdn - realm=${realm#*.} - cmake_args="$cmake_args -DREALM=$realm" - fi - else - if [[ z$realm = z ]]; then - realm=${hss_fqdn#*.} - cmake_args="$cmake_args -DREALM=$realm" - fi - fi - hss_hostname=${hss_fqdn%%.*} - cmake_args="$cmake_args -DHSS_HOSTNAME=$hss_hostname" - - hss_ip=`resolveip --silent $hss_hostname` - if [[ z$hss_ip = z ]]; then - hss_ip=`resolveip --silent $hss_fqdn` - fi - if [[ z$hss_ip = z ]]; then - echo_abort "Unable to get HSS IP addr of $hss_fqdn" - fi - cmake_args="$cmake_args -DHSS_IP=$hss_ip" - - set_openair_env - if [[ $verbose -eq 1 ]]; then - cecho "OPENAIR_DIR = $OPENAIR_DIR" $green - fi - - # for conf files copy in this bash script - if [ -d /usr/lib/freeDiameter ]; then - export FREEDIAMETER_PREFIX=/usr - else - if [ -d /usr/local/lib/freeDiameter ]; then - export FREEDIAMETER_PREFIX=/usr/local - else - echo_fatal "FreeDiameter prefix not found, install freeDiameter if EPC, HSS" - fi - fi - - - - local dbin=$OPENAIR_DIR/targets/bin - local dlog=$OPENAIR_DIR/cmake_targets/log - local dconf=$OPENAIR_DIR/targets/bin - - mkdir -m 777 -p $dbin $dlog - - ############################################################################## - # Compile userspace executable - ############################################################################## - cd $OPENAIR_DIR/cmake_targets/epc_build_oai - if [ $clean -ne 0 ]; then - if [[ $verbose -eq 1 ]]; then - echo "Cleaning EPC: certificates, generated configuration files, obj files, mme_gw executable, GTP kernel module" - fi - rm -f $OPENAIR_DIR/targets/bin/mme_gw - rm -Rf build 2>&1 - $SUDO rm -Rf $OPENAIR_TARGETS/CMAKE/EPC/MME_GW/build 2>&1 - $SUDO rm -f /usr/local/etc/freeDiameter/mme* 2>&1 - $SUDO rm -f /usr/local/etc/freeDiameter/epc* 2>&1 - $SUDO rm -f /usr/etc/freeDiameter/mme* 2>&1 - $SUDO rm -f /usr/etc/freeDiameter/epc* 2>&1 - $SUDO rm -f $OPENAIR_DIR/targets/bin/xt_GTPU*.ko 2>&1 - (cd $OPENAIRCN_DIR/GTPV1-U/GTPU_SP && $SUDO make clean) - $SUDO rm -f $OPENAIRCN_DIR/GTPV1-U/GTPU_SP/Bin/* 2>&1 - $SUDO rm -f /lib/xtables/libxt_GTPU*.so 2>&1 - mkdir -m 777 -p -v build - fi - - - - ############################################################################## - # Compile EPC - ############################################################################## - cd $OPENAIR_DIR/cmake_targets/epc_build_oai - #cd $OPENAIR_TARGETS/CMAKE/EPC/MME_GW - if [ ! -d ./build ]; then - mkdir -m 777 -p -v build - fi - cmake_file=./CMakeLists.txt - cp $OPENAIR_DIR/cmake_targets/epc_build_oai/CMakeLists.template $cmake_file - echo 'include(${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt)' >> $cmake_file - cd ./build - cmake $cmake_args .. - #make $make_args -j $NUM_CPU - if [ $conf_files_only -eq 0 ]; then - compilations \ - epc_build_oai mme_gw \ - mme_gw $dbin/mme_gw.$REL - # Only integrated mme+sgw+pgw is operational today - compilations \ - epc_build_oai xt_GTPUSP_lib \ - libxt_GTPUSP_lib.so $dbin - compilations \ - epc_build_oai xt_GTPUSP \ - CMakeFiles/xt_GTPUSP/xt_GTPUSP.ko $dbin - - echo_info "Copying iptables libraries into system directory: /lib/xtables" - if [ -f $dbin/libxt_GTPUSP_lib.so ] ; then - $SUDO rm -f /lib/xtables/libxt_GTPUSP.so - $SUDO ln -s $dbin/libxt_GTPUSP_lib.so /lib/xtables/libxt_GTPUSP.so - else - echo_fatal "not installed GTP-U iptables: binaries not found" - fi - fi - # Do EPC - if [ -f $OPENAIR_DIR/cmake_targets/epc_build_oai/build/mme_fd.conf ] ; then - cp -uv $OPENAIR_DIR/cmake_targets/epc_build_oai/build/epc*.conf $dconf - $SUDO cp -uv $OPENAIR_DIR/cmake_targets/epc_build_oai/build/mme_fd.conf $FREEDIAMETER_PREFIX/etc/freeDiameter - else - echo_fatal "not installed EPC config files: not found" - fi -} - - -main "$@" - diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper index 100effd872..953c21d929 100755 --- a/cmake_targets/tools/build_helper +++ b/cmake_targets/tools/build_helper @@ -1,29 +1,31 @@ ################################################################################ -# 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. +# Copyright (c) 2015, EURECOM (www.eurecom.fr) +# All rights reserved. # +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: # -# 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. +# 1. Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. # -# 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/>. +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE +# The views and conclusions contained in the software and documentation are those +# of the authors and should not be interpreted as representing official policies, +# either expressed or implied, of the FreeBSD Project. # ################################################################################ # file build_helper @@ -95,12 +97,9 @@ clean_kernel() { clean_all_files() { set_openair_env dir=$OPENAIR_DIR/cmake_targets - rm -rf $dir/log $OPENAIR_DIR/targets/bin/* + rm -rf $dir/log $OPENAIR_DIR/targets/bin/* rm -rf $dir/lte_build_oai $dir/lte-simulators/build - rm -rf $dir/epc_build_oai/build $dir/epc_build_oai/CMakeLists.txt rm -rf $dir/oaisim_build_oai/build $dir/oaisim_build_oai/CMakeLists.txt - rm -rf $dir/oaisim_mme_build_oai/build $dir/oaisim_mme_build_oai/CMakeLists.txt - rm -rf $dir/hss_build/build rm -rf $dir/autotests/bin $dir/autotests/log $dir/autotests/*/build } @@ -123,50 +122,6 @@ compilations() { fi } - -########################################## -# X.509 certificates -########################################## - -make_one_cert() { - fqdn=$1 - name=$2 - $SUDO openssl genrsa -out $name.key.pem 1024 - $SUDO openssl req -new -batch -out $name.csr.pem -key $name.key.pem -subj /CN=$name.$fqdn/C=FR/ST=PACA/L=Aix/O=Eurecom/OU=CM - $SUDO openssl ca -cert cacert.pem -keyfile cakey.pem -in $name.csr.pem -out $name.cert.pem -outdir . -batch -} - -make_certs(){ - - fqdn=$1 - certs_dir=$FREEDIAMETER_PREFIX/freeDiameter - # certificates are stored in diameter config directory - if [ ! -d $certs_dir ]; then - echo "Creating non existing directory: $certs_dir" - $SUDO mkdir -p $certs_dir || echo_error "can't create: $certs_dir" - fi - - cd $certs_dir - echo "creating the CA certificate" - echo_warning "erase all existing certificates as long as the CA is regenerated" - $SUDO rm -f $certs_dir/*.pem - $SUDO mkdir -p $certs_dir/demoCA/ - $SUDO touch $certs_dir/demoCA/index.txt - $SUDO sh -c "echo 01 > $certs_dir/demoCA/serial" - - # CA self certificate - $SUDO openssl req -new -batch -x509 -days 3650 -nodes -newkey rsa:1024 -out cacert.pem -keyout cakey.pem -subj /CN=$fqdn/C=FR/ST=PACA/L=Aix/O=Eurecom/OU=CM - - # generate hss certificate and sign it - make_one_cert eur hss - make_one_cert eur mme - - # legacy config is using a certificate named 'user' - make_one_cert eur user - -} - - ############################################ # External packages installers ############################################ @@ -200,58 +155,6 @@ install_gnutls_from_source(){ rm -rf /tmp/gnutls-3.1.23.tar.xz /tmp/gnutls-3.1.23 } -install_1.1.5_freediameter_from_source() { - cd /tmp - echo "Downloading 1.1.5 freeDiameter archive" - rm -rf /tmp/1.1.5.tar.gz* /tmp/freeDiameter-1.1.5 - wget http://www.freediameter.net/hg/freeDiameter/archive/1.1.5.tar.gz - tar xzf 1.1.5.tar.gz - cd freeDiameter-1.1.5 - patch -p1 < $OPENAIR_DIR/openair-cn/S6A/freediameter/freediameter-1.1.5.patch - mkdir build - cd build - cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr ../ - echo "Compiling freeDiameter" - make -j`nproc` - #make test - $SUDO make install - rm -rf /tmp/1.1.5.tar.gz /tmp/freeDiameter-1.1.5 -} - -install_freediameter_from_source() { - cd /tmp - echo "Downloading 1.2.0 freeDiameter archive" - rm -rf /tmp/1.2.0.tar.gz* /tmp/freeDiameter-1.2.0 - wget http://www.freediameter.net/hg/freeDiameter/archive/1.2.0.tar.gz - tar xzf 1.2.0.tar.gz - cd freeDiameter-1.2.0 - patch -p1 < $OPENAIR_DIR/openair-cn/S6A/freediameter/freediameter-1.2.0.patch - mkdir build - cd build - cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr ../ - echo "Compiling freeDiameter" - make -j`nproc` - #make test - $SUDO make install - rm -rf /tmp/1.2.0.tar.gz /tmp/freeDiameter-1.2.0 -} - -install_latest_freediameter_from_source() { - cd /tmp - rm -rf /tmp/freeDiameter - echo "Downloading latest freeDiameter trunk (may be unstable)" - git clone https://github.com/Metaswitch/freeDiameter.git - cd freeDiameter - patch -p1 < $OPENAIR_DIR/openair-cn/S6A/freediameter/freediameter-1.2.0.patch - mkdir build - cd build - cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr ../ - echo "Compiling freeDiameter" - make -j`nproc` - #make test - $SUDO make install - rm -rf /tmp/freeDiameter -} check_install_usrp_uhd_driver(){ @@ -345,8 +248,6 @@ check_install_oai_software() { libxml2-dev \ linux-headers-`uname -r` \ mscgen \ - mysql-client \ - mysql-server \ octave \ octave-signal \ openssh-client \ @@ -400,65 +301,7 @@ install_nas_tools() { } -################################## -# create HSS DB -################################ - -# arg 1 is mysql admin (ex: root) -# arg 2 is mysql password (ex: linux) -# arg 3 is hss username (ex: hssadmin) -# arg 4 is hss password (ex: admin) -# arg 5 is database name (ex: oai_db) -create_hss_database(){ - EXPECTED_ARGS=5 - if [ $# -ne $EXPECTED_ARGS ] - then - echo_error "Usage: $0 dbadmin dbpass hssuser hsspass databasename" - return 1 - fi - local mysql_admin=$1 - local mysql_password=$2 - local hss_username=$3 - local hss_password=$4 - local database_name=$5 - - Q1="GRANT ALL PRIVILEGES ON *.* TO '$hss_username'@'localhost' IDENTIFIED BY '$hss_password' WITH GRANT OPTION;" - Q2="FLUSH PRIVILEGES;" - mysql -u $mysql_admin --password=$mysql_password -e "${Q1}${Q2}" - if [ $? -ne 0 ]; then - echo_error "HSS: $hss_username permissions creation failed" - echo_error "verify root password for mysql is linux: mysql -u root --password=linux" - echo_error "if not, reset it to "linux" with sudo dpkg-reconfigure mysql-server-5.5" - return 1 - else - echo_success "HSS: $hss_username permissions creation succeeded" - fi - - Q3="CREATE DATABASE IF NOT EXISTS $database_name;" - mysql -u $hss_username --password=$hss_password -e "${Q3}" - if [ $? -ne 0 ]; then - echo_error "HSS: $database_name creation failed" - return 1 - else - echo_success "HSS: $database_name creation succeeded" - fi - - # test if tables have been created - mysql -u $hss_username --password=$hss_password -e "desc $database_name.users" > /dev/null 2>&1 - if [ $? -eq 1 ]; then - mysql -u $hss_username --password=$hss_password $database_name < $OPENAIR_DIR/openair-cn/OPENAIRHSS/db/$database_name.sql - if [ $? -ne 0 ]; then - echo_error "HSS: $database_name tables creation failed" - return 1 - else - echo_success "HSS: $database_name tables creation succeeded" - fi - else - echo_success "HSS: $database_name tables already created, nothing done" - fi - return 0 -} ################################ # set_openair_env diff --git a/cmake_targets/tools/build_hss b/cmake_targets/tools/build_hss deleted file mode 100755 index 6e0b1e927a..0000000000 --- a/cmake_targets/tools/build_hss +++ /dev/null @@ -1,271 +0,0 @@ -#!/bin/bash -################################################################################ -# 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) anylater 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@eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE -# -################################################################################ -# file build_hss -# brief -# author Lionel Gauthier -# company Eurecom -# email: lionel.gauthier@eurecom.fr -# -################################ -# include helper functions -################################ -THIS_SCRIPT_PATH=$(dirname $(readlink -f $0)) -source $THIS_SCRIPT_PATH/build_helper - - - -function help() -{ - echo_error " " - echo_error "Usage: build_hss [OPTION]..." - echo_error "Build the experimental HSS executable." - echo_error " " - echo_error "Options:" - echo_error "Mandatory arguments to long options are mandatory for short options too." - echo_error " -b, --s6a-bind-addr-list addr_list Optionaly, s6a server bind addresses can be specified here" - echo_error " -c, --clean Clean the build generated files (build from scratch)" - echo_error " -d, --debug Compile with debug informations." - echo_error " -f, --fqdn fqdn HSS Fully Qualified Domain Name (if not specified default is `hostname --fqdn`)." - echo_error " -h, --help Print this help." - echo_error " -i, --check-installed-software Check installed software packages necessary to build and run HSS (support Ubuntu 14.04)." - echo_error " -I, --install-hss-files Install HSS database if necessary." - echo_error " -k, --operator-key key Operator key of the HSS." - echo_error " If filled, then OPc key in table users for all subscribers (IMSI) will be computed." - echo_error " -m, --connect-to-mme fqdn MME act as a S6A server, HSS as a client (reversed situation but allows MME and HSS be on the same host) ." - echo_error " -r, --realm realm Realm of the HSS (optional parameter)." - echo_error " -R, --random boolean If false HSS random function returns always 0 (allowed values: {true, false})." - echo_error " -s, --transport-sctp-only Diameter use SCTP (TCP disabled)." - echo_error " -t, --transport-tcp-only Diameter use TCP (SCTP disabled)." - echo_error " -T, --transport-prefer-tcp Diameter prefer TCP." - echo_error " -v, --verbose Build process verbose." - echo_error " " - echo_error "Examples:" - echo_error " " - echo_error "Case 1 - HSS run on same EPC host" - echo_error "build_hss -d -m my_epc_fqdn -d -t -T" - echo_error "or build_hss -d -m my_epc_fqdn -d -t -T -k 11111111111111111111111111111111" - echo_error " " - echo_error "Case 2 - HSS and EPC do not run on same host" - echo_error "build_hss -d -s" - echo_error "build_hss -d -s -k 11111111111111111111111111111111" -} - - - -function main() -{ - local -i clean=0 - local -i verbose=0 - local cmake_args=" " - local make_args="-j $NUM_CPU" - local realm="" - local hss_hostname="" - local mme_hostname="" - local mme_ip="" - local mme_fqdn="" - - - until [ -z "$1" ]; do - case "$1" in - -b | --s6a-bind-addr-list) - echo "S6A server bind addresses: $2" - cmake_args="$cmake_args -DFD_SERVER_IP_BIND_LIST=$2" - shift 2; - ;; - -c | --clean) - clean=1 - echo "Clean the build generated files (build from scratch)" - shift; - ;; - -d | --debug) - cmake_args="$cmake_args -DDEBUG=1" - echo "Compile with debug informations" - shift; - ;; - -f | --fqdn) - echo "FQDN of the HSS: $2" - cmake_args="$cmake_args -DHSS_FQDN=$2" - shift 2; - ;; - -h | --help) - help - exit 0 - ;; - -i | --check-installed-software) - echo "Check installed software packages necessary to build and run HSS (support Ubuntu 14.04):" - set_openair_env - check_install_oai_software - exit 0 - ;; - -I | --install-hss-files) - echo "Install HSS files: .conf files, database (if you want to reinstall database, drop it by hand before)." - cmake_args="$cmake_args -DINSTALL_HSS_FILES=1" - shift; - ;; - -k | --operator-key) - echo "Operator key of the HSS: $2" - cmake_args="$cmake_args -DOPERATOR_key=$2" - shift 2; - ;; - -m | --connect-to-mme) - mme_fqdn=$2 - shift 2; - ;; - -r | --realm) - echo "Realm of the HSS: $2" - cmake_args="$cmake_args -DREALM=$2" - shift 2; - ;; - -R | --random) - echo "Random function: $2" - cmake_args="$cmake_args -DRANDOM_boolean=$2" - shift 2; - ;; - -s | --transport-sctp-only) - echo "Diameter use SCTP (TCP disabled), this is the default option." - cmake_args="$cmake_args -DTRANSPORT_option=No_TCP" - shift; - ;; - -t | --transport-tcp-only) - echo "Diameter use TCP (SCTP disabled)." - cmake_args="$cmake_args -DTRANSPORT_option=No_SCTP" - shift; - ;; - -T | --transport-prefer-tcp) - echo "Diameter prefer TCP (TCP, SCTP enabled)." - cmake_args="$cmake_args -DTRANSPORT_PREFER_TCP_option=Prefer_TCP" - shift; - ;; - -v | --verbose) - echo "Make build process verbose" - cmake_args="$cmake_args -DCMAKE_VERBOSE_MAKEFILE=ON" - make_args="VERBOSE=1 $make_args" - verbose=1 - shift; - ;; - *) - echo "Unknown option $1" - help - exit 1 - ;; - esac - done - - # extra arguments processing - if [[ z$hss_fqdn = z ]]; then - hss_fqdn=`hostname --fqdn` - cmake_args="$cmake_args -DHSS_FQDN=$hss_fqdn" - if [[ z$realm = z ]]; then - realm=$hss_fqdn - realm=${realm#*.} - cmake_args="$cmake_args -DREALM=$realm" - fi - fi - - if [[ z$mme_fqdn != z ]]; then - cmake_args="$cmake_args -DMME_FQDN=$mme_fqdn" - mme_hostname=${mme_fqdn%%.*} - cmake_args="$cmake_args -DMME_HOSTNAME=$mme_hostname" - - mme_ip=`resolveip --silent $mme_hostname` - if [[ z$mme_ip = z ]]; then - mme_ip=`resolveip --silent $mme_fqdn` - fi - if [[ z$mme_ip = z ]]; then - echo_fatal "Unable to get MME IP addr of $mme_fqdn" - fi - cmake_args="$cmake_args -DHSS_CONNECT_TO_MME=1 -DMME_IP=$mme_ip" - fi - - set_openair_env - if [[ $verbose -eq 1 ]]; then - cecho "OPENAIR_DIR = $OPENAIR_DIR" $green - fi - - if [[ z$OPENAIR_DIR = z ]]; then - echo_fatal "OPENAIR_DIR env variable not set, exiting" - fi - - - local dbin=$OPENAIR_DIR/targets/bin - local dlog=$OPENAIR_DIR/cmake_targets/log - local dconf=OPENAIR_DIR/targets/bin - - mkdir -m 777 -p $dbin $dlog - - # for conf files copy in this bash script - if [ -d /usr/lib/freeDiameter ]; then - export FREEDIAMETER_PREFIX=/usr - else - if [ -d /usr/local/lib/freeDiameter ]; then - export FREEDIAMETER_PREFIX=/usr/local - else - echo_fatal "FreeDiameter prefix not found, install freeDiameter if EPC, HSS" - fi - fi - - - - cmake_args="$cmake_args -DOPENAIR_DIR=$OPENAIR_DIR" - - rm -f $OPENAIR_DIR/targets/bin/openair-hss - cd $OPENAIR_DIR/cmake_targets/hss_build - if [ $clean -ne 0 ]; then - if [[ $verbose -eq 1 ]]; then - echo "Cleaning HSS" - fi - $SUDO rm -Rf build 2>&1 - if [[ $verbose -eq 1 ]]; then - echo "Cleaning /usr/*/etc/freeDiameter" - fi - $SUDO rm -f /usr/local/etc/freeDiameter/hss* 2>&1 - $SUDO rm -f /usr/local/etc/freeDiameter/acl.conf 2>&1 - $SUDO rm -f /usr/etc/freeDiameter/hss* 2>&1 - $SUDO rm -f /usr/etc/freeDiameter/acl.conf 2>&1 - mkdir -m 777 -p -v build - fi - if [ ! -d ./build ]; then - mkdir -m 777 -p -v build - fi - cd ./build - cmake $cmake_args .. - make $make_args - make install - - - # bash doesn't like space char around = char - cp -uv $OPENAIR_DIR/cmake_targets/hss_build/build/hss.conf $dbin - $SUDO cp -uv $OPENAIR_DIR/cmake_targets/hss_build/build/hss_fd.conf $OPENAIR_DIR/cmake_targets/hss_build/build/acl.conf $FREEDIAMETER_PREFIX/etc/freeDiameter - -} - - -main "$@" - diff --git a/cmake_targets/tools/build_test_epc_tools b/cmake_targets/tools/build_test_epc_tools new file mode 100755 index 0000000000..aff2a26fc0 --- /dev/null +++ b/cmake_targets/tools/build_test_epc_tools @@ -0,0 +1,147 @@ +#!/bin/bash +################################################################################ +# 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) anylater 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@eurecom.fr +# +# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE +# +################################################################################ +# file build_test_epc_tools +# brief +# author Lionel Gauthier +# company Eurecom +# email: lionel.gauthier@eurecom.fr +# +################################ +# include helper functions +################################ +THIS_SCRIPT_PATH=$(dirname $(readlink -f $0)) +source $THIS_SCRIPT_PATH/build_helper + +function help() +{ + echo_error " " + echo_error "Usage: build_test_epc_tools [OPTION]..." + echo_error "Build the executables for generating and running a test case for EPC." + echo_error " " + echo_error "Options:" + echo_error "Mandatory arguments to long options are mandatory for short options too." + echo_error " -c, --clean Clean the build generated files (build from scratch)" + echo_error " -d, --debug Compile with debug informations." + echo_error " -h, --help Print this help." + echo_error " -v, --verbose Build process verbose." + echo_error " " +} + + + +function main() +{ + local -i clean=0 + local -i verbose=0 + local cmake_args=" " + local make_args="-j $NUM_CPU" + local realm="" + + + until [ -z "$1" ] + do + case "$1" in + -c | --clean) + clean=1 + echo "Clean the build generated files (build from scratch)" + shift; + ;; + -d | --debug) + cmake_args="$cmake_args -DDEBUG=1" + echo "Compile with debug informations" + shift; + ;; + -h | --help) + help + shift; + exit 0 + ;; + -v | --verbose) + echo "Make build process verbose" + cmake_args="$cmake_args -DCMAKE_VERBOSE_MAKEFILE=ON" + make_args="VERBOSE=1 $make_args" + verbose=1 + shift; + ;; + *) + echo "Unknown option $1" + help + exit 1 + ;; + esac + done + + + + + set_openair_env + if [[ $verbose -eq 1 ]]; then + cecho "OPENAIR_DIR = $OPENAIR_DIR" $green + fi + + local dbin=$OPENAIR_DIR/targets/bin + local dlog=$OPENAIR_DIR/cmake_targets/log + local dconf=$OPENAIR_DIR/targets/bin + + mkdir -m 777 -p $dbin $dlog + + ############################################################################## + # Compile userspace executable + ############################################################################## + cd $OPENAIR_DIR/cmake_targets/epc_test + if [ $clean -ne 0 ]; then + if [[ $verbose -eq 1 ]]; then + echo "Cleaning TEST_EPC" + fi + rm -f $OPENAIR_DIR/targets/bin/test_epc_generate_scenario + rm -Rf build 2>&1 + mkdir -m 777 -p -v build + fi + + ############################################################################## + # Compile EPC + ############################################################################## + cd $OPENAIR_DIR/cmake_targets/epc_test + if [ ! -d ./build ]; then + mkdir -m 777 -p -v build + fi + cmake_file=./CMakeLists.txt + cp $OPENAIR_DIR/cmake_targets/epc_test/CMakeLists.template $cmake_file + echo 'include(${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt)' >> $cmake_file + cd ./build + cmake $cmake_args .. + compilations \ + epc_test test_epc_generate_scenario \ + test_epc_generate_scenario $dbin/test_epc_generate_scenario +} + + +main "$@" + diff --git a/cmake_targets/tools/check_hss_s6a_certificate b/cmake_targets/tools/check_hss_s6a_certificate deleted file mode 100755 index e444c7f4c5..0000000000 --- a/cmake_targets/tools/check_hss_s6a_certificate +++ /dev/null @@ -1,104 +0,0 @@ -#!/bin/bash -################################################################################ -# 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) anylater 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@eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE -# -################################################################################ -# file check_hss_s6a_certificate -# brief -# author Lionel Gauthier -# company Eurecom -# email: lionel.gauthier@eurecom.fr -################################ -# include helper functions -################################ -THIS_SCRIPT_PATH=$(dirname $(readlink -f $0)) -source $THIS_SCRIPT_PATH/build_helper - - -function _create_hss_certs() -{ - local freediameter_path=$1 - local fqdn=$2 - - cd /tmp - rm -rf /tmp/demoCA - mkdir /tmp/demoCA - echo 01 > /tmp/demoCA/serial - touch /tmp/demoCA/index.txt - - echo "Creating HSS certificate for user '$fqdn'" - # Create a Root Certification Authority Certificate - openssl req -new -batch -x509 -days 3650 -nodes -newkey rsa:1024 -out hss.cacert.pem -keyout hss.cakey.pem -subj /CN=$fqdn/C=FR/ST=PACA/L=Aix/O=Eurecom/OU=CM - - # Generate a Private Key - openssl genrsa -out hss.key.pem 1024 - - # Generate a CSR (Certificate Signing Request) that will be self-signed - openssl req -new -batch -out hss.csr.pem -key hss.key.pem -subj /CN=$fqdn/C=FR/ST=PACA/L=Aix/O=Eurecom/OU=CM - - # Certification authority - openssl ca -cert hss.cacert.pem -keyfile hss.cakey.pem -in hss.csr.pem -out hss.cert.pem -outdir . -batch - - if [ ! -d $freediameter_path/etc/freeDiameter ]; then - echo "Creating non existing directory: $freediameter_path/etc/freeDiameter/" - sudo mkdir -p $freediameter_path/etc/freeDiameter/ - fi - - sudo mv hss.cakey.pem hss.cert.pem hss.cacert.pem hss.key.pem $freediameter_path/etc/freeDiameter/ - cd - -} - - -#$1 if freediameter path -#$2 is fqdn -function main() { - local freediameter_path=$1 - local fqdn=$2 - if [ -d $freediameter_path/etc/freeDiameter ]; then - if [ -f $freediameter_path/etc/freeDiameter/hss.cert.pem ]; then - full_hostname=`cat $freediameter_path/etc/freeDiameter/hss.cert.pem | grep "Subject" | grep "CN" | cut -d '=' -f6` - if [ a$full_hostname == a$fqdn ]; then - echo_success "HSS S6A: Found valid certificate in $freediameter_path/etc/freeDiameter" - return 0 - else - echo_error "Bad hss fqdn found in cert file: $full_hostname fqdn is $fqdn" - fi - fi - fi - echo_error "HSS S6A: Did not find valid certificate in $freediameter_path/etc/freeDiameter" - echo_warning "HSS S6A: generating new certificate in $freediameter_path/etc/freeDiameter..." - _create_hss_certs $freediameter_path $fqdn - if [ $# -lt 3 ] ; then - main $freediameter_path $fqdn 2 - return $? - else - echo_error "Could not access to freeDiameter path: $freediameter_path/etc/freeDiameter" - exit 1 - fi -} - -main "$@" diff --git a/cmake_targets/tools/check_mme_s6a_certificate b/cmake_targets/tools/check_mme_s6a_certificate deleted file mode 100755 index aac91f3abe..0000000000 --- a/cmake_targets/tools/check_mme_s6a_certificate +++ /dev/null @@ -1,107 +0,0 @@ -#!/bin/bash -################################################################################ -# 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) anylater 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@eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE -# -################################################################################ -# file check_mme_s6a_certificate -# brief -# author Lionel Gauthier -# company Eurecom -# email: lionel.gauthier@eurecom.fr -################################ -# include helper functions -################################ -THIS_SCRIPT_PATH=$(dirname $(readlink -f $0)) -. $THIS_SCRIPT_PATH/build_helper - - -function _create_mme_certs() -{ - local freediameter_path=$1 - local fqdn=$2 - - cd /tmp - rm -rf /tmp/demoCA - mkdir /tmp/demoCA - echo 01 > /tmp/demoCA/serial - touch /tmp/demoCA/index.txt - - echo "Creating MME certificate for user '$fqdn'" - # Create a Root Certification Authority Certificate - openssl req -new -batch -x509 -days 3650 -nodes -newkey rsa:1024 -out mme.cacert.pem -keyout mme.cakey.pem -subj /CN=$fqdn/C=FR/ST=PACA/L=Aix/O=Eurecom/OU=CM - - # Generate a Private Key - openssl genrsa -out mme.key.pem 1024 - - # Generate a CSR (Certificate Signing Request) that will be self-signed - openssl req -new -batch -out mme.csr.pem -key mme.key.pem -subj /CN=$fqdn/C=FR/ST=PACA/L=Aix/O=Eurecom/OU=CM - - # Certification authority - openssl ca -cert mme.cacert.pem -keyfile mme.cakey.pem -in mme.csr.pem -out mme.cert.pem -outdir . -batch - - if [ ! -d $freediameter_path/etc/freeDiameter ]; then - echo "Creating non existing directory: $freediameter_path/etc/freeDiameter/" - sudo mkdir -p $freediameter_path/etc/freeDiameter/ - fi - - sudo mv mme.cakey.pem mme.cert.pem mme.cacert.pem mme.key.pem $freediameter_path/etc/freeDiameter/ - cd - -} - -#$1 if freediameter path -#$2 is fqdn -function main() { - local freediameter_path=$1 - local fqdn=$2 - if [ -d $freediameter_path/etc/freeDiameter ]; then - if [ -f $freediameter_path/etc/freeDiameter/mme.cert.pem ]; then - full_hostname=`cat $freediameter_path/etc/freeDiameter/mme.cert.pem | grep "Subject" | grep "CN" | cut -d '=' -f6` - if [ a$full_hostname == a$fqdn ]; then - echo_success "MME S6A: Found valid certificate in $freediameter_path/etc/freeDiameter" - return 0 - else - echo_error "Bad mme fqdn found in cert file: $full_hostname fqdn is $fqdn" - fi - else - echo_error "File $freediameter_path/etc/freeDiameter/mme.cert.pem not found" - fi - else - echo_error "Directory $freediameter_path/etc/freeDiameter not found" - fi - echo_error "MME S6A: Did not find valid certificate in $freediameter_path/etc/freeDiameter" - echo_warning "MME S6A: generating new certificate in $freediameter_path/etc/freeDiameter..." - _create_mme_certs $freediameter_path $fqdn - if [ $# -lt 3 ] ; then - main $freediameter_path $fqdn 2 - return $? - else - echo_error "Could not access to freeDiameter path: $freediameter_path/etc/freeDiameter" - exit 1 - fi -} - -main "$@" diff --git a/cmake_targets/tools/create_hss_database b/cmake_targets/tools/create_hss_database deleted file mode 100755 index 054be034d7..0000000000 --- a/cmake_targets/tools/create_hss_database +++ /dev/null @@ -1,103 +0,0 @@ -#!/bin/bash -################################################################################ -# 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) anylater 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@eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE -# -################################################################################ -# file create_hss_database -# brief -# author Lionel Gauthier -# company Eurecom -# email: lionel.gauthier@eurecom.fr -################################ -# include helper functions -################################ -THIS_SCRIPT_PATH=$(dirname $(readlink -f $0)) -. $THIS_SCRIPT_PATH/build_helper - - -# arg 1 is mysql user (ex: root) -# arg 2 is mysql password (ex: linux) -# arg 3 is hss username (ex: hssadmin) -# arg 4 is hss password (ex: admin) -# arg 5 is database name (ex: oai_db) -function main() -{ - EXPECTED_ARGS=5 - E_BADARGS=65 - MYSQL=`which mysql` - rv=0 - if [ $# -ne $EXPECTED_ARGS ] - then - echo_fatal "Usage: $0 dbuser dbpass hssuser hsspass databasename" - rv=1 - fi - - set_openair_env - - # removed % - #Q1="GRANT ALL PRIVILEGES ON *.* TO '$3'@'%' IDENTIFIED BY '$4' WITH GRANT OPTION;" - Q1="GRANT ALL PRIVILEGES ON *.* TO '$3'@'localhost' IDENTIFIED BY '$4' WITH GRANT OPTION;" - Q2="FLUSH PRIVILEGES;" - SQL="${Q1}${Q2}" - $MYSQL -u $1 --password=$2 -e "$SQL" - if [ $? -ne 0 ]; then - echo_error "$3 permissions failed" - return 1 - else - echo_success "$3 permissions succeeded" - fi - - - Q1="CREATE DATABASE IF NOT EXISTS ${BTICK}$5${BTICK};" - SQL="${Q1}" - $MYSQL -u $3 --password=$4 -e "$SQL" - if [ $? -ne 0 ]; then - echo_error "$5 creation failed" - return 1 - else - echo_success "$5 creation succeeded" - fi - - - # test if tables have been created - mysql -u $3 --password=$4 -e "desc $5.users" > /dev/null 2>&1 - - if [ $? -eq 1 ]; then - $MYSQL -u $3 --password=$4 $5 < $OPENAIRCN_DIR/OPENAIRHSS/db/$5.sql - if [ $? -ne 0 ]; then - echo_error "$5 tables creation failed" - return 1 - else - echo_success "$5 tables creation succeeded" - fi - fi - - return 0 -} - -main "$@" - diff --git a/cmake_targets/tools/epc.conf.in b/cmake_targets/tools/epc.conf.in deleted file mode 100755 index 7af3cca4cc..0000000000 --- a/cmake_targets/tools/epc.conf.in +++ /dev/null @@ -1,163 +0,0 @@ -# Internet -# | -# PGW_IPV4_ADDRESS_FOR_SGI | -# +-----------+-------+------------+---------------+--------------------------+ -# |host y | | PGW_INTERFACE_NAME_FOR_SGI | | -# +-----------+ +------------+---------------+ | -# | | | -# | +----+----+ (HSS may run on this host | -# | | mme_gw | or on another one) | -# | +----+----+ | -# | | | -# | +-----------------+--------------------+ | -# | | SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP | | -# | | MME_INTERFACE_NAME_FOR_S1_MME | | -# +----------------------------+---+--+---------------------------------------+ -# MME_IPV4_ADDRESS_FOR_S1_MME | (S1-C and S1-U addresses/interfaces may be the same) -# SGW_IPV4_ADDRESS_FOR_S1U_S12_S4_UP -# | -# | -# a.b.c.d | -# +---------------+------------+---+--+---------------------------------------+ -# |eNBx | | ethx | | -# +---------------+ +---+--+ | -# | | | -# | +------+---------+ | -# | | lte-softmodem | | -# | | or | | -# | | oaisim (1)eNB (x UEs) | -# | +-------+--------+ | -# +---------------------------------+-----------------------------------------+ -# | -# O (RF antenna) - -MME : -{ - - REALM = "@REALM@"; # DO NOT CHANGE - # Define the limits of the system in terms of served eNB and served UE. - # When the limits will be reached, overload procedure will take place. - MAXENB = 10; - MAXUE = 100; - RELATIVE_CAPACITY = 10; - # Display statistics about whole system (expressed in seconds) - MME_STATISTIC_TIMER = 10; - EMERGENCY_ATTACH_SUPPORTED = "no"; - UNAUTHENTICATED_IMSI_SUPPORTED = "no"; - # ASN1 VERBOSITY: none, info, annoying - VERBOSITY = "none"; - - - IP_CAPABILITY = "IPV4V6"; - - - INTERTASK_INTERFACE : - { - # max queue size per task - ITTI_QUEUE_SIZE = 2000000; - }; - - S6A : - { - S6A_CONF = "@FREEDIAMETER_PATH@/../etc/freeDiameter/mme_fd.conf";# DO NOT CHANGE - HSS_HOSTNAME = "@HSS_HOSTNAME@"; # DO NOT CHANGE - }; - - # ------- SCTP definitions - SCTP : - { - # Number of streams to use in input/output - SCTP_INSTREAMS = 8; - SCTP_OUTSTREAMS = 8; - }; - - # ------- S1AP definitions - S1AP : - { - # outcome drop timer value (seconds) - S1AP_OUTCOME_TIMER = 10; - }; - - # ------- MME served GUMMEI - GUMMEI : - { - # MME code DEFAULT = 0 - # size = 8 bits - # maximum of 256 values, comma separated - MME_CODE = [ 1, 30 , 31, 32, 33, 34, 35, 36, 56 , 29 , 8 ]; - - # MME GROUP ID DEFAULT = 0 - # size = 16 bits - # maximum of 65535 values, comma separated - MME_GID = [ 32768 , 4 , 5 , 30 , 8 , 9 , 50021 ]; - - # TA (mcc.mnc:tracking area code) DEFAULT = 208.34:0 - # max values = 999.999:65535 - # maximum of 32 values, comma separated - TAI_LIST = ( - {MCC="208" ; MNC="95"; TAC = "1"; } # YOUR PLMN CONFIG HERE - ); - }; - - NAS : - { - # 3GPP TS 33.401 section 7.2.4.3 Procedures for NAS algorithm selection - # decreasing preference goes from left to right - ORDERED_SUPPORTED_INTEGRITY_ALGORITHM_LIST = [ "EIA2" , "EIA1" , "EIA0" ]; - ORDERED_SUPPORTED_CIPHERING_ALGORITHM_LIST = [ "EEA0" , "EEA1" , "EEA2" ]; - }; - - NETWORK_INTERFACES : - { - MME_INTERFACE_NAME_FOR_S1_MME = "eth2"; # YOUR NETWORK CONFIG HERE - MME_IPV4_ADDRESS_FOR_S1_MME = "192.168.27.101//24"; # YOUR NETWORK CONFIG HERE - - MME_INTERFACE_NAME_FOR_S11_MME = "none"; - MME_IPV4_ADDRESS_FOR_S11_MME = "0.0.0.0/24"; - }; -}; - -S-GW : -{ - NETWORK_INTERFACES : - { - SGW_INTERFACE_NAME_FOR_S11 = "none"; - SGW_IPV4_ADDRESS_FOR_S11 = "0.0.0.0/24"; - - SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP = "eth2"; # YOUR NETWORK CONFIG HERE - SGW_IPV4_ADDRESS_FOR_S1U_S12_S4_UP = "192.168.27.101/24"; # YOUR NETWORK CONFIG HERE - SGW_IPV4_PORT_FOR_S1U_S12_S4_UP = 2152; # PREFER NOT CHANGE - - SGW_INTERFACE_NAME_FOR_S5_S8_UP = "none"; # DO NOT CHANGE - SGW_IPV4_ADDRESS_FOR_S5_S8_UP = "0.0.0.0/24"; # DO NOT CHANGE - }; -}; - -P-GW = -{ - NETWORK_INTERFACES : - { - PGW_INTERFACE_NAME_FOR_S5_S8 = "none"; # DO NOT CHANGE - PGW_IPV4_ADDRESS_FOR_S5_S8 = "0.0.0.0/24"; # DO NOT CHANGE - - PGW_INTERFACE_NAME_FOR_SGI = "eth0"; # YOUR NETWORK CONFIG HERE - PGW_IPV4_ADDRESS_FOR_SGI = "192.168.12.213/24"; # YOUR NETWORK CONFIG HERE - PGW_MASQUERADE_SGI = "yes"; # YOUR NETWORK CONFIG HERE - }; - - IP_ADDRESS_POOL : - { - IPV4_LIST = ( - "192.188.0.0/24", # YOUR NETWORK CONFIG HERE - "192.188.1.0/24" # YOUR NETWORK CONFIG HERE - ); - IPV6_LIST = ( - "2014:02:26::0/120" # YOUR NETWORK CONFIG HERE - ); - }; - - DEFAULT_DNS_IPV4_ADDRESS = "192.168.106.12"; # YOUR NETWORK CONFIG HERE - DEFAULT_DNS_SEC_IPV4_ADDRESS = "192.168.12.100"; # YOUR NETWORK CONFIG HERE -}; - - diff --git a/cmake_targets/tools/epc.local.enb.conf.in b/cmake_targets/tools/epc.local.enb.conf.in deleted file mode 100755 index 353a294f64..0000000000 --- a/cmake_targets/tools/epc.local.enb.conf.in +++ /dev/null @@ -1,130 +0,0 @@ -MME : -{ - - REALM = "@REALM@"; # DO NOT CHANGE - # Define the limits of the system in terms of served eNB and served UE. - # When the limits will be reached, overload procedure will take place. - MAXENB = 10; - MAXUE = 100; - RELATIVE_CAPACITY = 10; - # Display statistics about whole system (expressed in seconds) - MME_STATISTIC_TIMER = 10; - EMERGENCY_ATTACH_SUPPORTED = "no"; - UNAUTHENTICATED_IMSI_SUPPORTED = "no"; - # ASN1 VERBOSITY: none, info, annoying - VERBOSITY = "none"; - - - IP_CAPABILITY = "IPV4V6"; - - - INTERTASK_INTERFACE : - { - # max queue size per task - ITTI_QUEUE_SIZE = 2000000; - }; - - S6A : - { - S6A_CONF = "@FREEDIAMETER_PATH@/../etc/freeDiameter/mme_fd.conf";# DO NOT CHANGE - HSS_HOSTNAME = "@HSS_HOSTNAME@"; # DO NOT CHANGE - }; - - # ------- SCTP definitions - SCTP : - { - # Number of streams to use in input/output - SCTP_INSTREAMS = 8; - SCTP_OUTSTREAMS = 8; - }; - - # ------- S1AP definitions - S1AP : - { - # outcome drop timer value (seconds) - S1AP_OUTCOME_TIMER = 10; - }; - - # ------- MME served GUMMEI - GUMMEI : - { - # MME code DEFAULT = 0 - # size = 8 bits - # maximum of 256 values, comma separated - MME_CODE = [ 1, 30 , 31, 32, 33, 34, 35, 36, 56 , 29 , 8 ]; - - # MME GROUP ID DEFAULT = 0 - # size = 16 bits - # maximum of 65535 values, comma separated - MME_GID = [ 32768 , 4 , 5 , 30 , 8 , 9 , 50021 ]; - - # TA (mcc.mnc:tracking area code) DEFAULT = 208.34:0 - # max values = 999.999:65535 - # maximum of 32 values, comma separated - TAI_LIST = ( - {MCC="208" ; MNC="95"; TAC = "1"; } # YOUR PLMN CONFIG HERE - ); - }; - - NAS : - { - # 3GPP TS 33.401 section 7.2.4.3 Procedures for NAS algorithm selection - # decreasing preference goes from left to right - ORDERED_SUPPORTED_INTEGRITY_ALGORITHM_LIST = [ "EIA2" , "EIA1" , "EIA0" ]; - ORDERED_SUPPORTED_CIPHERING_ALGORITHM_LIST = [ "EEA0" , "EEA1" , "EEA2" ]; - }; - - NETWORK_INTERFACES : - { - MME_INTERFACE_NAME_FOR_S1_MME = "tun2"; # DO NOT CHANGE - MME_IPV4_ADDRESS_FOR_S1_MME = "192.188.2.2/24"; # DO NOT CHANGE - - MME_INTERFACE_NAME_FOR_S11_MME = "none"; - MME_IPV4_ADDRESS_FOR_S11_MME = "0.0.0.0/24"; - }; -}; - -S-GW : -{ - NETWORK_INTERFACES : - { - SGW_INTERFACE_NAME_FOR_S11 = "none"; - SGW_IPV4_ADDRESS_FOR_S11 = "0.0.0.0/24"; - - SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP = "lo"; # DO NOT CHANGE - SGW_IPV4_ADDRESS_FOR_S1U_S12_S4_UP = "127.0.0.1/24"; # DO NOT CHANGE - SGW_IPV4_PORT_FOR_S1U_S12_S4_UP = 2152; # PREFER NOT CHANGE - - SGW_INTERFACE_NAME_FOR_S5_S8_UP = "none"; # DO NOT CHANGE - SGW_IPV4_ADDRESS_FOR_S5_S8_UP = "0.0.0.0/24"; # DO NOT CHANGE - }; -}; - -P-GW = -{ - NETWORK_INTERFACES : - { - PGW_INTERFACE_NAME_FOR_S5_S8 = "none"; # DO NOT CHANGE - PGW_IPV4_ADDRESS_FOR_S5_S8 = "0.0.0.0/24"; # DO NOT CHANGE - - PGW_INTERFACE_NAME_FOR_SGI = "eth0"; # YOUR NETWORK CONFIG HERE - PGW_IPV4_ADDRESS_FOR_SGI = "192.168.12.213/24"; # YOUR NETWORK CONFIG HERE - PGW_MASQUERADE_SGI = "yes"; # YOUR NETWORK CONFIG HERE - }; - - IP_ADDRESS_POOL : - { - IPV4_LIST = ( - "192.187.0.0/24", # YOUR NETWORK CONFIG HERE - "192.187.1.0/24" # YOUR NETWORK CONFIG HERE - ); - IPV6_LIST = ( - "2014:02:26::0/120" # YOUR NETWORK CONFIG HERE - ); - }; - - DEFAULT_DNS_IPV4_ADDRESS = "192.168.106.12"; # YOUR NETWORK CONFIG HERE - DEFAULT_DNS_SEC_IPV4_ADDRESS = "192.168.12.100"; # YOUR NETWORK CONFIG HERE -}; - - diff --git a/cmake_targets/tools/example_enb_exmimo_mme_hss.txt b/cmake_targets/tools/example_enb_exmimo_mme_hss.txt index c8227f176a..2c693a5003 100644 --- a/cmake_targets/tools/example_enb_exmimo_mme_hss.txt +++ b/cmake_targets/tools/example_enb_exmimo_mme_hss.txt @@ -21,7 +21,7 @@ # Contact Information # OpenAirInterface Admin: openair_admin@eurecom.fr # OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@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 # diff --git a/cmake_targets/tools/example_oaisim_enb_ue_mme_virtual.txt b/cmake_targets/tools/example_oaisim_enb_ue_mme_virtual.txt index d07d10b9d0..b47c6137c5 100644 --- a/cmake_targets/tools/example_oaisim_enb_ue_mme_virtual.txt +++ b/cmake_targets/tools/example_oaisim_enb_ue_mme_virtual.txt @@ -21,7 +21,7 @@ # Contact Information # OpenAirInterface Admin: openair_admin@eurecom.fr # OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@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 # diff --git a/cmake_targets/tools/indent_source_code b/cmake_targets/tools/indent_source_code index f666e65660..5e9f08f067 100755 --- a/cmake_targets/tools/indent_source_code +++ b/cmake_targets/tools/indent_source_code @@ -22,7 +22,7 @@ # Contact Information # OpenAirInterface Admin: openair_admin@eurecom.fr # OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@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 # diff --git a/cmake_targets/tools/init_exmimo2 b/cmake_targets/tools/init_exmimo2 index 5e4d13bec3..66eedf93dd 100755 --- a/cmake_targets/tools/init_exmimo2 +++ b/cmake_targets/tools/init_exmimo2 @@ -23,7 +23,7 @@ # Contact Information # OpenAirInterface Admin: openair_admin@eurecom.fr # OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@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 # diff --git a/cmake_targets/tools/init_nas_nos1 b/cmake_targets/tools/init_nas_nos1 index fed8eacc10..d2b7760867 100644 --- a/cmake_targets/tools/init_nas_nos1 +++ b/cmake_targets/tools/init_nas_nos1 @@ -23,7 +23,7 @@ # Contact Information # OpenAirInterface Admin: openair_admin@eurecom.fr # OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@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 # diff --git a/cmake_targets/tools/perf_oai.bash b/cmake_targets/tools/perf_oai.bash index 71519534e3..fe51ef1ee5 100755 --- a/cmake_targets/tools/perf_oai.bash +++ b/cmake_targets/tools/perf_oai.bash @@ -21,7 +21,7 @@ # Contact Information # OpenAirInterface Admin: openair_admin@eurecom.fr # OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@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 # diff --git a/cmake_targets/tools/run_enb_s1_exmimo b/cmake_targets/tools/run_enb_s1_exmimo index a2a50220a6..e2df8b5049 100755 --- a/cmake_targets/tools/run_enb_s1_exmimo +++ b/cmake_targets/tools/run_enb_s1_exmimo @@ -22,7 +22,7 @@ # Contact Information # OpenAirInterface Admin: openair_admin@eurecom.fr # OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@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 # diff --git a/cmake_targets/tools/run_enb_s1_usrp b/cmake_targets/tools/run_enb_s1_usrp index a4766ed658..01f4156071 100755 --- a/cmake_targets/tools/run_enb_s1_usrp +++ b/cmake_targets/tools/run_enb_s1_usrp @@ -22,7 +22,7 @@ # Contact Information # OpenAirInterface Admin: openair_admin@eurecom.fr # OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@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 # diff --git a/cmake_targets/tools/run_enb_ue_virt_noS1 b/cmake_targets/tools/run_enb_ue_virt_noS1 index c1ce434fa5..74abe0de02 100755 --- a/cmake_targets/tools/run_enb_ue_virt_noS1 +++ b/cmake_targets/tools/run_enb_ue_virt_noS1 @@ -22,7 +22,7 @@ # Contact Information # OpenAirInterface Admin: openair_admin@eurecom.fr # OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@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 # diff --git a/cmake_targets/tools/run_enb_ue_virt_s1 b/cmake_targets/tools/run_enb_ue_virt_s1 index 2ce29429b1..9cc226a698 100755 --- a/cmake_targets/tools/run_enb_ue_virt_s1 +++ b/cmake_targets/tools/run_enb_ue_virt_s1 @@ -22,7 +22,7 @@ # Contact Information # OpenAirInterface Admin: openair_admin@eurecom.fr # OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@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 # diff --git a/cmake_targets/tools/run_epc b/cmake_targets/tools/run_epc deleted file mode 100755 index 08a014cde0..0000000000 --- a/cmake_targets/tools/run_epc +++ /dev/null @@ -1,199 +0,0 @@ -#!/bin/bash -################################################################################ -# 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) anylater 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@eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE -# -################################################################################ -# file run_epc -# brief run script for EPC (MME+SGW-LITE). -# author Lionel GAUTHIER -# company Eurecom -# email: lionel.gauthier@eurecom.fr - - -################################ -# include helper functions -################################ -THIS_SCRIPT_PATH=$(dirname $(readlink -f $0)) -source $THIS_SCRIPT_PATH/build_helper -declare -i g_run_msc_gen=0 -declare g_msc_dir="/tmp" - -set_openair_env - - -function help() -{ - echo_error " " - echo_error "Usage: run_epc [OPTION]..." - echo_error "Run the EPC executable (MME+SGW-LITE)." - echo_error " " - echo_error "Options:" - echo_error "Mandatory arguments to long options are mandatory for short options too." - echo_error " -g, --gdb Run with GDB." - echo_error " -h, --help Print this help." - echo_error " -K, --itti-dump-file ITTI dump file containing all ITTI events occuring during EPC runtime." - echo_error " -l, --local-enb EPC run on the same eNB host." - echo_error " -m, --mscgen directory Generate mscgen output files in a directory" - echo_error " -v, --verbosity-level Verbosity level (0,1,2)." - echo_error " 0 -> ASN1 XER printf off" - echo_error " 1 -> ASN1 XER printf on and ASN1 debug off" - echo_error " 2 -> ASN1 XER printf on and ASN1 debug on" -} - -function do_msc_gen() -{ - cd $g_msc_dir - last_created_file=`ls -t mscgen* | head -1 | tr -d ':'` - $OPENAIR_DIR/targets/SCRIPTS/msc_gen.py - sync - last_created_file2=`ls -t mscgen* | head -1 | tr -d ':'` - - if [ x"$last_created_file" != x"$last_created_file2" ]; then - if [ -f ./$last_created_file2/oai_mscgen_page_0.png ]; then - command -v eog 2>/dev/null && eog ./$last_created_file2/oai_mscgen_page_0.png - fi - fi - -} - -function control_c() -# run if user hits control-c -{ - echo_warning "\nExiting by ctrl+c\n" - if [ $g_run_msc_gen -eq 1 ]; then - do_msc_gen - fi - exit $? -} - -function main() -{ - local -i run_gdb=0 - local exe_arguments=" " - local -i epc_local=0 - local -r epc_default_config_file="$OPENAIR_TARGETS/bin/epc.conf" - local epc_config_file=$epc_default_config_file - - until [ -z "$1" ] - do - case "$1" in - -g | --gdb) - run_gdb=1 - echo "setting GDB flag to: $GDB" - shift; - ;; - -h | --help) - help - exit 0 - ;; - -K | --itti-dump-file) - local itti_dump_file=$2 - # can omit file name if last arg on the line - if [ "x$itti_dump_file" = "x" ]; then - itti_dump_file="/tmp/epc_itti.log" - else - shift 1; - fi - echo "setting ITTI dump file to: $itti_dump_file" - exe_arguments="$exe_arguments -K $itti_dump_file" - shift 1; - ;; - -l | --local-enb) - epc_local=1 - shift; - ;; - -m | --mscgen) - g_msc_dir=$2 - if [ -d "$g_msc_dir" ]; then - echo "setting mscgen log files to dir: $g_msc_dir" - g_run_msc_gen=1 - shift 2; - else - echo_error "Mscgen log dir does not exist" - exit -1 - fi - ;; - -v | --verbosity-level) - local verbosity_level=$2 - echo "setting verbosity level to: $verbosity_level" - exe_arguments="-v $verbosity_level $exe_arguments" - shift 2; - ;; - *) - echo "Unknown option $1" - help - exit 0 - ;; - esac - done - - set_openair_env - cecho "OPENAIR_DIR = $OPENAIR_DIR" $green - - - if [ ! -e $OPENAIR_DIR/targets/bin/mme_gw.Rel10 ]; then - echo_fatal "Cannot find $OPENAIR_DIR/targets/bin/mme_gw.Rel10 executable, have a look at the output of build_epc executable" - fi - - if [ $epc_local -eq 1 ]; then - epc_config_file="$OPENAIR_DIR/targets/bin/epc.local.enb.conf" - fi - - if [ $g_run_msc_gen -eq 1 ]; then - rm -f /tmp/openair.msc.* - fi - - exe_arguments="-O $epc_config_file $exe_arguments" - - if [ $run_gdb -eq 0 ]; then - # trap keyboard interrupt (control-c) - trap control_c SIGINT - $OPENAIR_DIR/targets/bin/mme_gw.Rel10 `echo $exe_arguments` 2>&1 - else - # trap keyboard interrupt (control-c) is done by gdb - touch ~/.gdb_mme_gw - chmod 777 ~/.gdb_mme_gw - echo "file $OPENAIR_DIR/targets/bin/mme_gw.Rel10" > ~/.gdb_mme_gw - echo "set args $exe_arguments " >> ~/.gdb_mme_gw - echo "run" >> ~/.gdb_mme_gw - cat ~/.gdb_mme_gw - gdb -n -x ~/.gdb_mme_gw - if [ $g_run_msc_gen -eq 1 ]; then - do_msc_gen - fi - fi -} - -sudo echo -is_sudo=$? -if [[ "$is_sudo" -ne 0 ]]; then - echo_error "This script must be run by root or a sudo'er" - echo - exit 1 -fi - -main "$@" diff --git a/cmake_targets/tools/run_hss b/cmake_targets/tools/run_hss deleted file mode 100755 index 03b2132d96..0000000000 --- a/cmake_targets/tools/run_hss +++ /dev/null @@ -1,113 +0,0 @@ -#!/bin/bash -################################################################################ -# 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) anylater 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@eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE -# -################################################################################ -# file run_hss -# brief run script for HSS (!EXPERIMENTAL!). -# author Lionel GAUTHIER -# company Eurecom -# email: lionel.gauthier@eurecom.fr - - -################################ -# include helper functions -################################ -THIS_SCRIPT_PATH=$(dirname $(readlink -f $0)) -source $THIS_SCRIPT_PATH/build_helper - - -function help() -{ - echo_error " " - echo_error "Usage: run_hss [OPTION]..." - echo_error "Run the HSS executable (experimental)." - echo_error " " - echo_error "Options:" - echo_error "Mandatory arguments to long options are mandatory for short options too." - echo_error " -g, --gdb Run with GDB." - echo_error " -h, --help Print this help." -} - - - -function main() -{ - local -i run_gdb=0 - local exe_arguments=" -c ./hss.conf" - - until [ -z "$1" ] - do - case "$1" in - -g | --gdb) - run_gdb=1 - echo "setting GDB flag to: $GDB" - shift; - ;; - -h | --help) - help - exit 0 - ;; - *) - echo "Unknown option $1" - help - exit 0 - ;; - esac - done - - set_openair_env - cecho "OPENAIR_DIR = $OPENAIR_DIR" $green - cecho "OPENAIR1_DIR = $OPENAIR1_DIR" $green - cecho "OPENAIR2_DIR = $OPENAIR2_DIR" $green - cecho "OPENAIR3_DIR = $OPENAIR3_DIR" $green - cecho "OPENAIRCN_DIR = $OPENAIRCN_DIR" $green - cecho "OPENAIR_TARGETS = $OPENAIR_TARGETS" $green - - - if [ ! -e $OPENAIR_TARGETS/bin/openair-hss ]; then - echo_fatal "Cannot find $OPENAIR_TARGETS/bin/openair-hss executable" - fi - - # for file config relative path - cd $OPENAIR_TARGETS/bin - - if [ $run_gdb -eq 0 ]; then - exec $OPENAIR_TARGETS/bin/openair-hss `echo $exe_arguments` 2>&1 - else - touch ~/.gdb_hss - chmod 777 ~/.gdb_hss - echo "file $OPENAIR_TARGETS/bin/openair-hss" > ~/.gdb_hss - echo "set args $exe_arguments " >> ~/.gdb_hss - echo "run" >> ~/.gdb_hss - cat ~/.gdb_hss - gdb -n -x ~/.gdb_hss 2>&1 - fi -} - - -main "$@" diff --git a/cmake_targets/tools/s6a.conf.in b/cmake_targets/tools/s6a.conf.in deleted file mode 100644 index 6b357b71fc..0000000000 --- a/cmake_targets/tools/s6a.conf.in +++ /dev/null @@ -1,97 +0,0 @@ -# -------- Local --------- - -# Uncomment if the framework cannot resolv it. -Identity = "@MME_FQDN@"; -Realm = "@REALM@"; - -# TLS configuration (see previous section) -TLS_Cred = "@FREEDIAMETER_PATH@/../etc/freeDiameter/mme.cert.pem", - "@FREEDIAMETER_PATH@/../etc/freeDiameter/mme.key.pem"; -TLS_CA = "@FREEDIAMETER_PATH@/../etc/freeDiameter/mme.cacert.pem"; - -# Disable use of TCP protocol (only listen and connect in SCTP) -# Default : TCP enabled -@TRANSPORT_option@; - -# This option is ignored if freeDiameter is compiled with DISABLE_SCTP option. -# Prefer TCP instead of SCTP for establishing new connections. -# This setting may be overwritten per peer in peer configuration blocs. -# Default : SCTP is attempted first. -@TRANSPORT_PREFER_TCP_option@; - - -No_IPv6; - -# Overwrite the number of SCTP streams. This value should be kept low, -# especially if you are using TLS over SCTP, because it consumes a lot of -# resources in that case. See tickets 19 and 27 for some additional details on -# this. -# Limit the number of SCTP streams -SCTP_streams = 3; - - -# By default, freeDiameter acts as a Diameter Relay Agent by forwarding all -# messages it cannot handle locally. This parameter disables this behavior. -NoRelay; - - -TLS_old_method; - - -AppServThreads = 1; - -# Specify the addresses on which to bind the listening server. This must be -# specified if the framework is unable to auto-detect these addresses, or if the -# auto-detected values are incorrect. Note that the list of addresses is sent -# in CER or CEA message, so one should pay attention to this parameter if some -# adresses should be kept hidden. -@ListenOn@ - -@DIAMETER_PORT@; -@DIAMETER_SEC_PORT@; - -# -------- Extensions --------- - -# Uncomment (and create rtd.conf) to specify routing table for this peer. -#LoadExtension = "rt_default.fdx" : "rtd.conf"; - -# Uncomment (and create acl.conf) to allow incoming connections from other peers. -#LoadExtension = "acl_wl.fdx" : "acl.conf"; - -# Uncomment to display periodic state information -#LoadExtension = "dbg_monitor.fdx"; - -# Uncomment to enable an interactive Python interpreter session. -# (see doc/dbg_interactive.py.sample for more information) -#LoadExtension = "dbg_interactive.fdx"; - -# Load the RFC4005 dictionary objects -#LoadExtension = "dict_nasreq.fdx"; - -LoadExtension = "dict_nas_mipv6.fdx"; -LoadExtension = "dict_s6a.fdx"; - -# Load RFC4072 dictionary objects -#LoadExtension = "dict_eap.fdx"; - -# Load the Diameter EAP server extension (requires diameap.conf) -#LoadExtension = "app_diameap.fdx" : "diameap.conf"; - -# Load the Accounting Server extension (requires app_acct.conf) -#LoadExtension = "app_acct.fdx" : "app_acct.conf"; - -# -------- Peers --------- - -# The framework will actively attempt to establish and maintain a connection -# with the peers listed here. -# For only accepting incoming connections, see the acl_wl.fx extension. - -# ConnectPeer -# Declare a remote peer to which this peer must maintain a connection. -# In addition, this allows specifying non-default parameters for this peer only -# (for example disable SCTP with this peer, or use RFC3588-flavour TLS). -# Note that by default, if a peer is not listed as a ConnectPeer entry, an -# incoming connection from this peer will be rejected. If you want to accept -# incoming connections from other peers, see the acl_wl.fdx? extension which -# allows exactly this. -@ConnectPeer@ = "@HSS_FQDN@" { ConnectTo = "@HSS_IP@"; No_IPv6; No_TLS ; port = 3868; Realm = "@REALM@"; }; diff --git a/common/utils/COPYING b/common/utils/COPYING index 818433ecc0..c888423064 100644 --- a/common/utils/COPYING +++ b/common/utils/COPYING @@ -1,674 +1,28 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program 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. - - This program 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 this program. If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - <program> Copyright (C) <year> <name of author> - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<http://www.gnu.org/licenses/>. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<http://www.gnu.org/philosophy/why-not-lgpl.html>. +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ \ No newline at end of file diff --git a/common/utils/asn1_conversions.h b/common/utils/asn1_conversions.h index be7748fecf..bb7b244989 100644 --- a/common/utils/asn1_conversions.h +++ b/common/utils/asn1_conversions.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #ifndef ASN1_CONVERSIONS_H_ #define ASN1_CONVERSIONS_H_ diff --git a/common/utils/assertions.h b/common/utils/assertions.h index a33c35ead3..8bb74109ed 100644 --- a/common/utils/assertions.h +++ b/common/utils/assertions.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #ifndef UTILS_ASSERTIONS_H_ #define UTILS_ASSERTIONS_H_ diff --git a/common/utils/collection/COPYING b/common/utils/collection/COPYING index 818433ecc0..d605b9a3b1 100644 --- a/common/utils/collection/COPYING +++ b/common/utils/collection/COPYING @@ -1,674 +1,28 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program 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. - - This program 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 this program. If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - <program> Copyright (C) <year> <name of author> - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<http://www.gnu.org/licenses/>. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<http://www.gnu.org/philosophy/why-not-lgpl.html>. +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ diff --git a/common/utils/collection/hashtable/COPYING b/common/utils/collection/hashtable/COPYING index 818433ecc0..d605b9a3b1 100644 --- a/common/utils/collection/hashtable/COPYING +++ b/common/utils/collection/hashtable/COPYING @@ -1,674 +1,28 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program 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. - - This program 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 this program. If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - <program> Copyright (C) <year> <name of author> - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<http://www.gnu.org/licenses/>. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<http://www.gnu.org/philosophy/why-not-lgpl.html>. +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ diff --git a/common/utils/collection/hashtable/hashtable.c b/common/utils/collection/hashtable/hashtable.c index ba2686c718..d424e2a0ad 100755 --- a/common/utils/collection/hashtable/hashtable.c +++ b/common/utils/collection/hashtable/hashtable.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <string.h> #include <stdio.h> diff --git a/common/utils/collection/hashtable/hashtable.h b/common/utils/collection/hashtable/hashtable.h index 2082e4f85f..5c06937bed 100755 --- a/common/utils/collection/hashtable/hashtable.h +++ b/common/utils/collection/hashtable/hashtable.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #ifndef _UTILS_COLLECTION_HASH_TABLE_H_ diff --git a/common/utils/collection/hashtable/obj_hashtable.c b/common/utils/collection/hashtable/obj_hashtable.c index b1d804335f..63fd8a688b 100755 --- a/common/utils/collection/hashtable/obj_hashtable.c +++ b/common/utils/collection/hashtable/obj_hashtable.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <string.h> #include <stdio.h> diff --git a/common/utils/collection/hashtable/obj_hashtable.h b/common/utils/collection/hashtable/obj_hashtable.h index bf7ea89b96..8743a13f08 100755 --- a/common/utils/collection/hashtable/obj_hashtable.h +++ b/common/utils/collection/hashtable/obj_hashtable.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #ifndef _UTILS_COLLECTION_OBJ_HASH_TABLE_H_ #define _UTILS_COLLECTION_OBJ_HASH_TABLE_H_ diff --git a/common/utils/itti/COPYING b/common/utils/itti/COPYING index 818433ecc0..c888423064 100644 --- a/common/utils/itti/COPYING +++ b/common/utils/itti/COPYING @@ -1,674 +1,28 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program 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. - - This program 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 this program. If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - <program> Copyright (C) <year> <name of author> - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<http://www.gnu.org/licenses/>. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<http://www.gnu.org/philosophy/why-not-lgpl.html>. +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ \ No newline at end of file diff --git a/common/utils/itti/assertions.h b/common/utils/itti/assertions.h index df14404c79..c047ef6b76 100644 --- a/common/utils/itti/assertions.h +++ b/common/utils/itti/assertions.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> diff --git a/common/utils/itti/backtrace.c b/common/utils/itti/backtrace.c index f83d018d6e..3d984cbf11 100644 --- a/common/utils/itti/backtrace.c +++ b/common/utils/itti/backtrace.c @@ -1,32 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <pthread.h> #include <stdio.h> #include <stdlib.h> diff --git a/common/utils/itti/backtrace.h b/common/utils/itti/backtrace.h index c2622a6b07..1ba8143860 100644 --- a/common/utils/itti/backtrace.h +++ b/common/utils/itti/backtrace.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <signal.h> diff --git a/common/utils/itti/intertask_interface.c b/common/utils/itti/intertask_interface.c index c61dd07636..572c207b3f 100644 --- a/common/utils/itti/intertask_interface.c +++ b/common/utils/itti/intertask_interface.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #define _GNU_SOURCE #include <pthread.h> diff --git a/common/utils/itti/intertask_interface.h b/common/utils/itti/intertask_interface.h index 350c88af6a..46fb0c749f 100644 --- a/common/utils/itti/intertask_interface.h +++ b/common/utils/itti/intertask_interface.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ /** @defgroup _intertask_interface_impl_ Intertask Interface Mechanisms * Implementation diff --git a/common/utils/itti/intertask_interface_dump.c b/common/utils/itti/intertask_interface_dump.c index e17cdab85a..491bff59b0 100644 --- a/common/utils/itti/intertask_interface_dump.c +++ b/common/utils/itti/intertask_interface_dump.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ /** @brief Intertask Interface Signal Dumper diff --git a/common/utils/itti/intertask_interface_dump.h b/common/utils/itti/intertask_interface_dump.h index 8d06a8ed1f..acaf450cf4 100644 --- a/common/utils/itti/intertask_interface_dump.h +++ b/common/utils/itti/intertask_interface_dump.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #ifndef INTERTASK_INTERFACE_DUMP_H_ #define INTERTASK_INTERFACE_DUMP_H_ diff --git a/common/utils/itti/intertask_interface_init.h b/common/utils/itti/intertask_interface_init.h index 1135f17738..a01f1eea90 100644 --- a/common/utils/itti/intertask_interface_init.h +++ b/common/utils/itti/intertask_interface_init.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ /** @defgroup _intertask_interface_impl_ Intertask Interface Mechanisms * Implementation diff --git a/common/utils/itti/intertask_interface_types.h b/common/utils/itti/intertask_interface_types.h index 3e0203df6d..bf29e12008 100644 --- a/common/utils/itti/intertask_interface_types.h +++ b/common/utils/itti/intertask_interface_types.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ /** @defgroup _intertask_interface_impl_ Intertask Interface Mechanisms * Implementation diff --git a/common/utils/itti/intertask_messages_def.h b/common/utils/itti/intertask_messages_def.h index baac5cd6d0..4f125f4649 100644 --- a/common/utils/itti/intertask_messages_def.h +++ b/common/utils/itti/intertask_messages_def.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ /* This message asks for task initialization */ MESSAGE_DEF(INITIALIZE_MESSAGE, MESSAGE_PRIORITY_MED, IttiMsgEmpty, initialize_message) diff --git a/common/utils/itti/intertask_messages_types.h b/common/utils/itti/intertask_messages_types.h index c047d7dae8..e64a709636 100644 --- a/common/utils/itti/intertask_messages_types.h +++ b/common/utils/itti/intertask_messages_types.h @@ -1,32 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ /* * intertask_messages_types.h diff --git a/common/utils/itti/itti_types.h b/common/utils/itti/itti_types.h index ec1b290bfd..f1a17d1228 100644 --- a/common/utils/itti/itti_types.h +++ b/common/utils/itti/itti_types.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ /** @brief Intertask Interface common types * Contains type definitions used for generating and parsing ITTI messages. diff --git a/common/utils/itti/memory_pools.c b/common/utils/itti/memory_pools.c index 568c03defe..dadc80ca2a 100644 --- a/common/utils/itti/memory_pools.c +++ b/common/utils/itti/memory_pools.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #ifdef RTAI # include <rtai_shm.h> diff --git a/common/utils/itti/memory_pools.h b/common/utils/itti/memory_pools.h index a84499c2fc..72268f90d7 100644 --- a/common/utils/itti/memory_pools.h +++ b/common/utils/itti/memory_pools.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #ifndef MEMORY_POOLS_H_ #define MEMORY_POOLS_H_ diff --git a/common/utils/itti/messages_def.h b/common/utils/itti/messages_def.h index ea2a321ef8..7df3789fd7 100644 --- a/common/utils/itti/messages_def.h +++ b/common/utils/itti/messages_def.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ // These messages files are mandatory and must always be placed in first position #include "intertask_messages_def.h" diff --git a/common/utils/itti/messages_types.h b/common/utils/itti/messages_types.h index 2594d7b534..3426aada3e 100644 --- a/common/utils/itti/messages_types.h +++ b/common/utils/itti/messages_types.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ /* * messages_types.h diff --git a/common/utils/itti/signals.c b/common/utils/itti/signals.c index e1950b4665..b9a3316cec 100644 --- a/common/utils/itti/signals.c +++ b/common/utils/itti/signals.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #if HAVE_CONFIG_H # include "config.h" diff --git a/common/utils/itti/signals.h b/common/utils/itti/signals.h index 65bc59b046..53a73afa6f 100644 --- a/common/utils/itti/signals.h +++ b/common/utils/itti/signals.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #ifndef SIGNALS_H_ #define SIGNALS_H_ diff --git a/common/utils/itti/tasks_def.h b/common/utils/itti/tasks_def.h index 6d6ab48332..5f2a413235 100644 --- a/common/utils/itti/tasks_def.h +++ b/common/utils/itti/tasks_def.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ // This task is mandatory and must always be placed in first position TASK_DEF(TASK_TIMER, TASK_PRIORITY_MED, 10) diff --git a/common/utils/itti/timer.c b/common/utils/itti/timer.c index 25f70f04d7..40e8791022 100644 --- a/common/utils/itti/timer.c +++ b/common/utils/itti/timer.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <pthread.h> #include <stdio.h> diff --git a/common/utils/itti/timer.h b/common/utils/itti/timer.h index 9f2ec30f7d..825b3ca2eb 100644 --- a/common/utils/itti/timer.h +++ b/common/utils/itti/timer.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #ifndef TIMER_H_ #define TIMER_H_ diff --git a/common/utils/itti/timer_messages_def.h b/common/utils/itti/timer_messages_def.h index 077147fe50..56af4e8a8e 100644 --- a/common/utils/itti/timer_messages_def.h +++ b/common/utils/itti/timer_messages_def.h @@ -1,31 +1,30 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ MESSAGE_DEF(TIMER_HAS_EXPIRED, MESSAGE_PRIORITY_MED_PLUS, timer_has_expired_t, timer_has_expired) diff --git a/common/utils/itti/timer_messages_types.h b/common/utils/itti/timer_messages_types.h index c54f4d165e..8126b75aef 100644 --- a/common/utils/itti/timer_messages_types.h +++ b/common/utils/itti/timer_messages_types.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #ifndef TIMER_MESSAGES_TYPES_H_ #define TIMER_MESSAGES_TYPES_H_ diff --git a/common/utils/itti_analyzer/COPYING b/common/utils/itti_analyzer/COPYING index 818433ecc0..c888423064 100644 --- a/common/utils/itti_analyzer/COPYING +++ b/common/utils/itti_analyzer/COPYING @@ -1,674 +1,28 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program 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. - - This program 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 this program. If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - <program> Copyright (C) <year> <name of author> - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<http://www.gnu.org/licenses/>. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<http://www.gnu.org/philosophy/why-not-lgpl.html>. +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ \ No newline at end of file diff --git a/common/utils/itti_analyzer/README b/common/utils/itti_analyzer/README index 31dc085b23..8ca077a227 100644 --- a/common/utils/itti_analyzer/README +++ b/common/utils/itti_analyzer/README @@ -11,4 +11,4 @@ To run itti_analyzer, please perform the following actions: 5) make -6) ./itt \ No newline at end of file +6) ./itti_analyzer \ No newline at end of file diff --git a/common/utils/itti_analyzer/common/COPYING b/common/utils/itti_analyzer/common/COPYING index 818433ecc0..d605b9a3b1 100644 --- a/common/utils/itti_analyzer/common/COPYING +++ b/common/utils/itti_analyzer/common/COPYING @@ -1,674 +1,28 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program 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. - - This program 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 this program. If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - <program> Copyright (C) <year> <name of author> - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<http://www.gnu.org/licenses/>. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<http://www.gnu.org/philosophy/why-not-lgpl.html>. +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ diff --git a/common/utils/itti_analyzer/common/itti_types.h b/common/utils/itti_analyzer/common/itti_types.h index ddfd8473a6..3671b1d917 100644 --- a/common/utils/itti_analyzer/common/itti_types.h +++ b/common/utils/itti_analyzer/common/itti_types.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ /** @brief Intertask Interface common types * Contains type definitions used for generating and parsing ITTI messages. diff --git a/common/utils/itti_analyzer/common/logs.h b/common/utils/itti_analyzer/common/logs.h index 051e8b16c7..21d2dfad78 100644 --- a/common/utils/itti_analyzer/common/logs.h +++ b/common/utils/itti_analyzer/common/logs.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ /* * logs.h diff --git a/common/utils/itti_analyzer/common/rc.h b/common/utils/itti_analyzer/common/rc.h index 7fa6c05589..11eb107632 100644 --- a/common/utils/itti_analyzer/common/rc.h +++ b/common/utils/itti_analyzer/common/rc.h @@ -1,31 +1,32 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include <errno.h> #include <string.h> diff --git a/common/utils/itti_analyzer/itti_analyzer.c b/common/utils/itti_analyzer/itti_analyzer.c index 214430b096..78bdb43b39 100644 --- a/common/utils/itti_analyzer/itti_analyzer.c +++ b/common/utils/itti_analyzer/itti_analyzer.c @@ -1,31 +1,32 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ + #include <stdlib.h> #include <stdio.h> diff --git a/common/utils/itti_analyzer/libbuffers/COPYING b/common/utils/itti_analyzer/libbuffers/COPYING index 818433ecc0..d605b9a3b1 100644 --- a/common/utils/itti_analyzer/libbuffers/COPYING +++ b/common/utils/itti_analyzer/libbuffers/COPYING @@ -1,674 +1,28 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program 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. - - This program 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 this program. If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - <program> Copyright (C) <year> <name of author> - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<http://www.gnu.org/licenses/>. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<http://www.gnu.org/philosophy/why-not-lgpl.html>. +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ diff --git a/common/utils/itti_analyzer/libbuffers/buffers.c b/common/utils/itti_analyzer/libbuffers/buffers.c index 7927ce646a..e8a1fc0c20 100644 --- a/common/utils/itti_analyzer/libbuffers/buffers.c +++ b/common/utils/itti_analyzer/libbuffers/buffers.c @@ -1,31 +1,32 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ + #include <pthread.h> #include <stdlib.h> diff --git a/common/utils/itti_analyzer/libbuffers/buffers.h b/common/utils/itti_analyzer/libbuffers/buffers.h index 1346c4aaed..fd57e7b021 100644 --- a/common/utils/itti_analyzer/libbuffers/buffers.h +++ b/common/utils/itti_analyzer/libbuffers/buffers.h @@ -1,31 +1,32 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ + #include <stdint.h> diff --git a/common/utils/itti_analyzer/libbuffers/file.c b/common/utils/itti_analyzer/libbuffers/file.c index 0cfe0edd59..b9404c31c0 100644 --- a/common/utils/itti_analyzer/libbuffers/file.c +++ b/common/utils/itti_analyzer/libbuffers/file.c @@ -1,31 +1,32 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include <stdio.h> #include <string.h> diff --git a/common/utils/itti_analyzer/libbuffers/file.h b/common/utils/itti_analyzer/libbuffers/file.h index 0c1ecf7e07..8d2b90a5cf 100644 --- a/common/utils/itti_analyzer/libbuffers/file.h +++ b/common/utils/itti_analyzer/libbuffers/file.h @@ -1,31 +1,32 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #ifndef FILE_H_ #define FILE_H_ diff --git a/common/utils/itti_analyzer/libbuffers/socket.c b/common/utils/itti_analyzer/libbuffers/socket.c index 99cd44bd11..e782ee431b 100644 --- a/common/utils/itti_analyzer/libbuffers/socket.c +++ b/common/utils/itti_analyzer/libbuffers/socket.c @@ -1,31 +1,32 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ + #include <pthread.h> #include <stdio.h> diff --git a/common/utils/itti_analyzer/libbuffers/socket.h b/common/utils/itti_analyzer/libbuffers/socket.h index 755cf3093c..45881f311b 100644 --- a/common/utils/itti_analyzer/libbuffers/socket.h +++ b/common/utils/itti_analyzer/libbuffers/socket.h @@ -1,31 +1,32 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ + #include <arpa/inet.h> #include <netinet/in.h> diff --git a/common/utils/itti_analyzer/libparser/COPYING b/common/utils/itti_analyzer/libparser/COPYING index 818433ecc0..d605b9a3b1 100644 --- a/common/utils/itti_analyzer/libparser/COPYING +++ b/common/utils/itti_analyzer/libparser/COPYING @@ -1,674 +1,28 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program 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. - - This program 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 this program. If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - <program> Copyright (C) <year> <name of author> - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<http://www.gnu.org/licenses/>. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<http://www.gnu.org/philosophy/why-not-lgpl.html>. +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ diff --git a/common/utils/itti_analyzer/libparser/array_type.c b/common/utils/itti_analyzer/libparser/array_type.c index c69351d32a..d88c7fa848 100644 --- a/common/utils/itti_analyzer/libparser/array_type.c +++ b/common/utils/itti_analyzer/libparser/array_type.c @@ -1,31 +1,32 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ + #include <stdio.h> #include <stdlib.h> diff --git a/common/utils/itti_analyzer/libparser/array_type.h b/common/utils/itti_analyzer/libparser/array_type.h index 277a2a7db9..dd3eccf359 100644 --- a/common/utils/itti_analyzer/libparser/array_type.h +++ b/common/utils/itti_analyzer/libparser/array_type.h @@ -1,31 +1,32 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "types.h" diff --git a/common/utils/itti_analyzer/libparser/enum_type.c b/common/utils/itti_analyzer/libparser/enum_type.c index 1a2b90f2ca..78328b5492 100644 --- a/common/utils/itti_analyzer/libparser/enum_type.c +++ b/common/utils/itti_analyzer/libparser/enum_type.c @@ -1,31 +1,32 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ + #include <stdio.h> #include <stdlib.h> diff --git a/common/utils/itti_analyzer/libparser/enum_type.h b/common/utils/itti_analyzer/libparser/enum_type.h index 745140b52d..ae19a5c495 100644 --- a/common/utils/itti_analyzer/libparser/enum_type.h +++ b/common/utils/itti_analyzer/libparser/enum_type.h @@ -1,31 +1,32 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ + #include "types.h" diff --git a/common/utils/itti_analyzer/libparser/enum_value_type.c b/common/utils/itti_analyzer/libparser/enum_value_type.c index 47d3ba9b37..eae25817b6 100644 --- a/common/utils/itti_analyzer/libparser/enum_value_type.c +++ b/common/utils/itti_analyzer/libparser/enum_value_type.c @@ -1,31 +1,32 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include <stdio.h> #include <stdlib.h> diff --git a/common/utils/itti_analyzer/libparser/enum_value_type.h b/common/utils/itti_analyzer/libparser/enum_value_type.h index 6be8eda743..71ce4f9849 100644 --- a/common/utils/itti_analyzer/libparser/enum_value_type.h +++ b/common/utils/itti_analyzer/libparser/enum_value_type.h @@ -1,31 +1,32 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ + #include "types.h" diff --git a/common/utils/itti_analyzer/libparser/field_type.c b/common/utils/itti_analyzer/libparser/field_type.c index 4a9c6df56b..4ebb743150 100644 --- a/common/utils/itti_analyzer/libparser/field_type.c +++ b/common/utils/itti_analyzer/libparser/field_type.c @@ -1,31 +1,32 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ + #include <stdio.h> #include <stdlib.h> diff --git a/common/utils/itti_analyzer/libparser/field_type.h b/common/utils/itti_analyzer/libparser/field_type.h index abc09c0fe0..0437f9e5ec 100644 --- a/common/utils/itti_analyzer/libparser/field_type.h +++ b/common/utils/itti_analyzer/libparser/field_type.h @@ -1,31 +1,32 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "types.h" diff --git a/common/utils/itti_analyzer/libparser/file_type.c b/common/utils/itti_analyzer/libparser/file_type.c index 84552a836a..c032e6eb88 100644 --- a/common/utils/itti_analyzer/libparser/file_type.c +++ b/common/utils/itti_analyzer/libparser/file_type.c @@ -1,31 +1,32 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ + #include <stdio.h> #include <stdlib.h> diff --git a/common/utils/itti_analyzer/libparser/file_type.h b/common/utils/itti_analyzer/libparser/file_type.h index e6343afad8..d84f5af34f 100644 --- a/common/utils/itti_analyzer/libparser/file_type.h +++ b/common/utils/itti_analyzer/libparser/file_type.h @@ -1,31 +1,32 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "types.h" diff --git a/common/utils/itti_analyzer/libparser/fundamental_type.c b/common/utils/itti_analyzer/libparser/fundamental_type.c index 1c9c9a0dc9..8559919730 100644 --- a/common/utils/itti_analyzer/libparser/fundamental_type.c +++ b/common/utils/itti_analyzer/libparser/fundamental_type.c @@ -1,31 +1,32 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ + #include <stdio.h> #include <stdlib.h> diff --git a/common/utils/itti_analyzer/libparser/fundamental_type.h b/common/utils/itti_analyzer/libparser/fundamental_type.h index b0e169c643..cb13bf2b79 100644 --- a/common/utils/itti_analyzer/libparser/fundamental_type.h +++ b/common/utils/itti_analyzer/libparser/fundamental_type.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include "types.h" diff --git a/common/utils/itti_analyzer/libparser/intertask_contexts.h b/common/utils/itti_analyzer/libparser/intertask_contexts.h index 207910ee87..72d3fb2cc6 100644 --- a/common/utils/itti_analyzer/libparser/intertask_contexts.h +++ b/common/utils/itti_analyzer/libparser/intertask_contexts.h @@ -1,31 +1,32 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "fundamental_type.h" #include "struct_type.h" diff --git a/common/utils/itti_analyzer/libparser/pointer_type.c b/common/utils/itti_analyzer/libparser/pointer_type.c index e888c04b9a..921bafcac8 100644 --- a/common/utils/itti_analyzer/libparser/pointer_type.c +++ b/common/utils/itti_analyzer/libparser/pointer_type.c @@ -1,31 +1,32 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include <stdio.h> #include <stdlib.h> diff --git a/common/utils/itti_analyzer/libparser/pointer_type.h b/common/utils/itti_analyzer/libparser/pointer_type.h index b6eabff9a2..0c6b901f5b 100644 --- a/common/utils/itti_analyzer/libparser/pointer_type.h +++ b/common/utils/itti_analyzer/libparser/pointer_type.h @@ -1,31 +1,32 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "types.h" diff --git a/common/utils/itti_analyzer/libparser/reference_type.c b/common/utils/itti_analyzer/libparser/reference_type.c index 7409747d53..ee49b10cd5 100644 --- a/common/utils/itti_analyzer/libparser/reference_type.c +++ b/common/utils/itti_analyzer/libparser/reference_type.c @@ -1,31 +1,32 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include <stdio.h> #include <stdlib.h> diff --git a/common/utils/itti_analyzer/libparser/reference_type.h b/common/utils/itti_analyzer/libparser/reference_type.h index bcbfc98941..693bc712d8 100644 --- a/common/utils/itti_analyzer/libparser/reference_type.h +++ b/common/utils/itti_analyzer/libparser/reference_type.h @@ -1,31 +1,32 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "types.h" diff --git a/common/utils/itti_analyzer/libparser/struct_type.c b/common/utils/itti_analyzer/libparser/struct_type.c index b37c86fe59..af1201b4d2 100644 --- a/common/utils/itti_analyzer/libparser/struct_type.c +++ b/common/utils/itti_analyzer/libparser/struct_type.c @@ -1,31 +1,32 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ + #include <stdio.h> #include <stdlib.h> diff --git a/common/utils/itti_analyzer/libparser/struct_type.h b/common/utils/itti_analyzer/libparser/struct_type.h index e132c31690..7bbb9ee100 100644 --- a/common/utils/itti_analyzer/libparser/struct_type.h +++ b/common/utils/itti_analyzer/libparser/struct_type.h @@ -1,31 +1,32 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "types.h" diff --git a/common/utils/itti_analyzer/libparser/typedef_type.c b/common/utils/itti_analyzer/libparser/typedef_type.c index 08f9eb5b38..285acfad5c 100644 --- a/common/utils/itti_analyzer/libparser/typedef_type.c +++ b/common/utils/itti_analyzer/libparser/typedef_type.c @@ -1,31 +1,32 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include <stdio.h> #include <stdlib.h> diff --git a/common/utils/itti_analyzer/libparser/typedef_type.h b/common/utils/itti_analyzer/libparser/typedef_type.h index aac3a680b7..0657f50c98 100644 --- a/common/utils/itti_analyzer/libparser/typedef_type.h +++ b/common/utils/itti_analyzer/libparser/typedef_type.h @@ -1,31 +1,32 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "types.h" diff --git a/common/utils/itti_analyzer/libparser/types.c b/common/utils/itti_analyzer/libparser/types.c index dbd87e8eb7..7ae55bb737 100644 --- a/common/utils/itti_analyzer/libparser/types.c +++ b/common/utils/itti_analyzer/libparser/types.c @@ -1,31 +1,32 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include <stdio.h> #include <stdlib.h> diff --git a/common/utils/itti_analyzer/libparser/types.h b/common/utils/itti_analyzer/libparser/types.h index ad502d3a13..339029839d 100644 --- a/common/utils/itti_analyzer/libparser/types.h +++ b/common/utils/itti_analyzer/libparser/types.h @@ -1,31 +1,32 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ + #include <stdio.h> diff --git a/common/utils/itti_analyzer/libparser/union_type.c b/common/utils/itti_analyzer/libparser/union_type.c index 08ce06b389..ef8fd393ac 100644 --- a/common/utils/itti_analyzer/libparser/union_type.c +++ b/common/utils/itti_analyzer/libparser/union_type.c @@ -1,31 +1,32 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ + #include <stdio.h> #include <stdlib.h> diff --git a/common/utils/itti_analyzer/libparser/union_type.h b/common/utils/itti_analyzer/libparser/union_type.h index faf0cecfa0..c1817dea6e 100644 --- a/common/utils/itti_analyzer/libparser/union_type.h +++ b/common/utils/itti_analyzer/libparser/union_type.h @@ -1,31 +1,32 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ + #include "types.h" diff --git a/common/utils/itti_analyzer/libparser/xml_parse.c b/common/utils/itti_analyzer/libparser/xml_parse.c index 98b93976eb..cdad8ee3ed 100644 --- a/common/utils/itti_analyzer/libparser/xml_parse.c +++ b/common/utils/itti_analyzer/libparser/xml_parse.c @@ -1,31 +1,32 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ + #include <string.h> #include <unistd.h> diff --git a/common/utils/itti_analyzer/libparser/xml_parse.h b/common/utils/itti_analyzer/libparser/xml_parse.h index 7b1f28527f..5d23a6157a 100644 --- a/common/utils/itti_analyzer/libparser/xml_parse.h +++ b/common/utils/itti_analyzer/libparser/xml_parse.h @@ -1,31 +1,32 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ + #include "rc.h" #include "types.h" diff --git a/common/utils/itti_analyzer/libresolver/COPYING b/common/utils/itti_analyzer/libresolver/COPYING index 818433ecc0..d605b9a3b1 100644 --- a/common/utils/itti_analyzer/libresolver/COPYING +++ b/common/utils/itti_analyzer/libresolver/COPYING @@ -1,674 +1,28 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program 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. - - This program 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 this program. If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - <program> Copyright (C) <year> <name of author> - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<http://www.gnu.org/licenses/>. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<http://www.gnu.org/philosophy/why-not-lgpl.html>. +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ diff --git a/common/utils/itti_analyzer/libresolver/locate_root.c b/common/utils/itti_analyzer/libresolver/locate_root.c index 18f3a2d188..8d1b101e73 100644 --- a/common/utils/itti_analyzer/libresolver/locate_root.c +++ b/common/utils/itti_analyzer/libresolver/locate_root.c @@ -1,31 +1,32 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ + #include <stdio.h> #include <string.h> diff --git a/common/utils/itti_analyzer/libresolver/locate_root.h b/common/utils/itti_analyzer/libresolver/locate_root.h index 9e9a5f204d..103e7b96ef 100644 --- a/common/utils/itti_analyzer/libresolver/locate_root.h +++ b/common/utils/itti_analyzer/libresolver/locate_root.h @@ -1,31 +1,32 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ + #ifndef LOCATE_ROOT_H_ #define LOCATE_ROOT_H_ diff --git a/common/utils/itti_analyzer/libresolver/resolvers.c b/common/utils/itti_analyzer/libresolver/resolvers.c index 312effbcaf..685cd84d87 100644 --- a/common/utils/itti_analyzer/libresolver/resolvers.c +++ b/common/utils/itti_analyzer/libresolver/resolvers.c @@ -1,31 +1,32 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ + #include <stdio.h> #include <stdlib.h> diff --git a/common/utils/itti_analyzer/libresolver/resolvers.h b/common/utils/itti_analyzer/libresolver/resolvers.h index 1b24e921e9..84d2e15ecf 100644 --- a/common/utils/itti_analyzer/libresolver/resolvers.h +++ b/common/utils/itti_analyzer/libresolver/resolvers.h @@ -1,31 +1,32 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ + #ifndef RESOLVERS_H_ #define RESOLVERS_H_ diff --git a/common/utils/itti_analyzer/libui/COPYING b/common/utils/itti_analyzer/libui/COPYING index 818433ecc0..d605b9a3b1 100644 --- a/common/utils/itti_analyzer/libui/COPYING +++ b/common/utils/itti_analyzer/libui/COPYING @@ -1,674 +1,28 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program 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. - - This program 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 this program. If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - <program> Copyright (C) <year> <name of author> - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<http://www.gnu.org/licenses/>. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<http://www.gnu.org/philosophy/why-not-lgpl.html>. +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ diff --git a/common/utils/itti_analyzer/libui/ui_callbacks.c b/common/utils/itti_analyzer/libui/ui_callbacks.c index bec4dc3024..725a453334 100644 --- a/common/utils/itti_analyzer/libui/ui_callbacks.c +++ b/common/utils/itti_analyzer/libui/ui_callbacks.c @@ -1,31 +1,32 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ + #if HAVE_CONFIG_H # include "config.h" diff --git a/common/utils/itti_analyzer/libui/ui_callbacks.h b/common/utils/itti_analyzer/libui/ui_callbacks.h index 8ca5665f08..f408441548 100644 --- a/common/utils/itti_analyzer/libui/ui_callbacks.h +++ b/common/utils/itti_analyzer/libui/ui_callbacks.h @@ -1,31 +1,32 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ + #ifndef UI_CALLBACKS_H_ #define UI_CALLBACKS_H_ diff --git a/common/utils/itti_analyzer/libui/ui_filters.c b/common/utils/itti_analyzer/libui/ui_filters.c index 8d66904c99..e2fb993933 100644 --- a/common/utils/itti_analyzer/libui/ui_filters.c +++ b/common/utils/itti_analyzer/libui/ui_filters.c @@ -1,31 +1,32 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ + #include <stdio.h> #include <stdlib.h> diff --git a/common/utils/itti_analyzer/libui/ui_filters.h b/common/utils/itti_analyzer/libui/ui_filters.h index 4eb051e918..9e168ad62f 100644 --- a/common/utils/itti_analyzer/libui/ui_filters.h +++ b/common/utils/itti_analyzer/libui/ui_filters.h @@ -1,31 +1,32 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ + #ifndef UI_FILTERS_H_ #define UI_FILTERS_H_ diff --git a/common/utils/itti_analyzer/libui/ui_interface.c b/common/utils/itti_analyzer/libui/ui_interface.c index cbb3b9fc98..8f0f5a8415 100644 --- a/common/utils/itti_analyzer/libui/ui_interface.c +++ b/common/utils/itti_analyzer/libui/ui_interface.c @@ -1,31 +1,32 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ + #include <pthread.h> #include <stdint.h> diff --git a/common/utils/itti_analyzer/libui/ui_interface.h b/common/utils/itti_analyzer/libui/ui_interface.h index ef7fe31f6b..de120e6565 100644 --- a/common/utils/itti_analyzer/libui/ui_interface.h +++ b/common/utils/itti_analyzer/libui/ui_interface.h @@ -1,31 +1,32 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ - *******************************************************************************/ #include <glib.h> diff --git a/common/utils/itti_analyzer/libui/ui_main_screen.c b/common/utils/itti_analyzer/libui/ui_main_screen.c index ae3ab125c0..e440bfb50e 100644 --- a/common/utils/itti_analyzer/libui/ui_main_screen.c +++ b/common/utils/itti_analyzer/libui/ui_main_screen.c @@ -1,31 +1,32 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ + #if HAVE_CONFIG_H # include "config.h" diff --git a/common/utils/itti_analyzer/libui/ui_main_screen.h b/common/utils/itti_analyzer/libui/ui_main_screen.h index 9d0805f4cd..4455195a1d 100644 --- a/common/utils/itti_analyzer/libui/ui_main_screen.h +++ b/common/utils/itti_analyzer/libui/ui_main_screen.h @@ -1,31 +1,32 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ + #ifndef UI_MAIN_SCREEN_H_ #define UI_MAIN_SCREEN_H_ diff --git a/common/utils/itti_analyzer/libui/ui_menu_bar.c b/common/utils/itti_analyzer/libui/ui_menu_bar.c index b4ec50141a..a5c7c2810f 100644 --- a/common/utils/itti_analyzer/libui/ui_menu_bar.c +++ b/common/utils/itti_analyzer/libui/ui_menu_bar.c @@ -1,31 +1,32 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ + #define G_LOG_DOMAIN ("UI") diff --git a/common/utils/itti_analyzer/libui/ui_menu_bar.h b/common/utils/itti_analyzer/libui/ui_menu_bar.h index 03e069b96b..7644862c7a 100644 --- a/common/utils/itti_analyzer/libui/ui_menu_bar.h +++ b/common/utils/itti_analyzer/libui/ui_menu_bar.h @@ -1,31 +1,32 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #ifndef UI_MENU_BAR_H_ #define UI_MENU_BAR_H_ diff --git a/common/utils/itti_analyzer/libui/ui_notebook.c b/common/utils/itti_analyzer/libui/ui_notebook.c index d5e81ffa4e..07bf12fe7c 100644 --- a/common/utils/itti_analyzer/libui/ui_notebook.c +++ b/common/utils/itti_analyzer/libui/ui_notebook.c @@ -1,31 +1,32 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ + #if HAVE_CONFIG_H # include "config.h" diff --git a/common/utils/itti_analyzer/libui/ui_notebook.h b/common/utils/itti_analyzer/libui/ui_notebook.h index 741eb901e9..cf574608ca 100644 --- a/common/utils/itti_analyzer/libui/ui_notebook.h +++ b/common/utils/itti_analyzer/libui/ui_notebook.h @@ -1,31 +1,32 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #ifndef UI_NOTEBOOK_H_ #define UI_NOTEBOOK_H_ diff --git a/common/utils/itti_analyzer/libui/ui_notif_dlg.c b/common/utils/itti_analyzer/libui/ui_notif_dlg.c index 0b278e6429..6d442a733c 100644 --- a/common/utils/itti_analyzer/libui/ui_notif_dlg.c +++ b/common/utils/itti_analyzer/libui/ui_notif_dlg.c @@ -1,31 +1,32 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ + #define G_LOG_DOMAIN ("UI") diff --git a/common/utils/itti_analyzer/libui/ui_notif_dlg.h b/common/utils/itti_analyzer/libui/ui_notif_dlg.h index ea6d2754ce..871b7ddb0c 100644 --- a/common/utils/itti_analyzer/libui/ui_notif_dlg.h +++ b/common/utils/itti_analyzer/libui/ui_notif_dlg.h @@ -1,31 +1,32 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include <gtk/gtk.h> diff --git a/common/utils/itti_analyzer/libui/ui_notifications.c b/common/utils/itti_analyzer/libui/ui_notifications.c index 50fed85645..5a3b57656b 100644 --- a/common/utils/itti_analyzer/libui/ui_notifications.c +++ b/common/utils/itti_analyzer/libui/ui_notifications.c @@ -1,31 +1,32 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ + #include <fcntl.h> #include <stdlib.h> diff --git a/common/utils/itti_analyzer/libui/ui_notifications.h b/common/utils/itti_analyzer/libui/ui_notifications.h index 377c093849..9ea36aa1f2 100644 --- a/common/utils/itti_analyzer/libui/ui_notifications.h +++ b/common/utils/itti_analyzer/libui/ui_notifications.h @@ -1,31 +1,32 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ + #ifndef UI_NOTIFICATIONS_H_ #define UI_NOTIFICATIONS_H_ diff --git a/common/utils/itti_analyzer/libui/ui_signal_dissect_view.c b/common/utils/itti_analyzer/libui/ui_signal_dissect_view.c index 41af8410ac..49e8df315d 100644 --- a/common/utils/itti_analyzer/libui/ui_signal_dissect_view.c +++ b/common/utils/itti_analyzer/libui/ui_signal_dissect_view.c @@ -1,31 +1,32 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ + #include <string.h> diff --git a/common/utils/itti_analyzer/libui/ui_signal_dissect_view.h b/common/utils/itti_analyzer/libui/ui_signal_dissect_view.h index 1c9688f68d..36d8d55de5 100644 --- a/common/utils/itti_analyzer/libui/ui_signal_dissect_view.h +++ b/common/utils/itti_analyzer/libui/ui_signal_dissect_view.h @@ -1,31 +1,32 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #ifndef UI_SIGNAL_DISSECT_VIEW_H_ #define UI_SIGNAL_DISSECT_VIEW_H_ diff --git a/common/utils/itti_analyzer/libui/ui_tree_view.c b/common/utils/itti_analyzer/libui/ui_tree_view.c index 69b6b6b324..94a612dac6 100644 --- a/common/utils/itti_analyzer/libui/ui_tree_view.c +++ b/common/utils/itti_analyzer/libui/ui_tree_view.c @@ -1,31 +1,32 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ + #include <stdlib.h> #include <stdint.h> diff --git a/common/utils/itti_analyzer/libui/ui_tree_view.h b/common/utils/itti_analyzer/libui/ui_tree_view.h index 8abdf7f53d..cee24eba38 100644 --- a/common/utils/itti_analyzer/libui/ui_tree_view.h +++ b/common/utils/itti_analyzer/libui/ui_tree_view.h @@ -1,31 +1,32 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ + #ifndef UI_TREE_VIEW_H_ #define UI_TREE_VIEW_H_ diff --git a/common/utils/msc/msc.c b/common/utils/msc/msc.c index 9f7ed5ac3c..c05c1bf7ce 100644 --- a/common/utils/msc/msc.c +++ b/common/utils/msc/msc.c @@ -1,31 +1,32 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ - *******************************************************************************/ /*! \file msc.c * \brief Message chart generator logging utility (generated files to processed by a script to produce a mscgen input file for generating a sequence diagram document) * \author Lionel GAUTHIER diff --git a/common/utils/msc/msc.h b/common/utils/msc/msc.h index b5c0c83280..e73f826ac3 100644 --- a/common/utils/msc/msc.h +++ b/common/utils/msc/msc.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #ifndef MSC_H_ #define MSC_H_ diff --git a/openair-cn/AUTHORS b/openair-cn/AUTHORS deleted file mode 100644 index 8b13789179..0000000000 --- a/openair-cn/AUTHORS +++ /dev/null @@ -1 +0,0 @@ - diff --git a/openair-cn/COMMON/common_types.h b/openair-cn/COMMON/common_types.h index ff9a595ec8..18cba9fb81 100644 --- a/openair-cn/COMMON/common_types.h +++ b/openair-cn/COMMON/common_types.h @@ -1,31 +1,32 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include <stdint.h> diff --git a/openair-cn/COMMON/gtpv1_u_messages_def.h b/openair-cn/COMMON/gtpv1_u_messages_def.h index dfaa0429dc..d58b2dfc2e 100644 --- a/openair-cn/COMMON/gtpv1_u_messages_def.h +++ b/openair-cn/COMMON/gtpv1_u_messages_def.h @@ -1,31 +1,32 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ MESSAGE_DEF(GTPV1U_CREATE_TUNNEL_REQ, MESSAGE_PRIORITY_MED, Gtpv1uCreateTunnelReq, gtpv1uCreateTunnelReq) MESSAGE_DEF(GTPV1U_CREATE_TUNNEL_RESP, MESSAGE_PRIORITY_MED, Gtpv1uCreateTunnelResp, gtpv1uCreateTunnelResp) MESSAGE_DEF(GTPV1U_UPDATE_TUNNEL_REQ, MESSAGE_PRIORITY_MED, Gtpv1uUpdateTunnelReq, gtpv1uUpdateTunnelReq) diff --git a/openair-cn/COMMON/gtpv1_u_messages_types.h b/openair-cn/COMMON/gtpv1_u_messages_types.h index 0fe662e9ea..13fd0fd8a0 100644 --- a/openair-cn/COMMON/gtpv1_u_messages_types.h +++ b/openair-cn/COMMON/gtpv1_u_messages_types.h @@ -1,31 +1,32 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #ifndef GTPV1_U_MESSAGES_TYPES_H_ #define GTPV1_U_MESSAGES_TYPES_H_ diff --git a/openair-cn/COMMON/intertask_interface_conf.h b/openair-cn/COMMON/intertask_interface_conf.h index c6e8f02100..9ab7cc3151 100644 --- a/openair-cn/COMMON/intertask_interface_conf.h +++ b/openair-cn/COMMON/intertask_interface_conf.h @@ -1,31 +1,32 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ - *******************************************************************************/ /* * intertask_interface_conf.h diff --git a/openair-cn/COMMON/ip_forward_messages_def.h b/openair-cn/COMMON/ip_forward_messages_def.h deleted file mode 100755 index 37ea73781a..0000000000 --- a/openair-cn/COMMON/ip_forward_messages_def.h +++ /dev/null @@ -1,34 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -MESSAGE_DEF(SGI_CREATE_ENDPOINT_REQUEST, MESSAGE_PRIORITY_MED, SGICreateEndpointReq, sgiCreateEndpointReq) -MESSAGE_DEF(SGI_CREATE_ENDPOINT_RESPONSE, MESSAGE_PRIORITY_MED, SGICreateEndpointResp, sgiCreateEndpointResp) -MESSAGE_DEF(SGI_UPDATE_ENDPOINT_REQUEST, MESSAGE_PRIORITY_MED, SGIUpdateEndpointReq, sgiUpdateEndpointReq) -MESSAGE_DEF(SGI_UPDATE_ENDPOINT_RESPONSE, MESSAGE_PRIORITY_MED, SGIUpdateEndpointResp, sgiUpdateEndpointResp) -MESSAGE_DEF(SGI_DELETE_ENDPOINT_REQUEST, MESSAGE_PRIORITY_MED, SGIDeleteEndpointReq, sgiDeleteEndpointReq) -MESSAGE_DEF(SGI_DELETE_ENDPOINT_RESPONSE, MESSAGE_PRIORITY_MED, SGIDeleteEndpointResp, sgiDeleteEndpointResp) diff --git a/openair-cn/COMMON/ip_forward_messages_types.h b/openair-cn/COMMON/ip_forward_messages_types.h deleted file mode 100755 index 40db8d5c38..0000000000 --- a/openair-cn/COMMON/ip_forward_messages_types.h +++ /dev/null @@ -1,96 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -#ifndef SGI_FORWARD_MESSAGES_TYPES_H_ -#define SGI_FORWARD_MESSAGES_TYPES_H_ - -typedef enum SGIStatus_e { - SGI_STATUS_OK = 0, - SGI_STATUS_ERROR_CONTEXT_ALREADY_EXIST = 50, - SGI_STATUS_ERROR_CONTEXT_NOT_FOUND = 51, - SGI_STATUS_ERROR_INVALID_MESSAGE_FORMAT = 52, - SGI_STATUS_ERROR_SERVICE_NOT_SUPPORTED = 53, - SGI_STATUS_ERROR_SYSTEM_FAILURE = 54, - SGI_STATUS_ERROR_NO_RESOURCES_AVAILABLE = 55, - SGI_STATUS_ERROR_NO_MEMORY_AVAILABLE = 56, - SGI_STATUS_MAX, -} SGIStatus_t; - - -typedef struct { - Teid_t context_teid; ///< Tunnel Endpoint Identifier S11 - Teid_t sgw_S1u_teid; ///< Tunnel Endpoint Identifier S1-U - ebi_t eps_bearer_id; ///< EPS bearer identifier - pdn_type_t pdn_type; ///< PDN Type - PAA_t paa; ///< PDN Address Allocation -} SGICreateEndpointReq; - -typedef struct { - SGIStatus_t status; ///< Status of endpoint creation (Failed = 0xFF or Success = 0x0) - Teid_t context_teid; ///< Tunnel Endpoint Identifier S11 - Teid_t sgw_S1u_teid; ///< Tunnel Endpoint Identifier S1-U - ebi_t eps_bearer_id; ///< EPS bearer identifier - pdn_type_t pdn_type; ///< PDN Type - PAA_t paa; ///< PDN Address Allocation - pco_flat_t pco; ///< Protocol configuration options -} SGICreateEndpointResp; - -typedef struct { - Teid_t context_teid; ///< Tunnel Endpoint Identifier S11 - Teid_t sgw_S1u_teid; ///< Tunnel Endpoint Identifier S1-U - Teid_t enb_S1u_teid; ///< Tunnel Endpoint Identifier S1-U - ebi_t eps_bearer_id; ///< EPS bearer identifier -} SGIUpdateEndpointReq; - -typedef struct { - SGIStatus_t status; ///< Status of endpoint creation (Failed = 0xFF or Success = 0x0) - Teid_t context_teid; ///< Tunnel Endpoint Identifier S11 - Teid_t sgw_S1u_teid; ///< Tunnel Endpoint Identifier S1-U - Teid_t enb_S1u_teid; ///< Tunnel Endpoint Identifier S1-U - ebi_t eps_bearer_id; ///< EPS bearer identifier -} SGIUpdateEndpointResp; - - -typedef struct { - Teid_t context_teid; ///< Tunnel Endpoint Identifier S11 - Teid_t sgw_S1u_teid; ///< Tunnel Endpoint Identifier S1-U - ebi_t eps_bearer_id; ///< EPS bearer identifier - pdn_type_t pdn_type; ///< PDN Type - PAA_t paa; ///< PDN Address Allocation -} SGIDeleteEndpointReq; - -typedef struct { - SGIStatus_t status; ///< Status of endpoint deletion (Failed = 0xFF or Success = 0x0) - Teid_t context_teid; ///< Tunnel Endpoint Identifier S11 - Teid_t sgw_S1u_teid; ///< Tunnel Endpoint Identifier S1-U - ebi_t eps_bearer_id; ///< EPS bearer identifier - pdn_type_t pdn_type; ///< PDN Type - PAA_t paa; ///< PDN Address Allocation -} SGIDeleteEndpointResp; - -#endif /* SGI_FORWARD_MESSAGES_TYPES_H_ */ diff --git a/openair-cn/COMMON/messages_def.h b/openair-cn/COMMON/messages_def.h index 2e4dac22e8..2b8667507b 100644 --- a/openair-cn/COMMON/messages_def.h +++ b/openair-cn/COMMON/messages_def.h @@ -1,31 +1,32 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ // These messages files are mandatory and must always be placed in first position #include "intertask_messages_def.h" #include "timer_messages_def.h" diff --git a/openair-cn/COMMON/messages_types.h b/openair-cn/COMMON/messages_types.h index fd5da40bb5..46a7261c59 100644 --- a/openair-cn/COMMON/messages_types.h +++ b/openair-cn/COMMON/messages_types.h @@ -1,31 +1,32 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #ifndef MESSAGES_TYPES_H_ #define MESSAGES_TYPES_H_ diff --git a/openair-cn/COMMON/mme_app_messages_def.h b/openair-cn/COMMON/mme_app_messages_def.h deleted file mode 100644 index 68d904d4ae..0000000000 --- a/openair-cn/COMMON/mme_app_messages_def.h +++ /dev/null @@ -1,33 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -//WARNING: Do not include this header directly. Use intertask_interface.h instead. - -MESSAGE_DEF(MME_APP_CONNECTION_ESTABLISHMENT_IND , MESSAGE_PRIORITY_MED, mme_app_connection_establishment_ind_t , mme_app_connection_establishment_ind) -MESSAGE_DEF(MME_APP_CONNECTION_ESTABLISHMENT_CNF , MESSAGE_PRIORITY_MED, mme_app_connection_establishment_cnf_t , mme_app_connection_establishment_cnf) -MESSAGE_DEF(MME_APP_INITIAL_CONTEXT_SETUP_RSP , MESSAGE_PRIORITY_MED, mme_app_initial_context_setup_rsp_t , mme_app_initial_context_setup_rsp) diff --git a/openair-cn/COMMON/mme_app_messages_types.h b/openair-cn/COMMON/mme_app_messages_types.h deleted file mode 100644 index b9caa41547..0000000000 --- a/openair-cn/COMMON/mme_app_messages_types.h +++ /dev/null @@ -1,72 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -#ifndef MME_APP_MESSAGES_TYPES_H_ -#define MME_APP_MESSAGES_TYPES_H_ - - -#define MME_APP_CONNECTION_ESTABLISHMENT_IND(mSGpTR) (mSGpTR)->ittiMsg.mme_app_connection_establishment_ind -#define MME_APP_CONNECTION_ESTABLISHMENT_CNF(mSGpTR) (mSGpTR)->ittiMsg.mme_app_connection_establishment_cnf -#define MME_APP_INITIAL_CONTEXT_SETUP_RSP(mSGpTR) (mSGpTR)->ittiMsg.mme_app_initial_context_setup_rsp - -typedef struct mme_app_connection_establishment_ind_s { - uint32_t mme_ue_s1ap_id; - nas_establish_ind_t nas; - - /* Transparent message from s1ap to be forwarded to MME_APP or - * to S1AP if connection establishment is rejected by NAS. - */ - s1ap_initial_ue_message_t transparent; -} mme_app_connection_establishment_ind_t; - -typedef struct mme_app_connection_establishment_cnf_s { - - ebi_t eps_bearer_id; - FTeid_t bearer_s1u_sgw_fteid; - qci_t bearer_qos_qci; - priority_level_t bearer_qos_prio_level; - pre_emp_vulnerability_t bearer_qos_pre_emp_vulnerability; - pre_emp_capability_t bearer_qos_pre_emp_capability; - ambr_t ambr; - - /* Key eNB */ - uint8_t keNB[32]; - uint16_t security_capabilities_encryption_algorithms; - uint16_t security_capabilities_integrity_algorithms; - - nas_conn_est_cnf_t nas_conn_est_cnf; -} mme_app_connection_establishment_cnf_t; - -typedef struct mme_app_initial_context_setup_rsp_s { - uint32_t mme_ue_s1ap_id; - ebi_t eps_bearer_id; - FTeid_t bearer_s1u_enb_fteid; -} mme_app_initial_context_setup_rsp_t; - - -#endif /* MME_APP_MESSAGES_TYPES_H_ */ diff --git a/openair-cn/COMMON/nas_messages_def.h b/openair-cn/COMMON/nas_messages_def.h index ddd7ca392c..7c7e670511 100644 --- a/openair-cn/COMMON/nas_messages_def.h +++ b/openair-cn/COMMON/nas_messages_def.h @@ -1,31 +1,32 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ //WARNING: Do not include this header directly. Use intertask_interface.h instead. // Messages for NAS logging diff --git a/openair-cn/COMMON/nas_messages_types.h b/openair-cn/COMMON/nas_messages_types.h index 6c03d25252..4cbdad2c99 100644 --- a/openair-cn/COMMON/nas_messages_types.h +++ b/openair-cn/COMMON/nas_messages_types.h @@ -1,31 +1,32 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include "as_message.h" #include "nas_message.h" diff --git a/openair-cn/COMMON/s11_messages_def.h b/openair-cn/COMMON/s11_messages_def.h deleted file mode 100644 index 3859ce7d62..0000000000 --- a/openair-cn/COMMON/s11_messages_def.h +++ /dev/null @@ -1,29 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -//WARNING: Do not include this header directly. Use intertask_interface.h instead. diff --git a/openair-cn/COMMON/s11_messages_types.h b/openair-cn/COMMON/s11_messages_types.h deleted file mode 100644 index 62882569a0..0000000000 --- a/openair-cn/COMMON/s11_messages_types.h +++ /dev/null @@ -1,32 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -#ifndef S11_MESSAGES_TYPES_H_ -#define S11_MESSAGES_TYPES_H_ - -#endif /* S11_MESSAGES_TYPES_H_ */ diff --git a/openair-cn/COMMON/s1ap_messages_def.h b/openair-cn/COMMON/s1ap_messages_def.h index 2e39e264b2..eeb48a64b0 100644 --- a/openair-cn/COMMON/s1ap_messages_def.h +++ b/openair-cn/COMMON/s1ap_messages_def.h @@ -1,31 +1,32 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ //WARNING: Do not include this header directly. Use intertask_interface.h instead. /* Messages for S1AP logging */ diff --git a/openair-cn/COMMON/s1ap_messages_types.h b/openair-cn/COMMON/s1ap_messages_types.h index 23ff59a858..af45f57029 100644 --- a/openair-cn/COMMON/s1ap_messages_types.h +++ b/openair-cn/COMMON/s1ap_messages_types.h @@ -1,31 +1,32 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #ifndef S1AP_MESSAGES_TYPES_H_ #define S1AP_MESSAGES_TYPES_H_ diff --git a/openair-cn/COMMON/s6a_messages_def.h b/openair-cn/COMMON/s6a_messages_def.h deleted file mode 100644 index db8284aed5..0000000000 --- a/openair-cn/COMMON/s6a_messages_def.h +++ /dev/null @@ -1,33 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -//WARNING: Do not include this header directly. Use intertask_interface.h instead. -MESSAGE_DEF(S6A_UPDATE_LOCATION_REQ, MESSAGE_PRIORITY_MED, s6a_update_location_req_t, s6a_update_location_req) -MESSAGE_DEF(S6A_UPDATE_LOCATION_ANS, MESSAGE_PRIORITY_MED, s6a_update_location_ans_t, s6a_update_location_ans) -MESSAGE_DEF(S6A_AUTH_INFO_REQ, MESSAGE_PRIORITY_MED, s6a_auth_info_req_t, s6a_auth_info_req) -MESSAGE_DEF(S6A_AUTH_INFO_ANS, MESSAGE_PRIORITY_MED, s6a_auth_info_ans_t, s6a_auth_info_ans) diff --git a/openair-cn/COMMON/s6a_messages_types.h b/openair-cn/COMMON/s6a_messages_types.h deleted file mode 100644 index 0999afabbd..0000000000 --- a/openair-cn/COMMON/s6a_messages_types.h +++ /dev/null @@ -1,94 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -#ifndef S6A_MESSAGES_TYPES_H_ -#define S6A_MESSAGES_TYPES_H_ - -#define AUTS_LENGTH 14 - -typedef struct s6a_update_location_req_s { -#define SKIP_SUBSCRIBER_DATA (0x1) - unsigned skip_subscriber_data:1; -#define INITIAL_ATTACH (0x1) - unsigned initial_attach:1; - - char imsi[IMSI_DIGITS_MAX + 1]; // username - uint8_t imsi_length; // username - - plmn_t visited_plmn; // visited plmn id - rat_type_t rat_type; // rat type - - // missing // origin host - // missing // origin realm - - // missing // destination host - // missing // destination realm -} s6a_update_location_req_t; - -typedef struct s6a_update_location_ans_s { - s6a_result_t result; // Result of the update location request procedure - subscription_data_t subscription_data; // subscriber status, - // Maximum Requested Bandwidth Uplink, downlink - // access restriction data - // msisdn - apn_config_profile_t apn_config_profile;// APN configuration profile - - network_access_mode_t access_mode; - rau_tau_timer_t rau_tau_timer; - char imsi[IMSI_DIGITS_MAX + 1]; - uint8_t imsi_length; - - -} s6a_update_location_ans_t; - -typedef struct s6a_auth_info_req_s { - char imsi[IMSI_DIGITS_MAX + 1]; - uint8_t imsi_length; - plmn_t visited_plmn; - /* Number of vectors to retrieve from HSS, should be equal to one */ - uint8_t nb_of_vectors; - - /* Bit to indicate that USIM has requested a re-synchronization of SQN */ - unsigned re_synchronization:1; - /* AUTS to provide to AUC. - * Only present and interpreted if re_synchronization == 1. - */ - uint8_t auts[AUTS_LENGTH]; -} s6a_auth_info_req_t; - -typedef struct s6a_auth_info_ans_s { - char imsi[IMSI_DIGITS_MAX + 1]; - uint8_t imsi_length; - - /* Result of the authentication information procedure */ - s6a_result_t result; - /* Authentication info containing the vector(s) */ - authentication_info_t auth_info; -} s6a_auth_info_ans_t; - -#endif /* S6A_MESSAGES_TYPES_H_ */ diff --git a/openair-cn/COMMON/sctp_messages_def.h b/openair-cn/COMMON/sctp_messages_def.h index 3b840f1bf6..e56598bc44 100644 --- a/openair-cn/COMMON/sctp_messages_def.h +++ b/openair-cn/COMMON/sctp_messages_def.h @@ -1,31 +1,32 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ //WARNING: Do not include this header directly. Use intertask_interface.h instead. MESSAGE_DEF(SCTP_INIT_MSG, MESSAGE_PRIORITY_MED, SctpInit, sctpInit) diff --git a/openair-cn/COMMON/sctp_messages_types.h b/openair-cn/COMMON/sctp_messages_types.h index ac991e2f07..5d1aef92ed 100644 --- a/openair-cn/COMMON/sctp_messages_types.h +++ b/openair-cn/COMMON/sctp_messages_types.h @@ -1,31 +1,32 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #ifndef SCTP_MESSAGES_TYPES_H_ #define SCTP_MESSAGES_TYPES_H_ diff --git a/openair-cn/COMMON/security_types.h b/openair-cn/COMMON/security_types.h index debe695c90..3428b23e7a 100644 --- a/openair-cn/COMMON/security_types.h +++ b/openair-cn/COMMON/security_types.h @@ -1,31 +1,32 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ - *******************************************************************************/ #if HAVE_CONFIG_H # include "config.h" #endif diff --git a/openair-cn/COMMON/sgw_lite_def.h b/openair-cn/COMMON/sgw_lite_def.h deleted file mode 100644 index 3f1814b028..0000000000 --- a/openair-cn/COMMON/sgw_lite_def.h +++ /dev/null @@ -1,36 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -MESSAGE_DEF(SGW_CREATE_SESSION_REQUEST, MESSAGE_PRIORITY_MED, SgwCreateSessionRequest, sgwCreateSessionRequest) -MESSAGE_DEF(SGW_CREATE_SESSION_RESPONSE, MESSAGE_PRIORITY_MED, SgwCreateSessionResponse, sgwCreateSessionResponse) -MESSAGE_DEF(SGW_MODIFY_BEARER_REQUEST, MESSAGE_PRIORITY_MED, SgwModifyBearerRequest, sgwModifyBearerRequest) -MESSAGE_DEF(SGW_MODIFY_BEARER_RESPONSE, MESSAGE_PRIORITY_MED, SgwModifyBearerResponse, sgwModifyBearerResponse) -MESSAGE_DEF(SGW_DELETE_SESSION_REQUEST, MESSAGE_PRIORITY_MED, SgwDeleteSessionRequest, sgwDeleteSessionRequest) -MESSAGE_DEF(SGW_DELETE_SESSION_RESPONSE, MESSAGE_PRIORITY_MED, SgwDeleteSessionResponse, sgwDeleteSessionResponse) -MESSAGE_DEF(SGW_RELEASE_ACCESS_BEARERS_REQUEST, MESSAGE_PRIORITY_MED, SgwReleaseAccessBearersRequest, sgwReleaseAccessBearersRequest) -MESSAGE_DEF(SGW_RELEASE_ACCESS_BEARERS_RESPONSE, MESSAGE_PRIORITY_MED, SgwReleaseAccessBearersResponse, sgwReleaseAccessBearersResponse) diff --git a/openair-cn/COMMON/sgw_lite_messages_types.h b/openair-cn/COMMON/sgw_lite_messages_types.h deleted file mode 100644 index f83015b6bb..0000000000 --- a/openair-cn/COMMON/sgw_lite_messages_types.h +++ /dev/null @@ -1,928 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - - -/*! \file sgw_lite_messages_types.h - * \brief S11 definitions for interaction between MME and S11 - * 3GPP TS 29.274. - * Messages are the same as for GTPv2-C but here we abstract the UDP layer - * \author Sebastien ROUX <sebastien.roux@eurecom.fr> - * \date 2013 - * \version 0.1 - */ - -#include "../SGW-LITE/sgw_lite_ie_defs.h" - -#ifndef SGW_LITE_MESSAGES_TYPES_H_ -#define SGW_LITE_MESSAGES_TYPES_H_ - -#define SGW_CREATE_SESSION_REQUEST(mSGpTR) (mSGpTR)->ittiMsg.sgwCreateSessionRequest -#define SGW_CREATE_SESSION_RESPONSE(mSGpTR) (mSGpTR)->ittiMsg.sgwCreateSessionResponse -#define SGW_MODIFY_BEARER_REQUEST(mSGpTR) (mSGpTR)->ittiMsg.sgwModifyBearerRequest -#define SGW_MODIFY_BEARER_RESPONSE(mSGpTR) (mSGpTR)->ittiMsg.sgwModifyBearerResponse -#define SGW_DELETE_SESSION_REQUEST(mSGpTR) (mSGpTR)->ittiMsg.sgwDeleteSessionRequest -#define SGW_DELETE_SESSION_RESPONSE(mSGpTR) (mSGpTR)->ittiMsg.sgwDeleteSessionResponse -#define SGW_RELEASE_ACCESS_BEARERS_REQUEST(mSGpTR) (mSGpTR)->ittiMsg.sgwReleaseAccessBearersRequest -#define SGW_RELEASE_ACCESS_BEARERS_RESPONSE(mSGpTR) (mSGpTR)->ittiMsg.sgwReleaseAccessBearersResponse - - -/** @struct SgwCreateSessionRequest - * @brief Create Session Request - * - * Spec 3GPP TS 29.274, Universal Mobile Telecommunications System (UMTS); - * LTE; 3GPP Evolved Packet System (EPS); - * Evolved General Packet Radio Service (GPRS); - * Tunnelling Protocol for Control plane (GTPv2-C); Stage 3 - * The Create Session Request will be sent on S11 interface as - * part of these procedures: - * - E-UTRAN Initial Attach - * - UE requested PDN connectivity - * - Tracking Area Update procedure with Serving GW change - * - S1/X2-based handover with SGW change - */ -typedef struct SgwCreateSessionRequest_s { - Teid_t teid; ///< S11- S-GW Tunnel Endpoint Identifier - - Imsi_t imsi; ///< The IMSI shall be included in the message on the S4/S11 - ///< interface, and on S5/S8 interface if provided by the - ///< MME/SGSN, except for the case: - ///< - If the UE is emergency attached and the UE is UICCless. - ///< The IMSI shall be included in the message on the S4/S11 - ///< interface, and on S5/S8 interface if provided by the - ///< MME/SGSN, but not used as an identifier - ///< - if UE is emergency attached but IMSI is not authenticated. - ///< The IMSI shall be included in the message on the S2b interface. - - Msisdn_t msisdn; ///< For an E-UTRAN Initial Attach the IE shall be included - ///< when used on the S11 interface, if provided in the - ///< subscription data from the HSS. - ///< For a PDP Context Activation procedure the IE shall be - ///< included when used on the S4 interface, if provided in the - ///< subscription data from the HSS. - ///< The IE shall be included for the case of a UE Requested - ///< PDN Connectivity, if the MME has it stored for that UE. - ///< It shall be included when used on the S5/S8 interfaces if - ///< provided by the MME/SGSN. - ///< The ePDG shall include this IE on the S2b interface during - ///< an Attach with GTP on S2b and a UE initiated Connectivity - ///< to Additional PDN with GTP on S2b, if provided by the - ///< HSS/AAA. - - Mei_t mei; ///< The MME/SGSN shall include the ME Identity (MEI) IE on - ///< the S11/S4 interface: - ///< - If the UE is emergency attached and the UE is UICCless - ///< - If the UE is emergency attached and the IMSI is not authenticated - ///< For all other cases the MME/SGSN shall include the ME - ///< Identity (MEI) IE on the S11/S4 interface if it is available. - ///< If the SGW receives this IE, it shall forward it to the PGW - ///< on the S5/S8 interface. - - Uli_t uli; ///< This IE shall be included on the S11 interface for E- - ///< UTRAN Initial Attach and UE-requested PDN Connectivity - ///< procedures. It shall include ECGI&TAI. The MME/SGSN - ///< shall also include it on the S11/S4 interface for - ///< TAU/RAU/X2-Handover/Enhanced SRNS Relocation - ///< procedure if the PGW has requested location information - ///< change reporting and MME/SGSN support location - ///< information change reporting. The SGW shall include this - ///< IE on S5/S8 if it receives the ULI from MME/SGSN. - - ServingNetwork_t serving_network; ///< This IE shall be included on the S4/S11, S5/S8 and S2b - ///< interfaces for an E-UTRAN initial attach, a PDP Context - ///< Activation, a UE requested PDN connectivity, an Attach - ///< with GTP on S2b, a UE initiated Connectivity to Additional - ///< PDN with GTP on S2b and a Handover to Untrusted Non- - ///< 3GPP IP Access with GTP on S2b. - - rat_type_t rat_type; ///< This IE shall be set to the 3GPP access type or to the - ///< value matching the characteristics of the non-3GPP access - ///< the UE is using to attach to the EPS. - ///< The ePDG may use the access technology type of the - ///< untrusted non-3GPP access network if it is able to acquire - ///< it; otherwise it shall indicate Virtual as the RAT Type. - ///< See NOTE 3, NOTE 4. - - indication_flags_t indication_flags; ///< This IE shall be included if any one of the applicable flags - ///< is set to 1. - ///< Applicable flags are: - ///< - S5/S8 Protocol Type: This flag shall be used on - ///< the S11/S4 interfaces and set according to the - ///< protocol chosen to be used on the S5/S8 - ///< interfaces. - ///< - ///< - Dual Address Bearer Flag: This flag shall be used - ///< on the S2b, S11/S4 and S5/S8 interfaces and shall - ///< be set to 1 when the PDN Type, determined based - ///< on UE request and subscription record, is set to - ///< IPv4v6 and all SGSNs which the UE may be - ///< handed over to support dual addressing. This shall - ///< be determined based on node pre-configuration by - ///< the operator. - ///< - ///< - Handover Indication: This flag shall be set to 1 on - ///< the S11/S4 and S5/S8 interface during an E- - ///< UTRAN Initial Attach or a UE Requested PDN - ///< Connectivity or aPDP Context Activation procedure - ///< if the PDN connection/PDP Context is handed-over - ///< from non-3GPP access. - ///< This flag shall be set to 1 on the S2b interface - ///< during a Handover to Untrusted Non-3GPP IP - ///< Access with GTP on S2b and IP address - ///< preservation is requested by the UE. - ///< - ///< .... - ///< - Unauthenticated IMSI: This flag shall be set to 1 - ///< on the S4/S11 and S5/S8 interfaces if the IMSI - ///< present in the message is not authenticated and is - ///< for an emergency attached UE. - - FTeid_t sender_fteid_for_cp; ///< Sender F-TEID for control plane (MME) - - FTeid_t pgw_address_for_cp; ///< PGW S5/S8 address for control plane or PMIP - ///< This IE shall be sent on the S11 / S4 interfaces. The TEID - ///< or GRE Key is set to "0" in the E-UTRAN initial attach, the - ///< PDP Context Activation and the UE requested PDN - ///< connectivity procedures. - - char apn[APN_MAX_LENGTH + 1]; ///< Access Point Name - - SelectionMode_t selection_mode; ///< Selection Mode - ///< This IE shall be included on the S4/S11 and S5/S8 - ///< interfaces for an E-UTRAN initial attach, a PDP Context - ///< Activation and a UE requested PDN connectivity. - ///< This IE shall be included on the S2b interface for an Initial - ///< Attach with GTP on S2b and a UE initiated Connectivity to - ///< Additional PDN with GTP on S2b. - ///< It shall indicate whether a subscribed APN or a non - ///< subscribed APN chosen by the MME/SGSN/ePDG was - ///< selected. - ///< CO: When available, this IE shall be sent by the MME/SGSN on - ///< the S11/S4 interface during TAU/RAU/HO with SGW - ///< relocation. - - pdn_type_t pdn_type; ///< PDN Type - ///< This IE shall be included on the S4/S11 and S5/S8 - ///< interfaces for an E-UTRAN initial attach, a PDP Context - ///< Activation and a UE requested PDN connectivity. - ///< This IE shall be set to IPv4, IPv6 or IPv4v6. This is based - ///< on the UE request and the subscription record retrieved - ///< from the HSS (for MME see 3GPP TS 23.401 [3], clause - ///< 5.3.1.1, and for SGSN see 3GPP TS 23.060 [35], clause - ///< 9.2.1). See NOTE 1. - - PAA_t paa; ///< PDN Address Allocation - ///< This IE shall be included the S4/S11, S5/S8 and S2b - ///< interfaces for an E-UTRAN initial attach, a PDP Context - ///< Activation, a UE requested PDN connectivity, an Attach - ///< with GTP on S2b, a UE initiated Connectivity to Additional - ///< PDN with GTP on S2b and a Handover to Untrusted Non- - ///< 3GPP IP Access with GTP on S2b. For PMIP-based - ///< S5/S8, this IE shall also be included on the S4/S11 - ///< interfaces for TAU/RAU/Handover cases involving SGW - ///< relocation. - ///< The PDN type field in the PAA shall be set to IPv4, or IPv6 - ///< or IPv4v6 by MME, based on the UE request and the - ///< subscription record retrieved from the HSS. - ///< For static IP address assignment (for MME see 3GPP TS - ///< 23.401 [3], clause 5.3.1.1, for SGSN see 3GPP TS 23.060 - ///< [35], clause 9.2.1, and for ePDG see 3GPP TS 23.402 [45] - ///< subclause 4.7.3), the MME/SGSN/ePDG shall set the IPv4 - ///< address and/or IPv6 prefix length and IPv6 prefix and - ///< Interface Identifier based on the subscribed values - ///< received from HSS, if available. The value of PDN Type - ///< field shall be consistent with the value of the PDN Type IE, - ///< if present in this message. - ///< For a Handover to Untrusted Non-3GPP IP Access with - ///< GTP on S2b, the ePDG shall set the IPv4 address and/or - ///< IPv6 prefix length and IPv6 prefix and Interface Identifier - ///< based on the IP address(es) received from the UE. - ///< If static IP address assignment is not used, and for - ///< scenarios other than a Handover to Untrusted Non-3GPP - ///< IP Access with GTP on S2b, the IPv4 address shall be set - ///< to 0.0.0.0, and/or the IPv6 Prefix Length and IPv6 prefix - ///< and Interface Identifier shall all be set to zero. - ///< - ///< CO: This IE shall be sent by the MME/SGSN on S11/S4 - ///< interface during TAU/RAU/HO with SGW relocation. - - // APN Restriction Maximum_APN_Restriction ///< This IE shall be included on the S4/S11 and S5/S8 - ///< interfaces in the E-UTRAN initial attach, PDP Context - ///< Activation and UE Requested PDN connectivity - ///< procedures. - ///< This IE denotes the most stringent restriction as required - ///< by any already active bearer context. If there are no - ///< already active bearer contexts, this value is set to the least - ///< restrictive type. - - ambr_t ambr; ///< Aggregate Maximum Bit Rate (APN-AMBR) - ///< This IE represents the APN-AMBR. It shall be included on - ///< the S4/S11, S5/S8 and S2b interfaces for an E-UTRAN - ///< initial attach, UE requested PDN connectivity, the PDP - ///< Context Activation procedure using S4, the PS mobility - ///< from the Gn/Gp SGSN to the S4 SGSN/MME procedures, - ///< Attach with GTP on S2b and a UE initiated Connectivity to - ///< Additional PDN with GTP on S2b. - - // EBI Linked EPS Bearer ID ///< This IE shall be included on S4/S11 in RAU/TAU/HO - ///< except in the Gn/Gp SGSN to MME/S4-SGSN - ///< RAU/TAU/HO procedures with SGW change to identify the - ///< default bearer of the PDN Connection - - pco_flat_t pco; /// PCO protocol_configuration_options - ///< This IE is not applicable to TAU/RAU/Handover. If - ///< MME/SGSN receives PCO from UE (during the attach - ///< procedures), the MME/SGSN shall forward the PCO IE to - ///< SGW. The SGW shall also forward it to PGW. - - bearer_to_create_t bearer_to_create; ///< Bearer Contexts to be created - ///< Several IEs with the same type and instance value shall be - ///< included on the S4/S11 and S5/S8 interfaces as necessary - ///< to represent a list of Bearers. One single IE shall be - ///< included on the S2b interface. - ///< One bearer shall be included for an E-UTRAN Initial - ///< Attach, a PDP Context Activation, a UE requested PDN - ///< Connectivity, an Attach with GTP on S2b, a UE initiated - ///< Connectivity to Additional PDN with GTP on S2b and a - ///< Handover to Untrusted Non-3GPP IP Access with GTP on - ///< S2b. - ///< One or more bearers shall be included for a - ///< Handover/TAU/RAU with an SGW change. - - ///bearer_to_remove_t bearer_to_remove; ///< This IE shall be included on the S4/S11 interfaces for the - ///< TAU/RAU/Handover cases where any of the bearers - ///< existing before the TAU/RAU/Handover procedure will be - ///< deactivated as consequence of the TAU/RAU/Handover - ///< procedure. - ///< For each of those bearers, an IE with the same type and - ///< instance value shall be included. - - // Trace Information trace_information ///< This IE shall be included on the S4/S11 interface if an - ///< SGW trace is activated, and/or on the S5/S8 and S2b - ///< interfaces if a PGW trace is activated. See 3GPP TS - ///< 32.422 [18]. - - // Recovery Recovery ///< This IE shall be included on the S4/S11, S5/S8 and S2b - ///< interfaces if contacting the peer for the first time - - FQ_CSID_t mme_fq_csid; ///< This IE shall be included by the MME on the S11 interface - ///< and shall be forwarded by an SGW on the S5/S8 interfaces - ///< according to the requirements in 3GPP TS 23.007 [17]. - - FQ_CSID_t sgw_fq_csid; ///< This IE shall included by the SGW on the S5/S8 interfaces - ///< according to the requirements in 3GPP TS 23.007 [17]. - - //FQ_CSID_t epdg_fq_csid; ///< This IE shall be included by the ePDG on the S2b interface - ///< according to the requirements in 3GPP TS 23.007 [17]. - - UETimeZone_t ue_time_zone; ///< This IE shall be included by the MME over S11 during - ///< Initial Attach, UE Requested PDN Connectivity procedure. - ///< This IE shall be included by the SGSN over S4 during PDP - ///< Context Activation procedure. - ///< This IE shall be included by the MME/SGSN over S11/S4 - ///< TAU/RAU/Handover with SGW relocation. - ///< C: If SGW receives this IE, SGW shall forward it to PGW - ///< across S5/S8 interface. - - UCI_t uci; ///< User CSG Information - ///< CO This IE shall be included on the S4/S11 interface for E- - ///< UTRAN Initial Attach, UE-requested PDN Connectivity and - ///< PDP Context Activation using S4 procedures if the UE is - ///< accessed via CSG cell or hybrid cell. The MME/SGSN - ///< shall also include it for TAU/RAU/Handover procedures if - ///< the PGW has requested CSG info reporting and - ///< MME/SGSN support CSG info reporting. The SGW shall - ///< include this IE on S5/S8 if it receives the User CSG - ///< information from MME/SGSN. - - // Charging Characteristics - // MME/S4-SGSN LDN - // SGW LDN - // ePDG LDN - // Signalling Priority Indication - // MMBR Max MBR/APN-AMBR - // Private Extension - - /* S11 stack specific parameter. Not used in standalone epc mode */ - void *trxn; ///< Transaction identifier - uint32_t peer_ip; ///< MME ipv4 address for S-GW or S-GW ipv4 address for MME - uint16_t peer_port; ///< MME port for S-GW or S-GW port for MME -} SgwCreateSessionRequest; - -/** @struct SgwCreateSessionResponse - * @brief Create Session Response - * - * The Create Session Response will be sent on S11 interface as - * part of these procedures: - * - E-UTRAN Initial Attach - * - UE requested PDN connectivity - * - Tracking Area Update procedure with SGW change - * - S1/X2-based handover with SGW change - */ -typedef struct SgwCreateSessionResponse_s { - Teid_t teid; ///< Tunnel Endpoint Identifier - - // here fields listed in 3GPP TS 29.274 - SGWCause_t cause; ///< If the SGW cannot accept any of the "Bearer Context Created" IEs within Create Session Request - ///< message, the SGW shall send the Create Session Response with appropriate reject Cause value. - - // change_reporting_action ///< This IE shall be included on the S5/S8 and S4/S11 - ///< interfaces with the appropriate Action field if the location - ///< Change Reporting mechanism is to be started or stopped - ///< for this subscriber in the SGSN/MME. - - // csg_Information_reporting_action ///< This IE shall be included on the S5/S8 and S4/S11 - ///< interfaces with the appropriate Action field if the CSG Info - ///< reporting mechanism is to be started or stopped for this - ///< subscriber in the SGSN/MME. - - FTeid_t s11_sgw_teid; ///< Sender F-TEID for control plane - ///< This IE shall be sent on the S11/S4 interfaces. For the - ///< S5/S8/S2b interfaces it is not needed because its content - ///< would be identical to the IE PGW S5/S8/S2b F-TEID for - ///< PMIP based interface or for GTP based Control Plane - ///< interface. - - FTeid_t s5_s8_pgw_teid; ///< PGW S5/S8/S2b F-TEID for PMIP based interface or for GTP based Control Planeinterface - ///< PGW shall include this IE on the S5/S8 interfaces during - ///< the Initial Attach, UE requested PDN connectivity and PDP - ///< Context Activation procedures. - ///< If SGW receives this IE it shall forward the IE to MME/S4- - ///< SGSN on S11/S4 interface. - ///< This IE shall include the TEID in the GTP based S5/S8 - ///< case and the GRE key in the PMIP based S5/S8 case. - ///< In PMIP based S5/S8 case, same IP address is used for - ///< both control plane and the user plane communication. - ///< - ///< PGW shall include this IE on the S2b interface during the - ///< Attach with GTP on S2b, UE initiated Connectivity to - ///< Additional PDN with GTP on S2b and Handover to - ///< Untrusted Non-3GPP IP Access with GTP on S2b - ///< procedures. - - - PAA_t paa; ///< PDN Address Allocation - ///< This IE shall be included on the S5/S8, S4/S11 and S2b - ///< interfaces for the E-UTRAN initial attach, PDP Context - ///< Activation, UE requested PDN connectivity, Attach with - ///< GTP on S2b, UE initiated Connectivity to Additional PDN - ///< with GTP on S2b and Handover to Untrusted Non-3GPP IP - ///< Access with GTP on S2b procedures. - ///< The PDN type field in the PAA shall be set to IPv4, or IPv6 - ///< or IPv4v6 by the PGW. - ///< For the interfaces other than S2b, if the DHCPv4 is used - ///< for IPv4 address allocation, the IPv4 address field shall be - ///< set to 0.0.0.0. - - APNRestriction_t apn_restriction; ///< This IE shall be included on the S5/S8 and S4/S11 - ///< interfaces in the E-UTRAN initial attach, PDP Context - ///< Activation and UE Requested PDN connectivity - ///< procedures. - ///< This IE shall also be included on S4/S11 during the Gn/Gp - ///< SGSN to S4 SGSN/MME RAU/TAU procedures. - ///< This IE denotes the restriction on the combination of types - ///< of APN for the APN associated with this EPS bearer - ///< Context. - - ambr_t ambr; ///< Aggregate Maximum Bit Rate (APN-AMBR) - ///< This IE represents the APN-AMBR. It shall be included on - ///< the S5/S8, S4/S11 and S2b interfaces if the received APN- - ///< AMBR has been modified by the PCRF. - - // EBI Linked EPS Bearer ID ///< This IE shall be sent on the S4/S11 interfaces during - ///< Gn/Gp SGSN to S4-SGSN/MME RAU/TAU procedure to - ///< identify the default bearer the PGW selects for the PDN - ///< Connection. - - pco_flat_t pco;// PCO protocol_configuration_options - ///< This IE is not applicable for TAU/RAU/Handover. If PGW - ///< decides to return PCO to the UE, PGW shall send PCO to - ///< SGW. If SGW receives the PCO IE, SGW shall forward it - ///< MME/SGSN. - - bearer_context_created_t bearer_context_created;///< EPS bearers corresponding to Bearer Contexts sent in - ///< request message. Several IEs with the same type and - ///< instance value may be included on the S5/S8 and S4/S11 - ///< as necessary to represent a list of Bearers. One single IE - ///< shall be included on the S2b interface. - ///< One bearer shall be included for E-UTRAN Initial Attach, - ///< PDP Context Activation or UE Requested PDN - ///< Connectivity , Attach with GTP on S2b, UE initiated - ///< Connectivity to Additional PDN with GTP on S2b, and - ///< Handover to Untrusted Non-3GPP IP Access with GTP on - ///< S2b. - ///< One or more created bearers shall be included for a - ///< Handover/TAU/RAU with an SGW change. See NOTE 2. - - // Bearer_Context bearer_contexts_marked_for_removal ///< EPS bearers corresponding to Bearer Contexts to be - ///< removed that were sent in the Create Session Request - ///< message. - ///< For each of those bearers an IE with the same type and - ///< instance value shall be included on the S4/S11 interfaces. - - // Recovery Recovery ///< This IE shall be included on the S4/S11, S5/S8 and S2b - ///< interfaces if contacting the peer for the first time - - // FQDN charging_Gateway_name ///< When Charging Gateway Function (CGF) Address is - ///< configured, the PGW shall include this IE on the S5 - ///< interface. - ///< NOTE 1: Both Charging Gateway Name and Charging Gateway Address shall not be included at the same - ///< time. When both are available, the operator configures a preferred value. - - // IP Address charging_Gateway_address ///< When Charging Gateway Function (CGF) Address is - ///< configured, the PGW shall include this IE on the S5 - ///< interface. See NOTE 1. - - - FQ_CSID_t pgw_fq_csid; ///< This IE shall be included by the PGW on the S5/S8 and - ///< S2b interfaces and, when received from S5/S8 be - ///< forwarded by the SGW on the S11 interface according to - ///< the requirements in 3GPP TS 23.007 [17]. - - FQ_CSID_t sgw_fq_csid; ///< This IE shall be included by the SGW on the S11 interface - ///< according to the requirements in 3GPP TS 23.007 [17]. - - // Local Distinguished Name (LDN) SGW LDN ///< This IE is optionally sent by the SGW to the MME/SGSN - ///< on the S11/S4 interfaces (see 3GPP TS 32.423 [44]), - ///< when contacting the peer node for the first time. - ///< Also: - ///< This IE is optionally sent by the SGW to the MME/SGSN - ///< on the S11/S4 interfaces (see 3GPP TS 32.423 [44]), - ///< when communicating the LDN to the peer node for the first - ///< time. - - // Local Distinguished Name (LDN) PGW LDN ///< This IE is optionally included by the PGW on the S5/S8 - ///< and S2b interfaces (see 3GPP TS 32.423 [44]), when - ///< contacting the peer node for the first time. - ///< Also: - ///< This IE is optionally included by the PGW on the S5/S8 - ///< interfaces (see 3GPP TS 32.423 [44]), when - ///< communicating the LDN to the peer node for the first time. - - // EPC_Timer pgw_back_off_time ///< This IE may be included on the S5/S8 and S4/S11 - ///< interfaces when the PDN GW rejects the Create Session - ///< Request with the cause "APN congestion". It indicates the - ///< time during which the MME or S4-SGSN should refrain - ///< from sending subsequent PDN connection establishment - ///< requests to the PGW for the congested APN for services - ///< other than Service Users/emergency services. - ///< See NOTE 3: - ///< The last received value of the PGW Back-Off Time IE shall supersede any previous values received - ///< from that PGW and for this APN in the MME/SGSN. - - // Private Extension ///< This IE may be sent on the S5/S8, S4/S11 and S2b - ///< interfaces. - - /* S11 stack specific parameter. Not used in standalone epc mode */ - void *trxn; ///< Transaction identifier - uint32_t peer_ip; ///< MME ipv4 address -} SgwCreateSessionResponse; - -/** @struct SgwModifyBearerRequest - * @brief Modify Bearer Request - * - * The Modify Bearer Request will be sent on S11 interface as - * part of these procedures: - * - E-UTRAN Tracking Area Update without SGW Change - * - UE triggered Service Request - * - S1-based Handover - * - E-UTRAN Initial Attach - * - UE requested PDN connectivity - * - X2-based handover without SGWrelocation - */ -typedef struct SgwModifyBearerRequest_s { - Teid_t teid; ///< S11 SGW Tunnel Endpoint Identifier - - // MEI ME Identity (MEI) ///< C:This IE shall be sent on the S5/S8 interfaces for the Gn/Gp - ///< SGSN to MME TAU. - - Uli_t uli; ///< C: The MME/SGSN shall include this IE for - ///< TAU/RAU/Handover procedures if the PGW has requested - ///< location information change reporting and MME/SGSN - ///< support location information change reporting. - ///< An MME/SGSN which supports location information - ///< change shall include this IE for UE-initiated Service - ///< Request procedure if the PGW has requested location - ///< information change reporting and the UE’s location info - ///< has changed. - ///< The SGW shall include this IE on S5/S8 if it receives the - ///< ULI from MME/SGSN. - ///< CO:This IE shall also be included on the S4/S11 interface for a - ///< TAU/RAU/Handover with MME/SGSN change without - ///< SGW change procedure, if the level of support (User - ///< Location Change Reporting and/or CSG Information - ///< Change Reporting) changes the MME shall include the - ///< ECGI/TAI in the ULI, the SGSN shall include the CGI/SAI - ///< in the ULI. - ///< The SGW shall include this IE on S5/S8 if it receives the - ///< ULI from MME/SGSN. - - ServingNetwork_t serving_network; ///< CO:This IE shall be included on S11/S4 interface during the - ///< following procedures: - ///< - TAU/RAU/handover if Serving Network is changed. - ///< - TAU/RAU when the UE was ISR activated which is - ///< indicated by ISRAU flag. - ///< - UE triggered Service Request when UE is ISR - ///< activated. - ///< - UE initiated Service Request if ISR is not active, but - ///< the Serving Network has changed during previous - ///< mobility procedures, i.e. intra MME/S4-SGSN - ///< TAU/RAU and the change has not been reported to - ///< the PGW yet. - ///< - TAU/RAU procedure as part of the optional network - ///< triggered service restoration procedure with ISR, as - ///< specified by 3GPP TS 23.007 [17]. - ///< - ///< CO:This IE shall be included on S5/S8 if the SGW receives this - ///< IE from MME/SGSN and if ISR is not active. - ///< This IE shall be included on S5/S8 if the SGW receives this - ///< IE from MME/SGSN and ISR is active and the Modify - ///< Bearer Request message needs to be sent to the PGW as - ///< specified in the 3GPP TS 23.401 [3]. - - rat_type_t rat_type; ///< C: This IE shall be sent on the S11 interface for a TAU with - ///< an SGSN interaction, UE triggered Service Request or an I- - ///< RAT Handover. - ///< This IE shall be sent on the S4 interface for a RAU with - ///< MME interaction, a RAU with an SGSN change, a UE - ///< Initiated Service Request or an I-RAT Handover. - ///< This IE shall be sent on the S5/S8 interface if the RAT type - ///< changes. - ///< CO: CO If SGW receives this IE from MME/SGSN during a - ///< TAU/RAU/Handover with SGW change procedure, the - ///< SGW shall forward it across S5/S8 interface to PGW. - ///< CO: The IE shall be sent on the S11/S4 interface during the - ///< following procedures: - ///< - an inter MM TAU or inter SGSN RAU when UE was - ///< ISR activated which is indicated by ISRAU flag. - ///< - TAU/RAU procedure as part of optional network - ///< triggered service restoration procedure with ISR, as - ///< specified by 3GPP TS 23.007 [17]. - ///< If ISR is active, this IE shall also be included on the S11 - ///< interface in the S1-U GTP-U tunnel setup procedure during - ///< an intra-MME intra-SGW TAU procedure. - - indication_flags_t indication_flags; ///< C:This IE shall be included if any one of the applicable flags - ///< is set to 1. - ///< Applicable flags are: - ///< -ISRAI: This flag shall be used on S4/S11 interface - ///< and set to 1 if the ISR is established between the - ///< MME and the S4 SGSN. - ///< - Handover Indication: This flag shall be set to 1 on - ///< the S4/S11 and S5/S8 interfaces during an E- - ///< UTRAN Initial Attach or for a UE Requested PDN - ///< Connectivity or a PDP Context Activation - ///< procedure, if the PDN connection/PDP context is - ///< handed-over from non-3GPP access. - ///< - Direct Tunnel Flag: This flag shall be used on the - ///< S4 interface and set to 1 if Direct Tunnel is used. - ///< - Change Reporting support Indication: shall be - ///< used on S4/S11, S5/S8 and set if the SGSN/MME - ///< supports location Info Change Reporting. This flag - ///< should be ignored by SGW if no message is sent - ///< on S5/S8. See NOTE 4. - ///< - CSG Change Reporting Support Indication: shall - ///< be used on S4/S11, S5/S8 and set if the - ///< SGSN/MME supports CSG Information Change - ///< Reporting. This flag shall be ignored by SGW if no - ///< message is sent on S5/S8. See NOTE 4. - ///< - Change F-TEID support Indication: This flag shall - ///< be used on S4/S11 for an IDLE state UE initiated - ///< TAU/RAU procedure and set to 1 to allow the - ///< SGW changing the GTP-U F-TEID. - - FTeid_t sender_fteid_for_cp; ///< C: Sender F-TEID for control plane - ///< This IE shall be sent on the S11 and S4 interfaces for a - ///< TAU/RAU/ Handover with MME/SGSN change and without - ///< any SGW change. - ///< This IE shall be sent on the S5 and S8 interfaces for a - ///< TAU/RAU/Handover with a SGW change. - - ambr_t apn_ambr; ///< C: Aggregate Maximum Bit Rate (APN-AMBR) - ///< The APN-AMBR shall be sent for the PS mobility from the - ///< Gn/Gp SGSN to the S4 SGSN/MME procedures.. - - /* Delay Value in integer multiples of 50 millisecs, or zero */ - DelayValue_t delay_dl_packet_notif_req; ///<C:This IE shall be sent on the S11 interface for a UE - ///< triggered Service Request. - ///< CO: This IE shall be sent on the S4 interface for a UE triggered - ///< Service Request. - - bearer_context_to_modify_t bearer_context_to_modify;///< C: This IE shall be sent on the S4/S11 interface and S5/S8 - ///< interface except on the S5/S8 interface for a UE triggered - ///< Service Request. - ///< When Handover Indication flag is set to 1 (i.e., for - ///< EUTRAN Initial Attach or UE Requested PDN Connectivity - ///< when the UE comes from non-3GPP access), the PGW - ///< shall ignore this IE. See NOTE 1. - ///< Several IEs with the same type and instance value may be - ///< included as necessary to represent a list of Bearers to be - ///< modified. - ///< During a TAU/RAU/Handover procedure with an SGW - ///< change, the SGW includes all bearers it received from the - ///< MME/SGSN (Bearer Contexts to be created, or Bearer - ///< Contexts to be modified and also Bearer Contexts to be - ///< removed) into the list of 'Bearer Contexts to be modified' - ///< IEs, which are then sent on the S5/S8 interface to the - ///< PGW (see NOTE 2). - - // Bearer Context Bearer Contexts to be removed; ///< C: This IE shall be included on the S4 and S11 interfaces for - ///< the TAU/RAU/Handover and Service Request procedures - ///< where any of the bearers existing before the - ///< TAU/RAU/Handover procedure and Service Request - ///< procedures will be deactivated as consequence of the - ///< TAU/RAU/Handover procedure and Service Request - ///< procedures. (NOTE 3) - ///< For each of those bearers, an IE with the same type and - ///< instance value, shall be included. - - // recovery_t(restart counter) recovery; ///< C: This IE shall be included if contacting the peer for the first - ///< time. - - UETimeZone_t ue_time_zone; ///< CO: This IE shall be included by the MME/SGSN on the S11/S4 - ///< interfaces if the UE Time Zone has changed in the case of - ///< TAU/RAU/Handover. - ///< C: If SGW receives this IE, SGW shall forward it to PGW - ///< across S5/S8 interface. - - FQ_CSID_t mme_fq_csid; ///< C: This IE shall be included by MME on S11 and shall be - ///< forwarded by SGW on S5/S8 according to the - ///< requirements in 3GPP TS 23.007 [17]. - - FQ_CSID_t sgw_fq_csid; ///< C: This IE shall be included by SGW on S5/S8 according to - ///< the requirements in 3GPP TS 23.007 [17]. - - UCI_t uci; ///< CO: The MME/SGSN shall include this IE for - ///< TAU/RAU/Handover procedures and UE-initiated Service - ///< Request procedure if the PGW has requested CSG Info - ///< reporting and the MME/SGSN support the CSG - ///< information reporting. The SGW shall include this IE on - ///< S5/S8 if it receives the User CSG Information from - ///< MME/SGSN. - - // Local Distinguished Name (LDN) MME/S4-SGSN LDN ///< O: This IE is optionally sent by the MME to the SGW on the - ///< S11 interface and by the SGSN to the SGW on the S4 - ///< interface (see 3GPP TS 32.423 [44]), when communicating - ///< the LDN to the peer node for the first time. - - // Local Distinguished Name (LDN) SGW LDN ///< O: This IE is optionally sent by the SGW to the PGW on the - ///< S5/S8 interfaces (see 3GPP TS 32.423 [44]), for inter- - ///< SGW mobity, when communicating the LDN to the peer - ///< node for the first time. - - // MMBR Max MBR/APN-AMBR ///< CO: If the S4-SGSN supports Max MBR/APN-AMBR, this IE - ///< shall be included by the S4-SGSN over S4 interface in the - ///< following cases: - ///< - during inter SGSN RAU/SRNS relocation without - ///< SGW relocation and inter SGSN SRNS relocation - ///< with SGW relocation if Higher bitrates than - ///< 16 Mbps flag is not included in the MM Context IE - ///< in the Context Response message or in the MM - ///< Context IE in the Forward Relocation Request - ///< message from the old S4-SGSN, while it is - ///< received from target RNC or a local Max - ///< MBR/APN-AMBR is configured based on - ///< operator's policy. - ///< - during Service Request procedure if Higher - ///< bitrates than 16 Mbps flag is received but the S4- - ///< SGSN has not received it before from an old RNC - ///< or the S4-SGSN has not updated the Max - ///< MBR/APN-AMBR to the PGW yet. - ///< If SGW receives this IE, SGW shall forward it to PGW - ///< across S5/S8 interface. - - // Private Extension Private Extension - - /* S11 stack specific parameter. Not used in standalone epc mode */ - void *trxn; ///< Transaction identifier -} SgwModifyBearerRequest; - -/** @struct SgwModifyBearerResponse - * @brief Modify Bearer Response - * - * The Modify Bearer Response will be sent on S11 interface as - * part of these procedures: - * - E-UTRAN Tracking Area Update without SGW Change - * - UE triggered Service Request - * - S1-based Handover - * - E-UTRAN Initial Attach - * - UE requested PDN connectivity - * - X2-based handover without SGWrelocation - */ -typedef struct SgwModifyBearerResponse_s { - Teid_t teid; ///< S11 MME Tunnel Endpoint Identifier - - // here fields listed in 3GPP TS 29.274 - SGWCause_t cause; ///< - - ebi_t linked_eps_bearer_id;///< This IE shall be sent on S5/S8 when the UE moves from a - ///< Gn/Gp SGSN to the S4 SGSN or MME to identify the - ///< default bearer the PGW selects for the PDN Connection. - ///< This IE shall also be sent by SGW on S11, S4 during - ///< Gn/Gp SGSN to S4-SGSN/MME HO procedures to identify - ///< the default bearer the PGW selects for the PDN - ///< Connection. - - ambr_t apn_ambr; ///< Aggregate Maximum Bit Rate (APN-AMBR) - ///< This IE shall be included in the PS mobility from Gn/Gp - ///< SGSN to the S4 SGSN/MME procedures if the received - ///< APN-AMBR has been modified by the PCRF. - - APNRestriction_t apn_restriction; ///< This IE denotes the restriction on the combination of types - ///< of APN for the APN associated with this EPS bearer - ///< Context. This IE shall be included over S5/S8 interfaces, - ///< and shall be forwarded over S11/S4 interfaces during - ///< Gn/Gp SGSN to MME/S4-SGSN handover procedures. - ///< This IE shall also be included on S5/S8 interfaces during - ///< the Gn/Gp SGSN to S4 SGSN/MME RAU/TAU - ///< procedures. - ///< The target MME or SGSN determines the Maximum APN - ///< Restriction using the APN Restriction. - // PCO protocol_configuration_options ///< If SGW receives this IE from PGW on GTP or PMIP based - ///< S5/S8, the SGW shall forward PCO to MME/S4-SGSN - ///< during Inter RAT handover from the UTRAN or from the - ///< GERAN to the E-UTRAN. See NOTE 2: - ///< If MME receives the IE, but no NAS message is sent, MME discards the IE. - -#define MODIFY_BEARER_RESPONSE_MOD 0x0 -#define MODIFY_BEARER_RESPONSE_REM 0x1 - unsigned bearer_present:1; ///< Choice present in union choice - union { - bearer_context_modified_t bearer_contexts_modified;///< EPS bearers corresponding to Bearer Contexts to be - ///< modified that were sent in Modify Bearer Request - ///< message. Several IEs with the same type and instance - ///< value may be included as necessary to represent a list of - ///< the Bearers which are modified. - bearer_for_removal_t bearer_for_removal;///< EPS bearers corresponding to Bearer Contexts to be - ///< removed sent in the Modify Bearer Request message. - ///< Shall be included if request message contained Bearer - ///< Contexts to be removed. - ///< For each of those bearers an IE with the same type and - ///< instance value shall be included. - } bearer_choice; - - // change_reporting_action ///< This IE shall be included with the appropriate Action field If - ///< the location Change Reporting mechanism is to be started - ///< or stopped for this subscriber in the SGSN/MME. - - // csg_Information_reporting_action ///< This IE shall be included with the appropriate Action field if - ///< the location CSG Info change reporting mechanism is to be - ///< started or stopped for this subscriber in the SGSN/MME. - - // FQDN Charging Gateway Name ///< When Charging Gateway Function (CGF) Address is - ///< configured, the PGW shall include this IE on the S5 - ///< interface during SGW relocation and when the UE moves - ///< from Gn/Gp SGSN to S4-SGSN/MME. See NOTE 1: - ///< Both Charging Gateway Name and Charging Gateway Address shall not be included at the same - ///< time. When both are available, the operator configures a preferred value. - - // IP Address Charging Gateway Address ///< When Charging Gateway Function (CGF) Address is - ///< configured, the PGW shall include this IE on the S5 - ///< interface during SGW relocation and when the UE moves - ///< from Gn/Gp SGSN to S4-SGSN/MME. See NOTE 1: - ///< Both Charging Gateway Name and Charging Gateway Address shall not be included at the same - ///< time. When both are available, the operator configures a preferred value. - - FQ_CSID_t pgw_fq_csid; ///< This IE shall be included by PGW on S5/S8and shall be - ///< forwarded by SGW on S11 according to the requirements - ///< in 3GPP TS 23.007 [17]. - - FQ_CSID_t sgw_fq_csid; ///< This IE shall be included by SGW on S11 according to the - ///< requirements in 3GPP TS 23.007 [17]. - - // recovery_t(restart counter) recovery; ///< This IE shall be included if contacting the peer for the first - ///< time. - - // Local Distinguished Name (LDN) SGW LDN ///< This IE is optionally sent by the SGW to the MME/SGSN - ///< on the S11/S4 interfaces (see 3GPP TS 32.423 [44]), - ///< when contacting the peer node for the first time. - - // Local Distinguished Name (LDN) PGW LDN ///< This IE is optionally included by the PGW on the S5/S8 - ///< and S2b interfaces (see 3GPP TS 32.423 [44]), when - ///< contacting the peer node for the first time. - - // Private Extension Private Extension ///< optional - - /* S11 stack specific parameter. Not used in standalone epc mode */ - void *trxn; ///< Transaction identifier -} SgwModifyBearerResponse; - -typedef struct SgwDeleteSessionRequest_s { - Teid_t teid; ///< Tunnel Endpoint Identifier - EBI_t lbi; ///< Linked EPS Bearer ID - FTeid_t sender_fteid_for_cp; ///< Sender F-TEID for control plane - - /* Operation Indication: This flag shall be set over S4/S11 interface - * if the SGW needs to forward the Delete Session Request message to - * the PGW. This flag shall not be set if the ISR associated GTP - * entity sends this message to the SGW in the Detach procedure. - * This flag shall also not be set to 1 in the SRNS Relocation Cancel - * Using S4 (6.9.2.2.4a in 3GPP TS 23.060 [4]), Inter RAT handover - * Cancel procedure with SGW change TAU with Serving GW change, - * Gn/Gb based RAU (see 5.5.2.5, 5.3.3.1, D.3.5 in 3GPP TS 23.401 [3], - * respectively), S1 Based handover Cancel procedure with SGW change. - */ - indication_flags_t indication_flags; - - /* GTPv2-C specific parameters */ - void *trxn; - uint32_t peer_ip; -} SgwDeleteSessionRequest; - -/** @struct SgwDeleteSessionResponse - * @brief Delete Session Response - * - * The Delete Session Response will be sent on S11 interface as - * part of these procedures: - * - EUTRAN Initial Attach - * - UE, HSS or MME Initiated Detach - * - UE or MME Requested PDN Disconnection - * - Tracking Area Update with SGW Change - * - S1 Based Handover with SGW Change - * - X2 Based Handover with SGW Relocation - * - S1 Based handover cancel with SGW change - */ -typedef struct SgwDeleteSessionResponse_s { - Teid_t teid; ///< Remote Tunnel Endpoint Identifier - SGWCause_t cause; - - /* GTPv2-C specific parameters */ - void *trxn; - uint32_t peer_ip; -} SgwDeleteSessionResponse; - -/** @struct SgwReleaseAccessBearersRequest - * @brief Release AccessBearers Request - * - * The Release Access Bearers Request message shall sent on the S11 interface by - * the MME to the SGW as part of the S1 release procedure. - * The message shall also be sent on the S4 interface by the SGSN to the SGW as - * part of the procedures: - * - RAB release using S4 - * - Iu Release using S4 - * - READY to STANDBY transition within the network - */ -typedef struct SgwReleaseAccessBearersRequest_s { - Teid_t teid; ///< Tunnel Endpoint Identifier - uint32_t num_rabs; - EBI_t list_of_rabs[8] ; ///< Shall be present on S4 interface when this message is - ///< used to release a subset of all active RABs according to - ///< the RAB release procedure. - ///< Several IEs with this type and instance values shall be - ///< included as necessary to represent a list of RABs to be - ///< released. - - node_type_t originating_node; ///< This IE shall be sent on S11 interface, if ISR is active in the MME. - ///< This IE shall be sent on S4 interface, if ISR is active in the SGSN - // Private Extension Private Extension ///< optional - -} SgwReleaseAccessBearersRequest; - -/** @struct SgwReleaseAccessBearersResponse - * @brief Release AccessBearers Response - * - * The Release Access Bearers Response message is sent on the S11 interface by the SGW to the MME as part of the S1 - * release procedure. - * The message shall also be sent on the S4 interface by the SGW to the SGSN as part of the procedures: - * - RAB release using S4 - * - Iu Release using S4 - * - READY to STANDBY transition within the network - * Possible Cause values are specified in Table 8.4-1. Message specific cause values are: - * - "Request accepted". - * - "Request accepted partially". - * - "Context not found - */ -typedef struct SgwReleaseAccessBearersResponse_s { - Teid_t teid; ///< Tunnel Endpoint Identifier - SGWCause_t cause; - // Recovery ///< optional This IE shall be included if contacting the peer for the first time - // Private Extension ///< optional - -} SgwReleaseAccessBearersResponse; - -#endif diff --git a/openair-cn/COMMON/tasks_def.h b/openair-cn/COMMON/tasks_def.h index e257778052..4590bc002a 100644 --- a/openair-cn/COMMON/tasks_def.h +++ b/openair-cn/COMMON/tasks_def.h @@ -1,31 +1,32 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ // This task is mandatory and must always be placed in first position TASK_DEF(TASK_TIMER, TASK_PRIORITY_MED, 10) diff --git a/openair-cn/COMMON/udp_messages_def.h b/openair-cn/COMMON/udp_messages_def.h index 809e31bab2..551788a2bb 100644 --- a/openair-cn/COMMON/udp_messages_def.h +++ b/openair-cn/COMMON/udp_messages_def.h @@ -1,31 +1,32 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ MESSAGE_DEF(UDP_INIT, MESSAGE_PRIORITY_MED, udp_init_t, udp_init) MESSAGE_DEF(UDP_DATA_REQ, MESSAGE_PRIORITY_MED, udp_data_req_t, udp_data_req) MESSAGE_DEF(UDP_DATA_IND, MESSAGE_PRIORITY_MED, udp_data_ind_t, udp_data_ind) diff --git a/openair-cn/COMMON/udp_messages_types.h b/openair-cn/COMMON/udp_messages_types.h index 464d1575b1..a44ab44c16 100644 --- a/openair-cn/COMMON/udp_messages_types.h +++ b/openair-cn/COMMON/udp_messages_types.h @@ -1,31 +1,32 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #ifndef UDP_MESSAGES_TYPES_H_ #define UDP_MESSAGES_TYPES_H_ diff --git a/openair-cn/ChangeLog b/openair-cn/ChangeLog deleted file mode 100644 index 0db17ac628..0000000000 --- a/openair-cn/ChangeLog +++ /dev/null @@ -1,15 +0,0 @@ -v0.1: -- Build system -- SCTP layer v0.1 -- S1AP layer v0.1 -v0.2: -- Updated S1AP messages to RELEASE9 v9.8 -- S1-U layer using nw-gtpv1u -v0.3: -- Updated S1AP messages to RELEASE10 v10.5 -- Added NAS interface -- Added MME APPlication -- Converted sctp_bind to sctp_bindx for multi-homing support -- Added configuration file parsing -- S6a layer v0.1 using freeDiameter -- KeNB key derivy function \ No newline at end of file diff --git a/openair-cn/DOCS/DOXYGEN/Makefile.am b/openair-cn/DOCS/DOXYGEN/Makefile.am index 31f49b260d..f80ebfdfe0 100644 --- a/openair-cn/DOCS/DOXYGEN/Makefile.am +++ b/openair-cn/DOCS/DOXYGEN/Makefile.am @@ -21,7 +21,7 @@ # Contact Information # OpenAirInterface Admin: openair_admin@eurecom.fr # OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@eurecom.fr +# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr # # Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. # diff --git a/openair-cn/DOCS/EPC_User_Guide.docx b/openair-cn/DOCS/EPC_User_Guide.docx deleted file mode 100644 index b9cca8254cdd3b319aaa5ed907d114082f464140..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1019641 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
(3)n$=ky$eZRC3DcOd?d1}Iy7?s+L!X@ePD~k<- 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�!lpi!8jAYBEegB291(z}R= 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⪼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≫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�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�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⪙meIOXABCrRjx`HO%`g`ad7Jcppq; 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�Mm+_?JF^$M^U6NFE6y){(~4NT8Hx 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 diff --git a/openair-cn/DOCS/EPC_User_Guide.pdf b/openair-cn/DOCS/EPC_User_Guide.pdf deleted file mode 100644 index 6b8a476bad9b6b1e186edd4f6651e3e2496a25a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 706808 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%0DP@?PA>K^@-lkvS}-#kRH2qi}@q<!a~X+DL^x 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%0A-00MX+$TJFR{`wfqok~xK+rsV4lhKbn2JE;kB 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	hw=Wj8u|Bs; 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%0A6-OqlMKd!u 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%0Db%>^GQQPL*#!bMo{2_ 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�((mL@$!b2Vm3zFbdgpaZvxg&{1l!^!BAJ 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�Kr={>&JNS|tHIK|N)7H#NS~h3A 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�L9V@a<y)<*D^ePt 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 diff --git a/openair-cn/DOCS/Latex/EPC/Makefile b/openair-cn/DOCS/Latex/EPC/Makefile index 4c218c90fb..a29da4a53c 100644 --- a/openair-cn/DOCS/Latex/EPC/Makefile +++ b/openair-cn/DOCS/Latex/EPC/Makefile @@ -21,7 +21,7 @@ # Contact Information # OpenAirInterface Admin: openair_admin@eurecom.fr # OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@eurecom.fr +# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr # # Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. # diff --git a/openair-cn/DOCS/Makefile.am b/openair-cn/DOCS/Makefile.am index 4f16edea72..daf460186f 100644 --- a/openair-cn/DOCS/Makefile.am +++ b/openair-cn/DOCS/Makefile.am @@ -21,7 +21,7 @@ # Contact Information # OpenAirInterface Admin: openair_admin@eurecom.fr # OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@eurecom.fr +# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr # # Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. # diff --git a/openair-cn/GTPV1-U/GTPU_SP/COPYING b/openair-cn/GTPV1-U/GTPU_SP/COPYING deleted file mode 100755 index d511905c16..0000000000 --- a/openair-cn/GTPV1-U/GTPU_SP/COPYING +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program 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 2 of the License, or - (at your option) any later version. - - This program 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 this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - <signature of Ty Coon>, 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. diff --git a/openair-cn/GTPV1-U/GTPU_SP/INSTALL b/openair-cn/GTPV1-U/GTPU_SP/INSTALL deleted file mode 100755 index 0de93a937c..0000000000 --- a/openair-cn/GTPV1-U/GTPU_SP/INSTALL +++ /dev/null @@ -1,33 +0,0 @@ -How to build ------------- - -1. Extract the files in a location of your choice. The - Files will be extracted in a directory called gtpu. - -2. cd <gtpu_dir>/gtpu. - -3. make - -If make is successful, the binary files (libxt_GTPU.so and xt_GTPU.ko) -will be created in the Bin folder. - - -How to install --------------- -There is no "make install" as that will be difficult to support all -possible Linux distro. The cmd.sh file demonstrates how to install -the two binary files in the system. - - -In case of problem: - - check you got the last release of the library (see README), - - contact the mailing list (see README), - - check the bugtracker for known bugs (see README). - - -Documentation -------------- -Please have a look at the "Architecture" section in the README. - - - diff --git a/openair-cn/GTPV1-U/GTPU_SP/Makefile b/openair-cn/GTPV1-U/GTPU_SP/Makefile deleted file mode 100755 index f8b59266e1..0000000000 --- a/openair-cn/GTPV1-U/GTPU_SP/Makefile +++ /dev/null @@ -1,104 +0,0 @@ -#################################################################################### -# Makefile for iptables extension for the GTPUSP target and GTPUSP klm -# -# Copyright (c) 2010-2011 Polaris Networks -# Author: Pradip Biswas <pradip_biswas@polarisnetworks.net> -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License version 2 as -# published by the Free Software Foundation. -# -#################################################################################### - -export BIN_DIR ?= $(shell pwd)/Bin -KVERSION = $(shell uname -r) -KVERSION_LAST_DIGIT = $(shell echo ${KVERSION} | cut -d "." -f 3 | cut -d "-" -f 1) - -obj-m = xt_GTPUSP.o -EXTRA_CFLAGS += -DKVERSION=$(KVERSION_LAST_DIGIT) - -all: xtlib - echo "Building for Kernel Version: $(KVERSION_LAST_DIGIT)" - make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules - chmod 777 xt_GTPUSP.ko - mv xt_GTPUSP.ko $(BIN_DIR)/ - -clean: libclean - make -C /lib/modules/$(KVERSION)/build M=$(PWD) clean - -################################################################################ -# The next section is used by libxt_GTPUSP -################################################################################ - -XT_IPTABLES_VERSION = $(shell /sbin/iptables -V | cut -d " " -f 2 | cut -b 2-) -IPT_FIRST_NUM = $(shell echo ${XT_IPTABLES_VERSION} | cut -d "." -f 1 | cut -d "-" -f 1) -IPT_SECOND_NUM = $(shell echo ${XT_IPTABLES_VERSION} | cut -d "." -f 2 | cut -d "-" -f 1) -IPT_THIRD_NUM = $(shell echo ${XT_IPTABLES_VERSION} | cut -d "." -f 3 | cut -d "-" -f 1) -IPTVERSION = $(IPT_FIRST_NUM)$(IPT_SECOND_NUM)$(IPT_THIRD_NUM) -IPTABLES_VERSION_STRING = \"$(IPT_FIRST_NUM).$(IPT_SECOND_NUM).$(IPT_THIRD_NUM)\" - -LIB_CC := gcc - -ifeq ($(IPTVERSION), 135) - LIB_LD := ld -else - LIB_LD := gcc -endif - -LIB_CFLAGS := -fPIC -Wall -MMD -D_LARGEFILE_SOURCE=1 -D_LARGE_FILES -D_FILE_OFFSET_BITS=64 \ - -D_REENTRANT -pipe -DXTABLES_LIBDIR=\"/usr/local/libexec/xtables\" -DXTABLES_INTERNAL \ - -D_INIT=libxt_GTPUSP_init -DPIC -fPIC -O2 \ - -DIPTVERSION=$(IPTVERSION) \ - -DIPTABLES_VERSION_STRING=$(IPTABLES_VERSION_STRING) - -XT_TARGET := xt_GTPUSP -XT_LIBNAME := lib$(XT_TARGET).so -XT_BUILD_DIR = $(BIN_DIR)/$(XT_TARGET) - -# Get the system distribution type -IsDebian=$(shell /bin/cat /proc/version | grep -i -e ubuntu -e debian) -IsRedHat=$(shell /bin/cat /proc/version | grep -i -e centos -e "red hat" -e suse -e fedora) - -# Change the ipq library name for 64-bit Debian-based distributions -ifeq ($(X86_64),x86_64) - ifneq ($(strip $(IsDebian)),) - LIB_IPQ=_pic - endif -endif - -INCLUDE_DIR = -I. \ - -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include \ - -I/usr/lib64/glib-2.0/include - -XT_SOURCES = libxt_GTPUSP.c - -XT_OBJECTS := $(addprefix $(XT_BUILD_DIR)/, $(notdir $(XT_SOURCES:.c=.o))) - -xtlib: XT - -XT: DF = $(XT_BUILD_DIR)/$(*F) -XT: $(XT_BUILD_DIR) $(BIN_DIR)/$(XT_LIBNAME) - --include $(addprefix $(XT_BUILD_DIR)/, $(notdir $(XT_SOURCES:.c=.P))) - -$(XT_BUILD_DIR): - @echo Build Directory is $@ - @if [ ! -d $(BIN_DIR) ]; then mkdir $(BIN_DIR); fi - @if [ ! -d $@ ]; then mkdir $@; fi - -$(BIN_DIR)/$(XT_LIBNAME): $(XT_OBJECTS) - @echo Linking $@ - @$(LIB_LD) -shared $(XT_OBJECTS) -o $@ - -$(XT_BUILD_DIR)/%.o : %.c - @echo "Building GTPUSP ext for version $(IPTVERSION) $(IPTABLES_VERSION_STRING)" - @echo Compiling $< - @$(LIB_CC) $(LIB_CFLAGS) -MF $(DF).d $(INCLUDE_DIR) -o $@ -c $< - @cp $(DF).d $(DF).P; \ - sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \ - -e '/^$$/ d' -e 's/$$/ :/' < $(DF).d >> $(DF).P; \ - rm -f $(DF).d - -libclean: - @rm -rf $(BIN_DIR)/$(XT_LIBNAME) $(XT_BUILD_DIR) - diff --git a/openair-cn/GTPV1-U/GTPU_SP/README b/openair-cn/GTPV1-U/GTPU_SP/README deleted file mode 100755 index f29b8421c3..0000000000 --- a/openair-cn/GTPV1-U/GTPU_SP/README +++ /dev/null @@ -1,80 +0,0 @@ -Introduction ------------- -This piece of software implementes GPRS Tunneling Protocol (GTP) for user plane. -The software has two components - one is the extension of iptables that -run in user-space. The other is the counterpart of the iptables extension -that runs in kernel space. - - -License -------- -The project is licensed under GPL2+, see the COPYING and AUTHORS files for more -details. - - -Architecture ------------- -The GTPu tunneling is handled in two parts. The first part is the user-space -iptables target extension library (let's call it libxt). The second -part is the GTPu kernel loadable module (let's call it gtpu). The way it -is, once the user configures a GTPu tunnel attributes using iptables, the klm -is loaded by the kernel automatically and handles the IP packets according to -the GTPu tunnel attributes set by the user. - -The user can set the action to be taken on a matching IP packet. The action can be -either of "add", "remove" or "transport" . - -A GTPu tunnel has the following attributes: - - own IP address - - own GTPu tunnel id - - peer's IP address - - peer's GTPu tunnel id - -The GTPU target is designed to work only on mangle table. Also, the user is -expected to add GTPU target to the PREROUTING chain, as the GTPU target will -modify the original IP packet before it is routed. - -Once the user creates the rule in iptables, the matching IP packets go through -the gtpu klm, which acts upon the IP packet according to the action set by the -user. The action "Add" means the klm will add a GTPu header to the IP packet. -"Remove" will remove the GTPu header from the IP packet and "Transport" will -do a Remove first followed by an "Add" on the IP packet. - -For example, consider the following command: - -iptables -t mangle -A PREROUTING -d 10.10.10.1 -j GTPU --own-ip 192.168.0.98 --own-tun 100 --peer-ip 192.168.0.109 --peer-tun 101 --action add - -This command will configure the system to add a GTPu header to any IP packet destined to 10.10.10.1. -The source IP address outer IP will be 192.168.0.109, the dest IP will be 192.168.0.98 and -the destination GTP tunnel id will be 101. - -Similarly, consider the following command: - -iptables -t mangle -A PREROUTING -s 192.168.0.109 -d 192.168.0.98 -p udp --dport 2152 -j GTPU --action remove - -This command will process all the GTPu packets coming from 192.168.0.109 to 192.168.0.98 to -strip the GTPu header and forward the inner IP packet to the kernel's routing engine. - - -Files ---------- -There are two source C files and one header file: - - libxt_GTPU.c : source file for iptables GTPU extension library (libxt) - - xt_GTPU.c : source file for gtpu kernel loadable module (klm) - - xt_GTPU.h : common header file, shared between the libxt and the klm - - Makefile : Makefile to build both the libxt and the klm - - cmd.sh : sample cmd file to show how the binaries can be used - -See the INSTALL file to learn how to build the binaries. - - -References ----------- -3GPP TS 29.281 General Packet Radio System (GPRS) - Tunnelling Protocol User Plane (GTP-u) - - -Authors -------- -Pradip Biswas <pradip_biswas@polarisnetworks.net> - diff --git a/openair-cn/GTPV1-U/GTPU_SP/RELEASE_NOTES b/openair-cn/GTPV1-U/GTPU_SP/RELEASE_NOTES deleted file mode 100755 index 022846fcd5..0000000000 --- a/openair-cn/GTPV1-U/GTPU_SP/RELEASE_NOTES +++ /dev/null @@ -1,6 +0,0 @@ - -Known issues in GTPU v1.0 -------------------------- - -1. Does not implement the "Transport" action. - diff --git a/openair-cn/GTPV1-U/GTPU_SP/cmd.sh b/openair-cn/GTPV1-U/GTPU_SP/cmd.sh deleted file mode 100755 index 428b5b155a..0000000000 --- a/openair-cn/GTPV1-U/GTPU_SP/cmd.sh +++ /dev/null @@ -1,18 +0,0 @@ -# Clear the iptables mangle table -iptables -t mangle -F - -# Remove GTPU KLM -rmmod xt_GTPUSP - -# Insert the GTPUSP KLM -insmod ./Bin/xt_GTPUSP.ko - -# Copy the userland iptables extenstion library -if [ -d /lib/xtables ]; then - /bin/cp -f ./Bin/libxt_GTPUSP.so /lib/xtables/ -fi - -if [ -d /lib/iptables ]; then - /bin/cp -f ./Bin/libxt_GTPUSP.so /lib/iptables/libipt_GTPUSP.so -fi - diff --git a/openair-cn/GTPV1-U/GTPU_SP/libxt_GTPUSP.c b/openair-cn/GTPV1-U/GTPU_SP/libxt_GTPUSP.c deleted file mode 100755 index 0b749a8759..0000000000 --- a/openair-cn/GTPV1-U/GTPU_SP/libxt_GTPUSP.c +++ /dev/null @@ -1,322 +0,0 @@ -/* Shared library add-on to iptables for the GTPUSP target - * - * Copyright (c) 2010-2011 Polaris Networks - * Author: Pradip Biswas <pradip_biswas@polarisnetworks.net> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - -#include <stdio.h> -#include <string.h> -#include <stdlib.h> -#include <stdarg.h> -#include <getopt.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/inet.h> -#include <linux/netfilter.h> - -#include "xt_GTPUSP.h" - -#if (IPTVERSION <= 135) -#include <iptables.h> -#elif (IPTVERSION > 135) -#include <xtables.h> -#endif - -#if (IPTVERSION <= 135) -#define GTPUSP_PARAM_BAD_VALUE 0 -#define GTPUSP_PARAM_ONLY_ONCE 1 -#define XT_GTPUSP_VERSION IPTABLES_VERSION_STRING -#define gtpusp_strtoui(s,v,m,M) !string_to_number(s,m,M,v) -#define gtpusp_exit_error exit_error -#elif (IPTVERSION > 135) && (IPTVERSION <= 141) -#define GTPUSP_PARAM_BAD_VALUE P_BAD_VALUE -#define GTPUSP_PARAM_ONLY_ONCE P_ONLY_ONCE -#define XT_GTPUSP_VERSION XTABLES_VERSION -#define gtpusp_param_act param_act -#define gtpusp_strtoui(s,v,m,M) !string_to_number(s,m,M,v) -#define gtpusp_exit_error exit_error -#elif (IPTVERSION > 141) -#define GTPUSP_PARAM_BAD_VALUE XTF_BAD_VALUE -#define GTPUSP_PARAM_ONLY_ONCE XTF_ONLY_ONCE -#define XT_GTPUSP_VERSION XTABLES_VERSION -#define gtpusp_param_act xtables_param_act -#define gtpusp_strtoui(s,v,m,M) xtables_strtoui(s,NULL,v,m,M) -#define gtpusp_exit_error xtables_error -#endif - -enum { - PARAM_LADDR = 1 << 0, - PARAM_LTUN = 1 << 1, - PARAM_RADDR = 1 << 2, - PARAM_RTUN = 1 << 3, - PARAM_ACTION = 1 << 4, -}; - -static void GTPUSP_help(void) -{ - printf( - "GTPUSP target options\n" - " --action value Set action <value: add>\n" - " --own-ip value Set own IP address\n" - " --own-tun value Set own tunnel id <value: 1-2^31>\n" - " --peer-ip value Set peer IP address\n" - " --peer-tun value Set peer tunnel id <value: 1-2^31>\n"); -} - -#if (IPTVERSION <= 135) -/* Stolen from iptables v1.4.7 code */ -void gtpusp_param_act(unsigned int status, const char *p1, ...) -{ - const char *p2, *p3; - va_list args; - int b; - - va_start(args, p1); - - switch (status) { - case GTPUSP_PARAM_ONLY_ONCE: - p2 = va_arg(args, const char *); - b = va_arg(args, unsigned int); - - if (!b) - return; - - exit_error(PARAMETER_PROBLEM, - "%s: \"%s\" option may only be specified once", - p1, p2); - break; - - case GTPUSP_PARAM_BAD_VALUE: - p2 = va_arg(args, const char *); - p3 = va_arg(args, const char *); - exit_error(PARAMETER_PROBLEM, - "%s: Bad value for \"%s\" option: \"%s\"", - p1, p2, p3); - break; - - default: - exit_error(status, "%s", "Unknown error"); - break; - } - - va_end(args); -} - -#endif - -static void parse_gtpusp_addr(const char *s, struct xt_gtpusp_target_info *info, int flag) -{ - in_addr_t addr; - - if ((addr = inet_addr(s)) == -1) { - switch (flag) { - case PARAM_LADDR: - gtpusp_param_act(GTPUSP_PARAM_BAD_VALUE, "GTPUSP", "--own-ip", s); - break; - - case PARAM_RADDR: - gtpusp_param_act(GTPUSP_PARAM_BAD_VALUE, "GTPUSP", "--peer-ip", s); - break; - } - } - - switch (flag) { - case PARAM_LADDR: - info->laddr = addr; - break; - - case PARAM_RADDR: - info->raddr = addr; - break; - } -} - -static void parse_gtpusp_tunid(char *s, struct xt_gtpusp_target_info *info, int flag) -{ - unsigned int value; - - if (!gtpusp_strtoui(s, &value, 0, UINT32_MAX)) { - switch (flag) { - case PARAM_LTUN: - gtpusp_param_act(GTPUSP_PARAM_BAD_VALUE, "GTPUSP", "--own-tun", s); - break; - - case PARAM_RTUN: - gtpusp_param_act(GTPUSP_PARAM_BAD_VALUE, "GTPUSP", "--peer-tun", s); - break; - } - } - - switch (flag) { - case PARAM_LTUN: - info->ltun = value; - break; - - case PARAM_RTUN: - info->rtun = value; - break; - } -} - -static void parse_gtpusp_action(char *s, struct xt_gtpusp_target_info *info, unsigned int *flags) -{ - if (!strcmp(s, "add")) { - info->action = PARAM_GTPUSP_ACTION_ADD; - *flags |= PARAM_GTPUSP_ACTION_ADD; - } else { - gtpusp_param_act(GTPUSP_PARAM_BAD_VALUE, "GTPUSP", "--action", s); - } -} - -#if (IPTVERSION <= 135) -static int -GTPUSP_parse(int c, char **argv, int invert, unsigned int *flags, - const struct ipt_entry *entry, - struct ipt_entry_target **target) -#else -static int -GTPUSP_parse(int c, char **argv, int invert, unsigned int *flags, - const void *entry, struct xt_entry_target **target) -#endif -{ - struct xt_gtpusp_target_info *info = (struct xt_gtpusp_target_info *) (*target)->data; - - switch (c) { - case '1': - gtpusp_param_act(GTPUSP_PARAM_ONLY_ONCE, "GTPUSP", "--own-ip", *flags & PARAM_LADDR); - parse_gtpusp_addr(optarg, info, PARAM_LADDR); - *flags |= PARAM_LADDR; - return 1; - - case '2': - gtpusp_param_act(GTPUSP_PARAM_ONLY_ONCE, "GTPUSP", "--own-tun", *flags & PARAM_LTUN); - parse_gtpusp_tunid(optarg, info, PARAM_LTUN); - *flags |= PARAM_LTUN; - return 1; - - case '3': - gtpusp_param_act(GTPUSP_PARAM_ONLY_ONCE, "GTPUSP", "--peer-ip", *flags & PARAM_RADDR); - parse_gtpusp_addr(optarg, info, PARAM_RADDR); - *flags |= PARAM_RADDR; - return 1; - - case '4': - gtpusp_param_act(GTPUSP_PARAM_ONLY_ONCE, "GTPUSP", "--peer-tun", *flags & PARAM_RTUN); - parse_gtpusp_tunid(optarg, info, PARAM_RTUN); - *flags |= PARAM_RTUN; - return 1; - - case '5': - gtpusp_param_act(GTPUSP_PARAM_ONLY_ONCE, "GTPUSP", "--action", *flags & PARAM_ACTION); - parse_gtpusp_action(optarg, info, flags); - *flags |= PARAM_ACTION; - return 1; - } - - return 1; -} - -static void GTPUSP_check(unsigned int flags) -{ - if (!(flags & PARAM_ACTION)) { - gtpusp_exit_error(PARAMETER_PROBLEM, "GTPUSP: You must specify action"); - } - - if (!(flags & PARAM_LADDR)) { - gtpusp_exit_error(PARAMETER_PROBLEM, "GTPUSP: You must specify local addr"); - } - - if (!(flags & PARAM_LTUN)) { - gtpusp_exit_error(PARAMETER_PROBLEM, "GTPUSP: You must specify local tunnel id"); - } - - if (!(flags & PARAM_RADDR)) { - gtpusp_exit_error(PARAMETER_PROBLEM, "GTPUSP: You must specify remote addr"); - } - - if (!(flags & PARAM_RTUN)) { - gtpusp_exit_error(PARAMETER_PROBLEM, "GTPUSP: You must specify remote tunnel id"); - } -} - -static void convert_action_to_string(int action, char *actionstr) -{ - switch(action) { - case PARAM_GTPUSP_ACTION_ADD: - sprintf (actionstr, "add"); - break; - - default : - sprintf (actionstr, "unspecified!!!"); - break; - } -} - -#if (IPTVERSION <= 135) -static void -GTPUSP_print(const struct ipt_ip *ip, - const struct ipt_entry_target *target, - int numeric) - -#else -static void -GTPUSP_print(const void *ip, - const struct xt_entry_target *target, - int numeric) -#endif -{ - const struct xt_gtpusp_target_info *info = - (struct xt_gtpusp_target_info *) target->data; - - char laddr[64], raddr[64], actionstr[32]; - - convert_action_to_string(info->action, actionstr); - - sprintf (laddr, "%s", inet_ntoa(*(struct in_addr*)&info->laddr)); - sprintf (raddr, "%s", inet_ntoa(*(struct in_addr*)&info->raddr)); - printf("GTPUSP self: %s tunnel: 0x%x / peer: %s tunnel: 0x%x / action: %s", - laddr, info->ltun, raddr, info->rtun, actionstr); -} - -static struct option GTPUSP_opts[] = { - { "own-ip", 1, NULL, '1' }, - { "own-tun", 1, NULL, '2' }, - { "peer-ip", 1, NULL, '3' }, - { "peer-tun", 1, NULL, '4' }, - { "action", 1, NULL, '5' }, - { .name = NULL } -}; - -#if (IPTVERSION <= 135) -static struct iptables_target gtpusp_tg_reg = { -#else -static struct xtables_target gtpusp_tg_reg = { -#endif - .name = "GTPUSP", - .version = XT_GTPUSP_VERSION, -#if (IPTVERSION > 135) - .family = NFPROTO_IPV4, -#endif - .size = XT_ALIGN(sizeof(struct xt_gtpusp_target_info)), - .userspacesize = XT_ALIGN(sizeof(struct xt_gtpusp_target_info)), - .help = GTPUSP_help, - .parse = GTPUSP_parse, - .final_check = GTPUSP_check, - .print = GTPUSP_print, - .extra_opts = GTPUSP_opts, -}; - -void _init(void) -{ -#if (IPTVERSION <= 135) - register_target(>pusp_tg_reg); -#else - xtables_register_target(>pusp_tg_reg); -#endif -} - diff --git a/openair-cn/GTPV1-U/GTPU_SP/xt_GTPUSP.c b/openair-cn/GTPV1-U/GTPU_SP/xt_GTPUSP.c deleted file mode 100755 index 24f210e371..0000000000 --- a/openair-cn/GTPV1-U/GTPU_SP/xt_GTPUSP.c +++ /dev/null @@ -1,780 +0,0 @@ -/* - * GTPu klm for Linux/iptables - * - * Copyright (c) 2010-2011 Polaris Networks - * Author: Pradip Biswas <pradip_biswas@polarisnetworks.net> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - -#include <linux/module.h> -#include <linux/kallsyms.h> -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/skbuff.h> -#include <linux/ip.h> -#include <linux/if_ether.h> -#include <linux/route.h> -#include <linux/time.h> -#include <net/checksum.h> -#include <net/ip.h> -#include <linux/in.h> -#include <linux/icmp.h> -#include <net/udp.h> -#include <net/inet_sock.h> -#include <net/route.h> -#include <net/addrconf.h> -#include <net/ip6_checksum.h> -#include <net/ip6_route.h> -#include <net/ipv6.h> -#include <linux/netfilter/x_tables.h> -#include <linux/netfilter_ipv4/ip_tables.h> -#include <linux/kthread.h> -#include <linux/errno.h> -#include <linux/types.h> -#include <linux/netdevice.h> -#include <linux/delay.h> -#include <linux/inet.h> - -// CONNMARK -#include <net/netfilter/nf_conntrack.h> -#include <net/netfilter/nf_conntrack_ecache.h> -#include <linux/netfilter/x_tables.h> -#include <linux/netfilter/xt_connmark.h> -#if defined(CONFIG_IP6_NF_IPTABLES) || defined(CONFIG_IP6_NF_IPTABLES_MODULE) -# define WITH_IPV6 1 -#endif -#include "xt_GTPUSP.h" -#if !(defined KVERSION) -# error "Kernel version is not defined!!!! Exiting." -#endif - -#define GTPU_TRACE_IN_KERN_LOG 0 - -#if defined(GTPU_TRACE_IN_KERN_LOG) -#define PR_INFO(fORMAT, aRGS...) pr_info(fORMAT, ##aRGS) -#else -#define PR_INFO(fORMAT, aRGS...) -#endif -#define INT_MODULE_PARM(n, v) static int n = v; module_param(n, int, 0444) -#define STRING_MODULE_PARM(s, v) static char* s = v; module_param(s, charp, 0000); -//----------------------------------------------------------------------------- -static char* _gtpusp_nf_inet_hook_2_string(int nf_inet_hookP); -static void _gtpusp_print_hex_octets(unsigned char* data_pP, unsigned short sizeP); -static void _gtpusp_tg4_add(struct sk_buff *old_skb_pP, const struct xt_action_param *par_pP); -#ifdef WITH_IPV6 -static void _gtpusp_tg6_add(struct sk_buff *old_skb_pP, const struct xt_action_param *par_pP); -static unsigned int _gtpusp_tg6(struct sk_buff *skb_pP, const struct xt_action_param *par_pP); -#endif -static unsigned int _gtpusp_tg4(struct sk_buff *skb_pP, const struct xt_action_param *par_pP); -static int __init gtpusp_tg_init(void); -static void __exit gtpusp_tg_exit(void); -static int _udp_thread(void *data); -static int _gtpusp_ksocket_send(struct socket *sock_pP, struct sockaddr_in *addr_pP, unsigned char *gtpuh_pP, int len_gtpP, unsigned char *buf_ip_pP, int len_ipP); -static int _gtpusp_ksocket_receive(struct socket* sock_pP, struct sockaddr_in* addr_pP, unsigned char* buf_pP, int lenP); -static int _gtpusp_ksocket_process_gtp(const unsigned char * const rx_buf_pP, const int lenP, unsigned char* tx_buf_pP); -//----------------------------------------------------------------------------- -#define MODULE_NAME "GTPUSP" -MODULE_LICENSE("GPL"); -MODULE_AUTHOR("Pradip Biswas <pradip_biswas@polarisnetworks.net>"); -MODULE_DESCRIPTION("GTPu Data Path extension on netfilter"); -//----------------------------------------------------------------------------- -static struct xt_target gtpusp_tg_reg[] __read_mostly = { - { - .name = MODULE_NAME, - .revision = 0, - .family = NFPROTO_IPV4, - .hooks = (1 << NF_INET_POST_ROUTING) | - (1 << NF_INET_LOCAL_IN) | - (1 << NF_INET_FORWARD), - .table = "mangle", - .target = _gtpusp_tg4, - .targetsize = sizeof(struct xt_gtpusp_target_info), - .me = THIS_MODULE, - }, -#ifdef WITH_IPV6 - { - .name = MODULE_NAME, - .revision = 0, - .family = NFPROTO_IPV6, - .hooks = (1 << NF_INET_POST_ROUTING) | - (1 << NF_INET_LOCAL_IN) | - (1 << NF_INET_FORWARD), - .table = "mangle", - .target = _gtpusp_tg6, - .targetsize = sizeof(struct xt_gtpusp_target_info), - .me = THIS_MODULE, - }, -#endif -}; -#define GTP_ECHO_REQ 1 -#define GTP_ECHO_RSP 2 -#define GTP_ERROR_INDICATION 26 -#define GTP_GPDU 255 - -typedef struct gtpv1u_msg_s { - unsigned char version; - unsigned char protocol_type; - unsigned char ext_hdr_flag; - unsigned char seq_num_flag; - u_int16_t npdu_num_flag; - u_int32_t msg_type; - u_int16_t msg_len; - u_int32_t teid; - u_int16_t seq_num; - unsigned char npdu_num; - unsigned char next_ext_hdr_type; - u_int32_t msg_buf_len; - u_int32_t msg_buf_offset; - struct gtpv1u_msg_s* next; -} gtpv1u_msg_t; - -struct gtpuhdr { - char flags; - char msgtype; - u_int16_t length; - u_int32_t tunid; -}; -typedef struct gtpusp_sock_s { - struct task_struct *thread; - struct sockaddr_in addr; - struct socket *sock; - struct sockaddr_in addr_send; - int running; - int thread_stop_requested; -} gtpusp_sock_t; - -//----------------------------------------------------------------------------- -#define GTPU_HDR_PNBIT 1 -#define GTPU_HDR_SBIT 1 << 1 -#define GTPU_HDR_EBIT 1 << 2 -#define GTPU_ANY_EXT_HDR_BIT (GTPU_HDR_PNBIT | GTPU_HDR_SBIT | GTPU_HDR_EBIT) - -#define GTPU_FAILURE 1 -#define GTPU_SUCCESS !GTPU_FAILURE -#define GTPUSP_2_PRINT_BUFFER_LEN 8192 - -#define IP_MORE_FRAGMENTS 0x2000 -#define NIPADDR(addr) \ - (uint8_t)(addr & 0x000000FF), \ - (uint8_t)((addr & 0x0000FF00) >> 8), \ - (uint8_t)((addr & 0x00FF0000) >> 16), \ - (uint8_t)((addr & 0xFF000000) >> 24) -//----------------------------------------------------------------------------- -static char _gtpusp_print_buffer[GTPUSP_2_PRINT_BUFFER_LEN]; -gtpusp_sock_t _gtpusp_sock; - -INT_MODULE_PARM(gtpu_sgw_port, 2152); -MODULE_PARM_DESC(gtpu_sgw_port, "UDP port number for S1U interface (s-GW side)"); -INT_MODULE_PARM(gtpu_enb_port, 2153); -MODULE_PARM_DESC(gtpu_enb_port, "UDP port number for S1U interface (eNB side)"); -STRING_MODULE_PARM(sgw_addr, "127.0.0.1"); -MODULE_PARM_DESC(sgw_addr, "IPv4 address of the S1U IP interface"); - - - -//----------------------------------------------------------------------------- -static char* -_gtpusp_icmph_type_2_string(uint8_t typeP) -//----------------------------------------------------------------------------- -{ - switch (typeP) { - case ICMP_ECHOREPLY:return "ECHOREPLY";break; - case ICMP_DEST_UNREACH:return "DEST_UNREACH";break; - case ICMP_SOURCE_QUENCH:return "SOURCE_QUENCH";break; - case ICMP_REDIRECT:return "REDIRECT";break; - case ICMP_ECHO:return "ECHO";break; - case ICMP_TIME_EXCEEDED:return "TIME_EXCEEDED";break; - case ICMP_PARAMETERPROB:return "PARAMETERPROB";break; - case ICMP_TIMESTAMP:return "TIMESTAMP";break; - case ICMP_TIMESTAMPREPLY:return "TIMESTAMPREPLY";break; - case ICMP_INFO_REQUEST:return "INFO_REQUEST";break; - case ICMP_INFO_REPLY:return "INFO_REPLY";break; - case ICMP_ADDRESS:return "ADDRESS";break; - case ICMP_ADDRESSREPLY:return "ADDRESSREPLY";break; - default:return "TYPE?"; - } -} -//----------------------------------------------------------------------------- -static char* -_gtpusp_nf_inet_hook_2_string(int nf_inet_hookP) -{ - //----------------------------------------------------------------------------- - switch (nf_inet_hookP) { - case NF_INET_PRE_ROUTING: - return "NF_INET_PRE_ROUTING"; - break; - - case NF_INET_LOCAL_IN: - return "NF_INET_LOCAL_IN"; - break; - - case NF_INET_FORWARD: - return "NF_INET_FORWARD"; - break; - - case NF_INET_LOCAL_OUT: - return "NF_INET_LOCAL_OUT"; - break; - - case NF_INET_POST_ROUTING: - return "NF_INET_POST_ROUTING"; - break; - - default: - return "NF_INET_UNKNOWN"; - } -} -//----------------------------------------------------------------------------- -void -_gtpusp_print_hex_octets(unsigned char* data_pP, unsigned short sizeP) -{ - //----------------------------------------------------------------------------- - - unsigned long octet_index = 0; - unsigned long buffer_marker = 0; - unsigned char aindex; - struct timeval tv; - char timeofday[64]; - unsigned int h,m,s; - - if (data_pP == NULL) { - return; - } - - if (sizeP > 2000) { - return; - } - - do_gettimeofday(&tv); - h = (tv.tv_sec/3600) % 24; - m = (tv.tv_sec / 60) % 60; - s = tv.tv_sec % 60; - snprintf(timeofday, 64, "%02d:%02d:%02d.%06ld", h,m,s,tv.tv_usec); - - buffer_marker+=snprintf(&_gtpusp_print_buffer[buffer_marker], GTPUSP_2_PRINT_BUFFER_LEN - buffer_marker,"%s------+-------------------------------------------------+\n",timeofday); - buffer_marker+=snprintf(&_gtpusp_print_buffer[buffer_marker], GTPUSP_2_PRINT_BUFFER_LEN - buffer_marker,"%s | 0 1 2 3 4 5 6 7 8 9 a b c d e f |\n",timeofday); - buffer_marker+=snprintf(&_gtpusp_print_buffer[buffer_marker], GTPUSP_2_PRINT_BUFFER_LEN - buffer_marker,"%s------+-------------------------------------------------+\n",timeofday); - pr_info("%s",_gtpusp_print_buffer); - buffer_marker = 0; - - for (octet_index = 0; octet_index < sizeP; octet_index++) { - if ((octet_index % 16) == 0) { - if (octet_index != 0) { - buffer_marker+=snprintf(&_gtpusp_print_buffer[buffer_marker], GTPUSP_2_PRINT_BUFFER_LEN - buffer_marker, " |\n"); - pr_info("%s",_gtpusp_print_buffer); - buffer_marker = 0; - } - - buffer_marker+=snprintf(&_gtpusp_print_buffer[buffer_marker], GTPUSP_2_PRINT_BUFFER_LEN - buffer_marker, "%s %04ld |",timeofday, octet_index); - } - - /* - * Print every single octet in hexadecimal form - */ - buffer_marker+=snprintf(&_gtpusp_print_buffer[buffer_marker], GTPUSP_2_PRINT_BUFFER_LEN - buffer_marker, " %02x", data_pP[octet_index]); - /* - * Align newline and pipes according to the octets in groups of 2 - */ - } - - /* - * Append enough spaces and put final pipe - */ - for (aindex = octet_index; aindex < 16; ++aindex) - buffer_marker+=snprintf(&_gtpusp_print_buffer[buffer_marker], GTPUSP_2_PRINT_BUFFER_LEN - buffer_marker, " "); - - //SGI_IF_DEBUG(" "); - buffer_marker+=snprintf(&_gtpusp_print_buffer[buffer_marker], GTPUSP_2_PRINT_BUFFER_LEN - buffer_marker, " |\n"); - pr_info("%s",_gtpusp_print_buffer); -} - -// for uplink GTPU traffic on S-GW -//----------------------------------------------------------------------------- -static int _udp_thread(void *data) -//----------------------------------------------------------------------------- -{ - int size, tx_size; - int bufsize = 8192; -#if defined(FLAG_GTPV1U_KERNEL_THREAD_SOCK_NO_WAIT) - int success_read = 0; - int failed_read = 0; -#endif - unsigned char buf[bufsize+1]; - unsigned char gtp_resp[1024]; - - /* kernel thread initialization */ - _gtpusp_sock.running = 1; - - PR_INFO(MODULE_NAME": listening on port %d\n", gtpu_sgw_port); - - /* main loop */ - while(_gtpusp_sock.thread_stop_requested == 0){ - if (kthread_should_stop()) { - _gtpusp_sock.running = 0; - PR_INFO(MODULE_NAME": kthread_stop initiated exit at %lu \n", jiffies); - return -1; //Exit from the thread. Return value will be passed to kthread_stop() - } - size = _gtpusp_ksocket_receive(_gtpusp_sock.sock, &_gtpusp_sock.addr, buf, bufsize); - - if (size <= 0) { - if (size != -EAGAIN) { - pr_info(MODULE_NAME": error getting datagram, sock_recvmsg error = %d\n", size); - } -#if defined(FLAG_GTPV1U_KERNEL_THREAD_SOCK_NO_WAIT) - success_read = 0; - failed_read += 1; - if (failed_read > 10) failed_read = 10; - usleep_range(failed_read*20,failed_read*200); -#endif - } else { -#if defined(FLAG_GTPV1U_KERNEL_THREAD_SOCK_NO_WAIT) - success_read += 1; - failed_read = 0; -#endif - PR_INFO(MODULE_NAME": received %d bytes\n", size); - - if ((tx_size = _gtpusp_ksocket_process_gtp(buf, size, gtp_resp)) > 0) { - //ksocket_send(_gtpusp_sock.sock, &_gtpusp_sock.addr_send, buf, gtp_resp, tx_size, NULL, 0)); - } - } - } - _gtpusp_sock.running = 0; - if (kthread_should_stop()) { - PR_INFO(MODULE_NAME": kthread_stop initiated exit at %lu \n", jiffies); - return -1; //Exit from the thread. Return value will be passed to kthread_stop() - } - PR_INFO(MODULE_NAME": kthread do_exit()\n"); - do_exit(0); -} - -//----------------------------------------------------------------------------- -static int _gtpusp_ksocket_process_gtp(const unsigned char * const rx_buf_pP, const int lenP, unsigned char* tx_buf_pP) -//----------------------------------------------------------------------------- -{ - gtpv1u_msg_t gtpv1u_msg; - uint8_t msg_type; - struct iphdr *iph_p = NULL; - struct iphdr *new_iph_p= NULL; - struct sk_buff *skb_p = NULL; - const unsigned char * rx_buf_p = rx_buf_pP; - int err = 0; - struct rtable *rt = NULL; - struct flowi fl = { - .u = { - .ip4 = { - .daddr = 0, - .flowi4_tos = 0, - .flowi4_scope = RT_SCOPE_UNIVERSE, - } - } - }; - - msg_type = rx_buf_pP[1]; - - switch(msg_type) { - case GTP_ECHO_REQ: - PR_INFO(MODULE_NAME": TODO GTP ECHO_REQ, SEND TO GTPV1U TASK USER SPACE\n"); - //TODO; - return 0; - break; - - case GTP_ERROR_INDICATION: - PR_INFO(MODULE_NAME":TODO GTP ERROR INDICATION, SEND TO GTPV1U TASK USER SPACE\n"); - //TODO; - return 0; - break; - - case GTP_ECHO_RSP: - PR_INFO(MODULE_NAME":GTP ECHO_RSP, SEND TO GTPV1U TASK USER SPACE\n"); - return 0; - break; - - case GTP_GPDU: { - gtpv1u_msg.version = ((*rx_buf_p) & 0xE0) >> 5; - gtpv1u_msg.protocol_type = ((*rx_buf_p) & 0x10) >> 4; - gtpv1u_msg.ext_hdr_flag = ((*rx_buf_p) & 0x04) >> 2; - gtpv1u_msg.seq_num_flag = ((*rx_buf_p) & 0x02) >> 1; - gtpv1u_msg.npdu_num_flag = ((*rx_buf_p) & 0x01); - rx_buf_p++; - - gtpv1u_msg.msg_type = *(rx_buf_p); - rx_buf_p++; - - rx_buf_p += 2; - - gtpv1u_msg.teid = ntohl(*((u_int32_t *)rx_buf_p)); - rx_buf_p += 4; - - if(gtpv1u_msg.ext_hdr_flag || gtpv1u_msg.seq_num_flag || gtpv1u_msg.npdu_num_flag) { - gtpv1u_msg.seq_num = ntohs(*(((u_int16_t *)rx_buf_p))); - rx_buf_p += 2; - gtpv1u_msg.npdu_num = *(rx_buf_p++); - gtpv1u_msg.next_ext_hdr_type = *(rx_buf_p++); - } - - gtpv1u_msg.msg_buf_offset = (u_int32_t)(rx_buf_p - rx_buf_pP); - gtpv1u_msg.msg_buf_len = lenP - gtpv1u_msg.msg_buf_offset; - gtpv1u_msg.msg_len = lenP; - - iph_p = (struct iphdr*)(&rx_buf_pP[gtpv1u_msg.msg_buf_offset]); - - fl.u.ip4.daddr = iph_p->daddr; - fl.u.ip4.flowi4_tos = RT_TOS(iph_p->tos); - - rt = ip_route_output_key(&init_net, &fl.u.ip4); - - if (rt == NULL) { - PR_INFO("GTPURH: Failed to route packet to dst 0x%x. Error: (%d)\n", fl.u.ip4.daddr, err); - return NF_DROP; - } - - if (rt->dst.dev == NULL) { - pr_info("GTPURH: dst dev NULL\n"); - return 0; - } - - skb_p = alloc_skb(LL_MAX_HEADER + ntohs(iph_p->tot_len), GFP_ATOMIC); - if (skb_p == NULL) { - return 0; - } - skb_p->priority = rt_tos2priority(iph_p->tos); - skb_p->pkt_type = PACKET_OTHERHOST; - skb_dst_set(skb_p, dst_clone(&rt->dst)); - skb_p->dev = skb_dst(skb_p)->dev; - - skb_reserve(skb_p, LL_MAX_HEADER + ntohs(iph_p->tot_len)); - skb_p->protocol = htons(ETH_P_IP); - - new_iph_p = (void *)skb_push(skb_p, ntohs(iph_p->tot_len) - (iph_p->ihl << 2)); - skb_reset_transport_header(skb_p); - new_iph_p = (void *)skb_push(skb_p, iph_p->ihl << 2); - memcpy(new_iph_p, iph_p, ntohs(iph_p->tot_len)); - skb_reset_network_header(skb_p); - skb_reset_inner_network_header(skb_p); - skb_reset_inner_transport_header(skb_p); - - skb_p->mark = gtpv1u_msg.teid; - - new_iph_p->ttl = ip4_dst_hoplimit(skb_dst(skb_p)); - skb_p->ip_summed = CHECKSUM_NONE; - - if (skb_p->len > dst_mtu(skb_dst(skb_p))) { - PR_INFO("GTPURH: bad length\n"); - goto free_skb; - } - ip_local_out(skb_p); - return 0; -free_skb: - pr_info("GTPURH: Dropped skb\n"); - kfree_skb(skb_p); - return 0; - } - break; - - default: - PR_INFO(MODULE_NAME":ERROR GTPU msg type %u\n", msg_type); - return 0; - } -} - -//----------------------------------------------------------------------------- -static int _gtpusp_ksocket_receive(struct socket* sock_pP, struct sockaddr_in* addr_pP, unsigned char* buf_pP, int lenP) -//----------------------------------------------------------------------------- -{ - struct msghdr msg; - struct iovec iov; - mm_segment_t oldfs; - int size = 0; - - if (sock_pP->sk==NULL) return 0; - - iov.iov_base = buf_pP; - iov.iov_len = lenP; - -#if defined(FLAG_GTPV1U_KERNEL_THREAD_SOCK_NO_WAIT) - msg.msg_flags = MSG_DONTWAIT; -#else - msg.msg_flags = 0; -#endif - msg.msg_name = addr_pP; - msg.msg_namelen = sizeof(struct sockaddr_in); - msg.msg_control = NULL; - msg.msg_controllen = 0; - msg.msg_iov = &iov; - msg.msg_iovlen = 1; - msg.msg_control = NULL; - - oldfs = get_fs(); - set_fs(KERNEL_DS); - size = sock_recvmsg(sock_pP,&msg,lenP,msg.msg_flags); - set_fs(oldfs); - - return size; -} - -//----------------------------------------------------------------------------- -static int _gtpusp_ksocket_send(struct socket *sock_pP, struct sockaddr_in *addr_pP, unsigned char *gtpuh_pP, int len_gtpP, unsigned char *buf_ip_pP, int len_ipP) -//----------------------------------------------------------------------------- -{ - struct msghdr msg; - struct iovec iov[2]; - mm_segment_t oldfs; - int size = 0; - int err = 0; - int iov_index = 0; - - if ( (err = sock_pP->ops->connect(sock_pP, (struct sockaddr *)addr_pP, sizeof(struct sockaddr), 0)) < 0 ) { - PR_INFO(MODULE_NAME": Could not connect to socket, error = %d\n", -err); - return 0; - } - if (sock_pP->sk == NULL) { - return 0; - } - if ((gtpuh_pP != NULL) && (len_gtpP > 0)) { - iov[iov_index].iov_base = gtpuh_pP; - iov[iov_index].iov_len = len_gtpP; - iov_index += 1; - } - - if ((buf_ip_pP != NULL) && (len_ipP > 0)) { - iov[iov_index].iov_base = buf_ip_pP; - iov[iov_index].iov_len = len_ipP; - iov_index += 1; - } - - msg.msg_flags = 0; - msg.msg_name = addr_pP; - msg.msg_namelen = sizeof(struct sockaddr_in); - msg.msg_control = NULL; - msg.msg_controllen = 0; - msg.msg_iov = iov; - msg.msg_iovlen = iov_index; - msg.msg_control = NULL; - - oldfs = get_fs(); - set_fs(KERNEL_DS); - size = sock_sendmsg(sock_pP,&msg,len_ipP+len_gtpP); - set_fs(oldfs); - - return size; - } - -#ifdef WITH_IPV6 -//----------------------------------------------------------------------------- -static void -_gtpusp_tg6_add(struct sk_buff *old_skb_pP, const struct xt_action_param *par_pP) -{ - //----------------------------------------------------------------------------- - } -#endif - -//----------------------------------------------------------------------------- -static void -_gtpusp_tg4_add(struct sk_buff *old_skb_pP, const struct xt_action_param *par_pP) -{ - //----------------------------------------------------------------------------- - struct iphdr *old_iph_p = ip_hdr(old_skb_pP); - struct gtpuhdr gtpuh; - uint16_t orig_iplen = 0; - // CONNMARK - enum ip_conntrack_info ctinfo; - struct nf_conn *ct = NULL; - u_int32_t newmark; - - if (skb_linearize(old_skb_pP) < 0) { - PR_INFO(MODULE_NAME": skb no linearize\n"); - return; - } - orig_iplen = ntohs(old_iph_p->tot_len); - - //---------------------------------------------------------------------------- - // CONNMARK - //---------------------------------------------------------------------------- - ct = nf_ct_get(old_skb_pP, &ctinfo); - if (ct == NULL) { - PR_INFO(MODULE_NAME": _gtpusp_target_add force targinfo ltun %u to skb_pP mark %u\n", - ((const struct xt_gtpusp_target_info *)(par_pP->targinfo))->ltun, - old_skb_pP->mark); - newmark = ((const struct xt_gtpusp_target_info *)(par_pP->targinfo))->ltun; - } else { - //XT_CONNMARK_RESTORE: - newmark = old_skb_pP->mark ^ ct->mark; - - PR_INFO(MODULE_NAME": _gtpusp_target_add restore mark %u (skb mark %u ct mark %u) len %u sgw addr %x\n", - newmark, old_skb_pP->mark, ct->mark, orig_iplen, - ((const struct xt_gtpusp_target_info *)(par_pP->targinfo))->raddr); - if (newmark != ((const struct xt_gtpusp_target_info *)(par_pP->targinfo))->ltun) { - pr_warn(MODULE_NAME": _gtpusp_target_add restore mark 0x%x mismatch ltun 0x%x (rtun 0x%x)", - newmark, ((const struct xt_gtpusp_target_info *)(par_pP->targinfo))->ltun, - ((const struct xt_gtpusp_target_info *)(par_pP->targinfo))->rtun); - } - } - - - /* Add GTPu header */ - gtpuh.flags = 0x30; /* v1 and Protocol-type=GTP */ - gtpuh.msgtype = 0xff; /* T-PDU */ - gtpuh.length = htons(orig_iplen); - gtpuh.tunid = htonl(((const struct xt_gtpusp_target_info *)(par_pP->targinfo))->rtun); - - _gtpusp_sock.addr_send.sin_addr.s_addr = ((const struct xt_gtpusp_target_info *)(par_pP->targinfo))->raddr; - _gtpusp_ksocket_send(_gtpusp_sock.sock, &_gtpusp_sock.addr_send, (unsigned char*)>puh, sizeof(gtpuh), (unsigned char*)old_iph_p, orig_iplen); - return ; -} - -#ifdef WITH_IPV6 -//----------------------------------------------------------------------------- -static unsigned int -_gtpusp_tg6(struct sk_buff *skb_pP, const struct xt_action_param *par_pP) -{ - //----------------------------------------------------------------------------- - - const struct xt_gtpusp_target_info *tgi_p = par_pP->targinfo; - - if (tgi_p == NULL) { - return NF_ACCEPT; - } - - if (tgi_p->action == PARAM_GTPUSP_ACTION_ADD) { - _gtpusp_tg6_add(skb_pP, par_pP); - return NF_DROP; // TODO - } - - return NF_ACCEPT; -} -#endif - -//----------------------------------------------------------------------------- -static unsigned int -_gtpusp_tg4(struct sk_buff *skb_pP, const struct xt_action_param *par_pP) -{ - //----------------------------------------------------------------------------- - const struct xt_gtpusp_target_info *tgi_p = par_pP->targinfo; - - if (tgi_p == NULL) { - return NF_ACCEPT; - } - - if (tgi_p->action == PARAM_GTPUSP_ACTION_ADD) { - _gtpusp_tg4_add(skb_pP, par_pP); - return NF_DROP; - } - - return NF_ACCEPT; -} - -//----------------------------------------------------------------------------- -static int -__init gtpusp_tg_init(void) -//----------------------------------------------------------------------------- -{ - int err; - - pr_info(MODULE_NAME": Initializing module (KVersion: %d)\n", KVERSION); - pr_info(MODULE_NAME": Copyright Polaris Networks 2010-2011\n"); - pr_info(MODULE_NAME": Modified by EURECOM Lionel GAUTHIER 2014\n"); -#ifndef CMAKER - pr_info(MODULE_NAME": Compiled %s at time %s\n",__DATE__,__TIME__); -#endif -#if defined(WITH_IPV6) - pr_info(MODULE_NAME": IPv4/IPv6 enabled\n"); -#else - pr_info(MODULE_NAME": IPv4 only enabled\n"); -#endif - pr_info(MODULE_NAME": params gtpu_enb_port=%u, gtpu_sgw_port=%u, sgw_addr=%s\n", - gtpu_enb_port, gtpu_sgw_port, sgw_addr); - - // UDP socket socket - memset(&_gtpusp_sock, 0, sizeof(gtpusp_sock_t)); - - /* create a socket */ - if ((err = sock_create(AF_INET, SOCK_DGRAM, IPPROTO_UDP, &_gtpusp_sock.sock)) < 0 ) { - PR_INFO(": Could not create a datagram socket, error = %d\n", -ENXIO); - return err; - } - - _gtpusp_sock.addr.sin_family = AF_INET; - _gtpusp_sock.addr.sin_port = htons(gtpu_sgw_port); - _gtpusp_sock.addr.sin_addr.s_addr = in_aton(sgw_addr); - - _gtpusp_sock.addr_send.sin_family = AF_INET; - _gtpusp_sock.addr_send.sin_port = htons(gtpu_enb_port); - _gtpusp_sock.addr_send.sin_addr.s_addr = in_aton(sgw_addr); - - _gtpusp_sock.thread_stop_requested = 0; - - if ( (err = _gtpusp_sock.sock->ops->bind(_gtpusp_sock.sock, (struct sockaddr *)&_gtpusp_sock.addr, sizeof(struct sockaddr) ) ) < 0) { - pr_info(MODULE_NAME": Could not bind socket, error = %d\n", -err); - goto close_and_out; - } - - // start kernel thread - _gtpusp_sock.thread = kthread_run((void *)_udp_thread, NULL, MODULE_NAME); - if (IS_ERR(_gtpusp_sock.thread)) { - pr_info(MODULE_NAME": unable to start kernel thread\n"); - return -ENOMEM; - } - if((_gtpusp_sock.thread)) { - wake_up_process(_gtpusp_sock.thread); - } - return xt_register_targets(gtpusp_tg_reg, ARRAY_SIZE(gtpusp_tg_reg)); -close_and_out: - sock_release(_gtpusp_sock.sock); - _gtpusp_sock.sock = NULL; - return err; -} - -//----------------------------------------------------------------------------- -static void -__exit gtpusp_tg_exit(void) -//----------------------------------------------------------------------------- -{ - int err; - int loop = 0; - - - if (_gtpusp_sock.thread==NULL) { - pr_info(MODULE_NAME": no kernel thread to kill\n"); - } else { - if (_gtpusp_sock.running > 0) { - _gtpusp_sock.thread_stop_requested = 1; - pr_info(MODULE_NAME": exit kernel thread requested\n"); - do { - pr_info(MODULE_NAME": waking up thread with datagram\n"); - msleep(5); - pr_info(MODULE_NAME": waiting for thread...\n"); - loop++; - } while ((_gtpusp_sock.running > 0) && (loop < 20)); - if (_gtpusp_sock.running > 0) { - pr_info(MODULE_NAME": stopping kernel thread\n"); - err = kthread_stop(_gtpusp_sock.thread); - if(!err) { - pr_info(MODULE_NAME": Successfully killed kernel thread!\n"); - } else { - pr_info(MODULE_NAME": Unsuccessfully killed kernel thread!\n"); - } - } else { - pr_info(MODULE_NAME": Found thread exited by itself\n"); - } - } - } - - /* free allocated resources before exit */ - if (_gtpusp_sock.sock != NULL) { - sock_release(_gtpusp_sock.sock); - _gtpusp_sock.sock = NULL; - } - xt_unregister_targets(gtpusp_tg_reg, ARRAY_SIZE(gtpusp_tg_reg)); - pr_info(MODULE_NAME": Unloading module\n"); -} - - -module_init(gtpusp_tg_init); -module_exit(gtpusp_tg_exit); -MODULE_ALIAS("ipt6_GTPUSP"); -MODULE_ALIAS("ipt_GTPUSP"); - diff --git a/openair-cn/GTPV1-U/GTPU_SP/xt_GTPUSP.h b/openair-cn/GTPV1-U/GTPU_SP/xt_GTPUSP.h deleted file mode 100755 index e4d72f5875..0000000000 --- a/openair-cn/GTPV1-U/GTPU_SP/xt_GTPUSP.h +++ /dev/null @@ -1,23 +0,0 @@ -/* Shared header file for iptables extension for the GTPU target and GTPu KLM - * - * Copyright (c) 2010-2011 Polaris Networks - * Author: Pradip Biswas <pradip_biswas@polarisnetworks.net> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - -enum xt_gtpusp_mode_ { - PARAM_GTPUSP_ACTION_ADD = 1 << 8, -}; - -struct xt_gtpusp_target_info { - u_int32_t laddr __attribute__((aligned(8))); - u_int32_t raddr __attribute__((aligned(8))); - u_int32_t ltun __attribute__((aligned(8))); - u_int32_t rtun __attribute__((aligned(8))); - u_int32_t action __attribute__((aligned(8))); -}; - diff --git a/openair-cn/GTPV1-U/Makefile.am b/openair-cn/GTPV1-U/Makefile.am index cb8acf56c3..34df3ff5c9 100644 --- a/openair-cn/GTPV1-U/Makefile.am +++ b/openair-cn/GTPV1-U/Makefile.am @@ -21,7 +21,7 @@ # Contact Information # OpenAirInterface Admin: openair_admin@eurecom.fr # OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@eurecom.fr +# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr # # Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. # diff --git a/openair-cn/GTPV1-U/Makefile.eNB b/openair-cn/GTPV1-U/Makefile.eNB index 1347eb2c29..97920f114f 100644 --- a/openair-cn/GTPV1-U/Makefile.eNB +++ b/openair-cn/GTPV1-U/Makefile.eNB @@ -21,7 +21,7 @@ # Contact Information # OpenAirInterface Admin: openair_admin@eurecom.fr # OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@eurecom.fr +# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr # # Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. # diff --git a/openair-cn/GTPV1-U/gtpv1u.h b/openair-cn/GTPV1-U/gtpv1u.h index 3409505158..264fedfe77 100644 --- a/openair-cn/GTPV1-U/gtpv1u.h +++ b/openair-cn/GTPV1-U/gtpv1u.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/GTPV1-U/gtpv1u_eNB.c b/openair-cn/GTPV1-U/gtpv1u_eNB.c index 704123c3b2..ca492469b1 100644 --- a/openair-cn/GTPV1-U/gtpv1u_eNB.c +++ b/openair-cn/GTPV1-U/gtpv1u_eNB.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/GTPV1-U/gtpv1u_eNB_defs.h b/openair-cn/GTPV1-U/gtpv1u_eNB_defs.h index 81f00005d9..916d4459d9 100644 --- a/openair-cn/GTPV1-U/gtpv1u_eNB_defs.h +++ b/openair-cn/GTPV1-U/gtpv1u_eNB_defs.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/GTPV1-U/gtpv1u_eNB_task.h b/openair-cn/GTPV1-U/gtpv1u_eNB_task.h index ce6643b131..b06777a55d 100755 --- a/openair-cn/GTPV1-U/gtpv1u_eNB_task.h +++ b/openair-cn/GTPV1-U/gtpv1u_eNB_task.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/GTPV1-U/gtpv1u_sgw_defs.h b/openair-cn/GTPV1-U/gtpv1u_sgw_defs.h index a525c388a2..d40410f3b7 100644 --- a/openair-cn/GTPV1-U/gtpv1u_sgw_defs.h +++ b/openair-cn/GTPV1-U/gtpv1u_sgw_defs.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/GTPV1-U/gtpv1u_task.c b/openair-cn/GTPV1-U/gtpv1u_task.c index f98db6056e..f17a0fdd0e 100644 --- a/openair-cn/GTPV1-U/gtpv1u_task.c +++ b/openair-cn/GTPV1-U/gtpv1u_task.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/GTPV1-U/gtpv1u_teid_pool.c b/openair-cn/GTPV1-U/gtpv1u_teid_pool.c index 3cbafd8979..32db1ff47e 100644 --- a/openair-cn/GTPV1-U/gtpv1u_teid_pool.c +++ b/openair-cn/GTPV1-U/gtpv1u_teid_pool.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/GTPV2-C/Makefile.am b/openair-cn/GTPV2-C/Makefile.am deleted file mode 100644 index 4bbb12ed0d..0000000000 --- a/openair-cn/GTPV2-C/Makefile.am +++ /dev/null @@ -1,29 +0,0 @@ -################################################################################ -# 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@eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ -SUBDIRS = nwgtpv2c-0.11/ \ No newline at end of file diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/AUTHORS b/openair-cn/GTPV2-C/nwgtpv2c-0.11/AUTHORS deleted file mode 100644 index b068a40fdd..0000000000 --- a/openair-cn/GTPV2-C/nwgtpv2c-0.11/AUTHORS +++ /dev/null @@ -1 +0,0 @@ -Amit Chawre diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/COPYING b/openair-cn/GTPV2-C/nwgtpv2c-0.11/COPYING deleted file mode 100644 index d27832d6c1..0000000000 --- a/openair-cn/GTPV2-C/nwgtpv2c-0.11/COPYING +++ /dev/null @@ -1,26 +0,0 @@ -Copyright (c) 2010-2011 Amit Chawre <http://www.amitchawre.net/contact.html> -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -1. Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. -3. The name of the author may not be used to endorse or promote products -derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/ChangeLog b/openair-cn/GTPV2-C/nwgtpv2c-0.11/ChangeLog deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/Makefile.am b/openair-cn/GTPV2-C/nwgtpv2c-0.11/Makefile.am deleted file mode 100644 index 2b8e86b1a2..0000000000 --- a/openair-cn/GTPV2-C/nwgtpv2c-0.11/Makefile.am +++ /dev/null @@ -1,6 +0,0 @@ -# this is example-file: Makefile.am - -# the subdirectories of the project to go into -SUBDIRS = \ - src\ - test-app diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/NEWS b/openair-cn/GTPV2-C/nwgtpv2c-0.11/NEWS deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/README b/openair-cn/GTPV2-C/nwgtpv2c-0.11/README deleted file mode 100644 index 8aa79638e9..0000000000 --- a/openair-cn/GTPV2-C/nwgtpv2c-0.11/README +++ /dev/null @@ -1,168 +0,0 @@ - -INTRODUCTION ------------- - -nwGtpv2c library is a free and open source implementation of GPRS Tunneling -Protocol v2, also known as eGTP-C, as per 3GPP TS-29274. - -The stack library supports transaction management, message creation and parsing, -message validation, echo response and retransmission management. Other than -this, timer and memory management functions are also built into the stack. - -The library is published under BSD three clause license. - - -DESIGN PHILOSPHY ----------------- - -The stack is designed for high portability not only for the hardware and OS -it will run on but also for the application software that uses it. The stack -doesn't mandate conditions on the user application architecture or design. -The stack relies on the user application for infrastructure utilities such -as I/O, timers, logs and multithreading. This realized by using callback -mechanisms and enables the stack library to seamlessly integrate without or -very little changes to the existing application framework. - -The stack is fully-asynchronous in design for compatibility with event loop -mechanisms such as select, poll, etc. and can also be used for multi-threaded -applications. It should compile on Linux, BSD, Mac OS X, Solaris and Windows -(cygwin). - -The stack architecture builds upon following mentioned entities that are -external to it: - - +-------------+ +---------+ +---------+ - | ULP ENTITY | | TMR MGR | | LOG MGR | - +------+------+ +----+----+ +----+----+ - | | | - +------+------------------+------------------+----+ - | | - | NWGTPv2 STACK | - | | - +-------------------------+-----------------------+ - | - +------+------+ - | UDP ENTITY | - +-------------+ - - -- User Layer Protocol (ULP) Entity: -This entity is the one which decides behaviour of the GTP user application. -This layer implements the intelligent logic for the GTP application and sits -on top of the GTP stack. This layer may also execute functions other than GTP -procedures for example authetication. - -- UDP Entity: -This is the layer below the GTP stack and is responsible for UDP I/O between -the stack and network. This layer shall manage the socket interface. This entity -abstracts the stack library's view of the network. This may be useful in a -multiprocess load balancing application wherein the GTP messages are received -by a GTP load distribution entity and relayed to multiple GTP stacks over -internal messaging. It may or may not be housed with/in ULP. - -- Timer Manager Entity: -Timer Manager Entity provides the GTP stack library with infrastructure for -timer CRUD operations. It may or may not be housed with/in ULP. - -- Log Manager Entity: -Log Manager Entity provides the GTP stack library with callbacks for logging -operations. It may or may not be housed with/in ULP. - - -Optionally, there may be a user level "Stack Management Entity" which shall be -resposible for creating and configuring the stack library, though the stack -library is not aware of any such entity. - -The application may implement all above entities as a single or multiple object. -The external entities need to register callbacks with GTP stack library for -receiving APIs from the stack library and stack library exposes API for the same. - -The GTP stack library doesn't implement any execution threads of its own. It is -up-to user application if it want to call the library APIs via multiple threads. -The stack library, though, currently DOES NOT protect its critical section and -hence, is NOT threadsafe. - - -FEATURES --------- - -- TS 29.274 (Release 9) compliance target for gtp-c -- Message Encoding -- Reliable Message Delivery -- Message Parser -- Message Integrity and Error Checking -- Support for S11, S5 and S8 SAE/EPC interfaces -- Easy Application Integration - - -APPLICATIONS ------------- - -In general, the GTP stack library may be used to write any GTP version 2 based -application. -The GTP stack library can also be used by applications implementing LTE MME, SGW -or PDN Gateways and simulators/emulators for either of them. Please see the test -applications involving basic GTP procedures. - -The test applications use libevent-1.4 library for I/O and timer infrastructure, -(http://www.monkey.org/~provos/libevent-1.4.14b-stable.tar.gz). -Following is a brief description of the test applications: - -- nw-helloworld -This is minimalistic program demostrating usage of nw-gtpv2 library. It -demostrates ulp, udp, tmrmgr and logmgr entities as well as stack construction -and destruction. The gtpv2c test application creates a transaction and sends -a initial request messages over it. - -- nw-egpting -egtping is a utility for pinging a GPRS Tunneling Protocol (GTP) version 2, -or Evolved GTP (eGTP) using Echo Request/Response. - -- nw-epc -The nw-epc software package is a free and open source framework implementation -of SGW and PGW built upon nw-gtpv2. - - -LICENSE -------- - -Copyright (c) 2010-2011 Amit Chawre <http://www.amitchawre.net/contact.html> -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -3. The name of the author may not be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -DISCLAIMER ----------- - -THIS INFORMATION IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -THIS INFORMATION, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/configure.ac b/openair-cn/GTPV2-C/nwgtpv2c-0.11/configure.ac deleted file mode 100644 index c9284f575e..0000000000 --- a/openair-cn/GTPV2-C/nwgtpv2c-0.11/configure.ac +++ /dev/null @@ -1,58 +0,0 @@ -# this is example-file: configure.ac - -# initial information about the project -AC_INIT([NwGtpv2c],[0.11],[]) - -# check if the source folder is correct -AC_CONFIG_SRCDIR([src/NwGtpv2c.c]) - -# Checks for programs - -# check for C++ preprocessor and compiler and the library compiler -AC_PROG_CXXCPP -AC_PROG_CXX -AC_PROG_RANLIB - -# automake initialisation and check for minimal automake API version 1.9 -AM_INIT_AUTOMAKE([1.9]) - -# use the C compiler for the following checks -AC_LANG([C]) -AC_C_INLINE - -# Checks for header files. -AC_HEADER_STDC -AC_CHECK_HEADERS([fcntl.h]) -AC_CHECK_HEADERS([string]) -AC_CHECK_HEADERS([iostream]) -AC_CHECK_HEADERS([arpa/inet.h]) -AC_CHECK_HEADERS([sys/time.h]) -AC_CHECK_HEADERS([sys/socket.h]) - -AC_CHECK_FUNCS([strerror]) -AC_CHECK_FUNCS([socket]) -AC_CHECK_FUNCS([memset]) -AC_CHECK_FUNCS([gettimeofday]) -AC_FUNC_MALLOC -AC_PROG_LN_S - -AC_CHECK_LIB([event], [event_init]) -AM_CONDITIONAL([ENABLE_TESTS_APP], [test x$HAVE_LIBEVENT == xyes]) - -# Checks for typedefs, structures, and compiler characteristics. -AC_TYPE_SIZE_T - -# distribute additional compiler and linker flags -# --> set these variables instead of CXXFLAGS or LDFLAGS -AC_SUBST([AM_CFLAGS]) -AC_SUBST([AM_LDFLAGS]) - -# files to generate via autotools (.am or .in source files) -AC_CONFIG_FILES([Makefile]) -AC_CONFIG_FILES([src/Makefile]) -AC_CONFIG_FILES([test-app/Makefile]) -AC_CONFIG_FILES([test-app/nw-helloworld/Makefile]) -AC_CONFIG_FILES([test-app/nw-egtping/Makefile]) - -# generate the final Makefile etc. -AC_OUTPUT diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/include/NwGtpv2cLog.h b/openair-cn/GTPV2-C/nwgtpv2c-0.11/include/NwGtpv2cLog.h deleted file mode 100644 index b35694b966..0000000000 --- a/openair-cn/GTPV2-C/nwgtpv2c-0.11/include/NwGtpv2cLog.h +++ /dev/null @@ -1,83 +0,0 @@ -/*----------------------------------------------------------------------------* - * * - * n w - g t p v 2 c * - * G P R S T u n n e l i n g P r o t o c o l v 2 c S t a c k * - * * - * * - * Copyright (c) 2010-2011 Amit Chawre * - * All rights reserved. * - * * - * Redistribution and use in source and binary forms, with or without * - * modification, are permitted provided that the following conditions * - * are met: * - * * - * 1. Redistributions of source code must retain the above copyright * - * notice, this list of conditions and the following disclaimer. * - * 2. Redistributions in binary form must reproduce the above copyright * - * notice, this list of conditions and the following disclaimer in the * - * documentation and/or other materials provided with the distribution. * - * 3. The name of the author may not be used to endorse or promote products * - * derived from this software without specific prior written permission. * - * * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - *----------------------------------------------------------------------------*/ - -#ifndef __NW_GTPV2C_LOG_H__ -#define __NW_GTPV2C_LOG_H__ - -#include <stdio.h> -#include "NwLog.h" - -/** - * @file NwGtpv2cLog.h - * @brief This header contains logging related definitions. -*/ - -#ifdef __cplusplus -extern "C" { -#endif - -/*--------------------------------------------------------------------------- - * Log Macro Definition - *--------------------------------------------------------------------------*/ - -#define NW_LOG(_gtpv2cHandle, _logLevel, ...) \ - do { \ - if(((NwGtpv2cStackT*)(_gtpv2cHandle))->logLevel >= _logLevel) \ - { \ - char _logBuf[1024]; \ - snprintf(_logBuf, 1024, __VA_ARGS__); \ - ((NwGtpv2cStackT*)(_gtpv2cHandle))->logMgr.logReqCallback(((NwGtpv2cStackT*)_gtpv2cHandle)->logMgr.logMgrHandle, _logLevel, __FILE__, __LINE__, _logBuf);\ - } \ - } while(0) - -#define NW_ENTER(_gtpv2cHandle) \ - do { \ - NW_LOG(_gtpv2cHandle, NW_LOG_LEVEL_DEBG, "Entering '%s'", __func__);\ - } while(0) - -#define NW_LEAVE(_gtpv2cHandle) \ - do { \ - NW_LOG(_gtpv2cHandle, NW_LOG_LEVEL_DEBG, "Leaving '%s'", __func__);\ - } while(0) - -#ifdef __cplusplus -} -#endif - -#endif /* __NW_TYPES_H__ */ - - -/*--------------------------------------------------------------------------* - * E N D O F F I L E * - *--------------------------------------------------------------------------*/ - diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/include/NwGtpv2cMsgIeParseInfo.h b/openair-cn/GTPV2-C/nwgtpv2c-0.11/include/NwGtpv2cMsgIeParseInfo.h deleted file mode 100644 index 38a37a5d4a..0000000000 --- a/openair-cn/GTPV2-C/nwgtpv2c-0.11/include/NwGtpv2cMsgIeParseInfo.h +++ /dev/null @@ -1,95 +0,0 @@ -/*----------------------------------------------------------------------------* - * * - * n w - g t p v 2 c * - * G P R S T u n n e l i n g P r o t o c o l v 2 c S t a c k * - * * - * * - * Copyright (c) 2010-2011 Amit Chawre * - * All rights reserved. * - * * - * Redistribution and use in source and binary forms, with or without * - * modification, are permitted provided that the following conditions * - * are met: * - * * - * 1. Redistributions of source code must retain the above copyright * - * notice, this list of conditions and the following disclaimer. * - * 2. Redistributions in binary form must reproduce the above copyright * - * notice, this list of conditions and the following disclaimer in the * - * documentation and/or other materials provided with the distribution. * - * 3. The name of the author may not be used to endorse or promote products * - * derived from this software without specific prior written permission. * - * * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - *----------------------------------------------------------------------------*/ - -#ifndef __NW_GTPV2C_MSG_PARSE_INFO_H__ -#define __NW_GTPV2C_MSG_PARSE_INFO_H__ - -#include "NwTypes.h" -#include "NwGtpv2c.h" - -/** - * @file NwGtpv2cMsgParseInfo.h - * @brief This file defines APIs for to parse incoming messages. -*/ - -typedef struct { - uint8_t groupedIeType; - uint16_t mandatoryIeCount; - NwGtpv2cStackHandleT hStack; - - struct { - uint8_t ieMinLength; - uint8_t iePresence; - } ieParseInfo[NW_GTPV2C_IE_TYPE_MAXIMUM][NW_GTPV2C_IE_INSTANCE_MAXIMUM]; - -} NwGtpv2cGroupedIeParseInfoT; - -typedef struct { - uint16_t msgType; - uint16_t mandatoryIeCount; - NwGtpv2cStackHandleT hStack; - - struct { - uint8_t ieMinLength; - uint8_t iePresence; - NwGtpv2cGroupedIeParseInfoT* pGroupedIeInfo; - } ieParseInfo[NW_GTPV2C_IE_TYPE_MAXIMUM][NW_GTPV2C_IE_INSTANCE_MAXIMUM]; - -} NwGtpv2cMsgIeParseInfoT; - -#ifdef __cplusplus -extern "C" { -#endif - -NwGtpv2cMsgIeParseInfoT* -nwGtpv2cMsgIeParseInfoNew(NwGtpv2cStackHandleT hStack, uint8_t msgType); - -NwRcT -nwGtpv2cMsgIeParseInfoDelete(NwGtpv2cMsgIeParseInfoT* thiz); - -NwRcT -nwGtpv2cMsgIeParse(NW_IN NwGtpv2cMsgIeParseInfoT* thiz, - NW_IN NwGtpv2cMsgHandleT hMsg, - NW_INOUT NwGtpv2cErrorT *pError); - -#ifdef __cplusplus -} -#endif - -#endif /* __NW_GTPV2C_MSG_PARSE_INFO_H__ */ - - -/*--------------------------------------------------------------------------* - * E N D O F F I L E * - *--------------------------------------------------------------------------*/ - diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/include/NwGtpv2cPrivate.h b/openair-cn/GTPV2-C/nwgtpv2c-0.11/include/NwGtpv2cPrivate.h deleted file mode 100644 index 29be2c3f29..0000000000 --- a/openair-cn/GTPV2-C/nwgtpv2c-0.11/include/NwGtpv2cPrivate.h +++ /dev/null @@ -1,237 +0,0 @@ -/*----------------------------------------------------------------------------* - * * - * n w - g t p v 2 c * - * G P R S T u n n e l i n g P r o t o c o l v 2 c S t a c k * - * * - * * - * Copyright (c) 2010-2011 Amit Chawre * - * All rights reserved. * - * * - * Redistribution and use in source and binary forms, with or without * - * modification, are permitted provided that the following conditions * - * are met: * - * * - * 1. Redistributions of source code must retain the above copyright * - * notice, this list of conditions and the following disclaimer. * - * 2. Redistributions in binary form must reproduce the above copyright * - * notice, this list of conditions and the following disclaimer in the * - * documentation and/or other materials provided with the distribution. * - * 3. The name of the author may not be used to endorse or promote products * - * derived from this software without specific prior written permission. * - * * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - *----------------------------------------------------------------------------*/ - -#ifndef __NW_GTPV2C_PRIVATE_H__ -#define __NW_GTPV2C_PRIVATE_H__ - -#include <sys/time.h> - -#include "tree.h" -#include "queue.h" - -#include "NwTypes.h" -#include "NwError.h" -#include "NwGtpv2c.h" -#include "NwGtpv2cIe.h" -#include "NwGtpv2cMsg.h" -#include "NwGtpv2cMsgIeParseInfo.h" -#include "NwGtpv2cTunnel.h" - -/** - * @file NwGtpv2cPrivate.h - * @brief This header file contains nw-gtpv2c private definitions not to be - * exposed to user application. -*/ - -#ifdef __cplusplus -extern "C" { -#endif - -#define NW_GTPV2C_MALLOC(_stack, _size, _mem, _type) \ - do { \ - if(((NwGtpv2cStackT*)(_stack))->memMgr.memAlloc && ((NwGtpv2cStackT*)(_stack))->memMgr.memFree )\ - { \ - _mem = (_type) ((NwGtpv2cStackT*) (_stack))->memMgr.memAlloc(((NwGtpv2cStackT*) (_stack))->memMgr.hMemMgr, _size, __FILE__, __LINE__);\ - } \ - else \ - { \ - _mem = (_type) malloc (_size); \ - } \ - } while (0) - -#define NW_GTPV2C_FREE(_stack, _mem) \ - do { \ - if(((NwGtpv2cStackT*)(_stack))->memMgr.memAlloc && ((NwGtpv2cStackT*)(_stack))->memMgr.memFree )\ - { \ - ((NwGtpv2cStackT*)(_stack))->memMgr.memFree(((NwGtpv2cStackT*) (_stack))->memMgr.hMemMgr, _mem, __FILE__, __LINE__);\ - } \ - else \ - { \ - free ((void*)_mem); \ - } \ - } while (0) - -/*--------------------------------------------------------------------------* - * G T P V 2 C S T A C K O B J E C T T Y P E D E F I N I T I O N * - *--------------------------------------------------------------------------*/ - -/** - * gtpv2c stack class definition - */ - -typedef struct NwGtpv2cStack { - uint32_t id; - NwGtpv2cUlpEntityT ulp; - NwGtpv2cUdpEntityT udp; - NwGtpv2cMemMgrEntityT memMgr; - NwGtpv2cTimerMgrEntityT tmrMgr; - NwGtpv2cLogMgrEntityT logMgr; - - uint32_t seqNum; - uint32_t logLevel; - uint32_t restartCounter; - - NwGtpv2cMsgIeParseInfoT *pGtpv2cMsgIeParseInfo[NW_GTP_MSG_END]; - struct NwGtpv2cTimeoutInfo *activeTimerInfo; - - RB_HEAD( NwGtpv2cTunnelMap, NwGtpv2cTunnel ) tunnelMap; - RB_HEAD( NwGtpv2cOutstandingTxSeqNumTrxnMap, NwGtpv2cTrxn ) outstandingTxSeqNumMap; - RB_HEAD( NwGtpv2cOutstandingRxSeqNumTrxnMap, NwGtpv2cTrxn ) outstandingRxSeqNumMap; - RB_HEAD( NwGtpv2cActiveTimerList, NwGtpv2cTimeoutInfo ) activeTimerList; - NwHandleT hTmrMinHeap; -} NwGtpv2cStackT; - - -/*--------------------------------------------------------------------------* - * Timeout Info Type Definition - *--------------------------------------------------------------------------*/ - -/** - * gtpv2c timeout info - */ - -typedef struct NwGtpv2cTimeoutInfo { - NwGtpv2cStackHandleT hStack; - struct timeval tvTimeout; - uint32_t tmrType; - void* timeoutArg; - NwRcT (*timeoutCallbackFunc)(void*); - NwGtpv2cTimerHandleT hTimer; - RB_ENTRY (NwGtpv2cTimeoutInfo) activeTimerListRbtNode; /**< RB Tree Data Structure Node */ - uint32_t timerMinHeapIndex; - struct NwGtpv2cTimeoutInfo *next; -} NwGtpv2cTimeoutInfoT; - - -/*--------------------------------------------------------------------------- - * GTPv2c Message Container Definition - *--------------------------------------------------------------------------*/ - -#define NW_GTPV2C_MAX_MSG_LEN (1024) /**< Maximum supported gtpv2c packet length including header */ - -/** - * NwGtpv2cMsgT holds gtpv2c messages to/from the peer. - */ -typedef struct NwGtpv2cMsgS { - uint8_t version; - uint8_t teidPresent; - uint8_t msgType; - uint16_t msgLen; - uint32_t teid; - uint32_t seqNum; - uint8_t* pMsgStart; - -#define NW_GTPV2C_MAX_GROUPED_IE_DEPTH (2) - struct { - NwGtpv2cIeTlvT *pIe[NW_GTPV2C_MAX_GROUPED_IE_DEPTH]; - uint8_t top; - } groupedIeEncodeStack; - - NwBoolT isIeValid[NW_GTPV2C_IE_TYPE_MAXIMUM][NW_GTPV2C_IE_INSTANCE_MAXIMUM]; - uint8_t *pIe[NW_GTPV2C_IE_TYPE_MAXIMUM][NW_GTPV2C_IE_INSTANCE_MAXIMUM]; - uint8_t msgBuf[NW_GTPV2C_MAX_MSG_LEN]; - NwGtpv2cStackHandleT hStack; - struct NwGtpv2cMsgS* next; -} NwGtpv2cMsgT; - -/** - * Transaction structure - */ - -typedef struct NwGtpv2cTrxn { - uint32_t seqNum; - uint32_t peerIp; - uint32_t peerPort; - uint8_t t3Timer; - uint8_t maxRetries; - NwGtpv2cMsgT* pMsg; - NwGtpv2cStackT* pStack; - NwGtpv2cTimerHandleT hRspTmr; /**< Handle to reponse timer */ - NwGtpv2cTunnelHandleT hTunnel; /**< Handle to local tunnel context */ - NwGtpv2cUlpTrxnHandleT hUlpTrxn; /**< Handle to ULP tunnel context */ - RB_ENTRY (NwGtpv2cTrxn) outstandingTxSeqNumMapRbtNode; /**< RB Tree Data Structure Node */ - RB_ENTRY (NwGtpv2cTrxn) outstandingRxSeqNumMapRbtNode; /**< RB Tree Data Structure Node */ - struct NwGtpv2cTrxn* next; -} NwGtpv2cTrxnT; - -/** - * GTPv2c Path Context - */ - -typedef struct NwGtpv2cPathS { - uint32_t hUlpPath; /**< Handle to ULP path contect */ - uint32_t ipv4Address; - uint32_t restartCounter; - uint16_t t3ResponseTimout; - uint16_t n3RequestCount; - NwGtpv2cTimerHandleT hKeepAliveTmr; /**< Handle to path keep alive echo timer */ - RB_ENTRY (NwGtpv2cPathS) pathMapRbtNode; -} NwGtpv2cPathT; - - -RB_PROTOTYPE(NwGtpv2cTunnelMap, NwGtpv2cTunnel, tunnelMapRbtNode, nwGtpv2cCompareTunnel) -RB_PROTOTYPE(NwGtpv2cOutstandingTxSeqNumTrxnMap, NwGtpv2cTrxn, outstandingTxSeqNumMapRbtNode, nwGtpv2cCompareSeqNum) -RB_PROTOTYPE(NwGtpv2cOutstandingRxSeqNumTrxnMap, NwGtpv2cTrxn, outstandingRxSeqNumMapRbtNode, nwGtpv2cCompareSeqNum) -RB_PROTOTYPE(NwGtpv2cActiveTimerList, NwGtpv2cTimeoutInfo, activeTimerListRbtNode, nwGtpv2cCompareOutstandingTxRexmitTime) - -/** - * Start Timer with ULP Timer Manager - */ - -NwRcT -nwGtpv2cStartTimer(NwGtpv2cStackT* thiz, - uint32_t timeoutSec, - uint32_t timeoutUsec, - uint32_t tmrType, - NwRcT (*timeoutCallbackFunc)(void*), - void* timeoutCallbackArg, - NwGtpv2cTimerHandleT *phTimer); - - -/** - * Stop Timer with ULP Timer Manager - */ - -NwRcT -nwGtpv2cStopTimer(NwGtpv2cStackT* thiz, - NwGtpv2cTimerHandleT hTimer); - -#ifdef __cplusplus -} -#endif - -#endif /* __NW_GTPV2C_PRIVATE_H__ */ -/*--------------------------------------------------------------------------* - * E N D O F F I L E * - *--------------------------------------------------------------------------*/ - diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/include/NwGtpv2cTrxn.h b/openair-cn/GTPV2-C/nwgtpv2c-0.11/include/NwGtpv2cTrxn.h deleted file mode 100644 index 26ae1875c3..0000000000 --- a/openair-cn/GTPV2-C/nwgtpv2c-0.11/include/NwGtpv2cTrxn.h +++ /dev/null @@ -1,117 +0,0 @@ -/*----------------------------------------------------------------------------* - * * - * n w - g t p v 2 c * - * G P R S T u n n e l i n g P r o t o c o l v 2 c S t a c k * - * * - * * - * Copyright (c) 2010-2011 Amit Chawre * - * All rights reserved. * - * * - * Redistribution and use in source and binary forms, with or without * - * modification, are permitted provided that the following conditions * - * are met: * - * * - * 1. Redistributions of source code must retain the above copyright * - * notice, this list of conditions and the following disclaimer. * - * 2. Redistributions in binary form must reproduce the above copyright * - * notice, this list of conditions and the following disclaimer in the * - * documentation and/or other materials provided with the distribution. * - * 3. The name of the author may not be used to endorse or promote products * - * derived from this software without specific prior written permission. * - * * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - *----------------------------------------------------------------------------*/ - -/** - * @file NwGtpv2cTrxn.h - * @author Amit Chawre - * @brief - * - * This header file contains required definitions and functions - * prototypes used by gtpv2c transactions. - * - **/ - - -#ifndef __NW_GTPV2C_TRXN_H__ -#define __NW_GTPV2C_TRXN_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * Constructotr - */ -NwGtpv2cTrxnT* -nwGtpv2cTrxnNew( NW_IN NwGtpv2cStackT* pStack); - -/** - * Overloaded Constructotr - */ -NwGtpv2cTrxnT* -nwGtpv2cTrxnWithSeqNumNew( NW_IN NwGtpv2cStackT* pStack, - NW_IN uint32_t seqNum); - -/** - * Another overloaded constructor. Create transaction as outstanding - * RX transaction for detecting duplicated requests. - * - * @param[in] thiz : Pointer to stack. - * @param[in] teidLocal : Trxn teid. - * @param[in] peerIp : Peer Ip address. - * @param[in] peerPort : Peer Ip port. - * @param[in] seqNum : Seq Number. - * @return NW_OK on success. - */ - -NwGtpv2cTrxnT* -nwGtpv2cTrxnOutstandingRxNew( NW_IN NwGtpv2cStackT* pStack, - NW_IN uint32_t teidLocal, - NW_IN uint32_t peerIp, - NW_IN uint32_t peerPort, - NW_IN uint32_t seqNum); - -NwRcT -nwGtpv2cTrxnDelete( NW_INOUT NwGtpv2cTrxnT **ppTrxn); - -/** - * Start timer to wait before pruginf a req tran for which response has been sent - * - * @param[in] thiz : Pointer to transaction - * @return NW_OK on success. - */ - -NwRcT -nwGtpv2cTrxnStartDulpicateRequestWaitTimer(NwGtpv2cTrxnT* thiz); - -/** - * Start timer to wait for rsp of a req message - * - * @param[in] thiz : Pointer to transaction - * @param[in] timeoutCallbackFunc : Timeout handler callback function. - * @return NW_OK on success. - */ - -NwRcT -nwGtpv2cTrxnStartPeerRspWaitTimer(NwGtpv2cTrxnT* thiz); - -#ifdef __cplusplus -} -#endif - -#endif /* __NW_GTPV2C_TRXN_H__ */ - -/*--------------------------------------------------------------------------* - * E N D O F F I L E * - *--------------------------------------------------------------------------*/ - diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/include/NwGtpv2cTunnel.h b/openair-cn/GTPV2-C/nwgtpv2c-0.11/include/NwGtpv2cTunnel.h deleted file mode 100644 index 33c437ada7..0000000000 --- a/openair-cn/GTPV2-C/nwgtpv2c-0.11/include/NwGtpv2cTunnel.h +++ /dev/null @@ -1,79 +0,0 @@ -/*----------------------------------------------------------------------------* - * * - * n w - g t p v 2 c * - * G P R S T u n n e l i n g P r o t o c o l v 2 c S t a c k * - * * - * * - * Copyright (c) 2010-2011 Amit Chawre * - * All rights reserved. * - * * - * Redistribution and use in source and binary forms, with or without * - * modification, are permitted provided that the following conditions * - * are met: * - * * - * 1. Redistributions of source code must retain the above copyright * - * notice, this list of conditions and the following disclaimer. * - * 2. Redistributions in binary form must reproduce the above copyright * - * notice, this list of conditions and the following disclaimer in the * - * documentation and/or other materials provided with the distribution. * - * 3. The name of the author may not be used to endorse or promote products * - * derived from this software without specific prior written permission. * - * * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - *----------------------------------------------------------------------------*/ - -#ifndef __NW_GTPV2C_TUNNEL_H__ -#define __NW_GTPV2C_TUNNEL_H__ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "tree.h" -#include "NwTypes.h" -#include "NwUtils.h" -#include "NwError.h" -#include "NwGtpv2c.h" - -#ifdef __cplusplus -extern "C" { -#endif - -struct NwGtpv2cStack; - -typedef struct NwGtpv2cTunnel { - uint32_t teid; - uint32_t ipv4AddrRemote; - NwGtpv2cUlpTunnelHandleT hUlpTunnel; - RB_ENTRY (NwGtpv2cTunnel) tunnelMapRbtNode; /**< RB Tree Data Structure Node */ - struct NwGtpv2cTunnel* next; -} NwGtpv2cTunnelT; - -NwGtpv2cTunnelT* -nwGtpv2cTunnelNew(struct NwGtpv2cStack *hStack, uint32_t teid, uint32_t peerIpv4Addr, NwGtpv2cUlpTunnelHandleT hUlpTunnel); - -NwRcT -nwGtpv2cTunnelDelete(struct NwGtpv2cStack *pStack, NwGtpv2cTunnelT* thiz); - -NwRcT -nwGtpv2cTunnelGetUlpTunnelHandle( NwGtpv2cTunnelT* thiz, NwGtpv2cUlpTunnelHandleT* phUlpTunnel); - -#ifdef __cplusplus -} -#endif - -#endif - -/*--------------------------------------------------------------------------* - * E N D O F F I L E * - *--------------------------------------------------------------------------*/ - diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/include/queue.h b/openair-cn/GTPV2-C/nwgtpv2c-0.11/include/queue.h deleted file mode 100644 index 457220bc98..0000000000 --- a/openair-cn/GTPV2-C/nwgtpv2c-0.11/include/queue.h +++ /dev/null @@ -1,566 +0,0 @@ -/* - * Copyright (c) 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)queue.h 8.5 (Berkeley) 8/20/94 - * $FreeBSD: src/sys/sys/queue.h,v 1.32.2.6 2001/12/18 10:09:02 ru Exp $ - */ - -#ifndef _SYS_QUEUE_H_ -#define _SYS_QUEUE_H_ - - -/* - * This file defines five types of data structures: singly-linked lists, - * singly-linked tail queues, lists, tail queues, and circular queues. - * - * A singly-linked list is headed by a single forward pointer. The elements - * are singly linked for minimum space and pointer manipulation overhead at - * the expense of O(n) removal for arbitrary elements. New elements can be - * added to the list after an existing element or at the head of the list. - * Elements being removed from the head of the list should use the explicit - * macro for this purpose for tmpimum efficiency. A singly-linked list may - * only be traversed in the forward direction. Singly-linked lists are ideal - * for applications with large datasets and few or no removals or for - * implementing a LIFO queue. - * - * A singly-linked tail queue is headed by a pair of pointers, one to the - * head of the list and the other to the tail of the list. The elements are - * singly linked for minimum space and pointer manipulation overhead at the - * expense of O(n) removal for arbitrary elements. New elements can be added - * to the list after an existing element, at the head of the list, or at the - * end of the list. Elements being removed from the head of the tail queue - * should use the explicit macro for this purpose for tmpimum efficiency. - * A singly-linked tail queue may only be traversed in the forward direction. - * Singly-linked tail queues are ideal for applications with large datasets - * and few or no removals or for implementing a FIFO queue. - * - * A list is headed by a single forward pointer (or an array of forward - * pointers for a hash table header). The elements are doubly linked - * so that an arbitrary element can be removed without a need to - * traverse the list. New elements can be added to the list before - * or after an existing element or at the head of the list. A list - * may only be traversed in the forward direction. - * - * A tail queue is headed by a pair of pointers, one to the head of the - * list and the other to the tail of the list. The elements are doubly - * linked so that an arbitrary element can be removed without a need to - * traverse the list. New elements can be added to the list before or - * after an existing element, at the head of the list, or at the end of - * the list. A tail queue may be traversed in either direction. - * - * A circle queue is headed by a pair of pointers, one to the head of the - * list and the other to the tail of the list. The elements are doubly - * linked so that an arbitrary element can be removed without a need to - * traverse the list. New elements can be added to the list before or after - * an existing element, at the head of the list, or at the end of the list. - * A circle queue may be traversed in either direction, but has a more - * complex end of list detection. - * - * For details on the use of these macros, see the queue(3) manual page. - * - * - * SLIST LIST STAILQ TAILQ CIRCLEQ - * _HEAD + + + + + - * _HEAD_INITIALIZER + + + + + - * _ENTRY + + + + + - * _INIT + + + + + - * _EMPTY + + + + + - * _FIRST + + + + + - * _NEXT + + + + + - * _PREV - - - + + - * _LAST - - + + + - * _FOREACH + + + + + - * _FOREACH_REVERSE - - - + + - * _INSERT_HEAD + + + + + - * _INSERT_BEFORE - + - + + - * _INSERT_AFTER + + + + + - * _INSERT_TAIL - - + + + - * _REMOVE_HEAD + - + - - - * _REMOVE + + + + + - * - */ - -/* - * Singly-linked List declarations. - */ -#define SLIST_HEAD(name, type) \ -struct name { \ - struct type *slh_first; /* first element */ \ -} - -#define SLIST_HEAD_INITIALIZER(head) \ - { NULL } - -#define SLIST_ENTRY(type) \ -struct { \ - struct type *sle_next; /* next element */ \ -} - -/* - * Singly-linked List functions. - */ -#define SLIST_EMPTY(head) ((head)->slh_first == NULL) - -#define SLIST_FIRST(head) ((head)->slh_first) - -#define SLIST_FOREACH(var, head, field) \ - for ((var) = SLIST_FIRST((head)); \ - (var); \ - (var) = SLIST_NEXT((var), field)) - -#define SLIST_INIT(head) do { \ - SLIST_FIRST((head)) = NULL; \ -} while (0) - -#define SLIST_INSERT_AFTER(slistelm, elm, field) do { \ - SLIST_NEXT((elm), field) = SLIST_NEXT((slistelm), field); \ - SLIST_NEXT((slistelm), field) = (elm); \ -} while (0) - -#define SLIST_INSERT_HEAD(head, elm, field) do { \ - SLIST_NEXT((elm), field) = SLIST_FIRST((head)); \ - SLIST_FIRST((head)) = (elm); \ -} while (0) - -#define SLIST_NEXT(elm, field) ((elm)->field.sle_next) - -#define SLIST_REMOVE(head, elm, type, field) do { \ - if (SLIST_FIRST((head)) == (elm)) { \ - SLIST_REMOVE_HEAD((head), field); \ - } \ - else { \ - struct type *curelm = SLIST_FIRST((head)); \ - while (SLIST_NEXT(curelm, field) != (elm)) \ - curelm = SLIST_NEXT(curelm, field); \ - SLIST_NEXT(curelm, field) = \ - SLIST_NEXT(SLIST_NEXT(curelm, field), field); \ - } \ -} while (0) - -#define SLIST_REMOVE_HEAD(head, field) do { \ - SLIST_FIRST((head)) = SLIST_NEXT(SLIST_FIRST((head)), field); \ -} while (0) - -/* - * Singly-linked Tail queue declarations. - */ -#define STAILQ_HEAD(name, type) \ -struct name { \ - struct type *stqh_first;/* first element */ \ - struct type **stqh_last;/* addr of last next element */ \ -} - -#define STAILQ_HEAD_INITIALIZER(head) \ - { NULL, &(head).stqh_first } - -#define STAILQ_HEAD_INIT(head) do{ \ - (head).stqh_first = NULL; \ - (head).stqh_last = &(head).stqh_first; \ -}while(0) - -#define STAILQ_ENTRY(type) \ -struct { \ - struct type *stqe_next; /* next element */ \ -} - -/* - * Singly-linked Tail queue functions. - */ -#define STAILQ_EMPTY(head) ((head)->stqh_first == NULL) - -#define STAILQ_FIRST(head) ((head)->stqh_first) - -#define STAILQ_FOREACH(var, head, field) \ - for((var) = STAILQ_FIRST((head)); \ - (var); \ - (var) = STAILQ_NEXT((var), field)) - -#define STAILQ_INIT(head) do { \ - STAILQ_FIRST((head)) = NULL; \ - (head)->stqh_last = &STAILQ_FIRST((head)); \ -} while (0) - -#define STAILQ_INSERT_AFTER(head, tqelm, elm, field) do { \ - if ((STAILQ_NEXT((elm), field) = STAILQ_NEXT((tqelm), field)) == NULL)\ - (head)->stqh_last = &STAILQ_NEXT((elm), field); \ - STAILQ_NEXT((tqelm), field) = (elm); \ -} while (0) - -#define STAILQ_INSERT_HEAD(head, elm, field) do { \ - if ((STAILQ_NEXT((elm), field) = STAILQ_FIRST((head))) == NULL) \ - (head)->stqh_last = &STAILQ_NEXT((elm), field); \ - STAILQ_FIRST((head)) = (elm); \ -} while (0) - -#define STAILQ_INSERT_TAIL(head, elm, field) do { \ - STAILQ_NEXT((elm), field) = NULL; \ - *(head)->stqh_last = (elm); \ - (head)->stqh_last = &STAILQ_NEXT((elm), field); \ -} while (0) - -#define STAILQ_LAST(head, type, field) \ - (STAILQ_EMPTY(head) ? \ - NULL : \ - ((struct type *) \ - ((char *)((head)->stqh_last) - __offsetof(struct type, field)))) - -#define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next) - -#define STAILQ_REMOVE(head, elm, type, field) do { \ - if (STAILQ_FIRST((head)) == (elm)) { \ - STAILQ_REMOVE_HEAD(head, field); \ - } \ - else { \ - struct type *curelm = STAILQ_FIRST((head)); \ - while (STAILQ_NEXT(curelm, field) != (elm)) \ - curelm = STAILQ_NEXT(curelm, field); \ - if ((STAILQ_NEXT(curelm, field) = \ - STAILQ_NEXT(STAILQ_NEXT(curelm, field), field)) == NULL)\ - (head)->stqh_last = &STAILQ_NEXT((curelm), field);\ - } \ -} while (0) - -#define STAILQ_REMOVE_HEAD(head, field) do { \ - if ((STAILQ_FIRST((head)) = \ - STAILQ_NEXT(STAILQ_FIRST((head)), field)) == NULL) \ - (head)->stqh_last = &STAILQ_FIRST((head)); \ -} while (0) - -#define STAILQ_REMOVE_HEAD_UNTIL(head, elm, field) do { \ - if ((STAILQ_FIRST((head)) = STAILQ_NEXT((elm), field)) == NULL) \ - (head)->stqh_last = &STAILQ_FIRST((head)); \ -} while (0) - -/* - * List declarations. - */ -#define LIST_HEAD(name, type) \ -struct name { \ - struct type *lh_first; /* first element */ \ -} - -#define LIST_HEAD_INITIALIZER(head) \ - { NULL } - -#define LIST_ENTRY(type) \ -struct { \ - struct type *le_next; /* next element */ \ - struct type **le_prev; /* address of previous next element */ \ -} - -/* - * List functions. - */ - -#define LIST_EMPTY(head) ((head)->lh_first == NULL) - -#define LIST_FIRST(head) ((head)->lh_first) - -#define LIST_FOREACH(var, head, field) \ - for ((var) = LIST_FIRST((head)); \ - (var); \ - (var) = LIST_NEXT((var), field)) - -#define LIST_INIT(head) do { \ - LIST_FIRST((head)) = NULL; \ -} while (0) - -#define LIST_INSERT_AFTER(listelm, elm, field) do { \ - if ((LIST_NEXT((elm), field) = LIST_NEXT((listelm), field)) != NULL)\ - LIST_NEXT((listelm), field)->field.le_prev = \ - &LIST_NEXT((elm), field); \ - LIST_NEXT((listelm), field) = (elm); \ - (elm)->field.le_prev = &LIST_NEXT((listelm), field); \ -} while (0) - -#define LIST_INSERT_BEFORE(listelm, elm, field) do { \ - (elm)->field.le_prev = (listelm)->field.le_prev; \ - LIST_NEXT((elm), field) = (listelm); \ - *(listelm)->field.le_prev = (elm); \ - (listelm)->field.le_prev = &LIST_NEXT((elm), field); \ -} while (0) - -#define LIST_INSERT_HEAD(head, elm, field) do { \ - if ((LIST_NEXT((elm), field) = LIST_FIRST((head))) != NULL) \ - LIST_FIRST((head))->field.le_prev = &LIST_NEXT((elm), field);\ - LIST_FIRST((head)) = (elm); \ - (elm)->field.le_prev = &LIST_FIRST((head)); \ -} while (0) - -#define LIST_NEXT(elm, field) ((elm)->field.le_next) - -#define LIST_REMOVE(elm, field) do { \ - if (LIST_NEXT((elm), field) != NULL) \ - LIST_NEXT((elm), field)->field.le_prev = \ - (elm)->field.le_prev; \ - *(elm)->field.le_prev = LIST_NEXT((elm), field); \ -} while (0) - -/* - * Tail queue declarations. - */ -#define TAILQ_HEAD(name, type) \ -struct name { \ - struct type *tqh_first; /* first element */ \ - struct type **tqh_last; /* addr of last next element */ \ -} - -#define TAILQ_HEAD_INITIALIZER(head) \ - { NULL, &(head).tqh_first } - -#define TAILQ_ENTRY(type) \ -struct { \ - struct type *tqe_next; /* next element */ \ - struct type **tqe_prev; /* address of previous next element */ \ -} - -/* - * Tail queue functions. - */ -#define TAILQ_EMPTY(head) ((head)->tqh_first == NULL) - -#define TAILQ_FIRST(head) ((head)->tqh_first) - -#define TAILQ_FOREACH(var, head, field) \ - for ((var) = TAILQ_FIRST((head)); \ - (var); \ - (var) = TAILQ_NEXT((var), field)) - -#define TAILQ_FOREACH_REVERSE(var, head, headname, field) \ - for ((var) = TAILQ_LAST((head), headname); \ - (var); \ - (var) = TAILQ_PREV((var), headname, field)) - -#define TAILQ_INIT(head) do { \ - TAILQ_FIRST((head)) = NULL; \ - (head)->tqh_last = &TAILQ_FIRST((head)); \ -} while (0) - -#define TAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ - if ((TAILQ_NEXT((elm), field) = TAILQ_NEXT((listelm), field)) != NULL)\ - TAILQ_NEXT((elm), field)->field.tqe_prev = \ - &TAILQ_NEXT((elm), field); \ - else \ - (head)->tqh_last = &TAILQ_NEXT((elm), field); \ - TAILQ_NEXT((listelm), field) = (elm); \ - (elm)->field.tqe_prev = &TAILQ_NEXT((listelm), field); \ -} while (0) - -#define TAILQ_INSERT_BEFORE(listelm, elm, field) do { \ - (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \ - TAILQ_NEXT((elm), field) = (listelm); \ - *(listelm)->field.tqe_prev = (elm); \ - (listelm)->field.tqe_prev = &TAILQ_NEXT((elm), field); \ -} while (0) - -#define TAILQ_INSERT_HEAD(head, elm, field) do { \ - if ((TAILQ_NEXT((elm), field) = TAILQ_FIRST((head))) != NULL) \ - TAILQ_FIRST((head))->field.tqe_prev = \ - &TAILQ_NEXT((elm), field); \ - else \ - (head)->tqh_last = &TAILQ_NEXT((elm), field); \ - TAILQ_FIRST((head)) = (elm); \ - (elm)->field.tqe_prev = &TAILQ_FIRST((head)); \ -} while (0) - -#define TAILQ_INSERT_TAIL(head, elm, field) do { \ - TAILQ_NEXT((elm), field) = NULL; \ - (elm)->field.tqe_prev = (head)->tqh_last; \ - *(head)->tqh_last = (elm); \ - (head)->tqh_last = &TAILQ_NEXT((elm), field); \ -} while (0) - -#define TAILQ_LAST(head, headname) \ - (*(((struct headname *)((head)->tqh_last))->tqh_last)) - -#define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next) - -#define TAILQ_PREV(elm, headname, field) \ - (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last)) - -#define TAILQ_REMOVE(head, elm, field) do { \ - if ((TAILQ_NEXT((elm), field)) != NULL) \ - TAILQ_NEXT((elm), field)->field.tqe_prev = \ - (elm)->field.tqe_prev; \ - else \ - (head)->tqh_last = (elm)->field.tqe_prev; \ - *(elm)->field.tqe_prev = TAILQ_NEXT((elm), field); \ -} while (0) - -/* - * Circular queue declarations. - */ -#define CIRCLEQ_HEAD(name, type) \ -struct name { \ - struct type *cqh_first; /* first element */ \ - struct type *cqh_last; /* last element */ \ -} - -#define CIRCLEQ_HEAD_INITIALIZER(head) \ - { (void *)&(head), (void *)&(head) } - -#define CIRCLEQ_ENTRY(type) \ -struct { \ - struct type *cqe_next; /* next element */ \ - struct type *cqe_prev; /* previous element */ \ -} - -/* - * Circular queue functions. - */ -#define CIRCLEQ_EMPTY(head) ((head)->cqh_first == (void *)(head)) - -#define CIRCLEQ_FIRST(head) ((head)->cqh_first) - -#define CIRCLEQ_FOREACH(var, head, field) \ - for ((var) = CIRCLEQ_FIRST((head)); \ - (var) != (void *)(head); \ - (var) = CIRCLEQ_NEXT((var), field)) - -#define CIRCLEQ_FOREACH_REVERSE(var, head, field) \ - for ((var) = CIRCLEQ_LAST((head)); \ - (var) != (void *)(head); \ - (var) = CIRCLEQ_PREV((var), field)) - -#define CIRCLEQ_INIT(head) do { \ - CIRCLEQ_FIRST((head)) = (void *)(head); \ - CIRCLEQ_LAST((head)) = (void *)(head); \ -} while (0) - -#define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do { \ - CIRCLEQ_NEXT((elm), field) = CIRCLEQ_NEXT((listelm), field); \ - CIRCLEQ_PREV((elm), field) = (listelm); \ - if (CIRCLEQ_NEXT((listelm), field) == (void *)(head)) \ - CIRCLEQ_LAST((head)) = (elm); \ - else \ - CIRCLEQ_PREV(CIRCLEQ_NEXT((listelm), field), field) = (elm);\ - CIRCLEQ_NEXT((listelm), field) = (elm); \ -} while (0) - -#define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do { \ - CIRCLEQ_NEXT((elm), field) = (listelm); \ - CIRCLEQ_PREV((elm), field) = CIRCLEQ_PREV((listelm), field); \ - if (CIRCLEQ_PREV((listelm), field) == (void *)(head)) \ - CIRCLEQ_FIRST((head)) = (elm); \ - else \ - CIRCLEQ_NEXT(CIRCLEQ_PREV((listelm), field), field) = (elm);\ - CIRCLEQ_PREV((listelm), field) = (elm); \ -} while (0) - -#define CIRCLEQ_INSERT_HEAD(head, elm, field) do { \ - CIRCLEQ_NEXT((elm), field) = CIRCLEQ_FIRST((head)); \ - CIRCLEQ_PREV((elm), field) = (void *)(head); \ - if (CIRCLEQ_LAST((head)) == (void *)(head)) \ - CIRCLEQ_LAST((head)) = (elm); \ - else \ - CIRCLEQ_PREV(CIRCLEQ_FIRST((head)), field) = (elm); \ - CIRCLEQ_FIRST((head)) = (elm); \ -} while (0) - -#define CIRCLEQ_INSERT_TAIL(head, elm, field) do { \ - CIRCLEQ_NEXT((elm), field) = (void *)(head); \ - CIRCLEQ_PREV((elm), field) = CIRCLEQ_LAST((head)); \ - if (CIRCLEQ_FIRST((head)) == (void *)(head)) \ - CIRCLEQ_FIRST((head)) = (elm); \ - else \ - CIRCLEQ_NEXT(CIRCLEQ_LAST((head)), field) = (elm); \ - CIRCLEQ_LAST((head)) = (elm); \ -} while (0) - -#define CIRCLEQ_LAST(head) ((head)->cqh_last) - -#define CIRCLEQ_NEXT(elm,field) ((elm)->field.cqe_next) - -#define CIRCLEQ_PREV(elm,field) ((elm)->field.cqe_prev) - -#define CIRCLEQ_REMOVE(head, elm, field) do { \ - if (CIRCLEQ_NEXT((elm), field) == (void *)(head)) \ - CIRCLEQ_LAST((head)) = CIRCLEQ_PREV((elm), field); \ - else \ - CIRCLEQ_PREV(CIRCLEQ_NEXT((elm), field), field) = \ - CIRCLEQ_PREV((elm), field); \ - if (CIRCLEQ_PREV((elm), field) == (void *)(head)) \ - CIRCLEQ_FIRST((head)) = CIRCLEQ_NEXT((elm), field); \ - else \ - CIRCLEQ_NEXT(CIRCLEQ_PREV((elm), field), field) = \ - CIRCLEQ_NEXT((elm), field); \ -} while (0) - -#ifdef _KERNEL - -/* - * XXX insque() and remque() are an old way of handling certain queues. - * They bogusly assumes that all queue heads look alike. - */ - -struct quehead { - struct quehead *qh_link; - struct quehead *qh_rlink; -}; - -#ifdef __GNUC__ - -static __inline void -insque(void *a, void *b) -{ - struct quehead *element = (struct quehead *)a, - *head = (struct quehead *)b; - - element->qh_link = head->qh_link; - element->qh_rlink = head; - head->qh_link = element; - element->qh_link->qh_rlink = element; -} - -static __inline void -remque(void *a) -{ - struct quehead *element = (struct quehead *)a; - - element->qh_link->qh_rlink = element->qh_rlink; - element->qh_rlink->qh_link = element->qh_link; - element->qh_rlink = 0; -} - -#else /* !__GNUC__ */ - -void insque __P((void *a, void *b)); -void remque __P((void *a)); - -#endif /* __GNUC__ */ - -#endif /* _KERNEL */ - -#endif /* !_SYS_QUEUE_H_ */ - - - diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/include/tree.h b/openair-cn/GTPV2-C/nwgtpv2c-0.11/include/tree.h deleted file mode 100644 index 351df9dfc5..0000000000 --- a/openair-cn/GTPV2-C/nwgtpv2c-0.11/include/tree.h +++ /dev/null @@ -1,678 +0,0 @@ -/* - * Copyright 2002 Niels Provos <provos@citi.umich.edu> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef _SYS_TREE_H_ -#define _SYS_TREE_H_ - -/* - * This file defines data structures for different types of trees: - * splay trees and red-black trees. - * - * A splay tree is a self-organizing data structure. Every operation - * on the tree causes a splay to happen. The splay moves the requested - * node to the root of the tree and partly rebalances it. - * - * This has the benefit that request locality causes faster lookups as - * the requested nodes move to the top of the tree. On the other hand, - * every lookup causes memory writes. - * - * The Balance Theorem bounds the total access time for m operations - * and n inserts on an initially empty tree as O((m + n)lg n). The - * amortized cost for a sequence of m accesses to a splay tree is O(lg n); - * - * A red-black tree is a binary search tree with the node color as an - * extra attribute. It fulfills a set of conditions: - * - every search path from the root to a leaf consists of the - * same number of black nodes, - * - each red node (except for the root) has a black parent, - * - each leaf node is black. - * - * Every operation on a red-black tree is bounded as O(lg n). - * The maximum height of a red-black tree is 2lg (n+1). - */ - -#define SPLAY_HEAD(name, type) \ -struct name { \ - struct type *sph_root; /* root of the tree */ \ -} - -#define SPLAY_INITIALIZER(root) \ - { NULL } - -#define SPLAY_INIT(root) do { \ - (root)->sph_root = NULL; \ -} while (0) - -#define SPLAY_ENTRY(type) \ -struct { \ - struct type *spe_left; /* left element */ \ - struct type *spe_right; /* right element */ \ -} - -#define SPLAY_LEFT(elm, field) (elm)->field.spe_left -#define SPLAY_RIGHT(elm, field) (elm)->field.spe_right -#define SPLAY_ROOT(head) (head)->sph_root -#define SPLAY_EMPTY(head) (SPLAY_ROOT(head) == NULL) - -/* SPLAY_ROTATE_{LEFT,RIGHT} expect that tmp hold SPLAY_{RIGHT,LEFT} */ -#define SPLAY_ROTATE_RIGHT(head, tmp, field) do { \ - SPLAY_LEFT((head)->sph_root, field) = SPLAY_RIGHT(tmp, field); \ - SPLAY_RIGHT(tmp, field) = (head)->sph_root; \ - (head)->sph_root = tmp; \ -} while (0) - -#define SPLAY_ROTATE_LEFT(head, tmp, field) do { \ - SPLAY_RIGHT((head)->sph_root, field) = SPLAY_LEFT(tmp, field); \ - SPLAY_LEFT(tmp, field) = (head)->sph_root; \ - (head)->sph_root = tmp; \ -} while (0) - -#define SPLAY_LINKLEFT(head, tmp, field) do { \ - SPLAY_LEFT(tmp, field) = (head)->sph_root; \ - tmp = (head)->sph_root; \ - (head)->sph_root = SPLAY_LEFT((head)->sph_root, field); \ -} while (0) - -#define SPLAY_LINKRIGHT(head, tmp, field) do { \ - SPLAY_RIGHT(tmp, field) = (head)->sph_root; \ - tmp = (head)->sph_root; \ - (head)->sph_root = SPLAY_RIGHT((head)->sph_root, field); \ -} while (0) - -#define SPLAY_ASSEMBLE(head, node, left, right, field) do { \ - SPLAY_RIGHT(left, field) = SPLAY_LEFT((head)->sph_root, field); \ - SPLAY_LEFT(right, field) = SPLAY_RIGHT((head)->sph_root, field);\ - SPLAY_LEFT((head)->sph_root, field) = SPLAY_RIGHT(node, field); \ - SPLAY_RIGHT((head)->sph_root, field) = SPLAY_LEFT(node, field); \ -} while (0) - -/* Generates prototypes and inline functions */ - -#define SPLAY_PROTOTYPE(name, type, field, cmp) \ -void name##_SPLAY(struct name *, struct type *); \ -void name##_SPLAY_MINMAX(struct name *, int); \ -struct type *name##_SPLAY_INSERT(struct name *, struct type *); \ -struct type *name##_SPLAY_REMOVE(struct name *, struct type *); \ - \ -/* Finds the node with the same key as elm */ \ -static __inline struct type * \ -name##_SPLAY_FIND(struct name *head, struct type *elm) \ -{ \ - if (SPLAY_EMPTY(head)) \ - return(NULL); \ - name##_SPLAY(head, elm); \ - if ((cmp)(elm, (head)->sph_root) == 0) \ - return (head->sph_root); \ - return (NULL); \ -} \ - \ -static __inline struct type * \ -name##_SPLAY_NEXT(struct name *head, struct type *elm) \ -{ \ - name##_SPLAY(head, elm); \ - if (SPLAY_RIGHT(elm, field) != NULL) { \ - elm = SPLAY_RIGHT(elm, field); \ - while (SPLAY_LEFT(elm, field) != NULL) { \ - elm = SPLAY_LEFT(elm, field); \ - } \ - } else \ - elm = NULL; \ - return (elm); \ -} \ - \ -static __inline struct type * \ -name##_SPLAY_MIN_MAX(struct name *head, int val) \ -{ \ - name##_SPLAY_MINMAX(head, val); \ - return (SPLAY_ROOT(head)); \ -} - -/* Main splay operation. - * Moves node close to the key of elm to top - */ -#define SPLAY_GENERATE(name, type, field, cmp) \ -struct type * \ -name##_SPLAY_INSERT(struct name *head, struct type *elm) \ -{ \ - if (SPLAY_EMPTY(head)) { \ - SPLAY_LEFT(elm, field) = SPLAY_RIGHT(elm, field) = NULL; \ - } else { \ - int __comp; \ - name##_SPLAY(head, elm); \ - __comp = (cmp)(elm, (head)->sph_root); \ - if(__comp < 0) { \ - SPLAY_LEFT(elm, field) = SPLAY_LEFT((head)->sph_root, field);\ - SPLAY_RIGHT(elm, field) = (head)->sph_root; \ - SPLAY_LEFT((head)->sph_root, field) = NULL; \ - } else if (__comp > 0) { \ - SPLAY_RIGHT(elm, field) = SPLAY_RIGHT((head)->sph_root, field);\ - SPLAY_LEFT(elm, field) = (head)->sph_root; \ - SPLAY_RIGHT((head)->sph_root, field) = NULL; \ - } else \ - return ((head)->sph_root); \ - } \ - (head)->sph_root = (elm); \ - return (NULL); \ -} \ - \ -struct type * \ -name##_SPLAY_REMOVE(struct name *head, struct type *elm) \ -{ \ - struct type *__tmp; \ - if (SPLAY_EMPTY(head)) \ - return (NULL); \ - name##_SPLAY(head, elm); \ - if ((cmp)(elm, (head)->sph_root) == 0) { \ - if (SPLAY_LEFT((head)->sph_root, field) == NULL) { \ - (head)->sph_root = SPLAY_RIGHT((head)->sph_root, field);\ - } else { \ - __tmp = SPLAY_RIGHT((head)->sph_root, field); \ - (head)->sph_root = SPLAY_LEFT((head)->sph_root, field);\ - name##_SPLAY(head, elm); \ - SPLAY_RIGHT((head)->sph_root, field) = __tmp; \ - } \ - return (elm); \ - } \ - return (NULL); \ -} \ - \ -void \ -name##_SPLAY(struct name *head, struct type *elm) \ -{ \ - struct type __node, *__left, *__right, *__tmp; \ - int __comp; \ -\ - SPLAY_LEFT(&__node, field) = SPLAY_RIGHT(&__node, field) = NULL;\ - __left = __right = &__node; \ -\ - while ((__comp = (cmp)(elm, (head)->sph_root))) { \ - if (__comp < 0) { \ - __tmp = SPLAY_LEFT((head)->sph_root, field); \ - if (__tmp == NULL) \ - break; \ - if ((cmp)(elm, __tmp) < 0){ \ - SPLAY_ROTATE_RIGHT(head, __tmp, field); \ - if (SPLAY_LEFT((head)->sph_root, field) == NULL)\ - break; \ - } \ - SPLAY_LINKLEFT(head, __right, field); \ - } else if (__comp > 0) { \ - __tmp = SPLAY_RIGHT((head)->sph_root, field); \ - if (__tmp == NULL) \ - break; \ - if ((cmp)(elm, __tmp) > 0){ \ - SPLAY_ROTATE_LEFT(head, __tmp, field); \ - if (SPLAY_RIGHT((head)->sph_root, field) == NULL)\ - break; \ - } \ - SPLAY_LINKRIGHT(head, __left, field); \ - } \ - } \ - SPLAY_ASSEMBLE(head, &__node, __left, __right, field); \ -} \ - \ -/* Splay with either the minimum or the maximum element \ - * Used to find minimum or maximum element in tree. \ - */ \ -void name##_SPLAY_MINMAX(struct name *head, int __comp) \ -{ \ - struct type __node, *__left, *__right, *__tmp; \ -\ - SPLAY_LEFT(&__node, field) = SPLAY_RIGHT(&__node, field) = NULL;\ - __left = __right = &__node; \ -\ - while (1) { \ - if (__comp < 0) { \ - __tmp = SPLAY_LEFT((head)->sph_root, field); \ - if (__tmp == NULL) \ - break; \ - if (__comp < 0){ \ - SPLAY_ROTATE_RIGHT(head, __tmp, field); \ - if (SPLAY_LEFT((head)->sph_root, field) == NULL)\ - break; \ - } \ - SPLAY_LINKLEFT(head, __right, field); \ - } else if (__comp > 0) { \ - __tmp = SPLAY_RIGHT((head)->sph_root, field); \ - if (__tmp == NULL) \ - break; \ - if (__comp > 0) { \ - SPLAY_ROTATE_LEFT(head, __tmp, field); \ - if (SPLAY_RIGHT((head)->sph_root, field) == NULL)\ - break; \ - } \ - SPLAY_LINKRIGHT(head, __left, field); \ - } \ - } \ - SPLAY_ASSEMBLE(head, &__node, __left, __right, field); \ -} - -#define SPLAY_NEGINF -1 -#define SPLAY_INF 1 - -#define SPLAY_INSERT(name, x, y) name##_SPLAY_INSERT(x, y) -#define SPLAY_REMOVE(name, x, y) name##_SPLAY_REMOVE(x, y) -#define SPLAY_FIND(name, x, y) name##_SPLAY_FIND(x, y) -#define SPLAY_NEXT(name, x, y) name##_SPLAY_NEXT(x, y) -#define SPLAY_MIN(name, x) (SPLAY_EMPTY(x) ? NULL \ - : name##_SPLAY_MIN_MAX(x, SPLAY_NEGINF)) -#define SPLAY_MAX(name, x) (SPLAY_EMPTY(x) ? NULL \ - : name##_SPLAY_MIN_MAX(x, SPLAY_INF)) - -#define SPLAY_FOREACH(x, name, head) \ - for ((x) = SPLAY_MIN(name, head); \ - (x) != NULL; \ - (x) = SPLAY_NEXT(name, head, x)) - -/* Macros that define a red-back tree */ -#define RB_HEAD(name, type) \ -struct name { \ - struct type *rbh_root; /* root of the tree */ \ -} - -#define RB_INITIALIZER(root) \ - { NULL } - -#define RB_INIT(root) do { \ - (root)->rbh_root = NULL; \ -} while (0) - -#define RB_BLACK 0 -#define RB_RED 1 -#define RB_ENTRY(type) \ -struct { \ - struct type *rbe_left; /* left element */ \ - struct type *rbe_right; /* right element */ \ - struct type *rbe_parent; /* parent element */ \ - int rbe_color; /* node color */ \ -} - -#define RB_LEFT(elm, field) (elm)->field.rbe_left -#define RB_RIGHT(elm, field) (elm)->field.rbe_right -#define RB_PARENT(elm, field) (elm)->field.rbe_parent -#define RB_COLOR(elm, field) (elm)->field.rbe_color -#define RB_ROOT(head) (head)->rbh_root -#define RB_EMPTY(head) (RB_ROOT(head) == NULL) - -#define RB_SET(elm, parent, field) do { \ - RB_PARENT(elm, field) = parent; \ - RB_LEFT(elm, field) = RB_RIGHT(elm, field) = NULL; \ - RB_COLOR(elm, field) = RB_RED; \ -} while (0) - -#define RB_SET_BLACKRED(black, red, field) do { \ - RB_COLOR(black, field) = RB_BLACK; \ - RB_COLOR(red, field) = RB_RED; \ -} while (0) - -#ifndef RB_AUGMENT -#define RB_AUGMENT(x) -#endif - -#define RB_ROTATE_LEFT(head, elm, tmp, field) do { \ - (tmp) = RB_RIGHT(elm, field); \ - if ((RB_RIGHT(elm, field) = RB_LEFT(tmp, field))) { \ - RB_PARENT(RB_LEFT(tmp, field), field) = (elm); \ - } \ - RB_AUGMENT(elm); \ - if ((RB_PARENT(tmp, field) = RB_PARENT(elm, field))) { \ - if ((elm) == RB_LEFT(RB_PARENT(elm, field), field)) \ - RB_LEFT(RB_PARENT(elm, field), field) = (tmp); \ - else \ - RB_RIGHT(RB_PARENT(elm, field), field) = (tmp); \ - } else \ - (head)->rbh_root = (tmp); \ - RB_LEFT(tmp, field) = (elm); \ - RB_PARENT(elm, field) = (tmp); \ - RB_AUGMENT(tmp); \ - if ((RB_PARENT(tmp, field))) \ - RB_AUGMENT(RB_PARENT(tmp, field)); \ -} while (0) - -#define RB_ROTATE_RIGHT(head, elm, tmp, field) do { \ - (tmp) = RB_LEFT(elm, field); \ - if ((RB_LEFT(elm, field) = RB_RIGHT(tmp, field))) { \ - RB_PARENT(RB_RIGHT(tmp, field), field) = (elm); \ - } \ - RB_AUGMENT(elm); \ - if ((RB_PARENT(tmp, field) = RB_PARENT(elm, field))) { \ - if ((elm) == RB_LEFT(RB_PARENT(elm, field), field)) \ - RB_LEFT(RB_PARENT(elm, field), field) = (tmp); \ - else \ - RB_RIGHT(RB_PARENT(elm, field), field) = (tmp); \ - } else \ - (head)->rbh_root = (tmp); \ - RB_RIGHT(tmp, field) = (elm); \ - RB_PARENT(elm, field) = (tmp); \ - RB_AUGMENT(tmp); \ - if ((RB_PARENT(tmp, field))) \ - RB_AUGMENT(RB_PARENT(tmp, field)); \ -} while (0) - -/* Generates prototypes and inline functions */ -#define RB_PROTOTYPE(name, type, field, cmp) \ -void name##_RB_INSERT_COLOR(struct name *, struct type *); \ -void name##_RB_REMOVE_COLOR(struct name *, struct type *, struct type *);\ -struct type *name##_RB_REMOVE(struct name *, struct type *); \ -struct type *name##_RB_INSERT(struct name *, struct type *); \ -struct type *name##_RB_FIND(struct name *, struct type *); \ -struct type *name##_RB_NEXT(struct type *); \ -struct type *name##_RB_MINMAX(struct name *, int); \ - \ - -/* Main rb operation. - * Moves node close to the key of elm to top - */ -#define RB_GENERATE(name, type, field, cmp) \ -void \ -name##_RB_INSERT_COLOR(struct name *head, struct type *elm) \ -{ \ - struct type *parent, *gparent, *tmp; \ - while ((parent = RB_PARENT(elm, field)) && \ - RB_COLOR(parent, field) == RB_RED) { \ - gparent = RB_PARENT(parent, field); \ - if (parent == RB_LEFT(gparent, field)) { \ - tmp = RB_RIGHT(gparent, field); \ - if (tmp && RB_COLOR(tmp, field) == RB_RED) { \ - RB_COLOR(tmp, field) = RB_BLACK; \ - RB_SET_BLACKRED(parent, gparent, field);\ - elm = gparent; \ - continue; \ - } \ - if (RB_RIGHT(parent, field) == elm) { \ - RB_ROTATE_LEFT(head, parent, tmp, field);\ - tmp = parent; \ - parent = elm; \ - elm = tmp; \ - } \ - RB_SET_BLACKRED(parent, gparent, field); \ - RB_ROTATE_RIGHT(head, gparent, tmp, field); \ - } else { \ - tmp = RB_LEFT(gparent, field); \ - if (tmp && RB_COLOR(tmp, field) == RB_RED) { \ - RB_COLOR(tmp, field) = RB_BLACK; \ - RB_SET_BLACKRED(parent, gparent, field);\ - elm = gparent; \ - continue; \ - } \ - if (RB_LEFT(parent, field) == elm) { \ - RB_ROTATE_RIGHT(head, parent, tmp, field);\ - tmp = parent; \ - parent = elm; \ - elm = tmp; \ - } \ - RB_SET_BLACKRED(parent, gparent, field); \ - RB_ROTATE_LEFT(head, gparent, tmp, field); \ - } \ - } \ - RB_COLOR(head->rbh_root, field) = RB_BLACK; \ -} \ - \ -void \ -name##_RB_REMOVE_COLOR(struct name *head, struct type *parent, struct type *elm) \ -{ \ - struct type *tmp; \ - while ((elm == NULL || RB_COLOR(elm, field) == RB_BLACK) && \ - elm != RB_ROOT(head)) { \ - if (RB_LEFT(parent, field) == elm) { \ - tmp = RB_RIGHT(parent, field); \ - if (RB_COLOR(tmp, field) == RB_RED) { \ - RB_SET_BLACKRED(tmp, parent, field); \ - RB_ROTATE_LEFT(head, parent, tmp, field);\ - tmp = RB_RIGHT(parent, field); \ - } \ - if ((RB_LEFT(tmp, field) == NULL || \ - RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) &&\ - (RB_RIGHT(tmp, field) == NULL || \ - RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK)) {\ - RB_COLOR(tmp, field) = RB_RED; \ - elm = parent; \ - parent = RB_PARENT(elm, field); \ - } else { \ - if (RB_RIGHT(tmp, field) == NULL || \ - RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK) {\ - struct type *oleft; \ - if ((oleft = RB_LEFT(tmp, field)))\ - RB_COLOR(oleft, field) = RB_BLACK;\ - RB_COLOR(tmp, field) = RB_RED; \ - RB_ROTATE_RIGHT(head, tmp, oleft, field);\ - tmp = RB_RIGHT(parent, field); \ - } \ - RB_COLOR(tmp, field) = RB_COLOR(parent, field);\ - RB_COLOR(parent, field) = RB_BLACK; \ - if (RB_RIGHT(tmp, field)) \ - RB_COLOR(RB_RIGHT(tmp, field), field) = RB_BLACK;\ - RB_ROTATE_LEFT(head, parent, tmp, field);\ - elm = RB_ROOT(head); \ - break; \ - } \ - } else { \ - tmp = RB_LEFT(parent, field); \ - if (RB_COLOR(tmp, field) == RB_RED) { \ - RB_SET_BLACKRED(tmp, parent, field); \ - RB_ROTATE_RIGHT(head, parent, tmp, field);\ - tmp = RB_LEFT(parent, field); \ - } \ - if ((RB_LEFT(tmp, field) == NULL || \ - RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) &&\ - (RB_RIGHT(tmp, field) == NULL || \ - RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK)) {\ - RB_COLOR(tmp, field) = RB_RED; \ - elm = parent; \ - parent = RB_PARENT(elm, field); \ - } else { \ - if (RB_LEFT(tmp, field) == NULL || \ - RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) {\ - struct type *oright; \ - if ((oright = RB_RIGHT(tmp, field)))\ - RB_COLOR(oright, field) = RB_BLACK;\ - RB_COLOR(tmp, field) = RB_RED; \ - RB_ROTATE_LEFT(head, tmp, oright, field);\ - tmp = RB_LEFT(parent, field); \ - } \ - RB_COLOR(tmp, field) = RB_COLOR(parent, field);\ - RB_COLOR(parent, field) = RB_BLACK; \ - if (RB_LEFT(tmp, field)) \ - RB_COLOR(RB_LEFT(tmp, field), field) = RB_BLACK;\ - RB_ROTATE_RIGHT(head, parent, tmp, field);\ - elm = RB_ROOT(head); \ - break; \ - } \ - } \ - } \ - if (elm) \ - RB_COLOR(elm, field) = RB_BLACK; \ -} \ - \ -struct type * \ -name##_RB_REMOVE(struct name *head, struct type *elm) \ -{ \ - struct type *child, *parent, *old = elm; \ - int color; \ - if (RB_LEFT(elm, field) == NULL) \ - child = RB_RIGHT(elm, field); \ - else if (RB_RIGHT(elm, field) == NULL) \ - child = RB_LEFT(elm, field); \ - else { \ - struct type *left; \ - elm = RB_RIGHT(elm, field); \ - while ((left = RB_LEFT(elm, field))) \ - elm = left; \ - child = RB_RIGHT(elm, field); \ - parent = RB_PARENT(elm, field); \ - color = RB_COLOR(elm, field); \ - if (child) \ - RB_PARENT(child, field) = parent; \ - if (parent) { \ - if (RB_LEFT(parent, field) == elm) \ - RB_LEFT(parent, field) = child; \ - else \ - RB_RIGHT(parent, field) = child; \ - RB_AUGMENT(parent); \ - } else \ - RB_ROOT(head) = child; \ - if (RB_PARENT(elm, field) == old) \ - parent = elm; \ - (elm)->field = (old)->field; \ - if (RB_PARENT(old, field)) { \ - if (RB_LEFT(RB_PARENT(old, field), field) == old)\ - RB_LEFT(RB_PARENT(old, field), field) = elm;\ - else \ - RB_RIGHT(RB_PARENT(old, field), field) = elm;\ - RB_AUGMENT(RB_PARENT(old, field)); \ - } else \ - RB_ROOT(head) = elm; \ - RB_PARENT(RB_LEFT(old, field), field) = elm; \ - if (RB_RIGHT(old, field)) \ - RB_PARENT(RB_RIGHT(old, field), field) = elm; \ - if (parent) { \ - left = parent; \ - do { \ - RB_AUGMENT(left); \ - } while ((left = RB_PARENT(left, field))); \ - } \ - goto color; \ - } \ - parent = RB_PARENT(elm, field); \ - color = RB_COLOR(elm, field); \ - if (child) \ - RB_PARENT(child, field) = parent; \ - if (parent) { \ - if (RB_LEFT(parent, field) == elm) \ - RB_LEFT(parent, field) = child; \ - else \ - RB_RIGHT(parent, field) = child; \ - RB_AUGMENT(parent); \ - } else \ - RB_ROOT(head) = child; \ -color: \ - if (color == RB_BLACK) \ - name##_RB_REMOVE_COLOR(head, parent, child); \ - return (old); \ -} \ - \ -/* Inserts a node into the RB tree */ \ -struct type * \ -name##_RB_INSERT(struct name *head, struct type *elm) \ -{ \ - struct type *tmp; \ - struct type *parent = NULL; \ - int comp = 0; \ - tmp = RB_ROOT(head); \ - while (tmp) { \ - parent = tmp; \ - comp = (cmp)(elm, parent); \ - if (comp < 0) \ - tmp = RB_LEFT(tmp, field); \ - else if (comp > 0) \ - tmp = RB_RIGHT(tmp, field); \ - else \ - return (tmp); \ - } \ - RB_SET(elm, parent, field); \ - if (parent != NULL) { \ - if (comp < 0) \ - RB_LEFT(parent, field) = elm; \ - else \ - RB_RIGHT(parent, field) = elm; \ - RB_AUGMENT(parent); \ - } else \ - { \ - RB_ROOT(head) = elm; \ - } \ - name##_RB_INSERT_COLOR(head, elm); \ - return (NULL); \ -} \ - \ -/* Finds the node with the same key as elm */ \ -struct type * \ -name##_RB_FIND(struct name *head, struct type *elm) \ -{ \ - struct type *tmp = RB_ROOT(head); \ - int comp; \ - while (tmp) { \ - comp = cmp(elm, tmp); \ - if (comp < 0) \ - tmp = RB_LEFT(tmp, field); \ - else if (comp > 0) \ - tmp = RB_RIGHT(tmp, field); \ - else \ - return (tmp); \ - } \ - return (NULL); \ -} \ - \ -struct type * \ -name##_RB_NEXT(struct type *elm) \ -{ \ - if (RB_RIGHT(elm, field)) { \ - elm = RB_RIGHT(elm, field); \ - while (RB_LEFT(elm, field)) \ - elm = RB_LEFT(elm, field); \ - } else { \ - if (RB_PARENT(elm, field) && \ - (elm == RB_LEFT(RB_PARENT(elm, field), field))) \ - elm = RB_PARENT(elm, field); \ - else { \ - while (RB_PARENT(elm, field) && \ - (elm == RB_RIGHT(RB_PARENT(elm, field), field)))\ - elm = RB_PARENT(elm, field); \ - elm = RB_PARENT(elm, field); \ - } \ - } \ - return (elm); \ -} \ - \ -struct type * \ -name##_RB_MINMAX(struct name *head, int val) \ -{ \ - struct type *tmp = RB_ROOT(head); \ - struct type *parent = NULL; \ - while (tmp) { \ - parent = tmp; \ - if (val < 0) \ - tmp = RB_LEFT(tmp, field); \ - else \ - tmp = RB_RIGHT(tmp, field); \ - } \ - return (parent); \ -} - -#define RB_NEGINF -1 -#define RB_INF 1 - -#define RB_INSERT(name, x, y) name##_RB_INSERT(x, y) -#define RB_REMOVE(name, x, y) name##_RB_REMOVE(x, y) -#define RB_FIND(name, x, y) name##_RB_FIND(x, y) -#define RB_NEXT(name, x, y) name##_RB_NEXT(y) -#define RB_MIN(name, x) name##_RB_MINMAX(x, RB_NEGINF) -#define RB_MAX(name, x) name##_RB_MINMAX(x, RB_INF) - -#define RB_FOREACH(x, name, head) \ - for ((x) = RB_MIN(name, head); \ - (x) != NULL; \ - (x) = name##_RB_NEXT(x)) - -#endif /* _SYS_TREE_H_ */ diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/shared/NwError.h b/openair-cn/GTPV2-C/nwgtpv2c-0.11/shared/NwError.h deleted file mode 100644 index 6389bedcb2..0000000000 --- a/openair-cn/GTPV2-C/nwgtpv2c-0.11/shared/NwError.h +++ /dev/null @@ -1,66 +0,0 @@ -/*----------------------------------------------------------------------------* - * * - * n w - g t p v 2 c * - * G P R S T u n n e l i n g P r o t o c o l v 2 c S t a c k * - * * - * * - * Copyright (c) 2010-2011 Amit Chawre * - * All rights reserved. * - * * - * Redistribution and use in source and binary forms, with or without * - * modification, are permitted provided that the following conditions * - * are met: * - * * - * 1. Redistributions of source code must retain the above copyright * - * notice, this list of conditions and the following disclaimer. * - * 2. Redistributions in binary form must reproduce the above copyright * - * notice, this list of conditions and the following disclaimer in the * - * documentation and/or other materials provided with the distribution. * - * 3. The name of the author may not be used to endorse or promote products * - * derived from this software without specific prior written permission. * - * * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - *----------------------------------------------------------------------------*/ - - -#ifndef __NW_ERROR_H__ -#define __NW_ERROR_H__ - -/** - * @file NwError.h - * @brief This header file contains return error code type definitions. -*/ - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum { - - NW_OK = 0x00000000, - NW_GTPV2C_IE_MISSING, - NW_GTPV2C_IE_INCORRECT, - NW_GTPV2C_MANDATORY_IE_DUPLICATE, - NW_GTPV2C_CONDITIONAL_IE_MISSING, - NW_GTPV2C_MANDATORY_IE_MISSING, - NW_GTPV2C_MSG_MALFORMED, - NW_FAILURE = 0xFFFFFFFE -} -NwRcT; - -#ifdef __cplusplus -} -#endif - -#endif /* __NW_ERROR_CODE_H__ */ - - diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/shared/NwGtpv2c.h b/openair-cn/GTPV2-C/nwgtpv2c-0.11/shared/NwGtpv2c.h deleted file mode 100644 index e3178fb11b..0000000000 --- a/openair-cn/GTPV2-C/nwgtpv2c-0.11/shared/NwGtpv2c.h +++ /dev/null @@ -1,576 +0,0 @@ -/*----------------------------------------------------------------------------* - * * - * n w - g t p v 2 c * - * G P R S T u n n e l i n g P r o t o c o l v 2 c S t a c k * - * * - * * - * Copyright (c) 2010-2011 Amit Chawre * - * All rights reserved. * - * * - * Redistribution and use in source and binary forms, with or without * - * modification, are permitted provided that the following conditions * - * are met: * - * * - * 1. Redistributions of source code must retain the above copyright * - * notice, this list of conditions and the following disclaimer. * - * 2. Redistributions in binary form must reproduce the above copyright * - * notice, this list of conditions and the following disclaimer in the * - * documentation and/or other materials provided with the distribution. * - * 3. The name of the author may not be used to endorse or promote products * - * derived from this software without specific prior written permission. * - * * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - *----------------------------------------------------------------------------*/ - -#ifndef __NW_GTPV2C_H__ -#define __NW_GTPV2C_H__ - -#include <sys/types.h> -#include <sys/socket.h> -#include <arpa/inet.h> -#include "NwTypes.h" -#include "NwError.h" - -/** @mainpage - - @section intro Introduction - - nw-gtpv2c library is a free and open source control plane implementation of GPRS - Tunneling protocol v2 also known as eGTPc as per 3GPP TS29274-930. - The library is published under BSD three clause license. - - @section scope Scope - - The stack library also does basic tasks like packet/header validation, - retransmission and message parsing. - - @section design Design Philosophy - - The stack is fully-asynchronous in design for compatibility with event loop - mechanisms such as select, poll, etc. and can also be used for multi-threaded - applications. It should compile on Linux, *BSD, Mac OS X, Solaris and Windows - (cygwin). - - The stack is designed for high portability not only for the hardware and OS it will - run on but also for the application software that uses it. The stack doesn't mandate - conditions on the user application architecture or design. The stack relies on - the user application for infrastructure utilities such as I/O, timers, - logs and multithreading. This realized by using callback mechanisms and enables the - stack library to seamlessly integrate without or very little changes to the existing - application framework. - - The stack architecture builds upon following mentioned entities that are external to it. - - User Layer Protocol (ULP) Entity: - This layer implements the intelligent logic for the application and sits on top of the - stack. - - UDP Entity: - This is the layer below the stack and is responsible for UDP I/O with the stack and network. - It may or may not be housed in ULP. - - Timer Manager Entity: - Timer Manager Entity provides the stack with infrastructure for timer CRUD operations. - - Log Manager Entity: - Log Manager Entity provides the stack with callbacks for logging operations. It may - or may not be housed in ULP. - - The application may implement all above entities as a single or multiple object. - - @section applications Applications and Usage - - Please refer sample applications under 'test-app' directory for usage examples. - - */ - -/** - * @file NwGtpv2c.h - * @author Amit Chawre - * @brief - * - * This header file contains all required definitions and functions - * prototypes for using nw-gtpv2c library. - * - **/ - -/*--------------------------------------------------------------------------* - * S T A C K H A N D L E D E F I N I T I O N S * - *--------------------------------------------------------------------------*/ - -typedef NwPtrT NwGtpv2cStackHandleT; /**< Gtpv2c Stack Handle */ -typedef NwPtrT NwGtpv2cUlpHandleT; /**< Gtpv2c Stack Ulp Entity Handle */ -typedef NwPtrT NwGtpv2cUdpHandleT; /**< Gtpv2c Stack Udp Entity Handle */ -typedef NwPtrT NwGtpv2cTimerMgrHandleT; /**< Gtpv2c Stack Timer Manager Handle */ -typedef NwPtrT NwGtpv2cMemMgrHandleT; /**< Gtpv2c Stack Memory Manager Handle */ -typedef NwPtrT NwGtpv2cLogMgrHandleT; /**< Gtpv2c Stack Log Manager Handle */ -typedef NwPtrT NwGtpv2cTimerHandleT; /**< Gtpv2c Stack Timer Handle */ -typedef NwPtrT NwGtpv2cMsgHandleT; /**< Gtpv2c Msg Handle */ -typedef NwPtrT NwGtpv2cTrxnHandleT; /**< Gtpv2c Transaction Handle */ -typedef NwPtrT NwGtpv2cTunnelHandleT; /**< Gtpv2c Ulp Tunnel Handle */ -typedef NwPtrT NwGtpv2cUlpTrxnHandleT; /**< Gtpv2c Ulp Transaction Handle */ -typedef NwPtrT NwGtpv2cUlpTunnelHandleT; /**< Gtpv2c Ulp Tunnel Handle */ - -typedef uint8_t NwGtpv2cMsgTypeT; /**< Gtpv2c Msg Type */ - -typedef struct NwGtpv2cStackConfigS { - uint16_t __tbd; -} NwGtpv2cStackConfigT; - -/*--------------------------------------------------------------------------* - * S T A C K A P I D E F I N I T I O N S * - *--------------------------------------------------------------------------*/ - -#define NW_GTPV2C_ULP_API_FLAG_NONE (0x00 << 24) -#define NW_GTPV2C_ULP_API_FLAG_CREATE_LOCAL_TUNNEL (0x01 << 24) -#define NW_GTPV2C_ULP_API_FLAG_DELETE_LOCAL_TUNNEL (0x02 << 24) -#define NW_GTPV2C_ULP_API_FLAG_IS_COMMAND_MESSAGE (0x03 << 24) - -/*--------------------------------------------------------------------------- - * Gtpv2c Stack ULP API type definitions - *--------------------------------------------------------------------------*/ - -/** - * APIs types between ULP and Stack - */ - -typedef enum { - /* APIs from ULP to stack */ - - NW_GTPV2C_ULP_API_INITIAL_REQ = 0x00000000, /**< Send a initial message */ - NW_GTPV2C_ULP_API_TRIGGERED_REQ, /**< Send a triggered req message */ - NW_GTPV2C_ULP_API_TRIGGERED_RSP, /**< Send a triggered rsp message */ - - /* APIs from stack to ULP */ - - NW_GTPV2C_ULP_API_INITIAL_REQ_IND, /**< Receive a initial message from stack */ - NW_GTPV2C_ULP_API_TRIGGERED_RSP_IND, /**< Recieve a triggered rsp message from stack */ - NW_GTPV2C_ULP_API_TRIGGERED_REQ_IND, /**< Recieve a triggered req message from stack */ - NW_GTPV2C_ULP_API_RSP_FAILURE_IND, /**< Rsp failure for gtpv2 message from stack */ - - /* Local tunnel management APIs from ULP to stack */ - - NW_GTPV2C_ULP_CREATE_LOCAL_TUNNEL, /**< Create a local tunnel */ - NW_GTPV2C_ULP_DELETE_LOCAL_TUNNEL, /**< Delete a local tunnel */ - - /* Do not add below this */ - NW_GTPV2C_ULP_API_END = 0xFFFFFFFF, - -} NwGtpv2cUlpApiTypeT; - -/** - * Error information of incoming GTP messages - */ - -typedef struct NwGtpv2cErrorS { - NW_IN uint8_t cause; - NW_IN uint8_t flags; - struct { - NW_IN uint8_t type; - NW_IN uint8_t instance; - } offendingIe; -} NwGtpv2cErrorT; - -/** - * API information elements between ULP and Stack for - * sending a Gtpv2c initial message. - */ - -typedef struct { - NW_INOUT NwGtpv2cTunnelHandleT hTunnel; /**< Tunnel handle over which the mesasge is to be sent.*/ - NW_IN uint16_t t3Timer; - NW_IN uint16_t maxRetries; - NW_IN NwGtpv2cUlpTrxnHandleT hUlpTrxn; /**< Optional handle to be returned in rsp of this msg. */ - - NW_IN uint32_t peerIp; /**< Required only in case when hTunnel == 0 */ - NW_IN uint32_t teidLocal; /**< Required only in case when hTunnel == 0 */ - NW_IN NwGtpv2cUlpTunnelHandleT hUlpTunnel; /**< Required only in case when hTunnel == 0 */ -} NwGtpv2cInitialReqInfoT; - -/** - * API information elements between ULP and Stack for - * sending a Gtpv2c triggered request message. - */ - -typedef struct { - NW_IN NwGtpv2cTunnelHandleT hTunnel; /**< Tunnel handle over which the mesasge is to be sent */ - NW_IN NwGtpv2cTrxnHandleT hTrxn; /**< Request Trxn handle which to which triggered req is being sent */ - NW_IN uint16_t t3Timer; - NW_IN uint16_t maxRetries; - NW_IN NwGtpv2cUlpTrxnHandleT hUlpTrxn; /**< Optional handle to be returned in rsp of this msg. */ - NW_IN uint32_t peerIp; /**< Required only in case when hTunnel == 0 */ - NW_IN uint32_t teidLocal; /**< Required only in case when hTunnel == 0 */ - NW_IN NwGtpv2cUlpTunnelHandleT hUlpTunnel; /**< Required only in case when hTunnel == 0 */ - -} NwGtpv2cTriggeredReqInfoT; - -/** - * API information elements between ULP and Stack for - * sending a Gtpv2c triggered response message. - */ - -typedef struct { - NW_IN NwGtpv2cTrxnHandleT hTrxn; /**< Request Trxn handle which to which triggered rsp is being sent */ - NW_IN uint32_t teidLocal; /**< Required only if NW_GTPV2C_ULP_API_FLAG_CREATE_LOCAL_TUNNEL is set to flags. */ - NW_IN NwGtpv2cUlpTunnelHandleT hUlpTunnel; /**< Required only if NW_GTPV2C_ULP_API_FLAG_CREATE_LOCAL_TUNNEL is set to flags. */ - - NW_OUT NwGtpv2cTunnelHandleT hTunnel; /**< Returned only in case flags is set to - NW_GTPV2C_ULP_API_FLAG_CREATE_LOCAL_TUNNEL */ -} NwGtpv2cTriggeredRspInfoT; - -/** - * API information elements between ULP and Stack for - * sending a Gtpv2c initial message. - */ - -typedef struct { - NW_IN NwGtpv2cErrorT error; - NW_IN NwGtpv2cTrxnHandleT hTrxn; - NW_IN NwGtpv2cUlpTrxnHandleT hUlpTrxn; - NW_IN NwGtpv2cMsgTypeT msgType; - NW_IN uint32_t peerIp; - NW_IN uint32_t peerPort; - NW_IN NwGtpv2cUlpTunnelHandleT hUlpTunnel; - NW_INOUT NwGtpv2cTunnelHandleT hTunnel; -} NwGtpv2cInitialReqIndInfoT; - -/** - * API information elements between ULP and Stack for - * sending a Gtpv2c triggered request message. - */ - -typedef struct { - NW_IN NwGtpv2cErrorT error; - NW_IN NwGtpv2cTrxnHandleT hTrxn; - NW_IN NwGtpv2cUlpTrxnHandleT hUlpTrxn; - NW_IN NwGtpv2cMsgTypeT msgType; - NW_IN uint32_t seqNum; - NW_IN uint32_t teidLocal; - NW_IN uint32_t teidRemote; - NW_IN NwGtpv2cUlpTunnelHandleT hUlpTunnel; -} NwGtpv2cTriggeredReqIndInfoT; - -/** - * API information elements between ULP and Stack for - * sending a Gtpv2c triggered response message. - */ - -typedef struct { - NW_IN NwGtpv2cErrorT error; - NW_IN NwGtpv2cUlpTrxnHandleT hUlpTrxn; - NW_IN NwGtpv2cUlpTunnelHandleT hUlpTunnel; - NW_IN NwGtpv2cMsgTypeT msgType; -} NwGtpv2cTriggeredRspIndInfoT; - -/** - * API information elements between ULP and Stack for - * receving a path failure indication from stack. - */ - -typedef struct { - NW_IN NwGtpv2cUlpTrxnHandleT hUlpTrxn; - NW_IN NwGtpv2cUlpTunnelHandleT hUlpTunnel; -} NwGtpv2cRspFailureIndInfoT; - -/** - * API information elements between ULP and Stack for - * creating local tunnel. - */ - -typedef struct { - NW_OUT NwGtpv2cTunnelHandleT hTunnel; - NW_IN NwGtpv2cUlpTunnelHandleT hUlpTunnel; - NW_IN uint32_t teidLocal; - NW_IN uint32_t peerIp; -} NwGtpv2cCreateLocalTunnelInfoT; - - -/** - * API information elements between ULP and Stack for - * deleting a local tunnel. - */ - -typedef struct { - NW_IN NwGtpv2cTunnelHandleT hTunnel; -} NwGtpv2cDeleteLocalTunnelInfoT; - - -/** - * API container structure between ULP and Stack. - */ - -typedef struct { - NwGtpv2cUlpApiTypeT apiType; /**< First bytes of this field is used as flag holder */ - NwGtpv2cMsgHandleT hMsg; /**< Handle associated with this API */ - union { - NwGtpv2cInitialReqInfoT initialReqInfo; - NwGtpv2cTriggeredRspInfoT triggeredRspInfo; - NwGtpv2cTriggeredReqInfoT triggeredReqInfo; - NwGtpv2cInitialReqIndInfoT initialReqIndInfo; - NwGtpv2cTriggeredRspIndInfoT triggeredRspIndInfo; - NwGtpv2cTriggeredReqIndInfoT triggeredReqIndInfo; - NwGtpv2cRspFailureIndInfoT rspFailureInfo; - NwGtpv2cCreateLocalTunnelInfoT createLocalTunnelInfo; - NwGtpv2cDeleteLocalTunnelInfoT deleteLocalTunnelInfo; - } apiInfo; -} NwGtpv2cUlpApiT; - - -/*--------------------------------------------------------------------------* - * S T A C K E N T I T I E S D E F I N I T I O N S * - *--------------------------------------------------------------------------*/ - -/** - * Gtpv2c ULP entity definition - */ - -typedef struct { - NwGtpv2cUlpHandleT hUlp; - NwRcT (*ulpReqCallback) ( NW_IN NwGtpv2cUlpHandleT hUlp, - NW_IN NwGtpv2cUlpApiT *pUlpApi); -} NwGtpv2cUlpEntityT; - - -/** - * Gtpv2c UDP entity definition - */ - -typedef struct { - NwGtpv2cUdpHandleT hUdp; - NwRcT (*udpDataReqCallback) ( NW_IN NwGtpv2cUdpHandleT udpHandle, - NW_IN uint8_t* dataBuf, - NW_IN uint32_t dataSize, - NW_IN uint32_t peerIp, - NW_IN uint32_t peerPort); -} NwGtpv2cUdpEntityT; - -/** - * Gtpv2c Memory Manager entity definition - */ - -typedef struct { - NwGtpv2cMemMgrHandleT hMemMgr; - void* (*memAlloc)( NW_IN NwGtpv2cMemMgrHandleT hMemMgr, - NW_IN uint32_t memSize, - NW_IN NwCharT* fileName, - NW_IN uint32_t lineNumber); - - void (*memFree) ( NW_IN NwGtpv2cMemMgrHandleT hMemMgr, - NW_IN void* hMem, - NW_IN NwCharT* fileName, - NW_IN uint32_t lineNumber); -} NwGtpv2cMemMgrEntityT; - - -#define NW_GTPV2C_TMR_TYPE_ONE_SHOT (0) -#define NW_GTPV2C_TMR_TYPE_REPETITIVE (1) -/** - * Gtpv2c Timer Manager entity definition - */ - -typedef struct { - NwGtpv2cTimerMgrHandleT tmrMgrHandle; - NwRcT (*tmrStartCallback)( NW_IN NwGtpv2cTimerMgrHandleT tmrMgrHandle, - NW_IN uint32_t timeoutSec, - NW_IN uint32_t timeoutUsec, - NW_IN uint32_t tmrType, - NW_IN void* tmrArg, - NW_OUT NwGtpv2cTimerHandleT* tmrHandle); - - NwRcT (*tmrStopCallback) ( NW_IN NwGtpv2cTimerMgrHandleT tmrMgrHandle, - NW_IN NwGtpv2cTimerHandleT tmrHandle); -} NwGtpv2cTimerMgrEntityT; - -/** - * Gtpv2c Log manager entity definition - */ - -typedef struct { - NwGtpv2cLogMgrHandleT logMgrHandle; - NwRcT (*logReqCallback) (NW_IN NwGtpv2cLogMgrHandleT logMgrHandle, - NW_IN uint32_t logLevel, - NW_IN NwCharT* filename, - NW_IN uint32_t line, - NW_IN NwCharT* logStr); -} NwGtpv2cLogMgrEntityT; - - -/*--------------------------------------------------------------------------* - * P U B L I C F U N C T I O N S * - *--------------------------------------------------------------------------*/ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - Constructor. Initialize nw-gtpv2c stack instance. - - @param[in,out] phGtpcStackHandle : Pointer to stack instance handle - */ - -NwRcT -nwGtpv2cInitialize( NW_INOUT NwGtpv2cStackHandleT* phGtpcStackHandle); - -/** - Destructor. Destroy nw-gtpv2c stack instance . - - @param[in] hGtpcStackHandle : Stack instance handle - */ - -NwRcT -nwGtpv2cFinalize( NW_IN NwGtpv2cStackHandleT hGtpcStackHandle); - -/** - Set Configuration for the nw-gtpv2c stack. - - @param[in,out] phGtpcStackHandle : Pointer to stack handle - */ - -NwRcT -nwGtpv2cConfigSet( NW_IN NwGtpv2cStackHandleT* phGtpcStackHandle, NW_IN NwGtpv2cStackConfigT* pConfig); - -/** - Get Configuration for the nw-gtpv2c stack. - - @param[in,out] phGtpcStackHandle : Pointer to stack handle - */ - -NwRcT -nwGtpv2cConfigGet( NW_IN NwGtpv2cStackHandleT* phGtpcStackHandle, NW_OUT NwGtpv2cStackConfigT* pConfig); - -/** - Set ULP entity for the stack. - - @param[in] hGtpcStackHandle : Stack handle - @param[in] pUlpEntity : Pointer to ULP entity. - @return NW_OK on success. - */ - -NwRcT -nwGtpv2cSetUlpEntity( NW_IN NwGtpv2cStackHandleT hGtpcStackHandle, - NW_IN NwGtpv2cUlpEntityT* pUlpEntity); - -/** - Set UDP entity for the stack. - - @param[in] hGtpcStackHandle : Stack handle - @param[in] pUdpEntity : Pointer to UDP entity. - @return NW_OK on success. - */ - -NwRcT -nwGtpv2cSetUdpEntity( NW_IN NwGtpv2cStackHandleT hGtpcStackHandle, - NW_IN NwGtpv2cUdpEntityT* pUdpEntity); - -/** - Set MemMgr entity for the stack. - - @param[in] hGtpcStackHandle : Stack handle - @param[in] pMemMgr : Pointer to Memory Manager. - @return NW_OK on success. - */ - -NwRcT -nwGtpv2cSetMemMgrEntity( NW_IN NwGtpv2cStackHandleT hGtpcStackHandle, - NW_IN NwGtpv2cMemMgrEntityT* pMemMgr); - - -/** - Set TmrMgr entity for the stack. - - @param[in] hGtpcStackHandle : Stack handle - @param[in] pTmrMgr : Pointer to Timer Manager. - @return NW_OK on success. - */ - -NwRcT -nwGtpv2cSetTimerMgrEntity( NW_IN NwGtpv2cStackHandleT hGtpcStackHandle, - NW_IN NwGtpv2cTimerMgrEntityT* pTmrMgr); - -/** - Set LogMgr entity for the stack. - - @param[in] hGtpcStackHandle : Stack handle - @param[in] pLogMgr : Pointer to Log Manager. - @return NW_OK on success. - */ - -NwRcT -nwGtpv2cSetLogMgrEntity( NW_IN NwGtpv2cStackHandleT hGtpcStackHandle, - NW_IN NwGtpv2cLogMgrEntityT* pLogMgr); - -/** - Set log level for the stack. - - @param[in] hGtpcStackHandle : Stack handle - @param[in] logLevel : Log Level. - @return NW_OK on success. - */ - -NwRcT -nwGtpv2cSetLogLevel( NW_IN NwGtpv2cStackHandleT hGtpcStackHandle, - NW_IN uint32_t logLevel); - - -/** - Process Data Request from UDP entity. - - @param[in] hGtpcStackHandle : Stack handle - @param[in] udpData : Pointer to received UDP data. - @param[in] udpDataLen : Received data length. - @param[in] dstPort : Received on port. - @param[in] from : Received from peer information. - @return NW_OK on success. - */ - -NwRcT -nwGtpv2cProcessUdpReq( NW_IN NwGtpv2cStackHandleT hGtpcStackHandle, - NW_IN uint8_t* udpData, - NW_IN uint32_t udpDataLen, - NW_IN uint16_t peerPort, - NW_IN uint32_t peerIP); - -/** - Process Request from ULP entity. - - @param[in] hGtpcStackHandle : Stack handle - @param[in] pLogMgr : Pointer to Ulp Req. - @return NW_OK on success. - */ - -NwRcT -nwGtpv2cProcessUlpReq( NW_IN NwGtpv2cStackHandleT hGtpcStackHandle, - NW_IN NwGtpv2cUlpApiT *ulpReq); - - -/** - Process Timer timeout Request from Timer Manager - - @param[in] pLogMgr : Pointer timeout arguments. - @return NW_OK on success. - */ - -NwRcT -nwGtpv2cProcessTimeout( NW_IN void* timeoutArg); - - -#ifdef __cplusplus -} -#endif - -#endif /* __NW_GTPV2C_H__ */ - -/*--------------------------------------------------------------------------* - * E N D O F F I L E * - *--------------------------------------------------------------------------*/ - diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/shared/NwGtpv2cIe.h b/openair-cn/GTPV2-C/nwgtpv2c-0.11/shared/NwGtpv2cIe.h deleted file mode 100644 index 2de7e217c7..0000000000 --- a/openair-cn/GTPV2-C/nwgtpv2c-0.11/shared/NwGtpv2cIe.h +++ /dev/null @@ -1,159 +0,0 @@ -/*----------------------------------------------------------------------------* - * * - * n w - g t p v 2 c * - * G P R S T u n n e l i n g P r o t o c o l v 2 c S t a c k * - * * - * * - * Copyright (c) 2010-2011 Amit Chawre * - * All rights reserved. * - * * - * Redistribution and use in source and binary forms, with or without * - * modification, are permitted provided that the following conditions * - * are met: * - * * - * 1. Redistributions of source code must retain the above copyright * - * notice, this list of conditions and the following disclaimer. * - * 2. Redistributions in binary form must reproduce the above copyright * - * notice, this list of conditions and the following disclaimer in the * - * documentation and/or other materials provided with the distribution. * - * 3. The name of the author may not be used to endorse or promote products * - * derived from this software without specific prior written permission. * - * * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - *----------------------------------------------------------------------------*/ - -/** - * @file NwGtpv2cIe.h - * @brief This header file contains Information Element definitions for GTPv2c - * as per 3GPP TS 29274-930. -*/ - -#ifndef __NW_GTPV2C_IE_H__ -#define __NW_GTPV2C_IE_H__ - -/*--------------------------------------------------------------------------* - * G T P V 2 C I E T Y P E M A C R O D E F I N I T I O N S * - *--------------------------------------------------------------------------*/ - -#define NW_GTPV2C_IE_RESERVED (0) -#define NW_GTPV2C_IE_IMSI (1) -#define NW_GTPV2C_IE_CAUSE (2) -#define NW_GTPV2C_IE_RECOVERY (3) -#define NW_GTPV2C_IE_APN (71) -#define NW_GTPV2C_IE_AMBR (72) -#define NW_GTPV2C_IE_EBI (73) -#define NW_GTPV2C_IE_IP_ADDRESS (74) -#define NW_GTPV2C_IE_MEI (75) -#define NW_GTPV2C_IE_MSISDN (76) -#define NW_GTPV2C_IE_INDICATION (77) -#define NW_GTPV2C_IE_PCO (78) -#define NW_GTPV2C_IE_PAA (79) -#define NW_GTPV2C_IE_BEARER_LEVEL_QOS (80) -#define NW_GTPV2C_IE_FLOW_QOS (81) -#define NW_GTPV2C_IE_RAT_TYPE (82) -#define NW_GTPV2C_IE_SERVING_NETWORK (83) -#define NW_GTPV2C_IE_BEARER_TFT (84) -#define NW_GTPV2C_IE_TAD (85) -#define NW_GTPV2C_IE_ULI (86) -#define NW_GTPV2C_IE_FTEID (87) -#define NW_GTPV2C_IE_TMSI (88) -#define NW_GTPV2C_IE_GLOBAL_CN_ID (89) -#define NW_GTPV2C_IE_S103PDF (90) -#define NW_GTPV2C_IE_S1UDF (91) -#define NW_GTPV2C_IE_DELAY_VALUE (92) -#define NW_GTPV2C_IE_BEARER_CONTEXT (93) -#define NW_GTPV2C_IE_CHARGING_ID (94) -#define NW_GTPV2C_IE_CHARGING_CHARACTERISTICS (95) -#define NW_GTPV2C_IE_TRACE_INFORMATION (96) -#define NW_GTPV2C_IE_BEARER_FLAGS (97) -#define NW_GTPV2C_IE_PDN_TYPE (99) -#define NW_GTPV2C_IE_PROCEDURE_TRANSACTION_ID (100) -#define NW_GTPV2C_IE_DRX_PARAMETER (101) -#define NW_GTPV2C_IE_UE_NETWORK_CAPABILITY (102) -#define NW_GTPV2C_IE_MM_CONTEXT (103) -#define NW_GTPV2C_IE_PDN_CONNECTION (109) -#define NW_GTPV2C_IE_PDU_NUMBERS (110) -#define NW_GTPV2C_IE_PTMSI (111) -#define NW_GTPV2C_IE_PTMSI_SIGNATURE (112) -#define NW_GTPV2C_IE_HOP_COUNTER (113) -#define NW_GTPV2C_IE_UE_TIME_ZONE (114) -#define NW_GTPV2C_IE_TRACE_REFERENCE (115) -#define NW_GTPV2C_IE_COMPLETE_REQUEST_MESSAGE (116) -#define NW_GTPV2C_IE_GUTI (117) -#define NW_GTPV2C_IE_F_CONTAINER (118) -#define NW_GTPV2C_IE_F_CAUSE (119) -#define NW_GTPV2C_IE_SELECTED_PLMN_ID (120) -#define NW_GTPV2C_IE_TARGET_IDENTIFICATION (121) -#define NW_GTPV2C_IE_PACKET_FLOW_ID (123) -#define NW_GTPV2C_IE_RAB_CONTEXT (124) -#define NW_GTPV2C_IE_SOURCE_RNC_PDCP_CONTEXT_INFO (125) -#define NW_GTPV2C_IE_UDP_SOURCE_PORT_NUMBER (126) -#define NW_GTPV2C_IE_APN_RESTRICTION (127) -#define NW_GTPV2C_IE_SELECTION_MODE (128) -#define NW_GTPV2C_IE_SOURCE_IDENTIFICATION (129) -#define NW_GTPV2C_IE_CHANGE_REPORTING_ACTION (131) -#define NW_GTPV2C_IE_FQ_CSID (132) -#define NW_GTPV2C_IE_CHANNEL_NEEDED (133) -#define NW_GTPV2C_IE_EMLPP_PRIORITY (134) -#define NW_GTPV2C_IE_NODE_TYPE (135) -#define NW_GTPV2C_IE_FQDN (136) -#define NW_GTPV2C_IE_TI (137) -#define NW_GTPV2C_IE_MBMS_SESSION_DURATION (138) -#define NW_GTPV2C_IE_MBMS_SERIVCE_AREA (139) -#define NW_GTPV2C_IE_MBMS_SESSION_IDENTIFIER (140) -#define NW_GTPV2C_IE_MBMS_FLOW_IDENTIFIER (141) -#define NW_GTPV2C_IE_MBMS_IP_MULTICAST_DISTRIBUTION (142) -#define NW_GTPV2C_IE_MBMS_IP_DISTRIBUTION_ACK (143) -#define NW_GTPV2C_IE_RFSP_INDEX (144) -#define NW_GTPV2C_IE_UCI (145) -#define NW_GTPV2C_IE_CSG_INFORMATION_REPORTING_ACTION (146) -#define NW_GTPV2C_IE_CSG_ID (147) -#define NW_GTPV2C_IE_CSG_MEMBERSHIP_INDICATION (148) -#define NW_GTPV2C_IE_SERVICE_INDICATOR (149) -#define NW_GTPV2C_IE_LDN (151) -#define NW_GTPV2C_IE_ADDITIONAL_MM_CTXT_FOR_SRVCC (159) -#define NW_GTPV2C_IE_ADDITIONAL_FLAGS_FOR_SRVCC (160) -#define NW_GTPV2C_IE_PRIVATE_EXTENSION (255) -#define NW_GTPV2C_IE_TYPE_MAXIMUM (256) - - -/*--------------------------------------------------------------------------* - * G T P V 2 C C A U S E V A L U E D E F I N I T I O N S * - *--------------------------------------------------------------------------*/ - -#define NW_GTPV2C_CAUSE_REQUEST_ACCEPTED (16) -#define NW_GTPV2C_CAUSE_INVALID_LENGTH (67) -#define NW_GTPV2C_CAUSE_MANDATORY_IE_INCORRECT (69) -#define NW_GTPV2C_CAUSE_MANDATORY_IE_MISSING (70) -#define NW_GTPV2C_CAUSE_SYSTEM_FAILURE (72) -#define NW_GTPV2C_CAUSE_REQUEST_REJECTED (94) -#define NW_GTPV2C_CAUSE_REMOTE_PEER_NOT_RESPONDING (100) -#define NW_GTPV2C_CAUSE_CONDITIONAL_IE_MISSING (103) - -#define NW_GTPV2C_IE_INSTANCE_ZERO (0) -#define NW_GTPV2C_IE_INSTANCE_ONE (1) -#define NW_GTPV2C_IE_INSTANCE_TWO (2) -#define NW_GTPV2C_IE_INSTANCE_THREE (3) -#define NW_GTPV2C_IE_INSTANCE_FOUR (4) -#define NW_GTPV2C_IE_INSTANCE_MAXIMUM (NW_GTPV2C_IE_INSTANCE_FOUR) - -#define NW_GTPV2C_IE_PRESENCE_MANDATORY (1) -#define NW_GTPV2C_IE_PRESENCE_CONDITIONAL (2) -#define NW_GTPV2C_IE_PRESENCE_CONDITIONAL_OPTIONAL (3) -#define NW_GTPV2C_IE_PRESENCE_OPTIONAL (4) - -#endif /* __NW_GTPV2C_IE_H__ */ - -/*--------------------------------------------------------------------------* - * E N D O F F I L E * - *--------------------------------------------------------------------------*/ - diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/shared/NwGtpv2cMsg.h b/openair-cn/GTPV2-C/nwgtpv2c-0.11/shared/NwGtpv2cMsg.h deleted file mode 100644 index 7c7476383b..0000000000 --- a/openair-cn/GTPV2-C/nwgtpv2c-0.11/shared/NwGtpv2cMsg.h +++ /dev/null @@ -1,626 +0,0 @@ -/*----------------------------------------------------------------------------* - * * - * n w - g t p v 2 c * - * G P R S T u n n e l i n g P r o t o c o l v 2 c S t a c k * - * * - * * - * Copyright (c) 2010-2011 Amit Chawre * - * All rights reserved. * - * * - * Redistribution and use in source and binary forms, with or without * - * modification, are permitted provided that the following conditions * - * are met: * - * * - * 1. Redistributions of source code must retain the above copyright * - * notice, this list of conditions and the following disclaimer. * - * 2. Redistributions in binary form must reproduce the above copyright * - * notice, this list of conditions and the following disclaimer in the * - * documentation and/or other materials provided with the distribution. * - * 3. The name of the author may not be used to endorse or promote products * - * derived from this software without specific prior written permission. * - * * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - *----------------------------------------------------------------------------*/ - -#ifndef __NW_GTPV2C_MSG_H__ -#define __NW_GTPV2C_MSG_H__ - -#include "NwTypes.h" -#include "NwGtpv2c.h" - -/** - * @file NwGtpv2cMsg.h - * @brief This file defines APIs for to build new outgoing gtpv2c messages and to parse incoming messages. - */ - -#ifdef __cplusplus -extern "C" { -#endif - -/*--------------------------------------------------------------------------* - * S H A R E D A P I M A C R O S * - *--------------------------------------------------------------------------*/ - - -#define NW_GTP_VERSION (0x02) /**< GTP Version */ -#define NW_GTPV2C_MINIMUM_HEADER_SIZE (8) /**< Size of GTPv2c minimun header */ -#define NW_GTPV2C_EPC_SPECIFIC_HEADER_SIZE (12) /**< Size of GTPv2c EPC specific header */ - -/* GTP Message Type Values */ -#define NW_GTP_ECHO_REQ (1) -#define NW_GTP_ECHO_RSP (2) -#define NW_GTP_VERSION_NOT_SUPPORTED_IND (3) -#define NW_GTP_CREATE_SESSION_REQ (32) -#define NW_GTP_CREATE_SESSION_RSP (33) -#define NW_GTP_MODIFY_BEARER_REQ (34) -#define NW_GTP_MODIFY_BEARER_RSP (35) -#define NW_GTP_DELETE_SESSION_REQ (36) -#define NW_GTP_DELETE_SESSION_RSP (37) -#define NW_GTP_MODIFY_BEARER_CMD (64) -#define NW_GTP_MODIFY_BEARER_FAILURE_IND (65) -#define NW_GTP_DELETE_BEARER_CMD (66) -#define NW_GTP_DELETE_BEARER_FAILURE_IND (67) -#define NW_GTP_BEARER_RESOURCE_CMD (68) -#define NW_GTP_BEARER_RESOURCE_FAILURE_IND (69) -#define NW_GTP_DOWNLINK_DATA_NOTIFICATION_FAILURE_IND (70) -#define NW_GTP_TRACE_SESSION_ACTIVATION (71) -#define NW_GTP_TRACE_SESSION_DEACTIVATION (72) -#define NW_GTP_STOP_PAGING_IND (73) -#define NW_GTP_CREATE_BEARER_REQ (95) -#define NW_GTP_CREATE_BEARER_RSP (96) -#define NW_GTP_UPDATE_BEARER_REQ (97) -#define NW_GTP_UPDATE_BEARER_RSP (98) -#define NW_GTP_DELETE_BEARER_REQ (99) -#define NW_GTP_DELETE_BEARER_RSP (100) -#define NW_GTP_DELETE_PDN_CONNECTION_SET_REQ (101) -#define NW_GTP_DELETE_PDN_CONNECTION_SET_RSP (102) -#define NW_GTP_IDENTIFICATION_REQ (128) -#define NW_GTP_IDENTIFICATION_RSP (129) -#define NW_GTP_CONTEXT_REQ (130) -#define NW_GTP_CONTEXT_RSP (131) -#define NW_GTP_CONTEXT_ACK (132) -#define NW_GTP_FORWARD_RELOCATION_REQ (133) -#define NW_GTP_FORWARD_RELOCATION_RSP (134) -#define NW_GTP_FORWARD_RELOCATION_COMPLETE_NTF (135) -#define NW_GTP_FORWARD_RELOCATION_COMPLETE_ACK (136) -#define NW_GTP_FORWARD_ACCESS_CONTEXT_NTF (137) -#define NW_GTP_FORWARD_ACCESS_CONTEXT_ACK (138) -#define NW_GTP_RELOCATION_CANCEL_REQ (139) -#define NW_GTP_RELOCATION_CANCEL_RSP (140) -#define NW_GTP_CONFIGURE_TRANSFER_TUNNEL (141) -#define NW_GTP_DETACH_NTF (149) -#define NW_GTP_DETACH_ACK (150) -#define NW_GTP_CS_PAGING_INDICATION (151) -#define NW_GTP_RAN_INFORMATION_RELAY (152) -#define NW_GTP_ALERT_MME_NTF (153) -#define NW_GTP_ALERT_MME_ACK (154) -#define NW_GTP_UE_ACTIVITY_NTF (155) -#define NW_GTP_UE_ACTIVITY_ACK (156) -#define NW_GTP_CREATE_FORWARDING_TUNNEL_REQ (160) -#define NW_GTP_CREATE_FORWARDING_TUNNEL_RSP (161) -#define NW_GTP_SUSPEND_NTF (162) -#define NW_GTP_SUSPEND_ACK (163) -#define NW_GTP_RESUME_NTF (164) -#define NW_GTP_RESUME_ACK (165) -#define NW_GTP_CREATE_INDIRECT_DATA_FORWARDING_TUNNEL_REQ (166) -#define NW_GTP_CREATE_INDIRECT_DATA_FORWARDING_TUNNEL_RSP (167) -#define NW_GTP_DELETE_INDIRECT_DATA_FORWARDING_TUNNEL_REQ (168) -#define NW_GTP_DELETE_INDIRECT_DATA_FORWARDING_TUNNEL_RSP (169) -#define NW_GTP_RELEASE_ACCESS_BEARERS_REQ (170) -#define NW_GTP_RELEASE_ACCESS_BEARERS_RSP (171) -#define NW_GTP_DOWNLINK_DATA_NOTIFICATION (176) -#define NW_GTP_DOWNLINK_DATA_NOTIFICATION_ACK (177) -#define NW_GTP_RESERVED (178) -#define NW_GTP_UPDATE_PDN_CONNECTION_SET_REQ (200) -#define NW_GTP_UPDATE_PDN_CONNECTION_SET_RSP (201) -#define NW_GTP_MBMS_SESSION_START_REQ (231) -#define NW_GTP_MBMS_SESSION_START_RSP (232) -#define NW_GTP_MBMS_SESSION_UPDATE_REQ (233) -#define NW_GTP_MBMS_SESSION_UPDATE_RSP (234) -#define NW_GTP_MBMS_SESSION_STOP_REQ (235) -#define NW_GTP_MBMS_SESSION_STOP_RSP (236) -#define NW_GTP_MSG_END (255) - - -/* Cause Values */ -#define NW_GTPV2C_CAUSE_BIT_NONE (0x00) -#define NW_GTPV2C_CAUSE_BIT_CS (0x01) -#define NW_GTPV2C_CAUSE_BIT_BCE (0x02) -#define NW_GTPV2C_CAUSE_BIT_PCE (0x04) - -/* RAT Type Values */ -#define NW_RAT_TYPE_EUTRAN (0x06) - -/* PDN Type Values */ -#define NW_PDN_TYPE_IPv4 (0x01) -#define NW_PDN_TYPE_IPv6 (0x02) -#define NW_PDN_TYPE_IPv4IPv6 (0x03) - -/* Interface Type Values */ -#define NW_GTPV2C_IFTYPE_S1U_ENODEB_GTPU (0) -#define NW_GTPV2C_IFTYPE_S1U_SGW_GTPU (1) -#define NW_GTPV2C_IFTYPE_S12_RNC_GTPU (2) -#define NW_GTPV2C_IFTYPE_S12_SGW_GTPU (3) -#define NW_GTPV2C_IFTYPE_S5S8_SGW_GTPU (4) -#define NW_GTPV2C_IFTYPE_S5S8_PGW_GTPU (5) -#define NW_GTPV2C_IFTYPE_S5S8_SGW_GTPC (6) -#define NW_GTPV2C_IFTYPE_S5S8_PGW_GTPC (7) -#define NW_GTPV2C_IFTYPE_S5S8_SGW_PIMPv6 (8) -#define NW_GTPV2C_IFTYPE_S5S8_PGW_PIMPv6 (9) -#define NW_GTPV2C_IFTYPE_S11_MME_GTPC (10) -#define NW_GTPV2C_IFTYPE_S11S4_SGW_GTPC (11) - -/* Indication Flag Values */ -#define NW_GTPV2C_INDICATION_FLAG_NONE (0x0000) -#define NW_GTPV2C_INDICATION_FLAG_DAF (0x8000) -#define NW_GTPV2C_INDICATION_FLAG_DTF (0x4000) -#define NW_GTPV2C_INDICATION_FLAG_HI (0x2000) -#define NW_GTPV2C_INDICATION_FLAG_DFI (0x1000) -#define NW_GTPV2C_INDICATION_FLAG_OI (0x0800) -#define NW_GTPV2C_INDICATION_FLAG_ISRSI (0x0400) -#define NW_GTPV2C_INDICATION_FLAG_ISRAI (0x0200) -#define NW_GTPV2C_INDICATION_FLAG_SGWCI (0x0100) - -#define NW_GTPV2C_INDICATION_FLAG_SPARE (0x0080) -#define NW_GTPV2C_INDICATION_FLAG_UMSI (0x0040) -#define NW_GTPV2C_INDICATION_FLAG_CSFI (0x0020) -#define NW_GTPV2C_INDICATION_FLAG_CRSI (0x0010) -#define NW_GTPV2C_INDICATION_FLAG_PS (0x0008) -#define NW_GTPV2C_INDICATION_FLAG_PT (0x0004) -#define NW_GTPV2C_INDICATION_FLAG_SI (0x0002) -#define NW_GTPV2C_INDICATION_FLAG_MSV (0x0001) - -/*--------------------------------------------------------------------------* - * G T P V 2 C I E D A T A - T Y P E D E F I N I T I O N S * - *--------------------------------------------------------------------------*/ - -#pragma pack(1) - -typedef struct NwGtpv2cIeTv1 { - uint8_t t; - uint16_t l; - uint8_t i; - uint8_t v; -} NwGtpv2cIeTv1T; - -typedef struct NwGtpv2cIeTv2 { - uint8_t t; - uint16_t l; - uint8_t i; - uint16_t v; -} NwGtpv2cIeTv2T; - -typedef struct NwGtpv2cIeTv4 { - uint8_t t; - uint16_t l; - uint8_t i; - uint32_t v; -} NwGtpv2cIeTv4T; - -typedef struct NwGtpv2cIeTv8 { - uint8_t t; - uint16_t l; - uint8_t i; - uint64_t v; -} NwGtpv2cIeTv8T; - -typedef struct NwGtpv2cIeTlv { - uint8_t t; - uint16_t l; - uint8_t i; -} NwGtpv2cIeTlvT; - -#pragma pack() - - -/** - * Allocate a gtpv2c message. - * - * @param[in] hGtpcStackHandle : gtpv2c stack handle. - * @param[in] teidPresent : TEID is present flag. - * @param[in] msgType : Message type for this message. - * @param[in] teid : TEID for this message. - * @param[in] seqNum : Sequence number for this message. - * @param[out] phMsg : Pointer to message handle. - */ - -NwRcT -nwGtpv2cMsgNew( NW_IN NwGtpv2cStackHandleT hGtpcStackHandle, - NW_IN uint8_t teidPresent, - NW_IN uint8_t msgType, - NW_IN uint32_t teid, - NW_IN uint32_t seqNum, - NW_OUT NwGtpv2cMsgHandleT *phMsg); - - -/** - * Allocate a gtpv2c message from data buffer. - * - * @param[in] hGtpcStackHandle : gtpv2c stack handle. - * @param[in] pBuf: Buffer to be copied in this message. - * @param[in] bufLen: Buffer length to be copied in this message. - * @param[out] phMsg : Pointer to message handle. - */ - -NwRcT -nwGtpv2cMsgFromBufferNew( NW_IN NwGtpv2cStackHandleT hGtpcStackHandle, - NW_IN uint8_t* pBuf, - NW_IN uint32_t bufLen, - NW_OUT NwGtpv2cMsgHandleT *phMsg); - -/** - * Free a gtpv2c message. - * - * @param[in] hGtpcStackHandle : gtpv2c stack handle. - * @param[in] hMsg : Message handle. - */ - -NwRcT -nwGtpv2cMsgDelete( NW_IN NwGtpv2cStackHandleT hGtpcStackHandle, - NW_IN NwGtpv2cMsgHandleT hMsg); - -/** - * Set TEID for gtpv2c message. - * - * @param[in] hMsg : Message handle. - * @param[in] teid: TEID value. - */ - -NwRcT -nwGtpv2cMsgSetTeid(NW_IN NwGtpv2cMsgHandleT hMsg, uint32_t teid); - -/** - * Set TEID present flag for gtpv2c message. - * - * @param[in] hMsg : Message handle. - * @param[in] teidPesent: Flag boolean value. - */ - -NwRcT -nwGtpv2cMsgSetTeidPresent(NW_IN NwGtpv2cMsgHandleT hMsg, NwBoolT teidPresent); - -/** - * Set sequence for gtpv2c message. - * - * @param[in] hMsg : Message handle. - * @param[in] seqNum: Flag boolean value. - */ - -NwRcT -nwGtpv2cMsgSetSeqNumber(NW_IN NwGtpv2cMsgHandleT hMsg, uint32_t seqNum); - -/** - * Get TEID present for gtpv2c message. - * - * @param[in] hMsg : Message handle. - */ - -uint32_t -nwGtpv2cMsgGetTeid(NW_IN NwGtpv2cMsgHandleT hMsg); - -/** - * Get TEID present for gtpv2c message. - * - * @param[in] hMsg : Message handle. - */ - -NwBoolT -nwGtpv2cMsgGetTeidPresent(NW_IN NwGtpv2cMsgHandleT hMsg); - -/** - * Get sequence number for gtpv2c message. - * - * @param[in] hMsg : Message handle. - */ - -uint32_t -nwGtpv2cMsgGetSeqNumber(NW_IN NwGtpv2cMsgHandleT hMsg); - -/** - * Get msg lenght for gtpv2c message. - * - * @param[in] hMsg : Message handle. - */ - -uint32_t -nwGtpv2cMsgGetLength(NW_IN NwGtpv2cMsgHandleT hMsg); - -/** - * Add a gtpv2c information element of length 1 to gtpv2c message. - * - * @param[in] hMsg : Handle to gtpv2c message. - * @param[in] type : IE type. - * @param[in] instance : IE instance. - * @param[in] value : IE value. - */ - -NwRcT -nwGtpv2cMsgAddIeTV1(NW_IN NwGtpv2cMsgHandleT hMsg, - NW_IN uint8_t type, - NW_IN uint8_t instance, - NW_IN uint8_t value); - - -/** - * Add a gtpv2c information element of length 2 to gtpv2c message. - * - * @param[in] hMsg : Handle to gtpv2c message. - * @param[in] type : IE type. - * @param[in] instance : IE instance. - * @param[in] value : IE value. - */ - -NwRcT -nwGtpv2cMsgAddIeTV2(NW_IN NwGtpv2cMsgHandleT hMsg, - NW_IN uint8_t type, - NW_IN uint8_t instance, - NW_IN uint16_t value); - - -/** - * Add a gtpv2c information element of length 4 to gtpv2c message. - * - * @param[in] hMsg : Handle to gtpv2c message. - * @param[in] type : IE type. - * @param[in] instance : IE instance. - * @param[in] value : IE value. - */ - -NwRcT -nwGtpv2cMsgAddIeTV4(NW_IN NwGtpv2cMsgHandleT hMsg, - NW_IN uint8_t type, - NW_IN uint8_t instance, - NW_IN uint32_t value); - - -/** - * Add a gtpv2c information element of variable length to gtpv2c message. - * - * @param[in] hMsg : Handle to gtpv2c message. - * @param[in] type : IE type. - * @param[in] length : IE length. - * @param[in] instance : IE instance. - * @param[in] value : IE value. - */ - -NwRcT -nwGtpv2cMsgAddIe(NW_IN NwGtpv2cMsgHandleT hMsg, - NW_IN uint8_t type, - NW_IN uint16_t length, - NW_IN uint8_t instance, - NW_IN uint8_t* pVal); - -/** - * Add CAUSE information element to gtpv2c message. - * - * @param[in] hMsg : Handle to gtpv2c message. - * @param[in] instance : IE instance. - * @param[in] causeValue: Cause value. - * @param[in] bitFlags: PDN Connetiion IE Error Flag, Bearer Context IE Error Flag, Cause Source Flag. - * @param[in] offendingIeType: Offending IE type. - * @param[in] offendingIeInstance: Offending IE instance. - */ - -NwRcT -nwGtpv2cMsgAddIeCause(NW_IN NwGtpv2cMsgHandleT hMsg, - NW_IN uint8_t instance, - NW_IN uint8_t causeValue, - NW_IN uint8_t bitFlags, - NW_IN uint8_t offendingIeType, - NW_IN uint8_t offendingIeInstance); - -/** - * Add F-TEID information element to gtpv2c message. - * - * @param[in] hMsg : Handle to gtpv2c message. - * @param[in] instance : IE instance. - * @param[in] ifType : Interface Type. - * @param[in] teidOrGreKey: TEID/ GRE Key - * @param[in] ipv4Addr : Ipv4 Address in Network Byte Order. - * @param[in] pIpv6Addr: Pointer to IPv6 Address in Network Byte Order. - */ - -NwRcT -nwGtpv2cMsgAddIeFteid(NW_IN NwGtpv2cMsgHandleT hMsg, - NW_IN uint8_t instance, - NW_IN uint8_t ifType, - NW_IN uint32_t teidOrGreKey, - NW_IN uint32_t ipv4Addr, - NW_IN uint8_t* pIpv6Addr); - -NwRcT -nwGtpv2cMsgGroupedIeStart(NW_IN NwGtpv2cMsgHandleT hMsg, - NW_IN uint8_t type, - NW_IN uint8_t instance); - -NwRcT -nwGtpv2cMsgGroupedIeEnd(NW_IN NwGtpv2cMsgHandleT hMsg); - - -/** - * Check if information element of type and instance is present - * in gtpv2c message. - * - * @param[in] hMsg : Handle to gtpv2c message. - * @param[in] type : IE Type. - * @param[in] instance : IE instance. - * @return NW_TRUE on success, NW_FALSE on failure. - */ - -NwBoolT -nwGtpv2cMsgIsIePresent(NW_IN NwGtpv2cMsgHandleT hMsg, - NW_IN uint8_t type, - NW_IN uint8_t instance); - -/** - * Get an information element of type 'uint8_t' from gtpv2c message. - * - * @param[in] hMsg : Handle to gtpv2c message. - * @param[in] type : IE Type. - * @param[in] instance : IE instance. - * @param[out] pVal : Pointer to value buffer. - * @return NW_OK on success. - */ - -NwRcT -nwGtpv2cMsgGetIeTV1(NW_IN NwGtpv2cMsgHandleT hMsg, - NW_IN uint8_t type, - NW_IN uint8_t instance, - NW_OUT uint8_t* pVal); - -/** - * Get an information element of type 'uint16_t' from gtpv2c message. - * - * @param[in] hMsg : Handle to gtpv2c message. - * @param[in] tyep : IE Type. - * @param[in] instance : IE instance. - * @param[out] pVal : Pointer to value buffer. - * @return NW_OK on success. - */ - - -NwRcT -nwGtpv2cMsgGetIeTV2(NW_IN NwGtpv2cMsgHandleT hMsg, - NW_IN uint8_t type, - NW_IN uint8_t instance, - NW_OUT uint16_t* pVal); - -/** - * Get an information element of type 'uint32_t' from gtpv2c message. - * - * @param[in] hMsg : Handle to gtpv2c message. - * @param[in] tyep : IE Type. - * @param[in] instance : IE instance. - * @param[out] pVal : Pointer to value buffer. - * @return NW_OK on success. - */ - - -NwRcT -nwGtpv2cMsgGetIeTV4(NW_IN NwGtpv2cMsgHandleT hMsg, - NW_IN uint8_t type, - NW_IN uint8_t instance, - NW_OUT uint32_t* pVal); - -/** - * Get an information element of type 'uint64_t' from gtpv2c message. - * - * @param[in] hMsg : Handle to gtpv2c message. - * @param[in] tyep : IE Type. - * @param[in] instance : IE instance. - * @param[out] pVal : Pointer to IE value buffer. - * @return NW_OK on success. - */ - - -NwRcT -nwGtpv2cMsgGetIeTV8(NW_IN NwGtpv2cMsgHandleT hMsg, - NW_IN uint8_t type, - NW_IN uint8_t instance, - NW_OUT uint64_t* pVal); - -/** - * Get an information element of variable length from gtpv2c message. - * - * @param[in] hMsg : Handle to gtpv2c message. - * @param[in] tyep : IE Type. - * @param[in] instance : IE instance. - * @param[in] maxLen : Maximum length of IE. - * @param[out] pVal : Pointer to IE value buffer. - * @param[out] pLen : Pointer to IE length buffer. - * @return NW_OK on success. - */ - -NwRcT -nwGtpv2cMsgGetIeTlv(NW_IN NwGtpv2cMsgHandleT hMsg, - NW_IN uint8_t type, - NW_IN uint8_t instance, - NW_IN uint16_t maxLen, - NW_OUT uint8_t* pVal, - NW_OUT uint16_t* pLen); - -/** - * Get an information element of variable length from gtpv2c message. - * - * @param[in] hMsg : Handle to gtpv2c message. - * @param[in] tyep : IE Type. - * @param[in] instance : IE instance. - * @param[out] ppVal : Pointer to IE value buffer pointer. - * @param[out] pLen : Pointer to IE length buffer. - * @return NW_OK on success. - */ - -NwRcT -nwGtpv2cMsgGetIeTlvP(NW_IN NwGtpv2cMsgHandleT hMsg, - NW_IN uint8_t type, - NW_IN uint8_t instance, - NW_OUT uint8_t** ppVal, - NW_OUT uint16_t* pLen); - - -/** - * Get F-TEID information element to gtpv2c message. - * - * @param[in] hMsg : Handle to gtpv2c message. - * @param[in] instance : IE instance. - * @param[out] ifType : Interface Type. - * @param[out] teidOrGreKey: TEID/ GRE Key - * @param[out] ipv4Addr : Ipv4 Address in Network Byte Order. - * @param[out] pIpv6Addr: Pointer to IPv6 Address in Network Byte Order. - */ - -NwRcT -nwGtpv2cMsgGetIeFteid(NW_IN NwGtpv2cMsgHandleT hMsg, - NW_IN uint8_t instance, - NW_OUT uint8_t* ifType, - NW_OUT uint32_t* teidOrGreKey, - NW_OUT uint32_t* ipv4Addr, - NW_OUT uint8_t* pIpv6Addr); - -NwRcT -nwGtpv2cMsgGetIeCause(NW_IN NwGtpv2cMsgHandleT hMsg, - NW_IN uint8_t instance, - NW_OUT uint8_t* causeValue, - NW_OUT uint8_t* flags, - NW_OUT uint8_t* offendingIeType, - NW_OUT uint8_t* offendingIeInstance); - -/** - * Get msg type for gtpv2c message. - * - * @param[in] hMsg : Message handle. - */ - -uint32_t -nwGtpv2cMsgGetMsgType(NW_IN NwGtpv2cMsgHandleT hMsg); - -/** - * Dump the contents of gtpv2c message. - * - * @param[in] hMsg : Handle to gtpv2c message. - * @param[in] fp: Pointer to output file. - */ - -NwRcT -nwGtpv2cMsgHexDump(NwGtpv2cMsgHandleT hMsg, FILE* fp); - -#ifdef __cplusplus -} -#endif - -#endif /* __NW_GTPV2C_MSG_H__ */ - - -/*--------------------------------------------------------------------------* - * E N D O F F I L E * - *--------------------------------------------------------------------------*/ - diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/shared/NwGtpv2cMsgParser.h b/openair-cn/GTPV2-C/nwgtpv2c-0.11/shared/NwGtpv2cMsgParser.h deleted file mode 100644 index a16bf4800a..0000000000 --- a/openair-cn/GTPV2-C/nwgtpv2c-0.11/shared/NwGtpv2cMsgParser.h +++ /dev/null @@ -1,153 +0,0 @@ -/*----------------------------------------------------------------------------* - * * - * n w - g t p v 2 c * - * G P R S T u n n e l i n g P r o t o c o l v 2 c S t a c k * - * * - * * - * Copyright (c) 2010-2011 Amit Chawre * - * All rights reserved. * - * * - * Redistribution and use in source and binary forms, with or without * - * modification, are permitted provided that the following conditions * - * are met: * - * * - * 1. Redistributions of source code must retain the above copyright * - * notice, this list of conditions and the following disclaimer. * - * 2. Redistributions in binary form must reproduce the above copyright * - * notice, this list of conditions and the following disclaimer in the * - * documentation and/or other materials provided with the distribution. * - * 3. The name of the author may not be used to endorse or promote products * - * derived from this software without specific prior written permission. * - * * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - *----------------------------------------------------------------------------*/ - -#include <string.h> -#include "NwTypes.h" -#include "NwGtpv2c.h" -#include "NwGtpv2cIe.h" - -#ifndef __NW_GTPV2C_MSG_PARSER_H__ -#define __NW_GTPV2C_MSG_PARSER_H__ - -/** - * @file NwGtpv2cMsgParser.h - * @brief This file defines APIs to parser gtpv2c messages. -*/ - -typedef struct { - uint16_t msgType; - uint16_t mandatoryIeCount; - NwGtpv2cStackHandleT hStack; - NwRcT (*ieReadCallback) (uint8_t ieType, uint8_t ieLength, uint8_t ieInstance, uint8_t* ieValue, void* ieReadCallbackArg); - void* ieReadCallbackArg; - - struct { - uint8_t iePresence; - NwRcT (*ieReadCallback) (uint8_t ieType, uint8_t ieLength, uint8_t ieInstance, uint8_t* ieValue, void* ieReadCallbackArg); - void* ieReadCallbackArg; - } ieParseInfo[NW_GTPV2C_IE_TYPE_MAXIMUM][NW_GTPV2C_IE_INSTANCE_MAXIMUM]; - - uint8_t *pIe[NW_GTPV2C_IE_TYPE_MAXIMUM][NW_GTPV2C_IE_INSTANCE_MAXIMUM]; -} NwGtpv2cMsgParserT; - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * Allocate a gtpv2c message Parser. - * - * @param[in] hGtpcStackHandle : gtpv2c stack handle. - * @param[in] msgType : Message type for this message parser. - * @param[out] pthiz : Pointer to message parser handle. - */ - -NwRcT -nwGtpv2cMsgParserNew( NW_IN NwGtpv2cStackHandleT hGtpcStackHandle, - NW_IN uint8_t msgType, - NW_IN NwRcT (*ieReadCallback) (uint8_t ieType, - uint8_t ieLength, - uint8_t ieInstance, - uint8_t* ieValue, - void* ieReadCallbackArg), - NW_IN void* ieReadCallbackArg, - NW_IN NwGtpv2cMsgParserT **pthiz); - - -/** - * Free a gtpv2c message parser. - * - * @param[in] hGtpcStackHandle : gtpv2c stack handle. - * @param[in] thiz : Message parser handle. - */ - -NwRcT -nwGtpv2cMsgParserDelete( NW_IN NwGtpv2cStackHandleT hGtpcStackHandle, - NW_IN NwGtpv2cMsgParserT* thiz); - -NwRcT -nwGtpv2cMsgParserUpdateIe( NW_IN NwGtpv2cMsgParserT* thiz, - NW_IN uint8_t ieType, - NW_IN uint8_t ieInstance, - NW_IN uint8_t iePresence, - NW_IN NwRcT (*ieReadCallback) (uint8_t ieType, - uint8_t ieLength, - uint8_t ieInstance, - uint8_t* ieValue, - void* ieReadCallbackArg), - NW_IN void* ieReadCallbackArg); - - -NwRcT -nwGtpv2cMsgParserUpdateIeReadCallback( NW_IN NwGtpv2cMsgParserT* thiz, - NW_IN NwRcT (*ieReadCallback) (uint8_t ieType, - uint8_t ieLength, - uint8_t ieInstance, - uint8_t* ieValue, - void* ieReadCallbackArg)); - - -NwRcT -nwGtpv2cMsgParserUpdateIeReadCallbackArg( NW_IN NwGtpv2cMsgParserT* thiz, - NW_IN void* ieReadCallbackArg); - -NwRcT -nwGtpv2cMsgParserAddIe( NW_IN NwGtpv2cMsgParserT* thiz, - NW_IN uint8_t ieType, - NW_IN uint8_t ieInstance, - NW_IN uint8_t iePresence, - NW_IN NwRcT (*ieReadCallback) (uint8_t ieType, - uint8_t ieLength, - uint8_t ieInstance, - uint8_t* ieValue, - void* ieReadCallbackArg), - NW_IN void* ieReadCallbackArg); - -NwRcT -nwGtpv2cMsgParserRun( NW_IN NwGtpv2cMsgParserT *thiz, - NW_IN NwGtpv2cMsgHandleT hMsg, - NW_OUT uint8_t *pOffendingIeType, - NW_OUT uint8_t *pOffendingIeInstance, - NW_OUT uint16_t *pOffendingIeLength); - -#ifdef __cplusplus -} -#endif - -#endif /* __NW_GTPV2C_MSG_PARSER_H__ */ - - -/*--------------------------------------------------------------------------* - * E N D O F F I L E * - *--------------------------------------------------------------------------*/ - diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/shared/NwLog.h b/openair-cn/GTPV2-C/nwgtpv2c-0.11/shared/NwLog.h deleted file mode 100644 index a941a31905..0000000000 --- a/openair-cn/GTPV2-C/nwgtpv2c-0.11/shared/NwLog.h +++ /dev/null @@ -1,85 +0,0 @@ -/*----------------------------------------------------------------------------* - * * - * n w - g t p v 2 c * - * G P R S T u n n e l i n g P r o t o c o l v 2 c S t a c k * - * * - * * - * Copyright (c) 2010-2011 Amit Chawre * - * All rights reserved. * - * * - * Redistribution and use in source and binary forms, with or without * - * modification, are permitted provided that the following conditions * - * are met: * - * * - * 1. Redistributions of source code must retain the above copyright * - * notice, this list of conditions and the following disclaimer. * - * 2. Redistributions in binary form must reproduce the above copyright * - * notice, this list of conditions and the following disclaimer in the * - * documentation and/or other materials provided with the distribution. * - * 3. The name of the author may not be used to endorse or promote products * - * derived from this software without specific prior written permission. * - * * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - *----------------------------------------------------------------------------*/ - - -#ifndef __NW_LOG_H__ -#define __NW_LOG_H__ - -#include <libgen.h> - -#include "NwTypes.h" - -/** - * @file NwLog.h - * @brief This header file contains global shared logging definitions. -*/ - -#ifdef __cplusplus -extern "C" { -#endif - -/*--------------------------------------------------------------------------- - * Log Level Definitions - *--------------------------------------------------------------------------*/ - -#define NW_LOG_LEVEL_EMER (0) /**< system is unusable */ -#define NW_LOG_LEVEL_ALER (1) /**< action must be taken immediately*/ -#define NW_LOG_LEVEL_CRIT (2) /**< critical conditions */ -#define NW_LOG_LEVEL_ERRO (3) /**< error conditions */ -#define NW_LOG_LEVEL_WARN (4) /**< warning conditions */ -#define NW_LOG_LEVEL_NOTI (5) /**< normal but signification condition */ -#define NW_LOG_LEVEL_INFO (6) /**< informational */ -#define NW_LOG_LEVEL_DEBG (7) /**< debug-level messages */ - -/*--------------------------------------------------------------------------- - * IPv4 logging macros - *--------------------------------------------------------------------------*/ - -#define NW_IPV4_ADDR "%u.%u.%u.%u" -#define NW_IPV4_ADDR_FORMAT(__addr) (uint8_t)((__addr) & 0x000000ff), \ - (uint8_t)(((__addr) & 0x0000ff00) >> 8 ), \ - (uint8_t)(((__addr) & 0x00ff0000) >> 16), \ - (uint8_t)(((__addr) & 0xff000000) >> 24) - -#define NW_IPV4_ADDR_FORMATP(__paddr) (uint8_t)(*((uint8_t*)(__paddr)) & 0x000000ff), \ - (uint8_t)(*((uint8_t*)(__paddr + 1)) & 0x000000ff), \ - (uint8_t)(*((uint8_t*)(__paddr + 2)) & 0x000000ff), \ - (uint8_t)(*((uint8_t*)(__paddr + 3)) & 0x000000ff) - -#ifdef __cplusplus -} -#endif - -#endif /* __NW_LOG_H__ */ - - diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/shared/NwTypes.h b/openair-cn/GTPV2-C/nwgtpv2c-0.11/shared/NwTypes.h deleted file mode 100644 index 78be53a5d0..0000000000 --- a/openair-cn/GTPV2-C/nwgtpv2c-0.11/shared/NwTypes.h +++ /dev/null @@ -1,83 +0,0 @@ -/*----------------------------------------------------------------------------* - * * - * n w - g t p v 2 c * - * G P R S T u n n e l i n g P r o t o c o l v 2 c S t a c k * - * * - * * - * Copyright (c) 2010-2011 Amit Chawre * - * All rights reserved. * - * * - * Redistribution and use in source and binary forms, with or without * - * modification, are permitted provided that the following conditions * - * are met: * - * * - * 1. Redistributions of source code must retain the above copyright * - * notice, this list of conditions and the following disclaimer. * - * 2. Redistributions in binary form must reproduce the above copyright * - * notice, this list of conditions and the following disclaimer in the * - * documentation and/or other materials provided with the distribution. * - * 3. The name of the author may not be used to endorse or promote products * - * derived from this software without specific prior written permission. * - * * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - *----------------------------------------------------------------------------*/ - - -#include <stdlib.h> -#include <stdint.h> - -#ifndef __NW_TYPES_H__ -#define __NW_TYPES_H__ - -/** - * @file NwTypes.h - * @brief This header file contains basic type definitions. -*/ - -#ifdef __cplusplus -extern "C" { -#endif - -#define NW_IN /**< An input argument */ -#define NW_OUT /**< An output argument */ -#define NW_INOUT /**< An input and output argument */ - -#define NW_TRUE (1) /**< Truth value */ -#define NW_FALSE (0) /**< False value */ - -typedef unsigned char uint8_t; /**< Unsigned 1 byte */ -typedef unsigned short uint16_t; /**< Unsigned 2 byte */ -typedef unsigned int uint32_t; /**< Unsigned 4 byte */ -typedef unsigned long long uint64_t; /**< Unsigned 8 byte */ - -typedef signed char NwS8T; /**< Signed 1 byte */ -typedef signed short NwS16T; /**< Signed 2 byte */ -typedef signed int NwS32T; /**< Signed 4 byte */ -typedef signed long long NwS64T; /**< Signed 8 byte */ - -typedef char NwBoolT; /**< Use this for booleans */ - -typedef char NwCharT; /**< Use this for strings */ - -typedef signed int NwFdT; /**< Use this for file descriptor */ - -typedef uintptr_t NwPtrT; /**< Use this for generic pointers */ -typedef unsigned int NwHandleT; /**< Use this for generic handles */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __NW_TYPES_H__ */ - - diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/shared/NwUtils.h b/openair-cn/GTPV2-C/nwgtpv2c-0.11/shared/NwUtils.h deleted file mode 100644 index a51437bce8..0000000000 --- a/openair-cn/GTPV2-C/nwgtpv2c-0.11/shared/NwUtils.h +++ /dev/null @@ -1,69 +0,0 @@ -/*----------------------------------------------------------------------------* - * * - * n w - g t p v 2 c * - * G P R S T u n n e l i n g P r o t o c o l v 2 c S t a c k * - * * - * * - * Copyright (c) 2010-2011 Amit Chawre * - * All rights reserved. * - * * - * Redistribution and use in source and binary forms, with or without * - * modification, are permitted provided that the following conditions * - * are met: * - * * - * 1. Redistributions of source code must retain the above copyright * - * notice, this list of conditions and the following disclaimer. * - * 2. Redistributions in binary form must reproduce the above copyright * - * notice, this list of conditions and the following disclaimer in the * - * documentation and/or other materials provided with the distribution. * - * 3. The name of the author may not be used to endorse or promote products * - * derived from this software without specific prior written permission. * - * * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - *----------------------------------------------------------------------------*/ - -#include <assert.h> - -#ifndef __NW_UTILS_H__ -#define __NW_UTILS_H__ - - -/** - * @file NwUtils.h - * @brief This header file contains utility macro and function definitions. -*/ - -#define NW_ASSERT assert /**< Assertion */ - -#define NW_CHK_NULL_PTR(_ptr) NW_ASSERT(_ptr != NULL) /**< Null pointer check */ - -#define NW_HTONS(x) ( ( ((x) & 0xff00) >> 8 ) | ( ((x) & 0x00ff) << 8 ) ) - -#define NW_HTONL(x) ( ( ((x) & 0xff000000) >> 24 ) | ( ( (x) & 0x00ff0000 ) >> 8 ) | \ - ( ( (x) & 0x0000ff00 ) << 8 ) | ( ( (x) & 0x000000ff) << 24 ) ) - -#define NW_HTONLL(x) ( \ - ( ( ((uint64_t)x) & 0xff00000000000000ULL ) >> 56 ) | ( ( ((uint64_t)x) & 0x00ff000000000000ULL ) >> 40 ) | \ - ( ( ((uint64_t)x) & 0x0000ff0000000000ULL ) >> 24 ) | ( ( ((uint64_t)x) & 0x000000ff00000000ULL ) >> 8 ) | \ - ( ( ((uint64_t)x) & 0x000000000000ff00ULL ) << 40 ) | ( ( ((uint64_t)x) & 0x00000000000000ffULL ) << 56 ) | \ - ( ( ((uint64_t)x) & 0x0000000000ff0000ULL ) << 24 ) | ( ( ((uint64_t)x) & 0x00000000ff000000ULL ) << 8 ) \ - ) - - -#define NW_NTOHS NW_HTONS -#define NW_NTOHL NW_HTONL -#define NW_NTOHLL NW_HTONLL - - -#endif /* __NW_UTILS_H__ */ - - diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/src/Makefile.am b/openair-cn/GTPV2-C/nwgtpv2c-0.11/src/Makefile.am deleted file mode 100644 index 0c12bd5984..0000000000 --- a/openair-cn/GTPV2-C/nwgtpv2c-0.11/src/Makefile.am +++ /dev/null @@ -1,46 +0,0 @@ -# this is example-file: src/mylib/Makefile.am - -# additional include paths necessary to compile the C++ library -AM_CFLAGS = -Wall -I$(top_srcdir)/src -I$(top_srcdir)/shared -I$(top_srcdir)/include @AM_CFLAGS@ - -############################################################################### -# THE LIBRARIES TO BUILD -############################################################################### - -# the library names to build (note we are building static libs only) -lib_LIBRARIES = libNwGtpv2c.a - -# where to install the headers on the system -libNwGtpv2c_adir = $(includedir)/mylib - -# the list of header files that belong to the library (to be installed later) -libNwGtpv2c_a_HEADERS = \ - $(top_srcdir)/shared/NwTypes.h\ - $(top_srcdir)/shared/NwUtils.h\ - $(top_srcdir)/shared/NwError.h\ - $(top_srcdir)/shared/NwLog.h\ - $(top_srcdir)/shared/NwGtpv2c.h\ - $(top_srcdir)/shared/NwGtpv2cMsg.h\ - $(top_srcdir)/shared/NwGtpv2cMsgParser.h\ - $(top_srcdir)/shared/NwGtpv2cIe.h\ - $(top_srcdir)/include/NwGtpv2cPrivate.h\ - $(top_srcdir)/include/NwGtpv2cTrxn.h\ - $(top_srcdir)/include/NwGtpv2cTunnel.h\ - $(top_srcdir)/include/NwGtpv2cMsgIeParseInfo.h\ - $(top_srcdir)/include/NwGtpv2cLog.h\ - $(top_srcdir)/include/queue.h\ - $(top_srcdir)/include/tree.h - -# the sources to add to the library and to add to the source distribution -libNwGtpv2c_a_SOURCES = \ - $(libNwGtpv2_a_HEADERS) \ - NwGtpv2cTrxn.c\ - NwGtpv2cTunnel.c\ - NwGtpv2cMsg.c\ - NwGtpv2cMsgIeParseInfo.c\ - NwGtpv2cMsgParser.c\ - NwGtpv2c.c - -############################################################################### - - diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/src/NwGtpv2c.c b/openair-cn/GTPV2-C/nwgtpv2c-0.11/src/NwGtpv2c.c deleted file mode 100644 index 123fe0932a..0000000000 --- a/openair-cn/GTPV2-C/nwgtpv2c-0.11/src/NwGtpv2c.c +++ /dev/null @@ -1,1811 +0,0 @@ -/*----------------------------------------------------------------------------* - * * - * n w - g t p v 2 c * - * G P R S T u n n e l i n g P r o t o c o l v 2 c S t a c k * - * * - * * - * Copyright (c) 2010-2011 Amit Chawre * - * All rights reserved. * - * * - * Redistribution and use in source and binary forms, with or without * - * modification, are permitted provided that the following conditions * - * are met: * - * * - * 1. Redistributions of source code must retain the above copyright * - * notice, this list of conditions and the following disclaimer. * - * 2. Redistributions in binary form must reproduce the above copyright * - * notice, this list of conditions and the following disclaimer in the * - * documentation and/or other materials provided with the distribution. * - * 3. The name of the author may not be used to endorse or promote products * - * derived from this software without specific prior written permission. * - * * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - *----------------------------------------------------------------------------*/ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <inttypes.h> - -#include "NwTypes.h" -#include "NwUtils.h" -#include "NwError.h" -#include "NwGtpv2cPrivate.h" -#include "NwGtpv2c.h" -#include "NwGtpv2cIe.h" -#include "NwGtpv2cTrxn.h" -#include "NwGtpv2cLog.h" - -#ifdef _NWGTPV2C_HAVE_TIMERADD -#define NW_GTPV2C_TIMER_ADD(tvp, uvp, vvp) timeradd((tvp), (uvp), (vvp)) -#define NW_GTPV2C_TIMER_SUB(tvp, uvp, vvp) timersub((tvp), (uvp), (vvp)) -#define NW_GTPV2C_TIMER_CMP_P(a, b, CMP) timercmp(a, b, CMP) -#else - -#define NW_GTPV2C_TIMER_ADD(tvp, uvp, vvp) \ - do { \ - (vvp)->tv_sec = (tvp)->tv_sec + (uvp)->tv_sec; \ - (vvp)->tv_usec = (tvp)->tv_usec + (uvp)->tv_usec; \ - if ((vvp)->tv_usec >= 1000000) { \ - (vvp)->tv_sec++; \ - (vvp)->tv_usec -= 1000000; \ - } \ - } while (0) - -#define NW_GTPV2C_TIMER_SUB(tvp, uvp, vvp) \ - do { \ - (vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec; \ - (vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec; \ - if ((vvp)->tv_usec < 0) { \ - (vvp)->tv_sec--; \ - (vvp)->tv_usec += 1000000; \ - } \ - } while (0) - -#define NW_GTPV2C_TIMER_CMP_P(a, b, CMP) \ - (((a)->tv_sec == (b)->tv_sec) ? \ - ((a)->tv_usec CMP (b)->tv_usec) : \ - ((a)->tv_sec CMP (b)->tv_sec)) - -#endif - - -#define NW_GTPV2C_INIT_MSG_IE_PARSE_INFO(__thiz, __msgType) \ - do { \ - __thiz->pGtpv2cMsgIeParseInfo[__msgType] = \ - nwGtpv2cMsgIeParseInfoNew((NwGtpv2cStackHandleT)__thiz, __msgType);\ - } while(0) - -#define NW_GTPV2C_UDP_PORT (2123) - -#ifdef __cplusplus -extern "C" { -#endif - -static NwGtpv2cTimeoutInfoT* gpGtpv2cTimeoutInfoPool = NULL; - -typedef struct { - int currSize; - int maxSize; - NwGtpv2cTimeoutInfoT** pHeap; -} NwGtpv2cTmrMinHeapT; - -#define NW_HEAP_PARENT_INDEX(__child) ( ( (__child) - 1 ) / 2 ) - - -NwGtpv2cTmrMinHeapT* -nwGtpv2cTmrMinHeapNew(int maxSize) -{ - NwGtpv2cTmrMinHeapT* thiz = (NwGtpv2cTmrMinHeapT*) malloc (sizeof(NwGtpv2cTmrMinHeapT)); - - if(thiz) { - thiz->currSize = 0; - thiz->maxSize = maxSize; - thiz->pHeap = (NwGtpv2cTimeoutInfoT**) malloc (maxSize * sizeof(NwGtpv2cTimeoutInfoT*)); - } - - return thiz; -} - -void -nwGtpv2cTmrMinHeapDelete(NwGtpv2cTmrMinHeapT* thiz) -{ - free(thiz->pHeap); - free(thiz); -} - -static NwRcT -nwGtpv2cTmrMinHeapInsert(NwGtpv2cTmrMinHeapT* thiz, NwGtpv2cTimeoutInfoT* pTimerEvent) -{ - int holeIndex = thiz->currSize++; - - NW_ASSERT(thiz->currSize < thiz->maxSize); - - while((holeIndex > 0) && - NW_GTPV2C_TIMER_CMP_P(&(thiz->pHeap[NW_HEAP_PARENT_INDEX(holeIndex)])->tvTimeout, &(pTimerEvent->tvTimeout), >)) { - thiz->pHeap[holeIndex] = thiz->pHeap[NW_HEAP_PARENT_INDEX(holeIndex)]; - thiz->pHeap[holeIndex]->timerMinHeapIndex = holeIndex; - holeIndex = NW_HEAP_PARENT_INDEX(holeIndex); - } - - thiz->pHeap[holeIndex] = pTimerEvent; - pTimerEvent->timerMinHeapIndex = holeIndex; - - return holeIndex; -} - -#define NW_MIN_HEAP_INDEX_INVALID (0xFFFFFFFF) -static NwRcT -nwGtpv2cTmrMinHeapRemove(NwGtpv2cTmrMinHeapT* thiz, int minHeapIndex) -{ - NwGtpv2cTimeoutInfoT* pTimerEvent; - int holeIndex = minHeapIndex; - int minChild, maxChild; - - //printf("- Trying Removing %p from index %u, currSize %u, minChild %u, maxChild %u\n", thiz->pHeap[minHeapIndex], minHeapIndex, thiz->currSize, minChild, maxChild); - if(minHeapIndex == NW_MIN_HEAP_INDEX_INVALID) return NW_FAILURE; - - if(minHeapIndex < thiz->currSize) { - thiz->pHeap[minHeapIndex]->timerMinHeapIndex = NW_MIN_HEAP_INDEX_INVALID; - thiz->currSize--; - - pTimerEvent = thiz->pHeap[thiz->currSize]; - holeIndex = minHeapIndex; - minChild = ( 2 * holeIndex ) + 1; - maxChild = minChild + 1; - - //printf("- Removing %p from index %u, currSize %u, minChild %u, maxChild %u\n", thiz->pHeap[minHeapIndex], minHeapIndex, thiz->currSize, minChild, maxChild); - - while( (maxChild) <= thiz->currSize ) { - if(NW_GTPV2C_TIMER_CMP_P(&(thiz->pHeap[minChild]->tvTimeout), &(thiz->pHeap[maxChild]->tvTimeout), >)) - minChild = maxChild; - - if(NW_GTPV2C_TIMER_CMP_P(&(pTimerEvent->tvTimeout), &(thiz->pHeap[minChild]->tvTimeout), <)) { - break; - } - - thiz->pHeap[holeIndex] = thiz->pHeap[minChild]; - thiz->pHeap[holeIndex]->timerMinHeapIndex = holeIndex; - holeIndex = minChild; - minChild = ( 2 * holeIndex ) + 1; - maxChild = minChild + 1; - } - - while((holeIndex > 0) && - NW_GTPV2C_TIMER_CMP_P(&((thiz->pHeap[NW_HEAP_PARENT_INDEX(holeIndex)])->tvTimeout), &(pTimerEvent->tvTimeout), >)) { - thiz->pHeap[holeIndex] = thiz->pHeap[NW_HEAP_PARENT_INDEX(holeIndex)]; - thiz->pHeap[holeIndex]->timerMinHeapIndex = holeIndex; - holeIndex = NW_HEAP_PARENT_INDEX(holeIndex); - } - - if(holeIndex < thiz->currSize) { - thiz->pHeap[holeIndex] = pTimerEvent; - pTimerEvent->timerMinHeapIndex = holeIndex; - } - - thiz->pHeap[thiz->currSize] = NULL; - return NW_OK; - } - - return NW_FAILURE; -} - -static NwGtpv2cTimeoutInfoT* -nwGtpv2cTmrMinHeapPeek(NwGtpv2cTmrMinHeapT* thiz) -{ - if(thiz->currSize) { - //printf("- Peek Returning %p at index %u(%u)\n", thiz->pHeap[0], thiz->pHeap[0]->timerMinHeapIndex, thiz->currSize); - return thiz->pHeap[0]; - } - - return NULL; -} -/*--------------------------------------------------------------------------* - * P R I V A T E F U N C T I O N S * - *--------------------------------------------------------------------------*/ - -static void -nwGtpv2cDisplayBanner( NwGtpv2cStackT* thiz) -{ -#ifdef NW_GTPV2C_DISPLAY_LICENCE_INFO - printf(" *----------------------------------------------------------------------------*\n"); - printf(" * *\n"); - printf(" * n w - g t p v 2 c *\n"); - printf(" * G P R S T u n n e l i n g P r o t o c o l v 2 c S t a c k *\n"); - printf(" * *\n"); - printf(" * *\n"); - printf(" * Copyright (c) 2010-2011 Amit Chawre *\n"); - printf(" * All rights reserved. *\n"); - printf(" * *\n"); - printf(" * Redistribution and use in source and binary forms, with or without *\n"); - printf(" * modification, are permitted provided that the following conditions *\n"); - printf(" * are met: *\n"); - printf(" * *\n"); - printf(" * 1. Redistributions of source code must retain the above copyright *\n"); - printf(" * notice, this list of conditions and the following disclaimer. *\n"); - printf(" * 2. Redistributions in binary form must reproduce the above copyright *\n"); - printf(" * notice, this list of conditions and the following disclaimer in the *\n"); - printf(" * documentation and/or other materials provided with the distribution. *\n"); - printf(" * 3. The name of the author may not be used to endorse or promote products *\n"); - printf(" * derived from this software without specific prior written permission. *\n"); - printf(" * *\n"); - printf(" * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR *\n"); - printf(" * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES *\n"); - printf(" * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. *\n"); - printf(" * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, *\n"); - printf(" * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT *\n"); - printf(" * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, *\n"); - printf(" * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY *\n"); - printf(" * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT *\n"); - printf(" * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF *\n"); - printf(" * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *\n"); - printf(" *----------------------------------------------------------------------------*\n\n"); -#endif -} - -/*--------------------------------------------------------------------------- - * Tunnel RBTree Search Data Structure - *--------------------------------------------------------------------------*/ - -/** - Comparator funtion for comparing two sequence number transactions. - - @param[in] a: Pointer to session a. - @param[in] b: Pointer to session b. - @return An integer greater than, equal to or less than zero according to whether the - object pointed to by a is greater than, equal to or less than the object pointed to by b. - */ - -static inline NwS32T -nwGtpv2cCompareTunnel(struct NwGtpv2cTunnel * a, struct NwGtpv2cTunnel* b) -{ - if(a->teid > b->teid) - return 1; - - if(a->teid < b->teid) - return -1; - - if(a->ipv4AddrRemote > b->ipv4AddrRemote) - return 1; - - if(a->ipv4AddrRemote < b->ipv4AddrRemote) - return -1; - - return 0; -} - -RB_GENERATE(NwGtpv2cTunnelMap, NwGtpv2cTunnel, tunnelMapRbtNode, nwGtpv2cCompareTunnel) - -/*--------------------------------------------------------------------------- - * Transaction RBTree Search Data Structure - *--------------------------------------------------------------------------*/ - -/** - Comparator funtion for comparing two outstancing TX transactions. - - @param[in] a: Pointer to session a. - @param[in] b: Pointer to session b. - @return An integer greater than, equal to or less than zero according to whether the - object pointed to by a is greater than, equal to or less than the object pointed to by b. - */ - -static inline NwS32T -nwGtpv2cCompareOutstandingTxSeqNumTrxn(struct NwGtpv2cTrxn* a, struct NwGtpv2cTrxn* b) -{ - if(a->seqNum > b->seqNum) - return 1; - - if(a->seqNum < b->seqNum) - return -1; - - if(a->peerIp > b->peerIp) - return 1; - - if(a->peerIp < b->peerIp) - return -1; - - return 0; -} - -RB_GENERATE(NwGtpv2cOutstandingTxSeqNumTrxnMap, NwGtpv2cTrxn, outstandingTxSeqNumMapRbtNode, nwGtpv2cCompareOutstandingTxSeqNumTrxn) - -/** - Comparator funtion for comparing outstanding RX transactions. - - @param[in] a: Pointer to session a. - @param[in] b: Pointer to session b. - @return An integer greater than, equal to or less than zero according to whether the - object pointed to by a is greater than, equal to or less than the object pointed to by b. - */ - -static inline NwS32T -nwGtpv2cCompareOutstandingRxSeqNumTrxn(struct NwGtpv2cTrxn* a, struct NwGtpv2cTrxn* b) -{ - if(a->seqNum > b->seqNum) - return 1; - - if(a->seqNum < b->seqNum) - return -1; - - if(a->peerIp > b->peerIp) - return 1; - - if(a->peerIp < b->peerIp) - return -1; - - if(a->peerPort > b->peerPort) - return 1; - - if(a->peerPort < b->peerPort) - return -1; - - return 0; -} - -RB_GENERATE(NwGtpv2cOutstandingRxSeqNumTrxnMap, NwGtpv2cTrxn, outstandingRxSeqNumMapRbtNode, nwGtpv2cCompareOutstandingRxSeqNumTrxn) - -/*--------------------------------------------------------------------------- - * Timer RB-tree data structure. - *--------------------------------------------------------------------------*/ - -/** - Comparator funtion for comparing two outstancing TX transactions. - - @param[in] a: Pointer to session a. - @param[in] b: Pointer to session b. - @return An integer greater than, equal to or less than zero according to whether the - object pointed to by a is greater than, equal to or less than the object pointed to by b. - */ - -static inline NwS32T -nwGtpv2cCompareOutstandingTxRexmitTime(struct NwGtpv2cTimeoutInfo* a, struct NwGtpv2cTimeoutInfo* b) -{ - if(NW_GTPV2C_TIMER_CMP_P(&a->tvTimeout, &b->tvTimeout, >)) - return 1; - - if(NW_GTPV2C_TIMER_CMP_P(&a->tvTimeout, &b->tvTimeout, <)) - return -1; - - return 0; -} - -RB_GENERATE(NwGtpv2cActiveTimerList, NwGtpv2cTimeoutInfo, activeTimerListRbtNode, nwGtpv2cCompareOutstandingTxRexmitTime) - - - -/** - * Send msg to peer via data request to UDP Entity - * - * @param[in] thiz : Pointer to stack. - * @param[in] peerIp : Peer Ip address. - * @param[in] peerPort : Peer Ip port. - * @param[in] pMsg : Message to be sent. - * @return NW_OK on success. - */ -static NwRcT -nwGtpv2cCreateAndSendMsg(NW_IN NwGtpv2cStackT* thiz, - NW_IN uint32_t seqNum, - NW_IN uint32_t peerIp, - NW_IN uint32_t peerPort, - NW_IN NwGtpv2cMsgT *pMsg) -{ - NwRcT rc; - uint8_t* msgHdr; - - NW_ASSERT(thiz); - NW_ASSERT(pMsg); - - msgHdr = pMsg->msgBuf; - - /* Set flags in header */ - *(msgHdr++) = (pMsg->version << 5) | (pMsg->teidPresent << 3); - - /* Set msg type in header */ - *(msgHdr++) = (pMsg->msgType); - - /* Set msg length in header*/ - *((uint16_t*) msgHdr) = htons(pMsg->msgLen - 4 ); - msgHdr += 2; - - /* Set TEID, if present in header */ - if(pMsg->teidPresent) { - *((uint32_t*) msgHdr) = htonl(pMsg->teid); - msgHdr += 4; - } - - /* Set seq num in header */ - *((uint32_t*) msgHdr) = htonl(seqNum << 8); - - /* Call UDP data request callback */ - NW_ASSERT(thiz->udp.udpDataReqCallback != NULL); - rc = thiz->udp.udpDataReqCallback(thiz->udp.hUdp, - pMsg->msgBuf, - pMsg->msgLen, - peerIp, - peerPort); - NW_ASSERT(NW_OK == rc); - - return rc; -} - -/** - Send an Version Not Supported message - - @param[in] thiz : Stack pointer - @return NW_OK on success. - */ - -static NwRcT -nwGtpv2cSendVersionNotSupportedInd( NW_IN NwGtpv2cStackT* thiz, - NW_IN uint32_t peerIp, - NW_IN uint32_t peerPort, - NW_IN uint32_t seqNum) -{ - NwRcT rc; - NwGtpv2cMsgHandleT hMsg = 0; - - rc = nwGtpv2cMsgNew( (NwGtpv2cStackHandleT)thiz, - NW_FALSE, - NW_GTP_VERSION_NOT_SUPPORTED_IND, - 0x00, - seqNum, - (&hMsg)); - - NW_ASSERT(NW_OK == rc); - - NW_LOG(thiz, NW_LOG_LEVEL_NOTI, "Sending Version Not Supported Indication message to %x:%x with seq %u", peerIp, peerPort, seqNum); - - rc = nwGtpv2cCreateAndSendMsg(thiz, - seqNum, - peerIp, - peerPort, - (NwGtpv2cMsgT*) hMsg); - - rc = nwGtpv2cMsgDelete((NwGtpv2cStackHandleT)thiz, hMsg); - NW_ASSERT(NW_OK == rc); - - return rc; -} - -/** - Create a local tunnel. - - @param[in] thiz : Stack pointer - @return NW_OK on success. - */ - -static NwRcT -nwGtpv2cCreateLocalTunnel( NW_IN NwGtpv2cStackT* thiz, - NW_IN uint32_t teid, - NW_IN uint32_t ipv4Remote, - NW_IN NwGtpv2cUlpTunnelHandleT hUlpTunnel, - NW_OUT NwGtpv2cTunnelHandleT *phTunnel) -{ - NwRcT rc; - NwGtpv2cTunnelT *pTunnel, *pCollision; - - NW_ENTER(thiz); - - NW_LOG(thiz, NW_LOG_LEVEL_DEBG, "Creating local tunnel with teid '0x%x' and peer IP 0x%x", teid, ipv4Remote); - - pTunnel = nwGtpv2cTunnelNew(thiz, teid, ipv4Remote, hUlpTunnel); - - if(pTunnel) { - pCollision = RB_INSERT(NwGtpv2cTunnelMap, &(thiz->tunnelMap), pTunnel); - - if(pCollision) { - rc = nwGtpv2cTunnelDelete(thiz, pTunnel); - NW_ASSERT(NW_OK == rc); - - *phTunnel = (NwGtpv2cTunnelHandleT) 0; - NW_LOG(thiz, NW_LOG_LEVEL_WARN, "Local tunnel creation failed for teid '0x%x' and peer IP "NW_IPV4_ADDR". Tunnel already exists!", teid, NW_IPV4_ADDR_FORMAT(ipv4Remote)); - - NW_ASSERT(0); - NW_LEAVE(thiz); - return NW_OK; - } - } else { - rc = NW_FAILURE; - } - - *phTunnel = (NwGtpv2cTunnelHandleT) pTunnel; - NW_LEAVE(thiz); - return NW_OK; -} - -/** - Delete a local tunnel. - - @param[in] thiz : Stack pointer - @return NW_OK on success. - */ - -static NwRcT -nwGtpv2cDeleteLocalTunnel( NW_IN NwGtpv2cStackT* thiz, - NW_OUT NwGtpv2cTunnelHandleT hTunnel) -{ - NwRcT rc; - NwGtpv2cTunnelT *pTunnel = (NwGtpv2cTunnelT*) hTunnel ; - - NW_ENTER(thiz); - - pTunnel = RB_REMOVE(NwGtpv2cTunnelMap, &(thiz->tunnelMap), (NwGtpv2cTunnelT*)hTunnel); - NW_ASSERT(pTunnel == (NwGtpv2cTunnelT*)hTunnel); - - NW_LOG(thiz, NW_LOG_LEVEL_DEBG, "Deleting local tunnel with teid '0x%x' and peer IP 0x%x", pTunnel->teid, pTunnel->ipv4AddrRemote); - - rc = nwGtpv2cTunnelDelete(thiz, pTunnel); - NW_ASSERT(NW_OK == rc); - - NW_LEAVE(thiz); - return NW_OK; -} - -/*--------------------------------------------------------------------------- - * ULP API Processing Functions - *--------------------------------------------------------------------------*/ - -/** - Process NW_GTPV2C_ULP_API_INITIAL_REQ Request from ULP entity. - - @param[in] hGtpcStackHandle : Stack handle - @param[in] pUlpReq : Pointer to Ulp Req. - @return NW_OK on success. - */ - -static NwRcT -nwGtpv2cHandleUlpInitialReq( NW_IN NwGtpv2cStackT* thiz, NW_IN NwGtpv2cUlpApiT *pUlpReq) -{ - NwRcT rc; - NwGtpv2cTrxnT *pTrxn; - - NW_ENTER(thiz); - - /* Create New Transaction */ - pTrxn = nwGtpv2cTrxnNew(thiz); - - if(pTrxn) { - if(!pUlpReq->apiInfo.initialReqInfo.hTunnel) { - rc = nwGtpv2cCreateLocalTunnel(thiz, - pUlpReq->apiInfo.initialReqInfo.teidLocal, - pUlpReq->apiInfo.initialReqInfo.peerIp, - pUlpReq->apiInfo.initialReqInfo.hUlpTunnel, - &pUlpReq->apiInfo.initialReqInfo.hTunnel); - NW_ASSERT(NW_OK == rc); - } - - pTrxn->pMsg = (NwGtpv2cMsgT*) pUlpReq->hMsg; - pTrxn->hTunnel = pUlpReq->apiInfo.initialReqInfo.hTunnel; - pTrxn->hUlpTrxn = pUlpReq->apiInfo.initialReqInfo.hUlpTrxn; - pTrxn->peerIp = ((NwGtpv2cTunnelT*)(pTrxn->hTunnel))->ipv4AddrRemote; - pTrxn->peerPort = NW_GTPV2C_UDP_PORT; - - if(pUlpReq->apiType & NW_GTPV2C_ULP_API_FLAG_IS_COMMAND_MESSAGE) { - pTrxn->seqNum |= 0x00100000UL; - } - - rc = nwGtpv2cCreateAndSendMsg(thiz, - pTrxn->seqNum, - pTrxn->peerIp, - pTrxn->peerPort, - pTrxn->pMsg); - - if(NW_OK == rc) { - /* Start guard timer */ - rc = nwGtpv2cTrxnStartPeerRspWaitTimer(pTrxn); - NW_ASSERT(NW_OK == rc); - - /* Insert into search tree */ - pTrxn = RB_INSERT(NwGtpv2cOutstandingTxSeqNumTrxnMap, &(thiz->outstandingTxSeqNumMap), pTrxn); - NW_ASSERT(pTrxn == NULL); - } else { - rc = nwGtpv2cTrxnDelete(&pTrxn); - NW_ASSERT(NW_OK == rc); - } - } else { - rc = NW_FAILURE; - } - - NW_LEAVE(thiz); - - return rc; -} - -/** - Process NW_GTPV2C_ULP_API_TRIGGERED_REQ Request from ULP entity. - - @param[in] hGtpcStackHandle : Stack handle - @param[in] pUlpReq : Pointer to Ulp Req. - @return NW_OK on success. - */ - -static NwRcT -nwGtpv2cHandleUlpTriggeredReq( NW_IN NwGtpv2cStackT* thiz, NW_IN NwGtpv2cUlpApiT *pUlpReq) -{ - NwRcT rc; - NwGtpv2cTrxnT *pTrxn; - NwGtpv2cTrxnT *pReqTrxn; - - NW_ENTER(thiz); - - /* Create New Transaction */ - pTrxn = nwGtpv2cTrxnWithSeqNumNew(thiz, (((NwGtpv2cMsgT*)(pUlpReq->hMsg))->seqNum)); - - if(pTrxn) { - pReqTrxn = (NwGtpv2cTrxnT*) pUlpReq->apiInfo.triggeredReqInfo.hTrxn; - - pTrxn->hUlpTrxn = pUlpReq->apiInfo.triggeredReqInfo.hUlpTrxn; - pTrxn->peerIp = pReqTrxn->peerIp; - pTrxn->peerPort = pReqTrxn->peerPort; - pTrxn->pMsg = (NwGtpv2cMsgT*) pUlpReq->hMsg; - - rc = nwGtpv2cCreateAndSendMsg(thiz, - pTrxn->seqNum, - pTrxn->peerIp, - pTrxn->peerPort, - pTrxn->pMsg); - - if(NW_OK == rc) { - /* Start guard timer */ - rc = nwGtpv2cTrxnStartPeerRspWaitTimer(pTrxn); - NW_ASSERT(NW_OK == rc); - - /* Insert into search tree */ - RB_INSERT(NwGtpv2cOutstandingTxSeqNumTrxnMap, &(thiz->outstandingTxSeqNumMap), pTrxn); - - if(!pUlpReq->apiInfo.triggeredReqInfo.hTunnel) { - rc = nwGtpv2cCreateLocalTunnel(thiz, - pUlpReq->apiInfo.triggeredReqInfo.teidLocal, - pReqTrxn->peerIp, - pUlpReq->apiInfo.triggeredReqInfo.hUlpTunnel, - &pUlpReq->apiInfo.triggeredReqInfo.hTunnel); - } - } else { - rc = nwGtpv2cTrxnDelete(&pTrxn); - NW_ASSERT(NW_OK == rc); - } - } else { - rc = NW_FAILURE; - } - - NW_LEAVE(thiz); - - return rc; -} - -/** - Process NW_GTPV2C_ULP_API_TRIGGERED_RSP Request from ULP entity. - - @param[in] hGtpcStackHandle : Stack handle - @param[in] pUlpReq : Pointer to Ulp Req. - @return NW_OK on success. - */ - -static NwRcT -nwGtpv2cHandleUlpTriggeredRsp( NW_IN NwGtpv2cStackT* thiz, NW_IN NwGtpv2cUlpApiT *pUlpRsp) -{ - NwRcT rc; - NwGtpv2cTrxnT *pReqTrxn; - - NW_ENTER(thiz); - - pReqTrxn = (NwGtpv2cTrxnT*) pUlpRsp->apiInfo.triggeredRspInfo.hTrxn; - NW_ASSERT(pReqTrxn != NULL); - - if(((NwGtpv2cMsgT*) pUlpRsp->hMsg)->seqNum == 0) - ((NwGtpv2cMsgT*) pUlpRsp->hMsg)->seqNum = pReqTrxn->seqNum; - - NW_LOG(thiz, NW_LOG_LEVEL_DEBG, "Sending response message over seq '0x%x'", pReqTrxn->seqNum); - - rc = nwGtpv2cCreateAndSendMsg(thiz, - pReqTrxn->seqNum, - pReqTrxn->peerIp, - pReqTrxn->peerPort, - (NwGtpv2cMsgT*) pUlpRsp->hMsg); - - pReqTrxn->pMsg = (NwGtpv2cMsgT*) pUlpRsp->hMsg; - - rc = nwGtpv2cTrxnStartDulpicateRequestWaitTimer(pReqTrxn); - - if((pUlpRsp->apiType & 0xFF000000) == NW_GTPV2C_ULP_API_FLAG_CREATE_LOCAL_TUNNEL) { - rc = nwGtpv2cCreateLocalTunnel(thiz, - pUlpRsp->apiInfo.triggeredRspInfo.teidLocal, - pReqTrxn->peerIp, - pUlpRsp->apiInfo.triggeredRspInfo.hUlpTunnel, - &pUlpRsp->apiInfo.triggeredRspInfo.hTunnel); - } - - return rc; -} - -/** - Process NW_GTPV2C_ULP_CREATE_LOCAL_TUNNEL Request from ULP entity. - - @param[in] hGtpcStackHandle : Stack handle - @param[in] pUlpReq : Pointer to Ulp Req. - @return NW_OK on success. - */ - -static NwRcT -nwGtpv2cHandleUlpCreateLocalTunnel( NW_IN NwGtpv2cStackT* thiz, NW_IN NwGtpv2cUlpApiT *pUlpReq) -{ - NwRcT rc; - NwGtpv2cTunnelT *pTunnel, *pCollision; - - NW_ENTER(thiz); - - NW_LOG(thiz, NW_LOG_LEVEL_DEBG, "Creating local tunnel with teid '0x%x' and peer IP 0x%x", pUlpReq->apiInfo.createLocalTunnelInfo.teidLocal, pUlpReq->apiInfo.createLocalTunnelInfo.peerIp); - - pTunnel = nwGtpv2cTunnelNew(thiz, pUlpReq->apiInfo.createLocalTunnelInfo.teidLocal, - pUlpReq->apiInfo.createLocalTunnelInfo.peerIp, - pUlpReq->apiInfo.triggeredRspInfo.hUlpTunnel); - NW_ASSERT(pTunnel); - - pCollision = RB_INSERT(NwGtpv2cTunnelMap, &(thiz->tunnelMap), pTunnel); - - if(pCollision) { - rc = nwGtpv2cTunnelDelete(thiz, pTunnel); - NW_ASSERT(NW_OK == rc); - - pUlpReq->apiInfo.createLocalTunnelInfo.hTunnel = (NwGtpv2cTunnelHandleT) 0; - NW_LEAVE(thiz); - return NW_FAILURE; - } - - pUlpReq->apiInfo.createLocalTunnelInfo.hTunnel = (NwGtpv2cTunnelHandleT) pTunnel; - NW_LEAVE(thiz); - return NW_OK; -} - -/** - Process NW_GTPV2C_ULP_DELETE_LOCAL_TUNNEL Request from ULP entity. - - @param[in] hGtpcStackHandle : Stack handle - @param[in] pUlpReq : Pointer to Ulp Req. - @return NW_OK on success. - */ - -static NwRcT -nwGtpv2cHandleUlpDeleteLocalTunnel( NW_IN NwGtpv2cStackT* thiz, NW_IN NwGtpv2cUlpApiT *pUlpReq) -{ - NwRcT rc; - - NW_ENTER(thiz); - - rc = nwGtpv2cDeleteLocalTunnel(thiz, pUlpReq->apiInfo.deleteLocalTunnelInfo.hTunnel); - - NW_LEAVE(thiz); - return rc; -} - -/** - Send GTPv2c Initial Request Message Indication to ULP entity. - - @param[in] hGtpcStackHandle : Stack handle - @return NW_OK on success. - */ - -static NwRcT -nwGtpv2cSendInitialReqIndToUlp( NW_IN NwGtpv2cStackT *thiz, - NW_IN NwGtpv2cErrorT *pError, - NW_IN NwGtpv2cTrxnT *pTrxn, - NW_IN uint32_t hUlpTunnel, - NW_IN uint32_t msgType, - NW_IN uint32_t peerIp, - NW_IN uint16_t peerPort, - NW_IN NwGtpv2cMsgHandleT hMsg) -{ - NwRcT rc; - NwGtpv2cUlpApiT ulpApi; - - NW_ENTER(thiz); - - ulpApi.hMsg = hMsg; - ulpApi.apiType = NW_GTPV2C_ULP_API_INITIAL_REQ_IND; - ulpApi.apiInfo.initialReqIndInfo.msgType = msgType; - ulpApi.apiInfo.initialReqIndInfo.hTrxn = (NwGtpv2cTrxnHandleT) pTrxn; - ulpApi.apiInfo.initialReqIndInfo.hUlpTunnel = hUlpTunnel; - ulpApi.apiInfo.initialReqIndInfo.peerIp = peerIp; - ulpApi.apiInfo.initialReqIndInfo.peerPort = peerPort; - - ulpApi.apiInfo.triggeredRspIndInfo.error = *pError; - - rc = thiz->ulp.ulpReqCallback(thiz->ulp.hUlp, &ulpApi); - - NW_LEAVE(thiz); - - return rc; -} - -/** - Send GTPv2c Triggered Response Indication to ULP entity. - - @param[in] hGtpcStackHandle : Stack handle - @return NW_OK on success. - */ - -static NwRcT -nwGtpv2cSendTriggeredRspIndToUlp( NW_IN NwGtpv2cStackT* thiz, - NW_IN NwGtpv2cErrorT *pError, - NW_IN uint32_t hUlpTrxn, - NW_IN uint32_t hUlpTunnel, - NW_IN uint32_t msgType, - NW_IN NwGtpv2cMsgHandleT hMsg) -{ - NwRcT rc; - NwGtpv2cUlpApiT ulpApi; - - NW_ENTER(thiz); - - ulpApi.hMsg = hMsg; - ulpApi.apiType = NW_GTPV2C_ULP_API_TRIGGERED_RSP_IND; - ulpApi.apiInfo.triggeredRspIndInfo.msgType = msgType; - ulpApi.apiInfo.triggeredRspIndInfo.hUlpTrxn = hUlpTrxn; - ulpApi.apiInfo.triggeredRspIndInfo.hUlpTunnel = hUlpTunnel; - - ulpApi.apiInfo.triggeredRspIndInfo.error = *pError; - - rc = thiz->ulp.ulpReqCallback(thiz->ulp.hUlp, &ulpApi); - - NW_LEAVE(thiz); - - return rc; -} - -/** - Handle Echo Request from Peer Entity. - - @param[in] thiz : Stack context - @return NW_OK on success. - */ - -static NwRcT -nwGtpv2cHandleEchoReq(NW_IN NwGtpv2cStackT *thiz, - NW_IN uint32_t msgType, - NW_IN uint8_t* msgBuf, - NW_IN uint32_t msgBufLen, - NW_IN uint16_t peerPort, - NW_IN uint32_t peerIp) -{ - NwRcT rc; - uint32_t seqNum = 0; - NwGtpv2cMsgHandleT hMsg = 0; - - seqNum = ntohl(*((uint32_t*)(msgBuf + (((*msgBuf) & 0x08) ? 8 : 4)))) >> 8; - - /* Send Echo Response */ - - rc = nwGtpv2cMsgNew( (NwGtpv2cStackHandleT)thiz, - NW_FALSE, /* TEID present flag */ - NW_GTP_ECHO_RSP, /* Msg Type */ - 0x00, /* TEID */ - seqNum, /* Seq Number */ - (&hMsg)); - - NW_ASSERT(NW_OK == rc); - - rc = nwGtpv2cMsgAddIeTV1(hMsg, NW_GTPV2C_IE_RECOVERY, 0, thiz->restartCounter); - - NW_LOG(thiz, NW_LOG_LEVEL_ERRO, "Sending NW_GTP_ECHO_RSP message to "NW_IPV4_ADDR":%u with seq %u", NW_IPV4_ADDR_FORMAT(peerIp), peerPort, (seqNum)); - - rc = nwGtpv2cCreateAndSendMsg(thiz, - (seqNum), - peerIp, - peerPort, - (NwGtpv2cMsgT*) hMsg); - - rc = nwGtpv2cMsgDelete((NwGtpv2cStackHandleT)thiz, hMsg); - NW_ASSERT(NW_OK == rc); - - return rc; -} - -/** - Handle Initial Request from Peer Entity. - - @param[in] thiz : Stack context - @return NW_OK on success. - */ - -static NwRcT -nwGtpv2cHandleInitialReq(NW_IN NwGtpv2cStackT *thiz, - NW_IN uint32_t msgType, - NW_IN uint8_t* msgBuf, - NW_IN uint32_t msgBufLen, - NW_IN uint16_t peerPort, - NW_IN uint32_t peerIp) -{ - NwRcT rc; - uint32_t seqNum = 0; - uint32_t teidLocal = 0; - NwGtpv2cTrxnT *pTrxn; - NwGtpv2cTunnelT *pLocalTunnel, keyTunnel; - NwGtpv2cMsgHandleT hMsg = 0; - NwGtpv2cUlpTunnelHandleT hUlpTunnel; - NwGtpv2cErrorT error; - - teidLocal = *((uint32_t*)(msgBuf + 4)); - - if(teidLocal) { - keyTunnel.teid = ntohl(teidLocal); - keyTunnel.ipv4AddrRemote = peerIp; - pLocalTunnel = RB_FIND(NwGtpv2cTunnelMap, &(thiz->tunnelMap), &keyTunnel); - - if(!pLocalTunnel) { - NW_LOG(thiz, NW_LOG_LEVEL_WARN, "Request message received on non-existent teid 0x%x from peer 0x%x received! Discarding.", ntohl(teidLocal), htonl(peerIp)); - return NW_OK; - } - - hUlpTunnel = pLocalTunnel->hUlpTunnel; - } else { - hUlpTunnel = 0; - } - - seqNum = ntohl(*((uint32_t*)(msgBuf + (((*msgBuf) & 0x08) ? 8 : 4)))) >> 8; - pTrxn = nwGtpv2cTrxnOutstandingRxNew(thiz, ntohl(teidLocal), peerIp, peerPort, (seqNum)); - - if(pTrxn) { - - rc = nwGtpv2cMsgFromBufferNew((NwGtpv2cStackHandleT)thiz, msgBuf, msgBufLen, &(hMsg)); - - NW_ASSERT(thiz->pGtpv2cMsgIeParseInfo[msgType]); - - rc = nwGtpv2cMsgIeParse(thiz->pGtpv2cMsgIeParseInfo[msgType], hMsg, &error); - - if(rc != NW_OK) { - NW_LOG(thiz, NW_LOG_LEVEL_WARN, "Malformed request message received on TEID %u from peer 0x%x. Notifying ULP.", ntohl(teidLocal), htonl(peerIp)); - } - - rc = nwGtpv2cSendInitialReqIndToUlp( thiz, - &error, - pTrxn, - hUlpTunnel, - msgType, - peerIp, - peerPort, - hMsg); - } - - return NW_OK; -} - -/** - Handle Triggered Response from Peer Entity. - - @param[in] thiz : Stack context - @return NW_OK on success. - */ - -static NwRcT -nwGtpv2cHandleTriggeredRsp(NW_IN NwGtpv2cStackT *thiz, - NW_IN uint32_t msgType, - NW_IN uint8_t* msgBuf, - NW_IN uint32_t msgBufLen, - NW_IN uint16_t peerPort, - NW_IN uint32_t peerIp) -{ - NwRcT rc; - NwGtpv2cTrxnT *pTrxn, keyTrxn; - NwGtpv2cMsgHandleT hMsg = 0; - NwGtpv2cErrorT error; - - keyTrxn.seqNum = ntohl(*((uint32_t*)(msgBuf + (((*msgBuf) & 0x08) ? 8 : 4)))) >> 8;; - keyTrxn.peerIp = peerIp; - - pTrxn = RB_FIND(NwGtpv2cOutstandingTxSeqNumTrxnMap, &(thiz->outstandingTxSeqNumMap), &keyTrxn); - - if(pTrxn) { - uint32_t hUlpTrxn; - uint32_t hUlpTunnel; - - hUlpTrxn = pTrxn->hUlpTrxn; - hUlpTunnel = (pTrxn->hTunnel ? ((NwGtpv2cTunnelT*)(pTrxn->hTunnel))->hUlpTunnel : 0); - - RB_REMOVE(NwGtpv2cOutstandingTxSeqNumTrxnMap, &(thiz->outstandingTxSeqNumMap), pTrxn); - rc = nwGtpv2cTrxnDelete(&pTrxn); - NW_ASSERT(NW_OK == rc); - - NW_ASSERT(msgBuf && msgBufLen); - rc = nwGtpv2cMsgFromBufferNew((NwGtpv2cStackHandleT)thiz, msgBuf, msgBufLen, &(hMsg)); - - NW_ASSERT(thiz->pGtpv2cMsgIeParseInfo[msgType]); - rc = nwGtpv2cMsgIeParse(thiz->pGtpv2cMsgIeParseInfo[msgType], hMsg, &error); - - if(rc != NW_OK) { - NW_LOG(thiz, NW_LOG_LEVEL_WARN, "Malformed message received on TEID %u from peer 0x%x. Notifying ULP.", ntohl((*((uint32_t*)(msgBuf + 4)))), htonl(peerIp)); - } - - rc = nwGtpv2cSendTriggeredRspIndToUlp( thiz, - &error, - hUlpTrxn, - hUlpTunnel, - msgType, - hMsg); - } else { - NW_LOG(thiz, NW_LOG_LEVEL_WARN, "Response message without a matching outstanding request received! Discarding."); - rc = NW_OK; - } - - return rc; -} - -/*--------------------------------------------------------------------------* - * P U B L I C F U N C T I O N S * - *--------------------------------------------------------------------------*/ - -/** - * Constructor - */ - -NwRcT -nwGtpv2cInitialize( NW_INOUT NwGtpv2cStackHandleT* hGtpcStackHandle) -{ - NwRcT rc = NW_OK; - NwGtpv2cStackT* thiz; - - thiz = (NwGtpv2cStackT*) malloc( sizeof(NwGtpv2cStackT)); - - memset(thiz, 0, sizeof(NwGtpv2cStackT)); - - if(thiz) { - thiz->id = (uint32_t) thiz; - thiz->seqNum = ((uint32_t) thiz) & 0x0000FFFF; - - RB_INIT(&(thiz->tunnelMap)); - RB_INIT(&(thiz->outstandingTxSeqNumMap)); - RB_INIT(&(thiz->outstandingRxSeqNumMap)); - RB_INIT(&(thiz->activeTimerList)); - - thiz->hTmrMinHeap = (NwHandleT) nwGtpv2cTmrMinHeapNew(10000); - - NW_GTPV2C_INIT_MSG_IE_PARSE_INFO(thiz, NW_GTP_ECHO_RSP); - - /* For S11 interface */ - NW_GTPV2C_INIT_MSG_IE_PARSE_INFO(thiz, NW_GTP_CREATE_SESSION_REQ); - NW_GTPV2C_INIT_MSG_IE_PARSE_INFO(thiz, NW_GTP_CREATE_SESSION_RSP); - NW_GTPV2C_INIT_MSG_IE_PARSE_INFO(thiz, NW_GTP_DELETE_SESSION_REQ); - NW_GTPV2C_INIT_MSG_IE_PARSE_INFO(thiz, NW_GTP_DELETE_SESSION_RSP); - NW_GTPV2C_INIT_MSG_IE_PARSE_INFO(thiz, NW_GTP_MODIFY_BEARER_REQ); - NW_GTPV2C_INIT_MSG_IE_PARSE_INFO(thiz, NW_GTP_MODIFY_BEARER_RSP); - - /* For S10 interface */ - NW_GTPV2C_INIT_MSG_IE_PARSE_INFO(thiz, NW_GTP_FORWARD_RELOCATION_REQ); - NW_GTPV2C_INIT_MSG_IE_PARSE_INFO(thiz, NW_GTP_FORWARD_RELOCATION_RSP); - NW_GTPV2C_INIT_MSG_IE_PARSE_INFO(thiz, NW_GTP_FORWARD_RELOCATION_COMPLETE_NTF); - NW_GTPV2C_INIT_MSG_IE_PARSE_INFO(thiz, NW_GTP_FORWARD_RELOCATION_COMPLETE_ACK); - NW_GTPV2C_INIT_MSG_IE_PARSE_INFO(thiz, NW_GTP_CONTEXT_REQ); - NW_GTPV2C_INIT_MSG_IE_PARSE_INFO(thiz, NW_GTP_CONTEXT_REQ); - NW_GTPV2C_INIT_MSG_IE_PARSE_INFO(thiz, NW_GTP_CONTEXT_ACK); - NW_GTPV2C_INIT_MSG_IE_PARSE_INFO(thiz, NW_GTP_IDENTIFICATION_REQ); - NW_GTPV2C_INIT_MSG_IE_PARSE_INFO(thiz, NW_GTP_IDENTIFICATION_RSP); - - nwGtpv2cDisplayBanner(thiz); - } else { - rc = NW_FAILURE; - } - - *hGtpcStackHandle = (NwGtpv2cStackHandleT) thiz; - return rc; -} - - -/** - * Destructor - */ - -NwRcT -nwGtpv2cFinalize( NW_IN NwGtpv2cStackHandleT hGtpcStackHandle) -{ - if(!hGtpcStackHandle) - return NW_FAILURE; - - free((void*)hGtpcStackHandle); - return NW_OK; -} - - -/** - * Set ULP entity - */ - -NwRcT -nwGtpv2cSetUlpEntity( NW_IN NwGtpv2cStackHandleT hGtpcStackHandle, - NW_IN NwGtpv2cUlpEntityT* pUlpEntity) -{ - NwGtpv2cStackT* thiz = (NwGtpv2cStackT*) hGtpcStackHandle; - - if(!pUlpEntity) - return NW_FAILURE; - - thiz->ulp = *(pUlpEntity); - return NW_OK; -} - -/** - * Set UDP entity - */ - -NwRcT -nwGtpv2cSetUdpEntity( NW_IN NwGtpv2cStackHandleT hGtpcStackHandle, - NW_IN NwGtpv2cUdpEntityT* pUdpEntity) -{ - NwGtpv2cStackT* thiz = (NwGtpv2cStackT*) hGtpcStackHandle; - - if(!pUdpEntity) - return NW_FAILURE; - - thiz->udp = *(pUdpEntity); - return NW_OK; -} - -/** - * Set MEM MGR entity - */ - -NwRcT -nwGtpv2cSetMemMgrEntity( NW_IN NwGtpv2cStackHandleT hGtpcStackHandle, - NW_IN NwGtpv2cMemMgrEntityT* pMemMgrEntity) -{ - NwGtpv2cStackT* thiz = (NwGtpv2cStackT*) hGtpcStackHandle; - - if(!pMemMgrEntity) - return NW_FAILURE; - - thiz->memMgr = *(pMemMgrEntity); - return NW_OK; -} - -/** - * Set TMR MGR entity - */ - -NwRcT -nwGtpv2cSetTimerMgrEntity( NW_IN NwGtpv2cStackHandleT hGtpcStackHandle, - NW_IN NwGtpv2cTimerMgrEntityT* pTmrMgrEntity) -{ - NwGtpv2cStackT* thiz = (NwGtpv2cStackT*) hGtpcStackHandle; - - if(!pTmrMgrEntity) - return NW_FAILURE; - - thiz->tmrMgr = *(pTmrMgrEntity); - return NW_OK; -} - - -/** - * Set LOG MGR entity - */ - -NwRcT -nwGtpv2cSetLogMgrEntity( NW_IN NwGtpv2cStackHandleT hGtpcStackHandle, - NW_IN NwGtpv2cLogMgrEntityT* pLogMgrEntity) -{ - NwGtpv2cStackT* thiz = (NwGtpv2cStackT*) hGtpcStackHandle; - - if(!pLogMgrEntity) - return NW_FAILURE; - - thiz->logMgr = *(pLogMgrEntity); - return NW_OK; -} - -/** - Set log level for the stack. - */ - -NwRcT -nwGtpv2cSetLogLevel( NW_IN NwGtpv2cStackHandleT hGtpcStackHandle, - NW_IN uint32_t logLevel) -{ - NwGtpv2cStackT* thiz = (NwGtpv2cStackT*) hGtpcStackHandle; - thiz->logLevel = logLevel; - return NW_OK; -} - -/** - * Process Request from Udp Layer - */ - -NwRcT -nwGtpv2cProcessUdpReq( NW_IN NwGtpv2cStackHandleT hGtpcStackHandle, - NW_IN uint8_t* udpData, - NW_IN uint32_t udpDataLen, - NW_IN uint16_t peerPort, - NW_IN uint32_t peerIp) -{ - NwRcT rc; - NwGtpv2cStackT* thiz; - uint16_t msgType; - - thiz = (NwGtpv2cStackT*) hGtpcStackHandle; - NW_ASSERT(thiz); - - NW_ENTER(thiz); - - if(udpDataLen < NW_GTPV2C_MINIMUM_HEADER_SIZE) { - /* - * TS 29.274 Section 7.7.3: - * If a GTP entity receives a message, which is too short to - * contain the respective GTPv2 header, the GTP-PDU shall be - * silently discarded - */ - NW_LOG(thiz, NW_LOG_LEVEL_WARN, "Received message too small! Discarding."); - return NW_OK; - } - - if( (ntohs(*((uint16_t*)((uint8_t*)udpData + 2))) /* Length */ - + ((*((uint8_t*)(udpData)) & 0x08) ? 4 : 0) /* Extra Header length if TEID present */) > udpDataLen) { - NW_LOG(thiz, NW_LOG_LEVEL_WARN, "Received message with errneous length of %u against expected length of %u! Discarding", udpDataLen, - ntohs(*((uint16_t*)((uint8_t*)udpData + 2))) + ((*((uint8_t*)(udpData)) & 0x08) ? 4 : 0)); - return NW_OK; - } - - if(((*((uint8_t*)(udpData)) & 0xE0) >> 5) != NW_GTP_VERSION) { - NW_LOG(thiz, NW_LOG_LEVEL_WARN, "Received unsupported GTP version '%u' message! Discarding.", ((*((uint8_t*)(udpData)) & 0xE0) >> 5)); - /* Send Version Not Supported Message to peer */ - rc = nwGtpv2cSendVersionNotSupportedInd( - thiz, - peerIp, - peerPort, - *((uint32_t*)(udpData + ((*((uint8_t*)(udpData)) & 0x08) ? 8 : 4))) /* Seq Num */); - - return NW_OK; - } - - msgType = *((uint8_t*)(udpData + 1)); - - switch(msgType) { - case NW_GTP_ECHO_REQ: { - rc = nwGtpv2cHandleEchoReq(thiz, msgType, udpData, udpDataLen, peerPort, peerIp); - } - break; - - case NW_GTP_CREATE_SESSION_REQ: - case NW_GTP_MODIFY_BEARER_REQ: - case NW_GTP_DELETE_SESSION_REQ: - case NW_GTP_CREATE_BEARER_REQ: - case NW_GTP_UPDATE_BEARER_REQ: - case NW_GTP_DELETE_BEARER_REQ: { - rc = nwGtpv2cHandleInitialReq(thiz, msgType, udpData, udpDataLen, peerPort, peerIp); - } - break; - - case NW_GTP_ECHO_RSP: - case NW_GTP_CREATE_SESSION_RSP: - case NW_GTP_MODIFY_BEARER_RSP: - case NW_GTP_DELETE_SESSION_RSP: - case NW_GTP_CREATE_BEARER_RSP: - case NW_GTP_UPDATE_BEARER_RSP: - case NW_GTP_DELETE_BEARER_RSP: { - rc = nwGtpv2cHandleTriggeredRsp(thiz, msgType, udpData, udpDataLen, peerPort, peerIp); - } - break; - - default: { - /* - * TS 29.274 Section 7.7.4: - * If a GTP entity receives a message with an unknown Message Type - * value, it shall silently discard the message. - */ - NW_LOG(thiz, NW_LOG_LEVEL_WARN, "Received unknown message type %u from UDP! Ignoring.", msgType); - rc = NW_OK; - } - } - - NW_LEAVE(thiz); - return rc; -} - - -/* - * Process Request from Upper Layer - */ - -NwRcT -nwGtpv2cProcessUlpReq( NW_IN NwGtpv2cStackHandleT hGtpcStackHandle, - NW_IN NwGtpv2cUlpApiT *pUlpReq) -{ - NwRcT rc; - NwGtpv2cStackT* thiz = (NwGtpv2cStackT*) hGtpcStackHandle; - - NW_ASSERT(thiz); - NW_ASSERT(pUlpReq != NULL); - - NW_ENTER(thiz); - - switch(pUlpReq->apiType & 0x00FFFFFFL) { - case NW_GTPV2C_ULP_API_INITIAL_REQ: { - NW_LOG(thiz, NW_LOG_LEVEL_DEBG, "Received initial request from ulp"); - rc = nwGtpv2cHandleUlpInitialReq(thiz, pUlpReq); - } - break; - - case NW_GTPV2C_ULP_API_TRIGGERED_REQ: { - NW_LOG(thiz, NW_LOG_LEVEL_DEBG, "Received triggered request from ulp"); - rc = nwGtpv2cHandleUlpTriggeredReq(thiz, pUlpReq); - } - break; - - case NW_GTPV2C_ULP_API_TRIGGERED_RSP: { - NW_LOG(thiz, NW_LOG_LEVEL_DEBG, "Received triggered response from ulp"); - rc = nwGtpv2cHandleUlpTriggeredRsp(thiz, pUlpReq); - } - break; - - case NW_GTPV2C_ULP_CREATE_LOCAL_TUNNEL: { - NW_LOG(thiz, NW_LOG_LEVEL_DEBG, "Received create local tunnel from ulp"); - rc = nwGtpv2cHandleUlpCreateLocalTunnel(thiz, pUlpReq); - } - break; - - case NW_GTPV2C_ULP_DELETE_LOCAL_TUNNEL: { - NW_LOG(thiz, NW_LOG_LEVEL_DEBG, "Received delete local tunnel from ulp"); - rc = nwGtpv2cHandleUlpDeleteLocalTunnel(thiz, pUlpReq); - } - break; - - default: { - NW_LOG(thiz, NW_LOG_LEVEL_WARN, "Received unhandled API 0x%x from ULP! Ignoring.", pUlpReq->apiType); - rc = NW_FAILURE; - } - break; - } - - NW_LEAVE(thiz); - - return rc; -} - -/** - * Process Timer timeout Request from Timer ULP Manager - */ - -NwRcT -nwGtpv2cProcessTimeoutOld(void* arg) -{ - NwRcT rc; - NwGtpv2cStackT* thiz; - NwGtpv2cTimeoutInfoT* timeoutInfo = (NwGtpv2cTimeoutInfoT*) arg; - NwGtpv2cTimeoutInfoT* pNextTimeoutInfo; - struct timeval tv; - - NW_ASSERT(timeoutInfo != NULL); - thiz = (NwGtpv2cStackT*) (((NwGtpv2cTimeoutInfoT*) timeoutInfo)->hStack); - - NW_ASSERT(thiz != NULL); - - NW_ENTER(thiz); - - if(thiz->activeTimerInfo == timeoutInfo) { - thiz->activeTimerInfo = NULL; - RB_REMOVE(NwGtpv2cActiveTimerList, &(thiz->activeTimerList), timeoutInfo); - timeoutInfo->next = gpGtpv2cTimeoutInfoPool; - gpGtpv2cTimeoutInfoPool = timeoutInfo; - - rc = ((timeoutInfo)->timeoutCallbackFunc) (timeoutInfo->timeoutArg); - - } else { - NW_LOG(thiz, NW_LOG_LEVEL_WARN, - "Received timeout event from ULP for non-existent timeoutInfo 0x%p and activeTimer 0x%p!", - timeoutInfo, thiz->activeTimerInfo); - return NW_OK; - } - - - NW_ASSERT(gettimeofday(&tv, NULL) == 0); - - for ((timeoutInfo) = RB_MIN(NwGtpv2cActiveTimerList, &(thiz->activeTimerList)); - (timeoutInfo) != NULL; ) - - { - if(NW_GTPV2C_TIMER_CMP_P(&timeoutInfo->tvTimeout, &tv, >)) - break; - - pNextTimeoutInfo = RB_NEXT(NwGtpv2cActiveTimerList, &(thiz->activeTimerList), timeoutInfo); - RB_REMOVE(NwGtpv2cActiveTimerList, &(thiz->activeTimerList), timeoutInfo); - timeoutInfo->next = gpGtpv2cTimeoutInfoPool; - gpGtpv2cTimeoutInfoPool = timeoutInfo; - - rc = ((timeoutInfo)->timeoutCallbackFunc) (timeoutInfo->timeoutArg); - - timeoutInfo = pNextTimeoutInfo; - } - - /* activeTimerInfo may be reset by the timeoutCallbackFunc call above */ - if(thiz->activeTimerInfo == NULL) { - timeoutInfo = RB_MIN(NwGtpv2cActiveTimerList, &(thiz->activeTimerList)); - - if(timeoutInfo) { - NW_GTPV2C_TIMER_SUB(&timeoutInfo->tvTimeout, &tv, &tv); - rc = thiz->tmrMgr.tmrStartCallback(thiz->tmrMgr.tmrMgrHandle, tv.tv_sec, tv.tv_usec, timeoutInfo->tmrType, (void*)timeoutInfo, &timeoutInfo->hTimer); - NW_ASSERT(NW_OK == rc); - - thiz->activeTimerInfo = timeoutInfo; - } - } - - NW_LEAVE(thiz); - - return rc; -} - -NwRcT -nwGtpv2cProcessTimeout(void* arg) -{ - NwRcT rc; - NwGtpv2cStackT* thiz; - NwGtpv2cTimeoutInfoT* timeoutInfo = (NwGtpv2cTimeoutInfoT*) arg; - struct timeval tv; - - NW_ASSERT(timeoutInfo != NULL); - - thiz = (NwGtpv2cStackT*) (timeoutInfo->hStack); - - NW_ASSERT(thiz != NULL); - NW_ENTER(thiz); - - if(thiz->activeTimerInfo == timeoutInfo) { - thiz->activeTimerInfo = NULL; - rc = nwGtpv2cTmrMinHeapRemove(thiz->hTmrMinHeap, timeoutInfo->timerMinHeapIndex); - timeoutInfo->next = gpGtpv2cTimeoutInfoPool; - gpGtpv2cTimeoutInfoPool = timeoutInfo; - - rc = ((timeoutInfo)->timeoutCallbackFunc) (timeoutInfo->timeoutArg); - } else { - NW_LOG(thiz, NW_LOG_LEVEL_WARN, "Received timeout event from ULP for " - "non-existent timeoutInfo 0x%p and activeTimer 0x%p!", - timeoutInfo, thiz->activeTimerInfo); - - NW_LEAVE(thiz); - - return NW_OK; - } - - NW_ASSERT(gettimeofday(&tv, NULL) == 0); - - //printf("------ Start -------\n"); - timeoutInfo = nwGtpv2cTmrMinHeapPeek(thiz->hTmrMinHeap); - - while((timeoutInfo) != NULL) { - if(NW_GTPV2C_TIMER_CMP_P(&timeoutInfo->tvTimeout, &tv, >)) - break; - - rc = nwGtpv2cTmrMinHeapRemove(thiz->hTmrMinHeap, timeoutInfo->timerMinHeapIndex); - timeoutInfo->next = gpGtpv2cTimeoutInfoPool; - gpGtpv2cTimeoutInfoPool = timeoutInfo; - - rc = ((timeoutInfo)->timeoutCallbackFunc) (timeoutInfo->timeoutArg); - - timeoutInfo = nwGtpv2cTmrMinHeapPeek(thiz->hTmrMinHeap); - //printf("-- %p --\n", timeoutInfo); - } - - //printf("------ End -------\n"); - - /* activeTimerInfo may be reset by the timeoutCallbackFunc call above */ - if(thiz->activeTimerInfo == NULL) { - timeoutInfo = nwGtpv2cTmrMinHeapPeek(thiz->hTmrMinHeap); - - if(timeoutInfo) { - NW_GTPV2C_TIMER_SUB(&timeoutInfo->tvTimeout, &tv, &tv); - rc = thiz->tmrMgr.tmrStartCallback(thiz->tmrMgr.tmrMgrHandle, tv.tv_sec, tv.tv_usec, timeoutInfo->tmrType, (void*)timeoutInfo, &timeoutInfo->hTimer); - NW_ASSERT(NW_OK == rc); - - thiz->activeTimerInfo = timeoutInfo; - } - } - - NW_LEAVE(thiz); - - return rc; -} - -/** - * Start Timer with ULP Timer Manager - */ - - - - - -NwRcT -nwGtpv2cStartTimer(NwGtpv2cStackT* thiz, - uint32_t timeoutSec, - uint32_t timeoutUsec, - uint32_t tmrType, - NwRcT (*timeoutCallbackFunc)(void*), - void* timeoutCallbackArg, - NwGtpv2cTimerHandleT *phTimer) -{ - NwRcT rc = NW_OK; - struct timeval tv; - NwGtpv2cTimeoutInfoT *timeoutInfo; - NwGtpv2cTimeoutInfoT *collision; - - NW_ENTER(thiz); - - if(gpGtpv2cTimeoutInfoPool) { - timeoutInfo = gpGtpv2cTimeoutInfoPool; - gpGtpv2cTimeoutInfoPool = gpGtpv2cTimeoutInfoPool->next; - } else { - NW_GTPV2C_MALLOC(thiz, sizeof(NwGtpv2cTimeoutInfoT), timeoutInfo, NwGtpv2cTimeoutInfoT*); - } - - if(timeoutInfo) { - timeoutInfo->tmrType = tmrType; - timeoutInfo->timeoutArg = timeoutCallbackArg; - timeoutInfo->timeoutCallbackFunc = timeoutCallbackFunc; - timeoutInfo->hStack = (NwGtpv2cStackHandleT)thiz; - - NW_ASSERT(gettimeofday(&tv, NULL) == 0); - NW_ASSERT(gettimeofday(&timeoutInfo->tvTimeout, NULL) == 0); - - timeoutInfo->tvTimeout.tv_sec = timeoutSec; - timeoutInfo->tvTimeout.tv_usec = timeoutUsec; - NW_GTPV2C_TIMER_ADD(&tv, &timeoutInfo->tvTimeout, &timeoutInfo->tvTimeout); - - rc = nwGtpv2cTmrMinHeapInsert(thiz->hTmrMinHeap, timeoutInfo); -#if 0 - - do { - collision = RB_INSERT(NwGtpv2cActiveTimerList, &(thiz->activeTimerList), timeoutInfo); - - if(!collision) - break; - - NW_LOG(thiz, NW_LOG_LEVEL_WARN, "timer collision!"); - timeoutInfo->tvTimeout.tv_usec++; /* HACK: In case there is a collision, schedule this event 1 usec later */ - - if(timeoutInfo->tvTimeout.tv_usec > (999999 /*1000000 - 1*/)) { - timeoutInfo->tvTimeout.tv_usec = 0; - timeoutInfo->tvTimeout.tv_sec++; - } - } while (1); - -#endif - - if(thiz->activeTimerInfo) { - if(NW_GTPV2C_TIMER_CMP_P(&(thiz->activeTimerInfo->tvTimeout), &(timeoutInfo->tvTimeout), >)) { - NW_LOG(thiz, NW_LOG_LEVEL_DEBG, "Stopping active timer 0x%"PRIxPTR" for info 0x%p!", - thiz->activeTimerInfo->hTimer, thiz->activeTimerInfo); - rc = thiz->tmrMgr.tmrStopCallback(thiz->tmrMgr.tmrMgrHandle, thiz->activeTimerInfo->hTimer); - NW_ASSERT(NW_OK == rc); - } else { - NW_LOG(thiz, NW_LOG_LEVEL_DEBG, "Already Started timer 0x%"PRIxPTR" for info 0x%p!", - thiz->activeTimerInfo->hTimer, thiz->activeTimerInfo); - *phTimer = (NwGtpv2cTimerHandleT) timeoutInfo; - NW_LEAVE(thiz); - return NW_OK; - } - } - - rc = thiz->tmrMgr.tmrStartCallback(thiz->tmrMgr.tmrMgrHandle, - timeoutSec, - timeoutUsec, - tmrType, - (void*)timeoutInfo, - &timeoutInfo->hTimer); - NW_LOG(thiz, NW_LOG_LEVEL_DEBG, "Started timer 0x%"PRIxPTR" for info 0x%p!", - timeoutInfo->hTimer, timeoutInfo); - NW_ASSERT(NW_OK == rc); - thiz->activeTimerInfo = timeoutInfo; - - } - - *phTimer = (NwGtpv2cTimerHandleT) timeoutInfo; - NW_LEAVE(thiz); - - return rc; -} - -NwRcT -nwGtpv2cStartTimerOld(NwGtpv2cStackT* thiz, - uint32_t timeoutSec, - uint32_t timeoutUsec, - uint32_t tmrType, - NwRcT (*timeoutCallbackFunc)(void*), - void* timeoutCallbackArg, - NwGtpv2cTimerHandleT *phTimer) -{ - NwRcT rc = NW_OK; - struct timeval tv; - NwGtpv2cTimeoutInfoT *timeoutInfo; - NwGtpv2cTimeoutInfoT *collision; - - NW_ASSERT(thiz != NULL); - - NW_ENTER(thiz); - - if(gpGtpv2cTimeoutInfoPool) { - timeoutInfo = gpGtpv2cTimeoutInfoPool; - gpGtpv2cTimeoutInfoPool = gpGtpv2cTimeoutInfoPool->next; - } else { - NW_GTPV2C_MALLOC(thiz, sizeof(NwGtpv2cTimeoutInfoT), timeoutInfo, NwGtpv2cTimeoutInfoT*); - } - - if(timeoutInfo) { - timeoutInfo->tmrType = tmrType; - timeoutInfo->timeoutArg = timeoutCallbackArg; - timeoutInfo->timeoutCallbackFunc = timeoutCallbackFunc; - timeoutInfo->hStack = (NwGtpv2cStackHandleT)thiz; - - NW_ASSERT(gettimeofday(&tv, NULL) == 0); - NW_ASSERT(gettimeofday(&timeoutInfo->tvTimeout, NULL) == 0); - - timeoutInfo->tvTimeout.tv_sec = timeoutSec; - timeoutInfo->tvTimeout.tv_usec = timeoutUsec; - NW_GTPV2C_TIMER_ADD(&tv, &timeoutInfo->tvTimeout, &timeoutInfo->tvTimeout); - - do { - collision = RB_INSERT(NwGtpv2cActiveTimerList, &(thiz->activeTimerList), timeoutInfo); - - if(!collision) - break; - - NW_LOG(thiz, NW_LOG_LEVEL_WARN, "timer collision!"); - timeoutInfo->tvTimeout.tv_usec++; /* HACK: In case there is a collision, schedule this event 1 usec later */ - - if(timeoutInfo->tvTimeout.tv_usec > (999999 /*1000000 - 1*/)) { - timeoutInfo->tvTimeout.tv_usec = 0; - timeoutInfo->tvTimeout.tv_sec++; - } - } while (1); - - if(thiz->activeTimerInfo) { - if(NW_GTPV2C_TIMER_CMP_P(&(thiz->activeTimerInfo->tvTimeout), &(timeoutInfo->tvTimeout), >)) { - NW_LOG(thiz, NW_LOG_LEVEL_DEBG, "Stopping active timer 0x%"PRIxPTR" for info 0x%p!", - thiz->activeTimerInfo->hTimer, thiz->activeTimerInfo); - rc = thiz->tmrMgr.tmrStopCallback(thiz->tmrMgr.tmrMgrHandle, thiz->activeTimerInfo->hTimer); - NW_ASSERT(NW_OK == rc); - } else { - NW_LOG(thiz, NW_LOG_LEVEL_DEBG, "Already Started timer 0x%"PRIxPTR" for info 0x%p!", - thiz->activeTimerInfo->hTimer, thiz->activeTimerInfo); - *phTimer = (NwGtpv2cTimerHandleT) timeoutInfo; - NW_LEAVE(thiz); - return NW_OK; - } - } - - rc = thiz->tmrMgr.tmrStartCallback(thiz->tmrMgr.tmrMgrHandle, timeoutSec, timeoutUsec, tmrType, (void*)timeoutInfo, &timeoutInfo->hTimer); - NW_LOG(thiz, NW_LOG_LEVEL_DEBG, "Started timer 0x%"PRIxPTR" for info 0x%p!", - timeoutInfo->hTimer, timeoutInfo); - NW_ASSERT(NW_OK == rc); - thiz->activeTimerInfo = timeoutInfo; - - } - - *phTimer = (NwGtpv2cTimerHandleT) timeoutInfo; - NW_LEAVE(thiz); - - return rc; -} - -/** - * Stop Timer with ULP Timer Manager - */ -NwRcT -nwGtpv2cStopTimer(NwGtpv2cStackT* thiz, - NwGtpv2cTimerHandleT hTimer) -{ - NwRcT rc = NW_OK; - struct timeval tv; - NwGtpv2cTimeoutInfoT *timeoutInfo; - - NW_ASSERT(thiz != NULL); - - NW_ENTER(thiz); - - timeoutInfo = (NwGtpv2cTimeoutInfoT*) hTimer; - - rc = nwGtpv2cTmrMinHeapRemove(thiz->hTmrMinHeap, timeoutInfo->timerMinHeapIndex); - timeoutInfo->next = gpGtpv2cTimeoutInfoPool; - gpGtpv2cTimeoutInfoPool = timeoutInfo; - - NW_LOG(thiz, NW_LOG_LEVEL_DEBG, "Stopping active timer 0x%"PRIxPTR" for info 0x%p!", - timeoutInfo->hTimer, timeoutInfo); - - if(thiz->activeTimerInfo == timeoutInfo) { - NW_LOG(thiz, NW_LOG_LEVEL_DEBG, "Stopping active timer 0x%"PRIxPTR" for info 0x%p!", - timeoutInfo->hTimer, timeoutInfo); - rc = thiz->tmrMgr.tmrStopCallback(thiz->tmrMgr.tmrMgrHandle, timeoutInfo->hTimer); - thiz->activeTimerInfo = NULL; - NW_ASSERT(NW_OK == rc); - - timeoutInfo = nwGtpv2cTmrMinHeapPeek(thiz->hTmrMinHeap); - - if(timeoutInfo) { - NW_ASSERT(gettimeofday(&tv, NULL) == 0); - - if(NW_GTPV2C_TIMER_CMP_P(&timeoutInfo->tvTimeout, &tv, <)) { - thiz->activeTimerInfo = timeoutInfo; - rc = nwGtpv2cProcessTimeout(timeoutInfo); - NW_ASSERT(NW_OK == rc); - } else { - NW_GTPV2C_TIMER_SUB(&timeoutInfo->tvTimeout, &tv, &tv); - rc = thiz->tmrMgr.tmrStartCallback(thiz->tmrMgr.tmrMgrHandle, tv.tv_sec, tv.tv_usec, timeoutInfo->tmrType, (void*)timeoutInfo, &timeoutInfo->hTimer); - NW_ASSERT(NW_OK == rc); - - NW_LOG(thiz, NW_LOG_LEVEL_DEBG, "Started timer 0x%"PRIxPTR" for info 0x%p!", - timeoutInfo->hTimer, timeoutInfo); - thiz->activeTimerInfo = timeoutInfo; - } - } - } - - NW_LEAVE(thiz); - - return rc; -} - -NwRcT -nwGtpv2cStopTimerOld(NwGtpv2cStackT* thiz, - NwGtpv2cTimerHandleT hTimer) -{ - NwRcT rc = NW_OK; - struct timeval tv; - NwGtpv2cTimeoutInfoT *timeoutInfo; - - NW_ASSERT(thiz != NULL); - - NW_ENTER(thiz); - - timeoutInfo = (NwGtpv2cTimeoutInfoT*) hTimer; - - RB_REMOVE(NwGtpv2cActiveTimerList, &(thiz->activeTimerList), timeoutInfo); - timeoutInfo->next = gpGtpv2cTimeoutInfoPool; - gpGtpv2cTimeoutInfoPool = timeoutInfo; - - NW_LOG(thiz, NW_LOG_LEVEL_DEBG, "Stopping active timer 0x%"PRIxPTR" for info 0x%p!", - timeoutInfo->hTimer, timeoutInfo); - - if(thiz->activeTimerInfo == timeoutInfo) { - NW_LOG(thiz, NW_LOG_LEVEL_DEBG, "Stopping active timer 0x%"PRIxPTR" for info 0x%p!", - timeoutInfo->hTimer, timeoutInfo); - rc = thiz->tmrMgr.tmrStopCallback(thiz->tmrMgr.tmrMgrHandle, timeoutInfo->hTimer); - thiz->activeTimerInfo = NULL; - NW_ASSERT(NW_OK == rc); - - timeoutInfo = RB_MIN(NwGtpv2cActiveTimerList, &(thiz->activeTimerList)); - - if(timeoutInfo) { - NW_ASSERT(gettimeofday(&tv, NULL) == 0); - - if(NW_GTPV2C_TIMER_CMP_P(&timeoutInfo->tvTimeout, &tv, <)) { - thiz->activeTimerInfo = timeoutInfo; - rc = nwGtpv2cProcessTimeout(timeoutInfo); - NW_ASSERT(NW_OK == rc); - } else { - NW_GTPV2C_TIMER_SUB(&timeoutInfo->tvTimeout, &tv, &tv); - rc = thiz->tmrMgr.tmrStartCallback(thiz->tmrMgr.tmrMgrHandle, tv.tv_sec, tv.tv_usec, timeoutInfo->tmrType, (void*)timeoutInfo, &timeoutInfo->hTimer); - NW_ASSERT(NW_OK == rc); - - NW_LOG(thiz, NW_LOG_LEVEL_DEBG, "Started timer 0x%"PRIxPTR" for info 0x%p!", - timeoutInfo->hTimer, timeoutInfo); - thiz->activeTimerInfo = timeoutInfo; - } - } - } - - NW_LEAVE(thiz); - - return rc; -} - -#ifdef __cplusplus -} -#endif - -/*--------------------------------------------------------------------------* - * E N D O F F I L E * - *--------------------------------------------------------------------------*/ - diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/src/NwGtpv2cMsg.c b/openair-cn/GTPV2-C/nwgtpv2c-0.11/src/NwGtpv2cMsg.c deleted file mode 100644 index e566a08594..0000000000 --- a/openair-cn/GTPV2-C/nwgtpv2c-0.11/src/NwGtpv2cMsg.c +++ /dev/null @@ -1,750 +0,0 @@ -/*----------------------------------------------------------------------------* - * * - * n w - g t p v 2 c * - * G P R S T u n n e l i n g P r o t o c o l v 2 c S t a c k * - * * - * * - * Copyright (c) 2010-2011 Amit Chawre * - * All rights reserved. * - * * - * Redistribution and use in source and binary forms, with or without * - * modification, are permitted provided that the following conditions * - * are met: * - * * - * 1. Redistributions of source code must retain the above copyright * - * notice, this list of conditions and the following disclaimer. * - * 2. Redistributions in binary form must reproduce the above copyright * - * notice, this list of conditions and the following disclaimer in the * - * documentation and/or other materials provided with the distribution. * - * 3. The name of the author may not be used to endorse or promote products * - * derived from this software without specific prior written permission. * - * * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - *----------------------------------------------------------------------------*/ - -#include <stdio.h> -#include <string.h> -#include <ctype.h> -#include <inttypes.h> - -#include "NwTypes.h" -#include "NwLog.h" -#include "NwUtils.h" -#include "NwGtpv2cLog.h" -#include "NwGtpv2c.h" -#include "NwGtpv2cPrivate.h" -#include "NwGtpv2cIe.h" -#include "NwGtpv2cMsg.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -/*----------------------------------------------------------------------------* - * P R I V A T E F U N C T I O N S * - *----------------------------------------------------------------------------*/ - -static NwGtpv2cMsgT* gpGtpv2cMsgPool = NULL; - -/*----------------------------------------------------------------------------* - * P U B L I C F U N C T I O N S * - *----------------------------------------------------------------------------*/ - -NwRcT -nwGtpv2cMsgNew( NW_IN NwGtpv2cStackHandleT hGtpcStackHandle, - NW_IN uint8_t teidPresent, - NW_IN uint8_t msgType, - NW_IN uint32_t teid, - NW_IN uint32_t seqNum, - NW_OUT NwGtpv2cMsgHandleT *phMsg) -{ - NwGtpv2cStackT* pStack = (NwGtpv2cStackT*) hGtpcStackHandle; - NwGtpv2cMsgT *pMsg; - - NW_ASSERT(pStack); - - if(gpGtpv2cMsgPool) { - pMsg = gpGtpv2cMsgPool; - gpGtpv2cMsgPool = gpGtpv2cMsgPool->next; - } else { - NW_GTPV2C_MALLOC(pStack, sizeof(NwGtpv2cMsgT), pMsg, NwGtpv2cMsgT*); - } - - if(pMsg) { - pMsg->version = NW_GTP_VERSION; - pMsg->teidPresent = teidPresent; - pMsg->msgType = msgType; - pMsg->teid = teid; - pMsg->seqNum = seqNum; - pMsg->msgLen = (NW_GTPV2C_EPC_SPECIFIC_HEADER_SIZE - (teidPresent ? 0 : 4)); - - pMsg->groupedIeEncodeStack.top = 0; - pMsg->hStack = hGtpcStackHandle; - - *phMsg = (NwGtpv2cMsgHandleT) pMsg; - NW_LOG(pStack, NW_LOG_LEVEL_DEBG, "Created message %p!", pMsg); - return NW_OK; - } - - return NW_FAILURE; -} - -NwRcT -nwGtpv2cMsgFromBufferNew( NW_IN NwGtpv2cStackHandleT hGtpcStackHandle, - NW_IN uint8_t* pBuf, - NW_IN uint32_t bufLen, - NW_OUT NwGtpv2cMsgHandleT *phMsg) -{ - NwGtpv2cStackT* pStack = (NwGtpv2cStackT*) hGtpcStackHandle; - NwGtpv2cMsgT *pMsg; - - NW_ASSERT(pStack); - - if(gpGtpv2cMsgPool) { - pMsg = gpGtpv2cMsgPool; - gpGtpv2cMsgPool = gpGtpv2cMsgPool->next; - } else { - NW_GTPV2C_MALLOC(pStack, sizeof(NwGtpv2cMsgT), pMsg, NwGtpv2cMsgT*); - } - - if(pMsg) { - *phMsg = (NwGtpv2cMsgHandleT) pMsg; - memcpy(pMsg->msgBuf, pBuf, bufLen); - pMsg->msgLen = bufLen; - - pMsg->version = ((*pBuf) & 0xE0) >> 5; - pMsg->teidPresent = ((*pBuf) & 0x08) >> 3; - pBuf++; - - pMsg->msgType = *(pBuf); - pBuf += 3; - - if(pMsg->teidPresent) { - pMsg->teid = ntohl(*((uint32_t*)(pBuf))); - pBuf += 4; - } - - memcpy(((uint8_t*)&pMsg->seqNum) + 1, pBuf, 3); - pMsg->seqNum = ntohl(pMsg->seqNum); - - pMsg->hStack = hGtpcStackHandle; - NW_LOG(pStack, NW_LOG_LEVEL_DEBG, "Created message %p!", pMsg); - return NW_OK; - } - - return NW_FAILURE; -} - -NwRcT -nwGtpv2cMsgDelete( NW_IN NwGtpv2cStackHandleT hGtpcStackHandle, - NW_IN NwGtpv2cMsgHandleT hMsg) -{ - NwGtpv2cStackT* pStack = (NwGtpv2cStackT*) hGtpcStackHandle; - NW_LOG(pStack, NW_LOG_LEVEL_DEBG, "Purging message %"PRIxPTR"!", hMsg); - - ((NwGtpv2cMsgT*)hMsg)->next = gpGtpv2cMsgPool; - gpGtpv2cMsgPool = (NwGtpv2cMsgT*) hMsg; - - return NW_OK; -} - -/** - * Set TEID for gtpv2c message. - * - * @param[in] hMsg : Message handle. - * @param[in] teid: TEID value. - */ - -NwRcT -nwGtpv2cMsgSetTeid(NW_IN NwGtpv2cMsgHandleT hMsg, uint32_t teid) -{ - NwGtpv2cMsgT *thiz = (NwGtpv2cMsgT*) hMsg; - thiz->teid = teid; - return NW_OK; -} - -/** - * Set TEID present flag for gtpv2c message. - * - * @param[in] hMsg : Message handle. - * @param[in] teidPesent: Flag boolean value. - */ - -NwRcT -nwGtpv2cMsgSetTeidPresent(NW_IN NwGtpv2cMsgHandleT hMsg, NwBoolT teidPresent) -{ - NwGtpv2cMsgT *thiz = (NwGtpv2cMsgT*) hMsg; - thiz->teidPresent = teidPresent; - return NW_OK; -} - -/** - * Set sequence for gtpv2c message. - * - * @param[in] hMsg : Message handle. - * @param[in] seqNum: Flag boolean value. - */ - -NwRcT -nwGtpv2cMsgSetSeqNumber(NW_IN NwGtpv2cMsgHandleT hMsg, uint32_t seqNum) -{ - NwGtpv2cMsgT *thiz = (NwGtpv2cMsgT*) hMsg; - thiz->seqNum = seqNum; - return NW_OK; -} - -/** - * Get TEID present for gtpv2c message. - * - * @param[in] hMsg : Message handle. - */ - -uint32_t -nwGtpv2cMsgGetTeid(NW_IN NwGtpv2cMsgHandleT hMsg) -{ - NwGtpv2cMsgT *thiz = (NwGtpv2cMsgT*) hMsg; - return (thiz->teid); -} - -/** - * Get TEID present for gtpv2c message. - * - * @param[in] hMsg : Message handle. - */ - -NwBoolT -nwGtpv2cMsgGetTeidPresent(NW_IN NwGtpv2cMsgHandleT hMsg) -{ - NwGtpv2cMsgT *thiz = (NwGtpv2cMsgT*) hMsg; - return (thiz->teidPresent); -} - -/** - * Get sequence number for gtpv2c message. - * - * @param[in] hMsg : Message handle. - */ - -uint32_t -nwGtpv2cMsgGetSeqNumber(NW_IN NwGtpv2cMsgHandleT hMsg) -{ - NwGtpv2cMsgT *thiz = (NwGtpv2cMsgT*) hMsg; - return (thiz->seqNum); -} - -/** - * Get msg type for gtpv2c message. - * - * @param[in] hMsg : Message handle. - */ - -uint32_t -nwGtpv2cMsgGetMsgType(NW_IN NwGtpv2cMsgHandleT hMsg) -{ - NwGtpv2cMsgT *thiz = (NwGtpv2cMsgT*) hMsg; - return (thiz->msgType); -} - -/** - * Get msg type for gtpv2c message. - * - * @param[in] hMsg : Message handle. - */ - -uint32_t -nwGtpv2cMsgGetLength(NW_IN NwGtpv2cMsgHandleT hMsg) -{ - NwGtpv2cMsgT *thiz = (NwGtpv2cMsgT*) hMsg; - return (thiz->msgLen); -} - - -NwRcT -nwGtpv2cMsgAddIeTV1(NW_IN NwGtpv2cMsgHandleT hMsg, - NW_IN uint8_t type, - NW_IN uint8_t instance, - NW_IN uint8_t value) -{ - NwGtpv2cMsgT *pMsg = (NwGtpv2cMsgT*) hMsg; - NwGtpv2cIeTv1T *pIe; - - pIe = (NwGtpv2cIeTv1T*) (pMsg->msgBuf + pMsg->msgLen); - - pIe->t = type; - pIe->l = htons(0x0001); - pIe->i = instance & 0x00ff; - pIe->v = value; - - pMsg->msgLen += sizeof(NwGtpv2cIeTv1T); - - return NW_OK; -} - -NwRcT -nwGtpv2cMsgAddIeTV2(NW_IN NwGtpv2cMsgHandleT hMsg, - NW_IN uint8_t type, - NW_IN uint8_t instance, - NW_IN uint16_t value) -{ - NwGtpv2cMsgT *pMsg = (NwGtpv2cMsgT*) hMsg; - NwGtpv2cIeTv2T *pIe; - - pIe = (NwGtpv2cIeTv2T*) (pMsg->msgBuf + pMsg->msgLen); - - pIe->t = type; - pIe->l = htons(0x0002); - pIe->i = instance & 0x00ff; - pIe->v = htons(value); - - pMsg->msgLen += sizeof(NwGtpv2cIeTv2T); - - return NW_OK; -} - -NwRcT -nwGtpv2cMsgAddIeTV4(NW_IN NwGtpv2cMsgHandleT hMsg, - NW_IN uint8_t type, - NW_IN uint8_t instance, - NW_IN uint32_t value) -{ - NwGtpv2cMsgT *pMsg = (NwGtpv2cMsgT*) hMsg; - NwGtpv2cIeTv4T *pIe; - - pIe = (NwGtpv2cIeTv4T*) (pMsg->msgBuf + pMsg->msgLen); - - pIe->t = type; - pIe->l = htons(0x0004); - pIe->i = instance & 0x00ff; - pIe->v = htonl(value); - - pMsg->msgLen += sizeof(NwGtpv2cIeTv4T); - - return NW_OK; -} - -NwRcT -nwGtpv2cMsgAddIe(NW_IN NwGtpv2cMsgHandleT hMsg, - NW_IN uint8_t type, - NW_IN uint16_t length, - NW_IN uint8_t instance, - NW_IN uint8_t* pVal) -{ - NwGtpv2cMsgT *pMsg = (NwGtpv2cMsgT*) hMsg; - NwGtpv2cIeTlvT *pIe; - - pIe = (NwGtpv2cIeTlvT*) (pMsg->msgBuf + pMsg->msgLen); - - pIe->t = type; - pIe->l = htons(length); - pIe->i = instance & 0x00ff; - - memcpy(((uint8_t*)pIe) + 4, pVal, length); - pMsg->msgLen += (4 + length); - - return NW_OK; -} - -NwRcT -nwGtpv2cMsgGroupedIeStart(NW_IN NwGtpv2cMsgHandleT hMsg, - NW_IN uint8_t type, - NW_IN uint8_t instance) -{ - NwGtpv2cMsgT *pMsg = (NwGtpv2cMsgT*) hMsg; - NwGtpv2cIeTlvT *pIe; - - pIe = (NwGtpv2cIeTlvT*) (pMsg->msgBuf + pMsg->msgLen); - - pIe->t = type; - pIe->i = instance & 0x00ff; - pMsg->msgLen += (4); - pIe->l = (pMsg->msgLen); - - NW_ASSERT(pMsg->groupedIeEncodeStack.top < NW_GTPV2C_MAX_GROUPED_IE_DEPTH); - - pMsg->groupedIeEncodeStack.pIe[pMsg->groupedIeEncodeStack.top] = pIe; - pMsg->groupedIeEncodeStack.top++; - - return NW_OK; -} - -NwRcT -nwGtpv2cMsgGroupedIeEnd(NW_IN NwGtpv2cMsgHandleT hMsg) -{ - NwGtpv2cMsgT *pMsg = (NwGtpv2cMsgT*) hMsg; - NwGtpv2cIeTlvT *pIe; - - NW_ASSERT(pMsg->groupedIeEncodeStack.top > 0); - - pMsg->groupedIeEncodeStack.top--; - pIe = pMsg->groupedIeEncodeStack.pIe[pMsg->groupedIeEncodeStack.top]; - - pIe->l = htons(pMsg->msgLen - pIe->l); - - return NW_OK; -} - -NwRcT -nwGtpv2cMsgAddIeCause(NW_IN NwGtpv2cMsgHandleT hMsg, - NW_IN uint8_t instance, - NW_IN uint8_t causeValue, - NW_IN uint8_t bitFlags, - NW_IN uint8_t offendingIeType, - NW_IN uint8_t offendingIeInstance) -{ - uint8_t causeBuf[8]; - - causeBuf[0] = causeValue; - causeBuf[1] = bitFlags; - - if(offendingIeType) { - causeBuf[2] = offendingIeType; - causeBuf[3] = 0; - causeBuf[4] = 0; - causeBuf[5] = (offendingIeInstance & 0x0f); - } - - return (nwGtpv2cMsgAddIe(hMsg, NW_GTPV2C_IE_CAUSE, (offendingIeType? 6 : 2), instance, causeBuf)); -} - -NwRcT -nwGtpv2cMsgAddIeFteid(NW_IN NwGtpv2cMsgHandleT hMsg, - NW_IN uint8_t instance, - NW_IN uint8_t ifType, - NW_IN uint32_t teidOrGreKey, - NW_IN uint32_t ipv4Addr, - NW_IN uint8_t* pIpv6Addr) -{ - - uint8_t fteidBuf[32]; - uint8_t *pFteidBuf = fteidBuf; - - fteidBuf[0] = (ifType & 0x1F); - pFteidBuf++; - - *((uint32_t*)(pFteidBuf)) = htonl((teidOrGreKey)); - pFteidBuf += 4; - - if(ipv4Addr) { - fteidBuf[0] |= (0x01 << 7); - *((uint32_t*)(pFteidBuf)) = htonl(ipv4Addr); - pFteidBuf += 4; - } - - if(pIpv6Addr) { - fteidBuf[0] |= (0x01 << 6); - memcpy((pFteidBuf), pIpv6Addr, 16); - pFteidBuf += 16; - } - - return (nwGtpv2cMsgAddIe(hMsg, NW_GTPV2C_IE_FTEID, (pFteidBuf - fteidBuf), instance, fteidBuf)); -} - - -NwBoolT -nwGtpv2cMsgIsIePresent(NW_IN NwGtpv2cMsgHandleT hMsg, - NW_IN uint8_t type, - NW_IN uint8_t instance) -{ - NwGtpv2cMsgT *thiz = (NwGtpv2cMsgT*) hMsg; - - if((NwGtpv2cIeTv1T*) thiz->pIe[type][instance]) - return NW_TRUE; - - return NW_FALSE; -} - -NwRcT -nwGtpv2cMsgGetIeTV1(NW_IN NwGtpv2cMsgHandleT hMsg, - NW_IN uint8_t type, - NW_IN uint8_t instance, - NW_OUT uint8_t* pVal) -{ - NwGtpv2cMsgT *thiz = (NwGtpv2cMsgT*) hMsg; - NwGtpv2cIeTv1T *pIe; - NW_ASSERT(instance <= NW_GTPV2C_IE_INSTANCE_MAXIMUM); - - if(thiz->isIeValid[type][instance]) { - pIe = (NwGtpv2cIeTv1T*) thiz->pIe[type][instance]; - - if(ntohs(pIe->l) != 0x01) - return NW_GTPV2C_IE_INCORRECT; - - if(pVal) *pVal = pIe->v; - - return NW_OK; - } - - return NW_GTPV2C_IE_MISSING; -} - -NwRcT -nwGtpv2cMsgGetIeTV2( NW_IN NwGtpv2cMsgHandleT hMsg, - NW_IN uint8_t type, - NW_IN uint8_t instance, - NW_OUT uint16_t* pVal) -{ - NwGtpv2cMsgT *thiz = (NwGtpv2cMsgT*) hMsg; - NwGtpv2cIeTv2T *pIe; - NW_ASSERT(instance <= NW_GTPV2C_IE_INSTANCE_MAXIMUM); - - if(thiz->isIeValid[type][instance]) { - pIe = (NwGtpv2cIeTv2T*) thiz->pIe[type][instance]; - - if(ntohs(pIe->l) != 0x02) - return NW_GTPV2C_IE_INCORRECT; - - if(pVal) *pVal = ntohs(pIe->v); - - return NW_OK; - } - - return NW_GTPV2C_IE_MISSING; -} - -NwRcT -nwGtpv2cMsgGetIeTV4( NW_IN NwGtpv2cMsgHandleT hMsg, - NW_IN uint8_t type, - NW_IN uint8_t instance, - NW_OUT uint32_t* pVal) -{ - NwGtpv2cMsgT *thiz = (NwGtpv2cMsgT*) hMsg; - NwGtpv2cIeTv4T *pIe; - NW_ASSERT(instance <= NW_GTPV2C_IE_INSTANCE_MAXIMUM); - - if(thiz->isIeValid[type][instance]) { - pIe = (NwGtpv2cIeTv4T*) thiz->pIe[type][instance]; - - if(ntohs(pIe->l) != 0x04) - return NW_GTPV2C_IE_INCORRECT; - - if(pVal) *pVal = ntohl(pIe->v); - - return NW_OK; - } - - return NW_GTPV2C_IE_MISSING; -} - -NwRcT -nwGtpv2cMsgGetIeTV8( NW_IN NwGtpv2cMsgHandleT hMsg, - NW_IN uint8_t type, - NW_IN uint8_t instance, - NW_OUT uint64_t* pVal) -{ - NwGtpv2cMsgT *thiz = (NwGtpv2cMsgT*) hMsg; - NwGtpv2cIeTv8T *pIe; - NW_ASSERT(instance <= NW_GTPV2C_IE_INSTANCE_MAXIMUM); - - if(thiz->isIeValid[type][instance]) { - pIe = (NwGtpv2cIeTv8T*) thiz->pIe[type][instance]; - - if(ntohs(pIe->l) != 0x08) - return NW_GTPV2C_IE_INCORRECT; - - if(pVal) *pVal = NW_NTOHLL((pIe->v)); - - return NW_OK; - } - - NW_LOG(thiz->hStack, NW_LOG_LEVEL_ERRO, "Cannot retrieve IE of type %u instance %u !", type, instance); - return NW_GTPV2C_IE_MISSING; -} - -NwRcT -nwGtpv2cMsgGetIeTlv( NW_IN NwGtpv2cMsgHandleT hMsg, - NW_IN uint8_t type, - NW_IN uint8_t instance, - NW_IN uint16_t maxLen, - NW_OUT uint8_t* pVal, - NW_OUT uint16_t* pLen) -{ - NwGtpv2cMsgT *thiz = (NwGtpv2cMsgT*) hMsg; - NwGtpv2cIeTlvT *pIe; - NW_ASSERT(instance <= NW_GTPV2C_IE_INSTANCE_MAXIMUM); - - if(thiz->isIeValid[type][instance]) { - pIe = (NwGtpv2cIeTlvT*) thiz->pIe[type][instance]; - - if(ntohs(pIe->l) <= maxLen) { - if(pVal) memcpy(pVal, ((uint8_t*) pIe) + 4, ntohs(pIe->l)); - - if(pLen) *pLen = ntohs(pIe->l); - - return NW_OK; - } - } - - return NW_GTPV2C_IE_MISSING; -} - -NwRcT -nwGtpv2cMsgGetIeTlvP( NW_IN NwGtpv2cMsgHandleT hMsg, - NW_IN uint8_t type, - NW_IN uint8_t instance, - NW_OUT uint8_t** ppVal, - NW_OUT uint16_t* pLen) -{ - NwGtpv2cMsgT *thiz = (NwGtpv2cMsgT*) hMsg; - NwGtpv2cIeTlvT *pIe; - NW_ASSERT(instance <= NW_GTPV2C_IE_INSTANCE_MAXIMUM); - - if(thiz->isIeValid[type][instance]) { - pIe = (NwGtpv2cIeTlvT*) thiz->pIe[type][instance]; - - if(ppVal) *ppVal = ((uint8_t*) pIe) + 4; - - if(pLen) *pLen = ntohs(pIe->l); - - return NW_OK; - } - - return NW_GTPV2C_IE_MISSING; -} - -NwRcT -nwGtpv2cMsgGetIeCause(NW_IN NwGtpv2cMsgHandleT hMsg, - NW_IN uint8_t instance, - NW_OUT uint8_t* causeValue, - NW_OUT uint8_t* flags, - NW_OUT uint8_t* offendingIeType, - NW_OUT uint8_t* offendingIeInstance) -{ - NwGtpv2cMsgT *thiz = (NwGtpv2cMsgT*) hMsg; - NwGtpv2cIeTlvT *pIe; - - NW_ASSERT(instance <= NW_GTPV2C_IE_INSTANCE_MAXIMUM); - - if(thiz->isIeValid[NW_GTPV2C_IE_CAUSE][instance]) { - pIe = (NwGtpv2cIeTlvT*) thiz->pIe[NW_GTPV2C_IE_CAUSE][instance]; - *causeValue = *((uint8_t*)(((uint8_t*)pIe) + 4)); - *flags = *((uint8_t*)(((uint8_t*)pIe) + 5)); - - if(pIe->l == 6) { - *offendingIeType = *((uint8_t*)(((uint8_t*)pIe) + 6)); - *offendingIeType = *((uint8_t*)(((uint8_t*)pIe) + 8)); - } - - return NW_OK; - } - - return NW_GTPV2C_IE_MISSING; -} - -NwRcT -nwGtpv2cMsgGetIeFteid(NW_IN NwGtpv2cMsgHandleT hMsg, - NW_IN uint8_t instance, - NW_OUT uint8_t* ifType, - NW_OUT uint32_t* teidOrGreKey, - NW_OUT uint32_t* ipv4Addr, - NW_OUT uint8_t* pIpv6Addr) -{ - NwGtpv2cMsgT *thiz = (NwGtpv2cMsgT*) hMsg; - NwGtpv2cIeTlvT *pIe; - - NW_ASSERT(instance <= NW_GTPV2C_IE_INSTANCE_MAXIMUM); - - if(thiz->isIeValid[NW_GTPV2C_IE_FTEID][instance]) { - pIe = (NwGtpv2cIeTlvT*) thiz->pIe[NW_GTPV2C_IE_FTEID][instance]; - uint8_t flags; - uint8_t* pIeValue = ((uint8_t*) pIe) + 4; - flags = (*pIeValue) & 0xE0; - *ifType = (*pIeValue) & 0x1F; - pIeValue += 1; - - *teidOrGreKey = ntohl(*((uint32_t*)(pIeValue))); - pIeValue += 4; - - if(flags & 0x80) { - *ipv4Addr = ntohl(*((uint32_t*)(pIeValue))); - pIeValue += 4; - } - - return NW_OK; - } - - return NW_GTPV2C_IE_MISSING; -} - -NwRcT -nwGtpv2cMsgHexDump(NwGtpv2cMsgHandleT hMsg, FILE* fp) -{ - - NwGtpv2cMsgT* pMsg = (NwGtpv2cMsgT*) hMsg; - uint8_t* data = pMsg->msgBuf; - uint32_t size = pMsg->msgLen; - - unsigned char *p = (unsigned char*)data; - unsigned char c; - int n; - char bytestr[4] = {0}; - char addrstr[10] = {0}; - char hexstr[ 16*3 + 5] = {0}; - char charstr[16*1 + 5] = {0}; - fprintf((FILE*)fp, "\n"); - - for(n=1; n<=size; n++) { - if (n%16 == 1) { - /* store address for this line */ - snprintf(addrstr, sizeof(addrstr), "%.4lx", - ((unsigned long)p-(unsigned long)data) ); - } - - c = *p; - - if (isalnum(c) == 0) { - c = '.'; - } - - /* store hex str (for left side) */ - snprintf(bytestr, sizeof(bytestr), "%02X ", *p); - strncat(hexstr, bytestr, sizeof(hexstr)-strlen(hexstr)-1); - - /* store char str (for right side) */ - snprintf(bytestr, sizeof(bytestr), "%c", c); - strncat(charstr, bytestr, sizeof(charstr)-strlen(charstr)-1); - - if(n%16 == 0) { - /* line completed */ - fprintf((FILE*)fp, "[%4.4s] %-50.50s %s\n", addrstr, hexstr, charstr); - hexstr[0] = 0; - charstr[0] = 0; - } else if(n%8 == 0) { - /* half line: add whitespaces */ - strncat(hexstr, " ", sizeof(hexstr)-strlen(hexstr)-1); - strncat(charstr, " ", sizeof(charstr)-strlen(charstr)-1); - } - - p++; /* next byte */ - } - - if (strlen(hexstr) > 0) { - /* print rest of buffer if not empty */ - fprintf((FILE*)fp, "[%4.4s] %-50.50s %s\n", addrstr, hexstr, charstr); - - } - - fprintf((FILE*)fp, "\n"); - - return NW_OK; -} - -#ifdef __cplusplus -} -#endif - - - -/*--------------------------------------------------------------------------* - * E N D O F F I L E * - *--------------------------------------------------------------------------*/ - diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/src/NwGtpv2cMsgIeParseInfo.c b/openair-cn/GTPV2-C/nwgtpv2c-0.11/src/NwGtpv2cMsgIeParseInfo.c deleted file mode 100644 index 22607df8aa..0000000000 --- a/openair-cn/GTPV2-C/nwgtpv2c-0.11/src/NwGtpv2cMsgIeParseInfo.c +++ /dev/null @@ -1,703 +0,0 @@ -/*----------------------------------------------------------------------------* - * * - * n w - g t p v 2 c * - * G P R S T u n n e l i n g P r o t o c o l v 2 c S t a c k * - * * - * * - * Copyright (c) 2010-2011 Amit Chawre * - * All rights reserved. * - * * - * Redistribution and use in source and binary forms, with or without * - * modification, are permitted provided that the following conditions * - * are met: * - * * - * 1. Redistributions of source code must retain the above copyright * - * notice, this list of conditions and the following disclaimer. * - * 2. Redistributions in binary form must reproduce the above copyright * - * notice, this list of conditions and the following disclaimer in the * - * documentation and/or other materials provided with the distribution. * - * 3. The name of the author may not be used to endorse or promote products * - * derived from this software without specific prior written permission. * - * * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - *----------------------------------------------------------------------------*/ - -#include <stdio.h> -#include <string.h> - -#include "NwTypes.h" -#include "NwLog.h" -#include "NwUtils.h" -#include "NwGtpv2cLog.h" -#include "NwGtpv2c.h" -#include "NwGtpv2cPrivate.h" -#include "NwGtpv2cIe.h" -#include "NwGtpv2cMsg.h" - - -#ifdef __cplusplus -extern "C" { -#endif - - -typedef struct NwGtpv2cMsgIeInfo { - uint8_t ieType; - uint8_t ieMinLength; - uint8_t ieInstance; - uint8_t iePresence; - struct NwGtpv2cMsgIeInfo *pGroupedIeInfo; -} NwGtpv2cMsgIeInfoT; - -static -NwGtpv2cMsgIeInfoT createSessionReqBearerCtxtTobeCreatedIeInfoTbl[] = { - { NW_GTPV2C_IE_EBI , 1, NW_GTPV2C_IE_INSTANCE_ZERO , NW_GTPV2C_IE_PRESENCE_MANDATORY , NULL}, - { NW_GTPV2C_IE_BEARER_TFT , 0, NW_GTPV2C_IE_INSTANCE_ZERO , NW_GTPV2C_IE_PRESENCE_OPTIONAL , NULL}, - { NW_GTPV2C_IE_FTEID , 9, NW_GTPV2C_IE_INSTANCE_ZERO , NW_GTPV2C_IE_PRESENCE_CONDITIONAL , NULL}, - { NW_GTPV2C_IE_FTEID , 9, NW_GTPV2C_IE_INSTANCE_ONE , NW_GTPV2C_IE_PRESENCE_CONDITIONAL , NULL}, - { NW_GTPV2C_IE_FTEID , 9, NW_GTPV2C_IE_INSTANCE_TWO , NW_GTPV2C_IE_PRESENCE_CONDITIONAL , NULL}, - { NW_GTPV2C_IE_FTEID , 9, NW_GTPV2C_IE_INSTANCE_THREE , NW_GTPV2C_IE_PRESENCE_CONDITIONAL , NULL}, - { NW_GTPV2C_IE_FTEID , 9, NW_GTPV2C_IE_INSTANCE_FOUR , NW_GTPV2C_IE_PRESENCE_CONDITIONAL , NULL}, - { NW_GTPV2C_IE_BEARER_LEVEL_QOS, 18, NW_GTPV2C_IE_INSTANCE_ZERO , NW_GTPV2C_IE_PRESENCE_MANDATORY , NULL}, - // { NW_GTPV2C_IE_IMSI , 0, NW_GTPV2C_IE_INSTANCE_ZERO , NW_GTPV2C_IE_PRESENCE_CONDITIONAL , NULL}, - - /* Do not add below this */ - { 0, 0, 0} -}; - -static -NwGtpv2cMsgIeInfoT createSessionReqBearerCtxtTobeRemovedIeInfoTbl[] = { - { NW_GTPV2C_IE_IMSI , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL}, - - /* Do not add below this */ - { 0, 0, 0} -}; - -static -NwGtpv2cMsgIeInfoT echoRspIeInfoTbl[] = { - { NW_GTPV2C_IE_RECOVERY , 1, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_MANDATORY, NULL}, - - /* Do not add below this */ - { 0, 0, 0} -}; - -static -NwGtpv2cMsgIeInfoT createSessionReqIeInfoTbl[] = { - { NW_GTPV2C_IE_IMSI , 8, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL}, - { NW_GTPV2C_IE_MSISDN , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL}, - { NW_GTPV2C_IE_MEI , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL}, - { NW_GTPV2C_IE_FTEID , 9, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_MANDATORY , NULL}, - { NW_GTPV2C_IE_FTEID , 9, NW_GTPV2C_IE_INSTANCE_ONE , NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL}, - { NW_GTPV2C_IE_RAT_TYPE , 1, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_MANDATORY , NULL}, - { NW_GTPV2C_IE_INDICATION , 3, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL}, - { NW_GTPV2C_IE_APN , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_MANDATORY , NULL}, - { NW_GTPV2C_IE_APN_RESTRICTION, 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_MANDATORY , NULL}, - { NW_GTPV2C_IE_SELECTION_MODE , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_MANDATORY , NULL}, - { NW_GTPV2C_IE_PDN_TYPE , 1, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_MANDATORY , NULL}, - { NW_GTPV2C_IE_PAA , 5, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_MANDATORY , NULL}, - { NW_GTPV2C_IE_AMBR , 8, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL}, - { NW_GTPV2C_IE_EBI , 1, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL}, - { NW_GTPV2C_IE_PCO , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL}, - { NW_GTPV2C_IE_TRACE_INFORMATION, 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL}, - { NW_GTPV2C_IE_FQ_CSID , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL}, - { NW_GTPV2C_IE_FQ_CSID , 0, NW_GTPV2C_IE_INSTANCE_ONE , NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL}, - { NW_GTPV2C_IE_BEARER_CONTEXT , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_MANDATORY , createSessionReqBearerCtxtTobeCreatedIeInfoTbl}, - { NW_GTPV2C_IE_BEARER_CONTEXT , 0, NW_GTPV2C_IE_INSTANCE_ONE , NW_GTPV2C_IE_PRESENCE_CONDITIONAL, createSessionReqBearerCtxtTobeRemovedIeInfoTbl}, - { NW_GTPV2C_IE_SERVING_NETWORK, 3, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_MANDATORY , NULL}, - { NW_GTPV2C_IE_RECOVERY , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL}, - { NW_GTPV2C_IE_CHARGING_CHARACTERISTICS, 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL}, - { NW_GTPV2C_IE_LDN , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_OPTIONAL , NULL }, - { NW_GTPV2C_IE_LDN , 0, NW_GTPV2C_IE_INSTANCE_ONE , NW_GTPV2C_IE_PRESENCE_OPTIONAL , NULL }, - { NW_GTPV2C_IE_PRIVATE_EXTENSION, 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_OPTIONAL , NULL }, - - /* Do not add below this */ - { 0, 0, 0} -}; - -static -NwGtpv2cMsgIeInfoT modifyBearerReqIeInfoTbl[] = { - { NW_GTPV2C_IE_MEI , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_SERVING_NETWORK, 3, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL}, - { NW_GTPV2C_IE_ULI , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_RAT_TYPE , 1, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_INDICATION , 3, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_FTEID , 9, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_BEARER_CONTEXT , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_MANDATORY , NULL }, - { NW_GTPV2C_IE_BEARER_CONTEXT , 0, NW_GTPV2C_IE_INSTANCE_ONE , NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_PRIVATE_EXTENSION, 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_OPTIONAL , NULL }, - - /* Do not add below this */ - { 0, 0, 0} -}; - -static -NwGtpv2cMsgIeInfoT deleteSessionReqIeInfoTbl[] = { - { NW_GTPV2C_IE_CAUSE , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_EBI , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_ULI , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_INDICATION , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_PCO , 0, NW_GTPV2C_IE_INSTANCE_ONE , NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_RECOVERY , 1, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_PRIVATE_EXTENSION, 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_OPTIONAL , NULL }, - - /* Do not add below this */ - { 0, 0, 0} -}; - -static -NwGtpv2cMsgIeInfoT createSessionRspIeInfoTbl[] = { - { NW_GTPV2C_IE_CAUSE , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_MANDATORY , NULL }, - { NW_GTPV2C_IE_PAA , 5, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_APN_RESTRICTION, 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_FTEID , 9, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_FTEID , 9, NW_GTPV2C_IE_INSTANCE_ONE , NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_BEARER_CONTEXT , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_MANDATORY , NULL }, - { NW_GTPV2C_IE_BEARER_CONTEXT , 0, NW_GTPV2C_IE_INSTANCE_ONE , NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_RECOVERY , 1, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_PRIVATE_EXTENSION, 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_OPTIONAL , NULL }, - - /* Do not add below this */ - { 0, 0, 0} -}; - -static -NwGtpv2cMsgIeInfoT modifyBearerRspIeInfoTbl[] = { - { NW_GTPV2C_IE_CAUSE , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_MANDATORY , NULL }, - { NW_GTPV2C_IE_PAA , 5, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_APN_RESTRICTION, 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_FTEID , 9, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_BEARER_CONTEXT , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_RECOVERY , 1, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_PRIVATE_EXTENSION, 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_OPTIONAL , NULL }, - - /* Do not add below this */ - { 0, 0, 0} -}; - -static -NwGtpv2cMsgIeInfoT deleteSessionRspIeInfoTbl[] = { - { NW_GTPV2C_IE_CAUSE , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_MANDATORY , NULL }, - { NW_GTPV2C_IE_RECOVERY , 1, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_PCO , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_PRIVATE_EXTENSION, 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_OPTIONAL , NULL }, - - /* Do not add below this */ - { 0, 0, 0} -}; - -/* Message sent over s10 interface */ -static -NwGtpv2cMsgIeInfoT identificationReqIeInfoTbl[] = { - { NW_GTPV2C_IE_GUTI , 6, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_COMPLETE_REQUEST_MESSAGE, 1, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_SERVING_NETWORK, 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL_OPTIONAL, NULL }, - { NW_GTPV2C_IE_PRIVATE_EXTENSION, 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_OPTIONAL , NULL }, - - /* Do not add below this */ - { 0, 0, 0} -}; - -static -NwGtpv2cMsgIeInfoT identificationRspIeInfoTbl[] = { - { NW_GTPV2C_IE_CAUSE , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_MANDATORY , NULL }, - { NW_GTPV2C_IE_IMSI , 8, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_MM_CONTEXT , 1, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_TRACE_INFORMATION, 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL_OPTIONAL, NULL }, - { NW_GTPV2C_IE_PRIVATE_EXTENSION, 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_OPTIONAL , NULL }, - - /* Do not add below this */ - { 0, 0, 0} -}; - -static -NwGtpv2cMsgIeInfoT contextReqIeInfoTbl[] = { - { NW_GTPV2C_IE_IMSI , 8, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_GUTI , 5, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_ULI , 7, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_PTMSI , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_COMPLETE_REQUEST_MESSAGE, 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_FTEID , 9, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_UDP_SOURCE_PORT_NUMBER, 9, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_RAT_TYPE , 1, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_INDICATION , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_OPTIONAL , NULL }, - { NW_GTPV2C_IE_HOP_COUNTER , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_OPTIONAL , NULL }, - { NW_GTPV2C_IE_SERVING_NETWORK, 3, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL_OPTIONAL, NULL }, - { NW_GTPV2C_IE_LDN , 3, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_OPTIONAL , NULL }, - { NW_GTPV2C_IE_PRIVATE_EXTENSION, 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_OPTIONAL , NULL }, - - /* Do not add below this */ - { 0, 0, 0} -}; - -static -NwGtpv2cMsgIeInfoT contextRspIeInfoTbl[] = { - { NW_GTPV2C_IE_CAUSE , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_MANDATORY , NULL }, - { NW_GTPV2C_IE_IMSI , 8, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL , NULL }, - { NW_GTPV2C_IE_MM_CONTEXT , 4, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL , NULL }, - { NW_GTPV2C_IE_PDN_CONNECTION , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL , NULL }, - { NW_GTPV2C_IE_FTEID , 9, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL , NULL }, - { NW_GTPV2C_IE_FTEID , 9, NW_GTPV2C_IE_INSTANCE_ONE , NW_GTPV2C_IE_PRESENCE_CONDITIONAL , NULL }, - { NW_GTPV2C_IE_FQDN , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL , NULL }, - { NW_GTPV2C_IE_INDICATION , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL , NULL }, - { NW_GTPV2C_IE_TRACE_INFORMATION, 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL , NULL }, - { NW_GTPV2C_IE_IP_ADDRESS , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL , NULL }, - { NW_GTPV2C_IE_IP_ADDRESS , 0, NW_GTPV2C_IE_INSTANCE_ONE , NW_GTPV2C_IE_PRESENCE_CONDITIONAL , NULL }, - { NW_GTPV2C_IE_RFSP_INDEX , 2, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL_OPTIONAL, NULL }, - { NW_GTPV2C_IE_RFSP_INDEX , 2, NW_GTPV2C_IE_INSTANCE_ONE , NW_GTPV2C_IE_PRESENCE_CONDITIONAL_OPTIONAL, NULL }, - { NW_GTPV2C_IE_UE_TIME_ZONE , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL_OPTIONAL, NULL }, - { NW_GTPV2C_IE_LDN , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_OPTIONAL , NULL }, - { NW_GTPV2C_IE_PRIVATE_EXTENSION, 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_OPTIONAL , NULL }, - - /* Do not add below this */ - { 0, 0, 0} -}; - -static -NwGtpv2cMsgIeInfoT contextAckIeInfoTbl[] = { - { NW_GTPV2C_IE_CAUSE , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_MANDATORY , NULL }, - { NW_GTPV2C_IE_INDICATION , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_PRIVATE_EXTENSION, 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_OPTIONAL , NULL }, - - /* Do not add below this */ - { 0, 0, 0} -}; - -static -NwGtpv2cMsgIeInfoT forwardRelocationReqIeInfoTbl[] = { - { NW_GTPV2C_IE_IMSI , 8, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_FTEID , 9, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_MANDATORY , NULL }, - { NW_GTPV2C_IE_PDN_CONNECTION , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_MANDATORY , NULL }, - { NW_GTPV2C_IE_FTEID , 9, NW_GTPV2C_IE_INSTANCE_ONE , NW_GTPV2C_IE_PRESENCE_MANDATORY , NULL }, - { NW_GTPV2C_IE_FQDN , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_MM_CONTEXT , 4, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_MANDATORY , NULL }, - { NW_GTPV2C_IE_INDICATION , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_F_CONTAINER , 1, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_F_CONTAINER , 1, NW_GTPV2C_IE_INSTANCE_ONE , NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_TARGET_IDENTIFICATION, 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_IP_ADDRESS , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_IP_ADDRESS , 0, NW_GTPV2C_IE_INSTANCE_ONE , NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_F_CAUSE , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_F_CAUSE , 0, NW_GTPV2C_IE_INSTANCE_ONE , NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_F_CONTAINER , 1, NW_GTPV2C_IE_INSTANCE_TWO , NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_SOURCE_IDENTIFICATION, 1, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_F_CAUSE , 0, NW_GTPV2C_IE_INSTANCE_TWO , NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_SELECTED_PLMN_ID, 0, NW_GTPV2C_IE_INSTANCE_ONE , NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_RECOVERY , 1, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_TRACE_INFORMATION, 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_RFSP_INDEX , 2, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL_OPTIONAL, NULL }, - { NW_GTPV2C_IE_RFSP_INDEX , 2, NW_GTPV2C_IE_INSTANCE_ONE , NW_GTPV2C_IE_PRESENCE_CONDITIONAL_OPTIONAL, NULL }, - { NW_GTPV2C_IE_CSG_ID , 4, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL_OPTIONAL, NULL }, - { NW_GTPV2C_IE_CSG_MEMBERSHIP_INDICATION, 1, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL_OPTIONAL, NULL }, - { NW_GTPV2C_IE_UE_TIME_ZONE , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL_OPTIONAL, NULL }, - { NW_GTPV2C_IE_LDN , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_OPTIONAL , NULL }, - { NW_GTPV2C_IE_ADDITIONAL_MM_CTXT_FOR_SRVCC,0,NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL_OPTIONAL, NULL }, - { NW_GTPV2C_IE_ADDITIONAL_FLAGS_FOR_SRVCC, 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL_OPTIONAL, NULL }, - { NW_GTPV2C_IE_MSISDN , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL_OPTIONAL, NULL }, - { NW_GTPV2C_IE_PRIVATE_EXTENSION, 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_OPTIONAL , NULL }, - - /* Do not add below this */ - { 0, 0, 0 } -}; - -static -NwGtpv2cMsgIeInfoT forwardRelocationRspIeInfoTbl[] = { - { NW_GTPV2C_IE_CAUSE , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_MANDATORY , NULL }, - { NW_GTPV2C_IE_FTEID , 9, NW_GTPV2C_IE_INSTANCE_ONE , NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_INDICATION , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_BEARER_CONTEXT , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_BEARER_CONTEXT , 0, NW_GTPV2C_IE_INSTANCE_ONE , NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_BEARER_CONTEXT , 0, NW_GTPV2C_IE_INSTANCE_TWO , NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_F_CAUSE , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_F_CAUSE , 0, NW_GTPV2C_IE_INSTANCE_ONE , NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_F_CONTAINER , 1, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_F_CONTAINER , 1, NW_GTPV2C_IE_INSTANCE_ONE , NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_F_CONTAINER , 1, NW_GTPV2C_IE_INSTANCE_TWO , NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_F_CAUSE , 0, NW_GTPV2C_IE_INSTANCE_TWO , NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_LDN , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_OPTIONAL , NULL }, - { NW_GTPV2C_IE_PRIVATE_EXTENSION, 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_OPTIONAL , NULL }, - - /* Do not add below this */ - { 0, 0, 0} -}; - -static -NwGtpv2cMsgIeInfoT forwardRelocationCompleteNtfIeInfoTbl[] = { - { NW_GTPV2C_IE_INDICATION , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_CONDITIONAL, NULL }, - { NW_GTPV2C_IE_PRIVATE_EXTENSION, 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_OPTIONAL , NULL }, - - /* Do not add below this */ - { 0, 0, 0} -}; - -static -NwGtpv2cMsgIeInfoT forwardRelocationCompleteAckIeInfoTbl[] = { - { NW_GTPV2C_IE_CAUSE , 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_MANDATORY , NULL }, - { NW_GTPV2C_IE_RECOVERY , 1, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_OPTIONAL , NULL }, - { NW_GTPV2C_IE_PRIVATE_EXTENSION, 0, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_OPTIONAL , NULL }, - - /* Do not add below this */ - { 0, 0, 0} -}; - -/*----------------------------------------------------------------------------* - * P R I V A T E F U N C T I O N S * - *----------------------------------------------------------------------------*/ - -static uint32_t -nwGtpv2cMsgGroupedIeCount(NwGtpv2cMsgIeInfoT *pMsgIeInfo) -{ - uint32_t count = 0; - NwGtpv2cMsgIeInfoT *pGroupedIeInfo = pMsgIeInfo; - - while (pGroupedIeInfo++) { - if (pGroupedIeInfo->ieType == 0) { - break; - } - - count ++; - } - - return count; -} - -static NwRcT -nwGtpv2cMsgIeParseInfoUpdate(NwGtpv2cMsgIeParseInfoT *thiz, - NwGtpv2cMsgIeInfoT *pMsgIeInfo) -{ - uint32_t i, j; - - for (i = 0; pMsgIeInfo[i].ieType; i++) { - if (pMsgIeInfo[i].pGroupedIeInfo) { - NwGtpv2cGroupedIeParseInfoT *pMsgIeParseInfo; - - NW_GTPV2C_MALLOC(thiz->hStack, sizeof(NwGtpv2cGroupedIeParseInfoT), - pMsgIeParseInfo, NwGtpv2cGroupedIeParseInfoT*); - - pMsgIeParseInfo->groupedIeType = pMsgIeInfo[i].ieType; - pMsgIeParseInfo->hStack = thiz->hStack; - - for (j = 0; pMsgIeInfo[i].pGroupedIeInfo[j].ieType; j++) { - pMsgIeParseInfo->ieParseInfo[pMsgIeInfo[i].pGroupedIeInfo[j].ieType][pMsgIeInfo[i].pGroupedIeInfo[j].ieInstance].ieMinLength = - pMsgIeInfo[i].pGroupedIeInfo[j].ieMinLength; - pMsgIeParseInfo->ieParseInfo[pMsgIeInfo[i].pGroupedIeInfo[j].ieType][pMsgIeInfo[i].pGroupedIeInfo[j].ieInstance].iePresence = - pMsgIeInfo[i].pGroupedIeInfo[j].iePresence; - - if(pMsgIeInfo[i].pGroupedIeInfo[j].iePresence == NW_GTPV2C_IE_PRESENCE_MANDATORY) - pMsgIeParseInfo->mandatoryIeCount++; - } - - thiz->ieParseInfo[pMsgIeInfo[i].ieType][pMsgIeInfo[i].ieInstance].pGroupedIeInfo = pMsgIeParseInfo; - } else { - thiz->ieParseInfo[pMsgIeInfo[i].ieType][pMsgIeInfo[i].ieInstance].pGroupedIeInfo = NULL; - } - - thiz->ieParseInfo[pMsgIeInfo[i].ieType][pMsgIeInfo[i].ieInstance].iePresence = pMsgIeInfo[i].iePresence; - thiz->ieParseInfo[pMsgIeInfo[i].ieType][pMsgIeInfo[i].ieInstance].ieMinLength = pMsgIeInfo[i].ieMinLength; - - if(pMsgIeInfo[i].iePresence == NW_GTPV2C_IE_PRESENCE_MANDATORY) - thiz->mandatoryIeCount++; - } - - return NW_OK; -} - -static NwRcT -nwGtpv2cMsgGroupedIeParse(NW_IN NwGtpv2cGroupedIeParseInfoT* thiz, - NW_IN uint8_t ieType, - NW_IN uint16_t ieLength, - NW_IN uint8_t ieInstance, - NW_IN uint8_t *pIeValue) -{ - NW_ASSERT(thiz); - - NW_LOG(thiz->hStack, NW_LOG_LEVEL_DEBG, "Received grouped IE %u with instance %u of length %u in msg-type %u!", - ieType, ieInstance, ieLength, thiz->groupedIeType); - - return NW_OK; -} - -/*----------------------------------------------------------------------------* - * P U B L I C F U N C T I O N S * - *----------------------------------------------------------------------------*/ - -/** - * Constructor - * @return Pointer to the object on success. - */ - -NwGtpv2cMsgIeParseInfoT* -nwGtpv2cMsgIeParseInfoNew(NwGtpv2cStackHandleT hStack, uint8_t msgType) -{ - NwRcT rc; - NwGtpv2cMsgIeParseInfoT *thiz; - - NW_GTPV2C_MALLOC(hStack, sizeof(NwGtpv2cMsgIeParseInfoT), thiz, NwGtpv2cMsgIeParseInfoT*); - - if(thiz) { - memset(thiz, 0, sizeof(NwGtpv2cMsgIeParseInfoT)); - - thiz->hStack = hStack; - thiz->msgType = msgType; - - switch(msgType) { - case NW_GTP_ECHO_RSP: { - rc = nwGtpv2cMsgIeParseInfoUpdate(thiz, echoRspIeInfoTbl); - NW_ASSERT(NW_OK == rc); - } - break; - - case NW_GTP_CREATE_SESSION_REQ: { - rc = nwGtpv2cMsgIeParseInfoUpdate(thiz, createSessionReqIeInfoTbl); - NW_ASSERT(NW_OK == rc); - } - break; - - case NW_GTP_CREATE_SESSION_RSP: { - rc = nwGtpv2cMsgIeParseInfoUpdate(thiz, createSessionRspIeInfoTbl); - NW_ASSERT(NW_OK == rc); - } - break; - - case NW_GTP_DELETE_SESSION_REQ: { - rc = nwGtpv2cMsgIeParseInfoUpdate(thiz, deleteSessionReqIeInfoTbl); - NW_ASSERT(NW_OK == rc); - } - break; - - case NW_GTP_DELETE_SESSION_RSP: { - rc = nwGtpv2cMsgIeParseInfoUpdate(thiz, deleteSessionRspIeInfoTbl); - NW_ASSERT(NW_OK == rc); - } - break; - - case NW_GTP_MODIFY_BEARER_REQ: { - rc = nwGtpv2cMsgIeParseInfoUpdate(thiz, modifyBearerReqIeInfoTbl); - NW_ASSERT(NW_OK == rc); - } - break; - - case NW_GTP_MODIFY_BEARER_RSP: { - rc = nwGtpv2cMsgIeParseInfoUpdate(thiz, modifyBearerRspIeInfoTbl); - NW_ASSERT(NW_OK == rc); - } - break; - - case NW_GTP_FORWARD_RELOCATION_REQ: { - rc = nwGtpv2cMsgIeParseInfoUpdate(thiz, forwardRelocationReqIeInfoTbl); - NW_ASSERT(NW_OK == rc); - } - break; - - case NW_GTP_FORWARD_RELOCATION_RSP: { - rc = nwGtpv2cMsgIeParseInfoUpdate(thiz, forwardRelocationRspIeInfoTbl); - NW_ASSERT(NW_OK == rc); - } - break; - - case NW_GTP_FORWARD_RELOCATION_COMPLETE_NTF: { - rc = nwGtpv2cMsgIeParseInfoUpdate(thiz, forwardRelocationCompleteNtfIeInfoTbl); - NW_ASSERT(NW_OK == rc); - } - break; - - case NW_GTP_FORWARD_RELOCATION_COMPLETE_ACK: { - rc = nwGtpv2cMsgIeParseInfoUpdate(thiz, forwardRelocationCompleteAckIeInfoTbl); - NW_ASSERT(NW_OK == rc); - } - break; - - case NW_GTP_CONTEXT_REQ: { - rc = nwGtpv2cMsgIeParseInfoUpdate(thiz, contextReqIeInfoTbl); - NW_ASSERT(NW_OK == rc); - } - break; - - case NW_GTP_CONTEXT_RSP: { - rc = nwGtpv2cMsgIeParseInfoUpdate(thiz, contextRspIeInfoTbl); - NW_ASSERT(NW_OK == rc); - } - break; - - case NW_GTP_CONTEXT_ACK: { - rc = nwGtpv2cMsgIeParseInfoUpdate(thiz, contextAckIeInfoTbl); - NW_ASSERT(NW_OK == rc); - } - break; - - case NW_GTP_IDENTIFICATION_REQ: { - rc = nwGtpv2cMsgIeParseInfoUpdate(thiz, identificationReqIeInfoTbl); - NW_ASSERT(NW_OK == rc); - } - break; - - case NW_GTP_IDENTIFICATION_RSP: { - rc = nwGtpv2cMsgIeParseInfoUpdate(thiz, identificationRspIeInfoTbl); - NW_ASSERT(NW_OK == rc); - } - break; - - default: { - free(thiz); - thiz = NULL; - } - break; - } - } - - return thiz; -} - -/** - * Destructor - * @return NW_OK on success. - */ - -NwRcT -nwGtpv2cMsgIeParseInfoDelete(NwGtpv2cMsgIeParseInfoT* thiz) -{ - NW_GTPV2C_FREE(thiz->hStack, thiz); - return NW_OK; -} - -/** - * Parse message - * @return NW_OK on success. - */ - -NwRcT -nwGtpv2cMsgIeParse(NW_IN NwGtpv2cMsgIeParseInfoT* thiz, - NW_IN NwGtpv2cMsgHandleT hMsg, - NW_INOUT NwGtpv2cErrorT *pError) -{ - NwRcT rc = NW_OK; - uint16_t mandatoryIeCount =0; - uint8_t *pIeBufStart; - uint8_t *pIeBufEnd; - uint16_t ieType; - uint16_t ieLength; - uint16_t ieInstance; - NwGtpv2cIeTlvT *pIe; - NwGtpv2cMsgT *pMsg = (NwGtpv2cMsgT*) hMsg; - uint8_t flags = *((uint8_t*)(pMsg->msgBuf)); - - pIeBufStart = (uint8_t *) (pMsg->msgBuf + (flags & 0x08 ? 12: 8)); - pIeBufEnd = (uint8_t *) (pMsg->msgBuf + pMsg->msgLen); - - //memset(pMsg->pIe, 0, sizeof(uint8_t*) * (NW_GTPV2C_IE_TYPE_MAXIMUM) * (NW_GTPV2C_IE_INSTANCE_MAXIMUM)); - memset(pMsg->isIeValid, (NW_FALSE), sizeof(uint8_t) * (NW_GTPV2C_IE_TYPE_MAXIMUM) * (NW_GTPV2C_IE_INSTANCE_MAXIMUM)); - - while (pIeBufStart < pIeBufEnd) { - pIe = (NwGtpv2cIeTlvT*) pIeBufStart; - ieType = pIe->t; - ieLength = ntohs(pIe->l); - ieInstance = pIe->i & 0x0F; - - NW_ASSERT(NW_GTPV2C_IE_INSTANCE_MAXIMUM >= ieInstance); - - NW_LOG(thiz->hStack, NW_LOG_LEVEL_DEBG, "Received IE %u with instance %u of length %u in msg-type %u!", ieType, ieInstance, ieLength, thiz->msgType); - - if(pIeBufStart + 4 + ieLength > pIeBufEnd) { - NW_LOG(thiz->hStack, NW_LOG_LEVEL_ERRO, "Invalid length for IE of type %u and instance %u!", ieType, ieInstance); - pError->cause = NW_GTPV2C_CAUSE_INVALID_LENGTH; - pError->offendingIe.type = ieType; - pError->offendingIe.instance = ieInstance; - return NW_FAILURE; - } - - if((thiz->ieParseInfo[ieType][ieInstance].iePresence)) { - if((ieLength < (thiz->ieParseInfo[ieType][ieInstance].ieMinLength))) { - if(thiz->ieParseInfo[ieType][ieInstance].iePresence == NW_GTPV2C_IE_PRESENCE_OPTIONAL) { - /* Ignore TLV */ - pIeBufStart += (ieLength + 4); - continue; - } else { - pError->cause = NW_GTPV2C_CAUSE_MANDATORY_IE_INCORRECT; - pError->offendingIe.type = ieType; - pError->offendingIe.instance = ieInstance; - NW_LOG(thiz->hStack, NW_LOG_LEVEL_ERRO, "Mandatory IE of type %u and instance %u incorrect!", ieType, ieInstance); - return NW_FAILURE; - } - } - - if(pMsg->isIeValid[ieType][ieInstance] == NW_TRUE) { - /* - * If an information element is repeated in a GTP signalling - * message in which repetition of the information element is - * not specified, only the contents of the information element - * appearing first shall be handled and all subsequent repetitions - * of the information element shall be ignored. - * TODO: Add handling for IEs for which repetition is allowed. - */ - pIeBufStart += (ieLength + 4); - continue; - } - - pMsg->pIe[ieType][ieInstance] = (uint8_t*) pIeBufStart; - pMsg->isIeValid[ieType][ieInstance] = NW_TRUE; - - if(thiz->ieParseInfo[ieType][ieInstance].pGroupedIeInfo) { - /* Parse the grouped IE */ - rc = nwGtpv2cMsgGroupedIeParse(thiz->ieParseInfo[ieType][ieInstance].pGroupedIeInfo, ieType, ieLength, ieInstance, ((uint8_t*) pIe) + 4); - - if (rc != NW_OK) { - pError->cause = NW_GTPV2C_CAUSE_MANDATORY_IE_INCORRECT; - pError->offendingIe.type = ieType; - pError->offendingIe.instance = ieInstance; - NW_LOG(thiz->hStack, NW_LOG_LEVEL_ERRO, "Mandatory IE of type %u and instance %u incorrect!", ieType, ieInstance); - return NW_FAILURE; - } - } - - if(thiz->ieParseInfo[ieType][ieInstance].iePresence == NW_GTPV2C_IE_PRESENCE_MANDATORY) { - mandatoryIeCount++; - } - } else { - NW_LOG(thiz->hStack, NW_LOG_LEVEL_WARN, "Unexpected IE %u with instance %u of length %u received in msg %u!", ieType, ieInstance, ieLength, thiz->msgType); - } - - pIeBufStart += (ieLength + 4); - } - - if((NW_OK == rc) && (mandatoryIeCount != thiz->mandatoryIeCount)) { - for(ieType = 0; ieType < NW_GTPV2C_IE_TYPE_MAXIMUM; ieType++) { - for(ieInstance = 0; ieInstance < NW_GTPV2C_IE_INSTANCE_MAXIMUM; ieInstance++) { - if(thiz->ieParseInfo[ieType][ieInstance].iePresence == NW_GTPV2C_IE_PRESENCE_MANDATORY) { - if(pMsg->isIeValid[ieType][ieInstance] == NW_FALSE) { - NW_LOG(thiz->hStack, NW_LOG_LEVEL_ERRO, "Mandatory IE of type %u and instance %u missing in msg type %u", ieType, ieInstance, pMsg->msgType); - pError->cause = NW_GTPV2C_CAUSE_MANDATORY_IE_MISSING; - pError->offendingIe.type = ieType; - pError->offendingIe.instance = ieInstance; - return NW_FAILURE; - } - } - } - } - - NW_LOG(thiz->hStack, NW_LOG_LEVEL_CRIT, "Unknown mandatory IE missing. Msg parser formed incorrectly!"); - pError->cause = NW_GTPV2C_CAUSE_MANDATORY_IE_MISSING; - pError->offendingIe.type = 0; - pError->offendingIe.instance = 0; - return NW_FAILURE; - } - - pError->cause = NW_GTPV2C_CAUSE_REQUEST_ACCEPTED; - return NW_OK; -} - - -#ifdef __cplusplus -} -#endif - -/*--------------------------------------------------------------------------* - * E N D O F F I L E * - *--------------------------------------------------------------------------*/ - diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/src/NwGtpv2cMsgParser.c b/openair-cn/GTPV2-C/nwgtpv2c-0.11/src/NwGtpv2cMsgParser.c deleted file mode 100644 index a19ddc1bcc..0000000000 --- a/openair-cn/GTPV2-C/nwgtpv2c-0.11/src/NwGtpv2cMsgParser.c +++ /dev/null @@ -1,293 +0,0 @@ -/*----------------------------------------------------------------------------* - * * - * n w - g t p v 2 c * - * G P R S T u n n e l i n g P r o t o c o l v 2 c S t a c k * - * * - * * - * Copyright (c) 2010-2011 Amit Chawre * - * All rights reserved. * - * * - * Redistribution and use in source and binary forms, with or without * - * modification, are permitted provided that the following conditions * - * are met: * - * * - * 1. Redistributions of source code must retain the above copyright * - * notice, this list of conditions and the following disclaimer. * - * 2. Redistributions in binary form must reproduce the above copyright * - * notice, this list of conditions and the following disclaimer in the * - * documentation and/or other materials provided with the distribution. * - * 3. The name of the author may not be used to endorse or promote products * - * derived from this software without specific prior written permission. * - * * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - *----------------------------------------------------------------------------*/ - -#include "NwTypes.h" -#include "NwUtils.h" -#include "NwGtpv2cLog.h" -#include "NwGtpv2c.h" -#include "NwGtpv2cPrivate.h" -#include "NwGtpv2cIe.h" -#include "NwGtpv2cMsg.h" -#include "NwGtpv2cMsgParser.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * Allocate a gtpv2c message Parser. - * - * @param[in] hGtpcStackHandle : gtpv2c stack handle. - * @param[in] msgType : Message type for this message parser. - * @param[out] pthiz : Pointer to message parser handle. - */ - -NwRcT -nwGtpv2cMsgParserNew( NW_IN NwGtpv2cStackHandleT hGtpcStackHandle, - NW_IN uint8_t msgType, - NW_IN NwRcT (*ieReadCallback) (uint8_t ieType, - uint8_t ieLength, - uint8_t ieInstance, - uint8_t* ieValue, - void* ieReadCallbackArg), - NW_IN void* ieReadCallbackArg, - NW_IN NwGtpv2cMsgParserT **pthiz) -{ - NwGtpv2cMsgParserT* thiz; - // NW_GTPV2C_MALLOC(hGtpcStackHandle, sizeof(NwGtpv2cMsgParserT), thiz, NwGtpv2cMsgParserT*); - thiz = (NwGtpv2cMsgParserT*) malloc (sizeof(NwGtpv2cMsgParserT)); - - if(thiz) { - memset(thiz, 0, sizeof(NwGtpv2cMsgParserT)); - thiz->msgType = msgType; - thiz->hStack = hGtpcStackHandle; - *pthiz = thiz; - thiz->ieReadCallback = ieReadCallback; - thiz->ieReadCallbackArg = ieReadCallbackArg; - return NW_OK; - } - - return NW_FAILURE; -} - -/** - * Free a gtpv2c message parser. - * - * @param[in] hGtpcStackHandle : gtpv2c stack handle. - * @param[in] thiz : Message parser handle. - */ - -NwRcT -nwGtpv2cMsgParserDelete( NW_IN NwGtpv2cStackHandleT hGtpcStackHandle, - NW_IN NwGtpv2cMsgParserT* thiz) -{ - NW_GTPV2C_FREE(hGtpcStackHandle, thiz); - return NW_OK; -} - -NwRcT -nwGtpv2cMsgParserUpdateIeReadCallback( NW_IN NwGtpv2cMsgParserT* thiz, - NW_IN NwRcT (*ieReadCallback) (uint8_t ieType, - uint8_t ieLength, - uint8_t ieInstance, - uint8_t* ieValue, - void* ieReadCallbackArg)) -{ - if(thiz) { - thiz->ieReadCallback = ieReadCallback; - return NW_OK; - } - - return NW_FAILURE; -} - -NwRcT -nwGtpv2cMsgParserUpdateIeReadCallbackArg( NW_IN NwGtpv2cMsgParserT* thiz, - NW_IN void* ieReadCallbackArg) -{ - if(thiz) { - thiz->ieReadCallbackArg = ieReadCallbackArg; - return NW_OK; - } - - return NW_FAILURE; -} - -NwRcT -nwGtpv2cMsgParserAddIe( NW_IN NwGtpv2cMsgParserT* thiz, - NW_IN uint8_t ieType, - NW_IN uint8_t ieInstance, - NW_IN uint8_t iePresence, - NW_IN NwRcT (*ieReadCallback) (uint8_t ieType, - uint8_t ieLength, - uint8_t ieInstance, - uint8_t* ieValue, - void* ieReadCallbackArg), - NW_IN void* ieReadCallbackArg) -{ - NW_ASSERT(thiz); - - if(thiz->ieParseInfo[ieType][ieInstance].iePresence == 0) { - NW_ASSERT(ieInstance <= NW_GTPV2C_IE_INSTANCE_MAXIMUM); - - thiz->ieParseInfo[ieType][ieInstance].ieReadCallback = ieReadCallback; - thiz->ieParseInfo[ieType][ieInstance].ieReadCallbackArg = ieReadCallbackArg; - thiz->ieParseInfo[ieType][ieInstance].iePresence = iePresence; - - if (iePresence == NW_GTPV2C_IE_PRESENCE_MANDATORY) { - thiz->mandatoryIeCount++; - } - } else { - NW_LOG(thiz->hStack, NW_LOG_LEVEL_ERRO, "Cannot add IE to parser for type %u and instance %u. IE info already exists!", ieType, ieInstance); - } - - return NW_OK; -} - -NwRcT -nwGtpv2cMsgParserUpdateIe( NW_IN NwGtpv2cMsgParserT* thiz, - NW_IN uint8_t ieType, - NW_IN uint8_t ieInstance, - NW_IN uint8_t iePresence, - NW_IN NwRcT (*ieReadCallback) (uint8_t ieType, - uint8_t ieLength, - uint8_t ieInstance, - uint8_t* ieValue, - void* ieReadCallbackArg), - NW_IN void* ieReadCallbackArg) -{ - NW_ASSERT(thiz); - - if(thiz->ieParseInfo[ieType][ieInstance].iePresence) { - thiz->ieParseInfo[ieType][ieInstance].ieReadCallback = ieReadCallback; - thiz->ieParseInfo[ieType][ieInstance].ieReadCallbackArg = ieReadCallbackArg; - - thiz->ieParseInfo[ieType][ieInstance].iePresence = iePresence; - } else { - NW_LOG(thiz->hStack, NW_LOG_LEVEL_ERRO, "Cannot update IE info for type %u and instance %u. IE info does not exist!", ieType, ieInstance); - } - - - return NW_OK; -} - - - -NwRcT -nwGtpv2cMsgParserRun( NW_IN NwGtpv2cMsgParserT *thiz, - NW_IN NwGtpv2cMsgHandleT hMsg, - NW_OUT uint8_t *pOffendingIeType, - NW_OUT uint8_t *pOffendingIeInstance, - NW_OUT uint16_t *pOffendingIeLength) -{ - NwRcT rc = NW_OK; - uint8_t flags; - uint16_t mandatoryIeCount =0; - NwGtpv2cIeTlvT *pIe; - uint8_t *pIeStart; - uint8_t *pIeEnd; - uint16_t ieLength; - NwGtpv2cMsgT *pMsg = (NwGtpv2cMsgT*) hMsg; - - NW_ASSERT(pMsg); - flags = *((uint8_t*)(pMsg->msgBuf)); - pIeStart = (uint8_t *) (pMsg->msgBuf + (flags & 0x08 ? 12: 8)); - pIeEnd = (uint8_t *) (pMsg->msgBuf + pMsg->msgLen); - - memset(thiz->pIe, 0, sizeof(uint8_t*) * (NW_GTPV2C_IE_TYPE_MAXIMUM) * (NW_GTPV2C_IE_INSTANCE_MAXIMUM)); - memset(pMsg->pIe, 0, sizeof(uint8_t*) * (NW_GTPV2C_IE_TYPE_MAXIMUM) * (NW_GTPV2C_IE_INSTANCE_MAXIMUM)); - - while (pIeStart < pIeEnd) { - pIe = (NwGtpv2cIeTlvT*) pIeStart; - ieLength = ntohs(pIe->l); - - if(pIeStart + 4 + ieLength > pIeEnd) { - *pOffendingIeType = pIe->t; - *pOffendingIeLength = pIe->l; - *pOffendingIeInstance = pIe->i; - return NW_GTPV2C_MSG_MALFORMED; - } - - if((thiz->ieParseInfo[pIe->t][pIe->i].iePresence)) { - thiz->pIe[pIe->t][pIe->i] = (uint8_t*) pIeStart; - pMsg->pIe[pIe->t][pIe->i] = (uint8_t*) pIeStart; - - NW_LOG(thiz->hStack, NW_LOG_LEVEL_DEBG, "Received IE %u of length %u!", pIe->t, ieLength); - - if((thiz->ieParseInfo[pIe->t][pIe->i].ieReadCallback) != NULL ) { - rc = thiz->ieParseInfo[pIe->t][pIe->i].ieReadCallback(pIe->t, ieLength, pIe->i, pIeStart + 4, thiz->ieParseInfo[pIe->t][pIe->i].ieReadCallbackArg); - - if(NW_OK == rc) { - if(thiz->ieParseInfo[pIe->t][pIe->i].iePresence == NW_GTPV2C_IE_PRESENCE_MANDATORY) - mandatoryIeCount++; - } else { - NW_LOG(thiz->hStack, NW_LOG_LEVEL_ERRO, "Error while parsing IE %u with instance %u and length %u!", pIe->t, pIe->i, ieLength); - break; - } - } else { - if((thiz->ieReadCallback) != NULL ) { - NW_LOG(thiz->hStack, NW_LOG_LEVEL_DEBG, "Received IE %u of length %u!", pIe->t, ieLength); - rc = thiz->ieReadCallback(pIe->t, ieLength, pIe->i, pIeStart + 4, thiz->ieReadCallbackArg); - - if(NW_OK == rc) { - if(thiz->ieParseInfo[pIe->t][pIe->i].iePresence == NW_GTPV2C_IE_PRESENCE_MANDATORY) - mandatoryIeCount++; - } else { - NW_LOG(thiz->hStack, NW_LOG_LEVEL_ERRO, "Error while parsing IE %u of length %u!", pIe->t, ieLength); - break; - } - } else { - NW_LOG(thiz->hStack, NW_LOG_LEVEL_WARN, "No parse method defined for received IE type %u of length %u in message %u!", pIe->t, ieLength, thiz->msgType); - } - } - } else { - NW_LOG(thiz->hStack, NW_LOG_LEVEL_WARN, "Unexpected IE %u of length %u received in msg %u!", pIe->t, ieLength, thiz->msgType); - } - - pIeStart += (ieLength + 4); - } - - if((NW_OK == rc) && (mandatoryIeCount != thiz->mandatoryIeCount)) { - uint16_t t, i; - *pOffendingIeType = 0; - *pOffendingIeInstance = 0; - *pOffendingIeLength = 0; - - for(t = 0; t < NW_GTPV2C_IE_TYPE_MAXIMUM; t++) { - for(i = 0; i < NW_GTPV2C_IE_INSTANCE_MAXIMUM; i++) { - if(thiz->ieParseInfo[t][i].iePresence == NW_GTPV2C_IE_PRESENCE_MANDATORY) { - if(thiz->pIe[t][i] == NULL) { - *pOffendingIeType = t; - *pOffendingIeInstance = i; - return NW_GTPV2C_MANDATORY_IE_MISSING; - } - } - } - } - - NW_LOG(thiz->hStack, NW_LOG_LEVEL_WARN, "Unknown mandatory IE missing. Parser formed incorrectly! %u:%u", mandatoryIeCount, thiz->mandatoryIeCount); - return NW_GTPV2C_MANDATORY_IE_MISSING; - } - - return rc; -} - -#ifdef __cplusplus -} -#endif - - -/*--------------------------------------------------------------------------* - * E N D O F F I L E * - *--------------------------------------------------------------------------*/ - diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/src/NwGtpv2cTrxn.c b/openair-cn/GTPV2-C/nwgtpv2c-0.11/src/NwGtpv2cTrxn.c deleted file mode 100644 index 4d052d05f1..0000000000 --- a/openair-cn/GTPV2-C/nwgtpv2c-0.11/src/NwGtpv2cTrxn.c +++ /dev/null @@ -1,389 +0,0 @@ -/*----------------------------------------------------------------------------* - * * - * n w - g t p v 2 c * - * G P R S T u n n e l i n g P r o t o c o l v 2 c S t a c k * - * * - * * - * Copyright (c) 2010-2011 Amit Chawre * - * All rights reserved. * - * * - * Redistribution and use in source and binary forms, with or without * - * modification, are permitted provided that the following conditions * - * are met: * - * * - * 1. Redistributions of source code must retain the above copyright * - * notice, this list of conditions and the following disclaimer. * - * 2. Redistributions in binary form must reproduce the above copyright * - * notice, this list of conditions and the following disclaimer in the * - * documentation and/or other materials provided with the distribution. * - * 3. The name of the author may not be used to endorse or promote products * - * derived from this software without specific prior written permission. * - * * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - *----------------------------------------------------------------------------*/ - -#include <stdio.h> -#include <string.h> - -#include "NwTypes.h" -#include "NwLog.h" -#include "NwUtils.h" -#include "NwGtpv2cLog.h" -#include "NwGtpv2c.h" -#include "NwGtpv2cPrivate.h" -#include "NwGtpv2cTrxn.h" - -/*--------------------------------------------------------------------------* - * P R I V A T E D E C L A R A T I O N S * - *--------------------------------------------------------------------------*/ - -#ifdef __cplusplus -extern "C" { -#endif - -static NwGtpv2cTrxnT* gpGtpv2cTrxnPool = NULL; - -/*--------------------------------------------------------------------------* - * P R I V A T E F U N C T I O N S * - *--------------------------------------------------------------------------*/ - -/*--------------------------------------------------------------------------- - * Send msg retransmission to peer via data request to UDP Entity - *--------------------------------------------------------------------------*/ - -static NwRcT -nwGtpv2cTrxnSendMsgRetransmission(NwGtpv2cTrxnT* thiz) -{ - NwRcT rc ; - - NW_ASSERT(thiz); - - NW_ASSERT(thiz->pMsg); - - rc = thiz->pStack->udp.udpDataReqCallback(thiz->pStack->udp.hUdp, - thiz->pMsg->msgBuf, - thiz->pMsg->msgLen, - thiz->peerIp, - thiz->peerPort); - - thiz->maxRetries--; - - return rc; -} - -static NwRcT -nwGtpv2cTrxnPeerRspWaitTimeout(void* arg) -{ - NwRcT rc = NW_OK; - NwGtpv2cTrxnT* thiz; - NwGtpv2cStackT* pStack; - - thiz = ((NwGtpv2cTrxnT*)arg); - pStack = thiz->pStack; - - NW_ASSERT(pStack); - - NW_LOG(pStack, NW_LOG_LEVEL_WARN, "T3 Response timer expired for transaction 0x%p", - thiz); - - thiz->hRspTmr = 0; - - if(thiz->maxRetries) { - rc = nwGtpv2cTrxnSendMsgRetransmission(thiz); - NW_ASSERT(NW_OK == rc); - - rc = nwGtpv2cStartTimer(thiz->pStack, thiz->t3Timer, 0, NW_GTPV2C_TMR_TYPE_ONE_SHOT, nwGtpv2cTrxnPeerRspWaitTimeout, thiz, &thiz->hRspTmr); - } else { - NwGtpv2cUlpApiT ulpApi; - - ulpApi.hMsg = 0; - ulpApi.apiType = NW_GTPV2C_ULP_API_RSP_FAILURE_IND; - - ulpApi.apiInfo.rspFailureInfo.hUlpTrxn = thiz->hUlpTrxn; - ulpApi.apiInfo.rspFailureInfo.hUlpTunnel = ( (thiz->hTunnel) ? ((NwGtpv2cTunnelT*)(thiz->hTunnel))->hUlpTunnel : 0 ); - - NW_LOG(pStack, NW_LOG_LEVEL_ERRO, "N3 retries expired for transaction 0x%p", - thiz); - RB_REMOVE(NwGtpv2cOutstandingTxSeqNumTrxnMap, &(pStack->outstandingTxSeqNumMap), thiz); - rc = nwGtpv2cTrxnDelete(&thiz); - - rc = pStack->ulp.ulpReqCallback(pStack->ulp.hUlp, &ulpApi); - } - - return rc; -} - -static NwRcT -nwGtpv2cTrxnDuplicateRequestWaitTimeout(void* arg) -{ - NwRcT rc = NW_OK; - NwGtpv2cTrxnT* thiz; - NwGtpv2cStackT* pStack; - - thiz = ((NwGtpv2cTrxnT*)arg); - - NW_ASSERT(thiz); - pStack = thiz->pStack; - - NW_ASSERT(pStack); - - NW_LOG(pStack, NW_LOG_LEVEL_DEBG, "Duplicate request hold timer expired for transaction 0x%p", - thiz); - - thiz->hRspTmr = 0; - - RB_REMOVE(NwGtpv2cOutstandingRxSeqNumTrxnMap, &(pStack->outstandingRxSeqNumMap), thiz); - rc = nwGtpv2cTrxnDelete(&thiz); - NW_ASSERT(NW_OK == rc); - - return rc; -} - -/** - * Start timer to wait for rsp of a req message - * - * @param[in] thiz : Pointer to transaction - * @param[in] timeoutCallbackFunc : Timeout handler callback function. - * @return NW_OK on success. - */ - -NwRcT -nwGtpv2cTrxnStartPeerRspWaitTimer(NwGtpv2cTrxnT* thiz) -{ - NwRcT rc; - rc = nwGtpv2cStartTimer(thiz->pStack, thiz->t3Timer, 0, NW_GTPV2C_TMR_TYPE_ONE_SHOT, nwGtpv2cTrxnPeerRspWaitTimeout, thiz, &thiz->hRspTmr); - return rc; -} - -/** - Start timer to wait before pruginf a req tran for which response has been sent - - @param[in] thiz : Pointer to transaction - @return NW_OK on success. - */ - -NwRcT -nwGtpv2cTrxnStartDulpicateRequestWaitTimer(NwGtpv2cTrxnT* thiz) -{ - NwRcT rc; - - rc = nwGtpv2cStartTimer(thiz->pStack, thiz->t3Timer * thiz->maxRetries, 0, NW_GTPV2C_TMR_TYPE_ONE_SHOT, nwGtpv2cTrxnDuplicateRequestWaitTimeout, thiz, &thiz->hRspTmr); - - return rc; -} - -/** - Send timer stop request to TmrMgr Entity. - - @param[in] thiz : Pointer to transaction - @return NW_OK on success. - */ - -static NwRcT -nwGtpv2cTrxnStopPeerRspTimer(NwGtpv2cTrxnT* thiz) -{ - NwRcT rc; - - NW_ASSERT(thiz->pStack->tmrMgr.tmrStopCallback != NULL); - - rc = nwGtpv2cStopTimer(thiz->pStack, thiz->hRspTmr); - thiz->hRspTmr = 0; - - return rc; -} - -/*--------------------------------------------------------------------------* - * P U B L I C F U N C T I O N S * - *--------------------------------------------------------------------------*/ - -/** - * Constructor - * - * @param[in] thiz : Pointer to stack - * @param[out] ppTrxn : Pointer to pointer to Trxn object. - * @return NW_OK on success. - */ -NwGtpv2cTrxnT* -nwGtpv2cTrxnNew( NW_IN NwGtpv2cStackT* thiz) -{ - NwGtpv2cTrxnT *pTrxn; - - if(gpGtpv2cTrxnPool) { - pTrxn = gpGtpv2cTrxnPool; - gpGtpv2cTrxnPool = gpGtpv2cTrxnPool->next; - } else { - NW_GTPV2C_MALLOC(thiz, sizeof(NwGtpv2cTrxnT), pTrxn, NwGtpv2cTrxnT*); - } - - if (pTrxn) { - pTrxn->pStack = thiz; - pTrxn->pMsg = NULL; - pTrxn->maxRetries = 2; - pTrxn->t3Timer = 2; - pTrxn->seqNum = thiz->seqNum; - - /* Increment sequence number */ - thiz->seqNum++; - - if(thiz->seqNum == 0x800000) - thiz->seqNum = 0; - - } - - NW_LOG(thiz, NW_LOG_LEVEL_DEBG, "Created transaction 0x%p", pTrxn); - - return pTrxn; -} - -/** - * Overloaded Constructor - * - * @param[in] thiz : Pointer to stack. - * @param[in] seqNum : Sequence number for this transaction. - * @return Pointer to Trxn object. - */ -NwGtpv2cTrxnT* -nwGtpv2cTrxnWithSeqNumNew( NW_IN NwGtpv2cStackT* thiz, - NW_IN uint32_t seqNum) -{ - NwGtpv2cTrxnT *pTrxn; - - if(gpGtpv2cTrxnPool) { - pTrxn = gpGtpv2cTrxnPool; - gpGtpv2cTrxnPool = gpGtpv2cTrxnPool->next; - } else { - NW_GTPV2C_MALLOC(thiz, sizeof(NwGtpv2cTrxnT), pTrxn, NwGtpv2cTrxnT*); - } - - if (pTrxn) { - pTrxn->pStack = thiz; - pTrxn->pMsg = NULL; - pTrxn->maxRetries = 2; - pTrxn->t3Timer = 2; - pTrxn->seqNum = seqNum; - pTrxn->pMsg = NULL; - } - - NW_LOG(thiz, NW_LOG_LEVEL_ERRO, "Created transaction 0x%p", pTrxn); - - return pTrxn; -} - -/** - * Another overloaded constructor. Create transaction as outstanding - * RX transaction for detecting duplicated requests. - * - * @param[in] thiz : Pointer to stack. - * @param[in] teidLocal : Trxn teid. - * @param[in] peerIp : Peer Ip address. - * @param[in] peerPort : Peer Ip port. - * @param[in] seqNum : Seq Number. - * @return NW_OK on success. - */ - -NwGtpv2cTrxnT* -nwGtpv2cTrxnOutstandingRxNew( NW_IN NwGtpv2cStackT* thiz, - NW_IN uint32_t teidLocal, - NW_IN uint32_t peerIp, - NW_IN uint32_t peerPort, - NW_IN uint32_t seqNum) -{ - NwRcT rc; - NwGtpv2cTrxnT *pTrxn, *pCollision; - - if(gpGtpv2cTrxnPool) { - pTrxn = gpGtpv2cTrxnPool; - gpGtpv2cTrxnPool = gpGtpv2cTrxnPool->next; - } else { - NW_GTPV2C_MALLOC(thiz, sizeof(NwGtpv2cTrxnT), pTrxn, NwGtpv2cTrxnT*); - } - - if (pTrxn) { - pTrxn->pStack = thiz; - pTrxn->maxRetries = 2; - pTrxn->t3Timer = 2; - pTrxn->seqNum = seqNum; - pTrxn->peerIp = peerIp; - pTrxn->peerPort = peerPort; - pTrxn->pMsg = NULL; - pTrxn->hRspTmr = 0; - - pCollision = RB_INSERT(NwGtpv2cOutstandingRxSeqNumTrxnMap, &(thiz->outstandingRxSeqNumMap), pTrxn); - - if(pCollision) { - NW_LOG(thiz, NW_LOG_LEVEL_WARN, "Duplicate request message received for seq num 0x%x!", - (uint32_t) seqNum); - - /* Case of duplicate request message from peer. Retransmit response. */ - if(pCollision->pMsg) { - rc = pCollision->pStack->udp.udpDataReqCallback(pCollision->pStack->udp.hUdp, - pCollision->pMsg->msgBuf, - pCollision->pMsg->msgLen, - pCollision->peerIp, - pCollision->peerPort); - } - - rc = nwGtpv2cTrxnDelete(&pTrxn); - NW_ASSERT(NW_OK == rc); - pTrxn = NULL; - } - } - - if(pTrxn) - NW_LOG(thiz, NW_LOG_LEVEL_DEBG, "Created outstanding RX transaction 0x%p", - pTrxn); - - return (pTrxn); -} - -/** - * Destructor - * - * @param[out] pthiz : Pointer to pointer to Trxn object. - * @return NW_OK on success. - */ -NwRcT -nwGtpv2cTrxnDelete( NW_INOUT NwGtpv2cTrxnT **pthiz) -{ - NwRcT rc = NW_OK; - NwGtpv2cStackT* pStack; - NwGtpv2cTrxnT *thiz = *pthiz; - - pStack = thiz->pStack; - - if(thiz->hRspTmr) { - rc = nwGtpv2cTrxnStopPeerRspTimer(thiz); - NW_ASSERT(NW_OK == rc); - } - - if(thiz->pMsg) { - rc = nwGtpv2cMsgDelete((NwGtpv2cStackHandleT)pStack, (NwGtpv2cMsgHandleT)thiz->pMsg); - NW_ASSERT(NW_OK == rc); - } - - NW_LOG(pStack, NW_LOG_LEVEL_DEBG, "Purging transaction 0x%p", thiz); - - thiz->next = gpGtpv2cTrxnPool; - gpGtpv2cTrxnPool = thiz; - - *pthiz = NULL; - return rc; -} - -#ifdef __cplusplus -} -#endif - -/*--------------------------------------------------------------------------* - * E N D O F F I L E * - *--------------------------------------------------------------------------*/ - diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/src/NwGtpv2cTunnel.c b/openair-cn/GTPV2-C/nwgtpv2c-0.11/src/NwGtpv2cTunnel.c deleted file mode 100644 index 865d2c155a..0000000000 --- a/openair-cn/GTPV2-C/nwgtpv2c-0.11/src/NwGtpv2cTunnel.c +++ /dev/null @@ -1,95 +0,0 @@ -/*----------------------------------------------------------------------------* - * * - * n w - g t p v 2 c * - * G P R S T u n n e l i n g P r o t o c o l v 2 c S t a c k * - * * - * * - * Copyright (c) 2010-2011 Amit Chawre * - * All rights reserved. * - * * - * Redistribution and use in source and binary forms, with or without * - * modification, are permitted provided that the following conditions * - * are met: * - * * - * 1. Redistributions of source code must retain the above copyright * - * notice, this list of conditions and the following disclaimer. * - * 2. Redistributions in binary form must reproduce the above copyright * - * notice, this list of conditions and the following disclaimer in the * - * documentation and/or other materials provided with the distribution. * - * 3. The name of the author may not be used to endorse or promote products * - * derived from this software without specific prior written permission. * - * * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - *----------------------------------------------------------------------------*/ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "NwTypes.h" -#include "NwUtils.h" -#include "NwError.h" -#include "NwGtpv2cPrivate.h" -#include "NwGtpv2cTunnel.h" - -#ifdef __cplusplus -extern "C" { -#endif - -static NwGtpv2cTunnelT* gpGtpv2cTunnelPool = NULL; - -NwGtpv2cTunnelT* -nwGtpv2cTunnelNew(struct NwGtpv2cStack *pStack, uint32_t teid, uint32_t ipv4AddrRemote, NwGtpv2cUlpTunnelHandleT hUlpTunnel) -{ - NwGtpv2cTunnelT* thiz; - - if(gpGtpv2cTunnelPool) { - thiz = gpGtpv2cTunnelPool; - gpGtpv2cTunnelPool = gpGtpv2cTunnelPool->next; - } else { - NW_GTPV2C_MALLOC(pStack, sizeof(NwGtpv2cTunnelT), thiz, NwGtpv2cTunnelT*); - } - - if(thiz) { - memset(thiz, 0, sizeof(NwGtpv2cTunnelT)); - thiz->teid = teid; - thiz->ipv4AddrRemote = ipv4AddrRemote; - thiz->hUlpTunnel = hUlpTunnel; - } - - return thiz; -} - -NwRcT -nwGtpv2cTunnelDelete(struct NwGtpv2cStack *pStack, NwGtpv2cTunnelT* thiz) -{ - thiz->next = gpGtpv2cTunnelPool; - gpGtpv2cTunnelPool = thiz; - - return NW_OK; -} - -NwRcT -nwGtpv2cTunnelGetUlpTunnelHandle( NwGtpv2cTunnelT* thiz, NwGtpv2cUlpTunnelHandleT* phUlpTunnel) -{ - *phUlpTunnel = (thiz? thiz->hUlpTunnel : 0x00000000); - return NW_OK; -} - -#ifdef __cplusplus -} -#endif - -/*--------------------------------------------------------------------------* - * E N D O F F I L E * - *--------------------------------------------------------------------------*/ - diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/Makefile.am b/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/Makefile.am deleted file mode 100644 index da32172d9a..0000000000 --- a/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/Makefile.am +++ /dev/null @@ -1,6 +0,0 @@ -# this is example-file: Makefile.am - -# the subdirectories of the project to go into -SUBDIRS = \ - nw-egtping\ - nw-helloworld diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-egtping/Makefile.am b/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-egtping/Makefile.am deleted file mode 100644 index 3674445989..0000000000 --- a/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-egtping/Makefile.am +++ /dev/null @@ -1,24 +0,0 @@ -AM_CFLAGS = -D__WITH_LIBEVENT__ \ - -I$(top_srcdir)/shared \ - -I$(top_srcdir)/include \ - -I$(top_srcdir)/test-app/nw-udp \ - -I$(top_srcdir)/test-app/nw-log \ - @AM_CFLAGS@ - -if ENABLE_TESTS_APP -bin_PROGRAMS = egtping - -egtping_SOURCES = \ - NwEvt.h\ - NwMiniLogMgrEntity.h\ - NwMiniTmrMgrEntity.h\ - NwMiniUlpEntity.h\ - NwMiniUdpEntity.h\ - NwMiniLogMgrEntity.c\ - NwMiniTmrMgrEntity.c\ - NwMiniUlpEntity.c\ - NwMiniUdpEntity.c\ - NwEgtPingMain.c - -egtping_LDADD = $(top_builddir)/src/libNwGtpv2c.a -levent $(AM_LDFLAGS) -endif \ No newline at end of file diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-egtping/NwEgtPingMain.c b/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-egtping/NwEgtPingMain.c deleted file mode 100644 index a346ab1faf..0000000000 --- a/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-egtping/NwEgtPingMain.c +++ /dev/null @@ -1,280 +0,0 @@ -/*----------------------------------------------------------------------------* - * Copyright (C) 2010 Amit Chawre. * - *----------------------------------------------------------------------------*/ - - -/** - * @file NwEgtPingMain.c - * @brief This is a program demostrating usage of nw-gtpv2c library for eGTP ping. -*/ - -#include <stdio.h> -#include <assert.h> -#include <signal.h> -#include <string.h> -#include "NwEvt.h" -#include "NwLog.h" -#include "NwGtpv2c.h" - -#include "NwMiniLogMgrEntity.h" -#include "NwMiniTmrMgrEntity.h" -#include "NwMiniUdpEntity.h" -#include "NwMiniUlpEntity.h" - -#ifndef NW_ASSERT -#define NW_ASSERT assert -#endif - -static -NwCharT* gLogLevelStr[] = {"EMER", "ALER", "CRIT", "ERRO", "WARN", "NOTI", "INFO", "DEBG"}; - - -typedef struct NwEgtPingS { - uint8_t localIpStr[20]; - uint8_t targetIpStr[20]; - uint32_t pingInterval; - uint32_t pingCount; - NwGtpv2cNodeUlpT ulpObj; - NwGtpv2cNodeUdpT udpObj; -} NwEgtPingT; - -static NwGtpv2cNodeUlpT ulpObj; -static NwGtpv2cNodeUdpT udpObj; - -static NwEgtPingT egtPing; - -void nwEgtPingHandleSignal(int sigNum) -{ - printf("\n--- %s ("NW_IPV4_ADDR") EGTPING statistics --- ", egtPing.targetIpStr, NW_IPV4_ADDR_FORMAT(inet_addr(egtPing.targetIpStr))); - printf("\n%u requests sent, %u response received, %d%% packet loss \n\n", udpObj.packetsSent, udpObj.packetsRcvd, - (udpObj.packetsSent ? 100 * (udpObj.packetsSent - udpObj.packetsRcvd ) / udpObj.packetsSent : 0) ); - exit(sigNum); -} - -NwRcT -nwEgtPingHelp() -{ - printf("Usage: egtping [-i interval] [-c count] [-l local-ip] "); - printf("\n [-t3 t3-time] [-n3 n3-count] destination"); - printf("\n"); - printf("\n -i <interval> : Interval between two echo request messages. (Default: 1 sec)"); - printf("\n -c <count> : Stop after sending count pings. (Default: Infinite)"); - printf("\n -t <t3-time> : GTP T3 timeout value. (Default: 2 sec)"); - printf("\n -n <n3-count> : GTP N3 count value. (Default: 2 sec)"); - printf("\n -l <local-ip> : Local IP adddress to use. (Default: All local IPs)"); - printf("\n -h : Show this message."); - printf("\n"); - printf("\n"); -} - -NwRcT -nwEgtPingParseCmdLineOpts(int argc, char* argv[]) -{ - NwRcT rc = NW_OK; - int i = 0; - i++; - - egtPing.pingInterval = 1; - egtPing.pingCount = 0xffffffff; - - if(argc < 2) - return NW_FAILURE; - - if( (argc == 2) && - ((strcmp("--help", argv[i]) == 0) - || (strcmp(argv[i], "-h") == 0))) - return NW_FAILURE; - - while( i < argc - 1) { - NW_LOG(NW_LOG_LEVEL_DEBG, "Processing cmdline arg %s", argv[i]); - - if((strcmp("--local-ip", argv[i]) == 0) - || (strcmp(argv[i], "-l") == 0)) { - i++; - - if(i >= (argc - 1)) - return NW_FAILURE; - - strcpy(egtPing.localIpStr, (argv[i])); - - } else if((strcmp("--interval", argv[i]) == 0) - || (strcmp(argv[i], "-i") == 0)) { - i++; - - if(i >= (argc - 1)) - return NW_FAILURE; - - egtPing.pingInterval = atoi(argv[i]); - - } else if((strcmp("--count", argv[i]) == 0) - || (strcmp(argv[i], "-c") == 0)) { - i++; - - if(i >= (argc - 1)) - return NW_FAILURE; - - egtPing.pingCount = atoi(argv[i]); - } else if((strcmp("--help", argv[i]) == 0) - || (strcmp(argv[i], "-h") == 0)) { - rc = NW_FAILURE; - } else { - return NW_FAILURE; - } - - i++; - } - - strcpy(egtPing.targetIpStr, (argv[i])); - - return rc; -} - -/*--------------------------------------------------------------------------- - * T H E M A I N F U N C T I O N - *--------------------------------------------------------------------------*/ - -int main(int argc, char* argv[]) -{ - NwRcT rc; - uint32_t logLevel; - uint8_t* logLevelStr; - - NwGtpv2cStackHandleT hGtpv2cStack = 0; - - NwGtpv2cUlpEntityT ulp; - NwGtpv2cUdpEntityT udp; - NwGtpv2cTimerMgrEntityT tmrMgr; - NwGtpv2cLogMgrEntityT logMgr; - - printf("EGTPING 0.1, Copyright (C) 2011 Amit Chawre.\n"); - rc = nwEgtPingParseCmdLineOpts(argc, argv); - - if(rc != NW_OK) { - rc = nwEgtPingHelp(); - exit(rc); - } - - logLevelStr = getenv ("NW_LOG_LEVEL"); - - if(logLevelStr == NULL) { - logLevel = NW_LOG_LEVEL_INFO; - } else { - if(strncmp(logLevelStr, "EMER",4) == 0) - logLevel = NW_LOG_LEVEL_EMER; - else if(strncmp(logLevelStr, "ALER",4) == 0) - logLevel = NW_LOG_LEVEL_ALER; - else if(strncmp(logLevelStr, "CRIT",4) == 0) - logLevel = NW_LOG_LEVEL_CRIT; - else if(strncmp(logLevelStr, "ERRO",4) == 0) - logLevel = NW_LOG_LEVEL_ERRO ; - else if(strncmp(logLevelStr, "WARN",4) == 0) - logLevel = NW_LOG_LEVEL_WARN; - else if(strncmp(logLevelStr, "NOTI",4) == 0) - logLevel = NW_LOG_LEVEL_NOTI; - else if(strncmp(logLevelStr, "INFO",4) == 0) - logLevel = NW_LOG_LEVEL_INFO; - else if(strncmp(logLevelStr, "DEBG",4) == 0) - logLevel = NW_LOG_LEVEL_DEBG; - } - - /*--------------------------------------------------------------------------- - * Initialize event library - *--------------------------------------------------------------------------*/ - - NW_EVT_INIT(); - - /*--------------------------------------------------------------------------- - * Initialize Log Manager - *--------------------------------------------------------------------------*/ - nwMiniLogMgrInit(nwMiniLogMgrGetInstance(), logLevel); - - /*--------------------------------------------------------------------------- - * Initialize Gtpv2c Stack Instance - *--------------------------------------------------------------------------*/ - rc = nwGtpv2cInitialize(&hGtpv2cStack); - - if(rc != NW_OK) { - NW_LOG(NW_LOG_LEVEL_ERRO, "Failed to create gtpv2c stack instance. Error '%u' occured", rc); - exit(1); - } - - rc = nwGtpv2cSetLogLevel(hGtpv2cStack, logLevel); - - /*--------------------------------------------------------------------------- - * Set up Ulp Entity - *--------------------------------------------------------------------------*/ - rc = nwGtpv2cUlpInit(&ulpObj, hGtpv2cStack, egtPing.localIpStr); - NW_ASSERT(NW_OK == rc); - - ulp.hUlp = (NwGtpv2cUlpHandleT) &ulpObj; - ulp.ulpReqCallback = nwGtpv2cUlpProcessStackReqCallback; - - rc = nwGtpv2cSetUlpEntity(hGtpv2cStack, &ulp); - NW_ASSERT(NW_OK == rc); - - /*--------------------------------------------------------------------------- - * Set up Udp Entity - *--------------------------------------------------------------------------*/ - rc = nwGtpv2cUdpInit(&udpObj, hGtpv2cStack, egtPing.localIpStr); - NW_ASSERT(NW_OK == rc); - - udp.hUdp = (NwGtpv2cUdpHandleT) &udpObj; - udp.udpDataReqCallback = nwGtpv2cUdpDataReq; - - rc = nwGtpv2cSetUdpEntity(hGtpv2cStack, &udp); - NW_ASSERT(NW_OK == rc); - - /*--------------------------------------------------------------------------- - * Set up Log Entity - *--------------------------------------------------------------------------*/ - tmrMgr.tmrMgrHandle = 0; - tmrMgr.tmrStartCallback = nwTimerStart; - tmrMgr.tmrStopCallback = nwTimerStop; - - rc = nwGtpv2cSetTimerMgrEntity(hGtpv2cStack, &tmrMgr); - NW_ASSERT(NW_OK == rc); - - /*--------------------------------------------------------------------------- - * Set up Log Entity - *--------------------------------------------------------------------------*/ - logMgr.logMgrHandle = (NwGtpv2cLogMgrHandleT) nwMiniLogMgrGetInstance(); - logMgr.logReqCallback = nwMiniLogMgrLogRequest; - - rc = nwGtpv2cSetLogMgrEntity(hGtpv2cStack, &logMgr); - NW_ASSERT(NW_OK == rc); - - /*--------------------------------------------------------------------------- - * Send Message Request to Gtpv2c Stack Instance - *--------------------------------------------------------------------------*/ - NW_LOG(NW_LOG_LEVEL_NOTI, "EGTPING %s ("NW_IPV4_ADDR")", egtPing.targetIpStr, NW_IPV4_ADDR_FORMAT(inet_addr(egtPing.targetIpStr))); - rc = nwGtpv2cUlpPing(&ulpObj, - inet_addr(egtPing.targetIpStr), - egtPing.pingCount, - egtPing.pingInterval, - 2, - 3); - NW_ASSERT(NW_OK == rc); - - /*--------------------------------------------------------------------------- - * Install signal handler - *--------------------------------------------------------------------------*/ - signal(SIGINT, nwEgtPingHandleSignal); - - /*--------------------------------------------------------------------------- - * Event loop - *--------------------------------------------------------------------------*/ - - NW_EVT_LOOP(); - NW_LOG(NW_LOG_LEVEL_ERRO, "Exit from eventloop, no events to process!"); - - /*--------------------------------------------------------------------------- - * Destroy Gtpv2c Stack Instance - *--------------------------------------------------------------------------*/ - rc = nwGtpv2cFinalize(hGtpv2cStack); - - if(rc != NW_OK) { - NW_LOG(NW_LOG_LEVEL_ERRO, "Failed to finalize gtpv2c stack instance. Error '%u' occured", rc); - } - - return rc; -} diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-egtping/NwEvt.h b/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-egtping/NwEvt.h deleted file mode 100644 index 6df5794a5f..0000000000 --- a/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-egtping/NwEvt.h +++ /dev/null @@ -1,80 +0,0 @@ -/*----------------------------------------------------------------------------* - * * - * Copyright (c) 2010-2011 Amit Chawre * - * All rights reserved. * - * * - * Redistribution and use in source and binary forms, with or without * - * modification, are permitted provided that the following conditions * - * are met: * - * * - * 1. Redistributions of source code must retain the above copyright * - * notice, this list of conditions and the following disclaimer. * - * 2. Redistributions in binary form must reproduce the above copyright * - * notice, this list of conditions and the following disclaimer in the * - * documentation and/or other materials provided with the distribution. * - * 3. The name of the author may not be used to endorse or promote products * - * derived from this software without specific prior written permission. * - * * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - *----------------------------------------------------------------------------*/ - -#ifndef __NW_EVT_H__ -#define __NW_EVT_H__ -/** - * @file NwEvt.h - * @brief -*/ - -#ifdef __WITH_LIBEVENT__ - -#include <event.h> - -typedef struct event NwEventT; - -#define NW_EVT_READ (EV_READ) -#define NW_EVT_PERSIST (EV_PERSIST) -#define NW_EVT_CALLBACK(__cbFunc) __cbFunc(int fd, short event, void *arg) -#define NW_TMR_CALLBACK(__cbFunc) __cbFunc(int fd, short event, void *arg) - -#define NW_EVT_INIT event_init -#define NW_EVT_LOOP event_dispatch - -#define NW_EVENT_ADD(__ev, __evSelObj, __evCallback, __evCallbackArg, __evFlags) \ - do { \ - event_set(&(__ev), __evSelObj, __evFlags, __evCallback, __evCallbackArg); \ - event_add(&(__ev), NULL); \ - } while(0) - -#else - -#warning "Event library not defined!" - -/* HACK : Defining dummy values for compilation!*/ - -typedef struct { - int __tbd; -} NwEventT; - -#define NW_EVT_READ (0) -#define NW_EVT_PERSIST (1) -#define NW_EVT_CALLBACK(__cbFunc) __cbFunc(void *arg) -#define NW_TMR_CALLBACK(__cbFunc) __cbFunc(void *arg) - - -#define NW_EVT_INIT() do { printf("error: Event library not defined!\n"); exit (0); } while(0) -#define NW_EVT_LOOP() do { printf("error: Event library not defined!\n"); exit (0); } while(0) -#define NW_EVENT_ADD(...) do { printf("error: Event library not defined!\n"); exit (0); } while(0) - - -#endif - -#endif /* __NW_EVT_H__ */ diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-egtping/NwMiniLogMgrEntity.c b/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-egtping/NwMiniLogMgrEntity.c deleted file mode 100644 index 585f7fa7c7..0000000000 --- a/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-egtping/NwMiniLogMgrEntity.c +++ /dev/null @@ -1,70 +0,0 @@ -/*----------------------------------------------------------------------------* - * * - * M I N I M A L I S T I C L O G M G R E N T I T Y * - * * - * Copyright (C) 2010 Amit Chawre. * - * * - *----------------------------------------------------------------------------*/ - -/** - * @file hello-world.c - * @brief This file contains example of a minimalistic log manager entity. -*/ - -#include <stdio.h> -#include <assert.h> -#include "NwEvt.h" -#include "NwTypes.h" -#include "NwError.h" -#include "NwLog.h" -#include "NwGtpv2c.h" - -#include "NwMiniLogMgrEntity.h" - -#ifdef __cplusplus -extern "C" { -#endif - -static -NwCharT* gLogLevelStr[] = {"EMER", "ALER", "CRIT", "ERRO", "WARN", "NOTI", "INFO", "DEBG"}; - -NwMiniLogMgrT __gLogMgr; - - -/*--------------------------------------------------------------------------- - * Public functions - *--------------------------------------------------------------------------*/ - -NwMiniLogMgrT* nwMiniLogMgrGetInstance() -{ - return &(__gLogMgr); -} - -NwRcT nwMiniLogMgrInit(NwMiniLogMgrT* thiz, uint32_t logLevel ) -{ - thiz->logLevel = logLevel; - return NW_OK; -} - -NwRcT nwMiniLogMgrSetLogLevel(NwMiniLogMgrT* thiz, uint32_t logLevel) -{ - thiz->logLevel = logLevel; -} - -NwRcT nwMiniLogMgrLogRequest (NwGtpv2cLogMgrHandleT hLogMgr, - uint32_t logLevel, - NwCharT* file, - uint32_t line, - NwCharT* logStr) -{ - NwMiniLogMgrT* thiz = (NwMiniLogMgrT*) hLogMgr; - - if(thiz->logLevel >= logLevel) - //printf("NWEGTPSTK %s - %s <%s,%u>\n", gLogLevelStr[logLevel], logStr, basename(file), line); - return NW_OK; -} - -#ifdef __cplusplus -} -#endif - diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-egtping/NwMiniLogMgrEntity.h b/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-egtping/NwMiniLogMgrEntity.h deleted file mode 100644 index 3f37dec409..0000000000 --- a/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-egtping/NwMiniLogMgrEntity.h +++ /dev/null @@ -1,89 +0,0 @@ -/*----------------------------------------------------------------------------* - * * - * M I N I M A L I S T I C L O G M G R E N T I T Y * - * * - * Copyright (C) 2010 Amit Chawre. * - * * - *----------------------------------------------------------------------------*/ - -/** - * @file hello-world.c - * @brief This file contains example of a minimalistic log manager entity. -*/ - -#include <stdio.h> -#include <assert.h> -#include "NwEvt.h" -#include "NwLog.h" - -#ifndef NW_ASSERT -#define NW_ASSERT assert -#endif - -#ifndef __NW_MINI_LOG_MGR_H__ -#define __NW_MINI_LOG_MGR_H__ - -#define NW_LOG( _logLevel, ...) \ - do { \ - if((nwMiniLogMgrGetInstance())->logLevel >= _logLevel) \ - { \ - char _logStr[1024]; \ - snprintf(_logStr, 1024, __VA_ARGS__); \ - printf("%s \n", _logStr);\ - } \ - } while(0) - -/** - * MiniLogMgr Class Definition - */ -typedef struct NwMiniLogMgr { - uint8_t logLevel; /*< Log level */ -} NwMiniLogMgrT; - - -/*--------------------------------------------------------------------------- - * Public functions - *--------------------------------------------------------------------------*/ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * Get global singleton MiniLogMgr instance - */ -NwMiniLogMgrT* nwMiniLogMgrGetInstance(); - -/** - * Initialize MiniLogMgr - * @param thiz : Pointer to global singleton MiniLogMgr instance - * @param logLevel : Log Level - */ -NwRcT nwMiniLogMgrInit(NwMiniLogMgrT* thiz, uint32_t logLevel ); - -/** - * Set MiniLogMgr log level - * @param thiz : Pointer to global singleton MiniLogMgr instance - * @param logLevel : Log Level - */ -NwRcT nwMiniLogMgrSetLogLevel(NwMiniLogMgrT* thiz, uint32_t logLevel); - -/** - * Process log request from stack - * @param thiz : Pointer to global singleton MiniLogMgr instance - * @param logLevel : Log Level - * @param file : Filename - * @param line : Line Number - * @param logStr : Log string - */ -NwRcT nwMiniLogMgrLogRequest (NwGtpv2cLogMgrHandleT logMgrHandle, - uint32_t logLevel, - NwCharT* file, - uint32_t line, - NwCharT* logStr); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-egtping/NwMiniTmrMgrEntity.c b/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-egtping/NwMiniTmrMgrEntity.c deleted file mode 100644 index 7b5553aa6b..0000000000 --- a/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-egtping/NwMiniTmrMgrEntity.c +++ /dev/null @@ -1,97 +0,0 @@ -/*----------------------------------------------------------------------------* - * * - * M I N I M A L I S T I C T M R M G R E N T I T Y * - * * - * Copyright (C) 2010 Amit Chawre. * - * * - *----------------------------------------------------------------------------*/ - -/** - * @file NwMiniTmrMgrEntity.c - * @brief This file ontains example of a minimalistic timer manager entity. -*/ - -#include <stdio.h> -#include <assert.h> -#include "NwEvt.h" -#include "NwGtpv2c.h" -#include "NwMiniLogMgrEntity.h" -#include "NwMiniTmrMgrEntity.h" - -#ifndef NW_ASSERT -#define NW_ASSERT assert -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -static -NwCharT* gLogLevelStr[] = {"EMER", "ALER", "CRIT", "ERRO", "WARN", "NOTI", "INFO", "DEBG"}; - -/*--------------------------------------------------------------------------- - * Private functions - *--------------------------------------------------------------------------*/ - -static void -NW_TMR_CALLBACK(nwGtpv2cNodeHandleStackTimerTimeout) -{ - NwRcT rc; - NwGtpv2cNodeTmrT *pTmr = (NwGtpv2cNodeTmrT*) arg; - - /* - * Send Timeout Request to Gtpv2c Stack Instance - */ - rc = nwGtpv2cProcessTimeout(pTmr->timeoutArg); - NW_ASSERT(NW_OK == rc); - - free(pTmr); - - return; -} - -/*--------------------------------------------------------------------------- - * Public functions - *--------------------------------------------------------------------------*/ - -NwRcT nwTimerStart( NwGtpv2cTimerMgrHandleT tmrMgrHandle, - uint32_t timeoutSec, - uint32_t timeoutUsec, - uint32_t tmrType, - void* timeoutArg, - NwGtpv2cTimerHandleT* hTmr) -{ - NwRcT rc = NW_OK; - NwGtpv2cNodeTmrT *pTmr; - struct timeval tv; - - pTmr = (NwGtpv2cNodeTmrT*) malloc(sizeof(NwGtpv2cNodeTmrT)); - - /* set the timevalues*/ - timerclear(&tv); - tv.tv_sec = timeoutSec; - tv.tv_usec = timeoutUsec; - - pTmr->timeoutArg = timeoutArg; - evtimer_set(&pTmr->ev, nwGtpv2cNodeHandleStackTimerTimeout, pTmr); - - /*add event*/ - - event_add(&(pTmr->ev), &tv); - - *hTmr = (NwGtpv2cTimerHandleT)pTmr; - - return rc; -} - -NwRcT nwTimerStop( NwGtpv2cTimerMgrHandleT tmrMgrHandle, - NwGtpv2cTimerHandleT hTmr) -{ - evtimer_del(&(((NwGtpv2cNodeTmrT*)hTmr)->ev)); - free((void*)hTmr); - return NW_OK; -} - -#ifdef __cplusplus -} -#endif diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-egtping/NwMiniTmrMgrEntity.h b/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-egtping/NwMiniTmrMgrEntity.h deleted file mode 100644 index 85970c6cc2..0000000000 --- a/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-egtping/NwMiniTmrMgrEntity.h +++ /dev/null @@ -1,57 +0,0 @@ -/*----------------------------------------------------------------------------* - * * - * M I N I M A L I S T I C T M R M G R E N T I T Y * - * * - * Copyright (C) 2010 Amit Chawre. * - * * - *----------------------------------------------------------------------------*/ - - -/** - * @file NwMiniTmrMgrEntity.c - * @brief This file ontains example of a minimalistic timer manager entity. -*/ - -#include <stdio.h> -#include <assert.h> -#include "NwEvt.h" -#include "NwLog.h" - -#ifndef NW_ASSERT -#define NW_ASSERT assert -#endif - -#ifndef __NW_MINI_TMR_MGR_H__ -#define __NW_MINI_TMR_MGR_H__ - -typedef struct { - uint8_t _tbd; -} NwGtpv2cNodeTmrMgrT; - -typedef struct { - NwEventT ev; - void* timeoutArg; -} NwGtpv2cNodeTmrT; - - -#ifdef __cplusplus -extern "C" { -#endif - -NwRcT nwTimerStart( NwGtpv2cTimerMgrHandleT tmrMgrHandle, - uint32_t timeoutSec, - uint32_t timeoutUsec, - uint32_t tmrType, - void* timeoutArg, - NwGtpv2cTimerHandleT* hTmr); - - -NwRcT nwTimerStop( NwGtpv2cTimerMgrHandleT tmrMgrHandle, - NwGtpv2cTimerHandleT hTmr); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-egtping/NwMiniUdpEntity.c b/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-egtping/NwMiniUdpEntity.c deleted file mode 100644 index 16f5f2bcea..0000000000 --- a/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-egtping/NwMiniUdpEntity.c +++ /dev/null @@ -1,218 +0,0 @@ -/*----------------------------------------------------------------------------* - * * - * M I N I M A L I S T I C U D P E N T I T Y * - * * - * Copyright (C) 2010 Amit Chawre. * - * * - *----------------------------------------------------------------------------*/ - - -/** - * @file NwMiniUdpEntity.c - * @brief This file contains example of a minimalistic ULP entity. -*/ - -#include <stdio.h> -#include <string.h> -#include <assert.h> -#include <sys/socket.h> -#include <arpa/inet.h> -#include <unistd.h> -#include <errno.h> -#include <fcntl.h> -#include "NwEvt.h" -#include "NwGtpv2c.h" -#include "NwMiniLogMgrEntity.h" -#include "NwMiniUdpEntity.h" - -#ifndef NW_ASSERT -#define NW_ASSERT assert -#endif - -#define MAX_UDP_PAYLOAD_LEN (4096) - -#ifdef __cplusplus -extern "C" { -#endif - -static -NwCharT* gLogLevelStr[] = {"EMER", "ALER", "CRIT", "ERRO", "WARN", "NOTI", "INFO", "DEBG"}; - -static int yes = 1; -/*--------------------------------------------------------------------------- - * Private functions - *--------------------------------------------------------------------------*/ - -static -void NW_EVT_CALLBACK(nwUdpDataIndicationCallbackData) -{ - NwRcT rc; - uint8_t udpBuf[MAX_UDP_PAYLOAD_LEN]; - NwS32T bytesRead; - struct sockaddr_in peer; - uint32_t peerLen; - NwGtpv2cNodeUdpT* thiz = (NwGtpv2cNodeUdpT*) arg; - - peerLen = sizeof(peer); - - bytesRead = recvfrom(fd, udpBuf, MAX_UDP_PAYLOAD_LEN , 0, (struct sockaddr *) &peer,(socklen_t*) &peerLen); - - if(bytesRead > 0) { - thiz->packetsRcvd++; - NW_LOG(NW_LOG_LEVEL_DEBG, "Received UDP message of size %u from peer %u.%u.%u.%u:%u", bytesRead, - (peer.sin_addr.s_addr & 0x000000ff), - (peer.sin_addr.s_addr & 0x0000ff00) >> 8, - (peer.sin_addr.s_addr & 0x00ff0000) >> 16, - (peer.sin_addr.s_addr & 0xff000000) >> 24, - ntohs(peer.sin_port)); - rc = nwGtpv2cProcessUdpReq(thiz->hGtpv2cStack, udpBuf, bytesRead, ntohs(peer.sin_port), ntohl(peer.sin_addr.s_addr)); - } else { - switch (errno) { - - case ENETUNREACH: - NW_LOG(NW_LOG_LEVEL_ERRO, "Network not reachable", errno, strerror(errno)); - break; - - case EHOSTUNREACH: - NW_LOG(NW_LOG_LEVEL_ERRO, "Host not reachable", errno, strerror(errno)); - break; - - case ECONNREFUSED: - NW_LOG(NW_LOG_LEVEL_ERRO, "Port not reachable", errno, strerror(errno)); - break; - - default: - NW_LOG(NW_LOG_LEVEL_ERRO, "%s", strerror(errno)); - } - - nwGtpv2cUdpReset(thiz); - } - - return; -} - - -/*--------------------------------------------------------------------------- - * Public functions - *--------------------------------------------------------------------------*/ - -NwRcT nwGtpv2cUdpInit(NwGtpv2cNodeUdpT* thiz, NwGtpv2cStackHandleT hGtpv2cStack, uint8_t* ipAddrStr) -{ - int sd; - struct sockaddr_in addr; - - sd = socket(AF_INET, SOCK_DGRAM, 0); - - if (sd < 0) { - NW_LOG(NW_LOG_LEVEL_ERRO, "%s", strerror(errno)); - NW_ASSERT(0); - } - - addr.sin_family = AF_INET; - addr.sin_port = htons(2123); - addr.sin_addr.s_addr = (strlen(ipAddrStr) ? inet_addr(ipAddrStr) : INADDR_ANY); - memset(addr.sin_zero, '\0', sizeof (addr.sin_zero)); - - if(bind(sd, (struct sockaddr *)&addr, sizeof(addr)) < 0) { - NW_LOG(NW_LOG_LEVEL_ERRO, "Error - %s", strerror(errno)); - NW_ASSERT(0); - } - - yes = 1; - - if (setsockopt(sd, SOL_IP, IP_RECVERR, &yes, sizeof(yes))) { - NW_LOG(NW_LOG_LEVEL_ERRO, "%s", strerror(errno)); - NW_ASSERT(0); - } - - NW_EVENT_ADD((thiz->ev), sd, nwUdpDataIndicationCallbackData, thiz, NW_EVT_READ | NW_EVT_PERSIST); - - thiz->ipv4Addr = addr.sin_addr.s_addr; - thiz->hSocket = sd; - thiz->hGtpv2cStack = hGtpv2cStack; - - return NW_OK; -} - -NwRcT nwGtpv2cUdpDestroy(NwGtpv2cNodeUdpT* thiz) -{ - close(thiz->hSocket); -} - -NwRcT nwGtpv2cUdpReset(NwGtpv2cNodeUdpT* thiz) -{ - int sd; - struct sockaddr_in addr; - - event_del(&thiz->ev); - close(thiz->hSocket); - - sd = socket(AF_INET, SOCK_DGRAM, 0); - - if (sd < 0) { - NW_LOG(NW_LOG_LEVEL_ERRO, "%s", strerror(errno)); - NW_ASSERT(0); - } - - addr.sin_family = AF_INET; - addr.sin_port = htons(2123); - addr.sin_addr.s_addr = (thiz->ipv4Addr); - memset(addr.sin_zero, '\0', sizeof (addr.sin_zero)); - - if(bind(sd, (struct sockaddr *)&addr, sizeof(addr)) < 0) { - NW_LOG(NW_LOG_LEVEL_ERRO, "%s", strerror(errno)); - NW_ASSERT(0); - } - - yes = 1; - - if (setsockopt(sd, SOL_IP, IP_RECVERR, &yes, sizeof(yes))) { - NW_LOG(NW_LOG_LEVEL_ERRO, "%s", strerror(errno)); - NW_ASSERT(0); - } - - NW_EVENT_ADD((thiz->ev), sd, nwUdpDataIndicationCallbackData, thiz, (NW_EVT_READ | NW_EVT_PERSIST)); - - thiz->hSocket = sd; - - return NW_OK; -} - -NwRcT nwGtpv2cUdpDataReq(NwGtpv2cUdpHandleT udpHandle, - uint8_t* dataBuf, - uint32_t dataSize, - uint32_t peerIp, - uint32_t peerPort) -{ - struct sockaddr_in peerAddr; - NwS32T bytesSent; - NwGtpv2cNodeUdpT* thiz = (NwGtpv2cNodeUdpT*) udpHandle; - - NW_LOG(NW_LOG_LEVEL_DEBG, "Sending %u bytes of data to %u.%u.%u.%u:%u", dataSize, - (peerIp & 0xff000000) >> 24, - (peerIp & 0x00ff0000) >> 16, - (peerIp & 0x0000ff00) >> 8, - (peerIp & 0x000000ff), - peerPort); - - peerAddr.sin_family = AF_INET; - peerAddr.sin_port = htons(peerPort); - peerAddr.sin_addr.s_addr = htonl(peerIp); - memset(peerAddr.sin_zero, '\0', sizeof (peerAddr.sin_zero)); - - bytesSent = sendto (thiz->hSocket, dataBuf, dataSize, 0, (struct sockaddr *) &peerAddr, sizeof(peerAddr)); - - if(bytesSent < 0) { - NW_LOG(NW_LOG_LEVEL_ERRO, "sendto - %s", strerror(errno)); - } else { - thiz->packetsSent++; - } - - return NW_OK; -} - - -#ifdef __cplusplus -} -#endif - diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-egtping/NwMiniUdpEntity.h b/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-egtping/NwMiniUdpEntity.h deleted file mode 100644 index 37061e95e4..0000000000 --- a/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-egtping/NwMiniUdpEntity.h +++ /dev/null @@ -1,56 +0,0 @@ -/*----------------------------------------------------------------------------* - * * - * M I N I M A L I S T I C U D P E N T I T Y * - * * - * Copyright (C) 2010 Amit Chawre. * - * * - *----------------------------------------------------------------------------*/ - - -/** - * @file NwMiniUdpEntity.c - * @brief This file contains example of a minimalistic ULP entity. -*/ - -#include <stdio.h> -#include <assert.h> -#include "NwEvt.h" -#include "NwLog.h" - -#ifndef NW_ASSERT -#define NW_ASSERT assert -#endif - -#ifndef __NW_MINI_UDP_ENTITY_H__ -#define __NW_MINI_UDP_ENTITY_H__ - -typedef struct { - uint32_t ipv4Addr; - uint32_t hSocket; - NwEventT ev; - NwGtpv2cStackHandleT hGtpv2cStack; - uint32_t packetsSent; - uint32_t packetsRcvd; -} NwGtpv2cNodeUdpT; - -#ifdef __cplusplus -extern "C" { -#endif - -NwRcT nwGtpv2cUdpInit(NwGtpv2cNodeUdpT* thiz, NwGtpv2cStackHandleT hGtpv2cStack, uint8_t* ipAddrStr); - -NwRcT nwGtpv2cUdpDestroy(NwGtpv2cNodeUdpT* thiz); - -NwRcT nwGtpv2cUdpDataReq(NwGtpv2cUdpHandleT udpHandle, - uint8_t* dataBuf, - uint32_t dataSize, - uint32_t peerIp, - uint32_t peerPort); - -NwRcT nwGtpv2cUdpReset(NwGtpv2cNodeUdpT* thiz); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-egtping/NwMiniUlpEntity.c b/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-egtping/NwMiniUlpEntity.c deleted file mode 100644 index fc5cc809d0..0000000000 --- a/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-egtping/NwMiniUlpEntity.c +++ /dev/null @@ -1,220 +0,0 @@ -/*----------------------------------------------------------------------------* - * * - * M I N I M A L I S T I C U L P E N T I T Y * - * * - * Copyright (C) 2010 Amit Chawre. * - * * - *----------------------------------------------------------------------------*/ - -/** - * @file NwMiniUlpEntity.c - * @brief This file contains example of a minimalistic ULP entity. -*/ - -#include <stdio.h> -#include <string.h> -#include <assert.h> -#include <sys/time.h> -#include "NwEvt.h" -#include "NwGtpv2c.h" -#include "NwGtpv2cIe.h" -#include "NwGtpv2cMsg.h" -#include "NwGtpv2cMsgParser.h" -#include "NwMiniLogMgrEntity.h" -#include "NwMiniUlpEntity.h" - -#ifndef NW_ASSERT -#define NW_ASSERT assert -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -static -NwCharT* gLogLevelStr[] = {"EMER", "ALER", "CRIT", "ERRO", "WARN", "NOTI", "INFO", "DEBG"}; - -/*--------------------------------------------------------------------------- - * Public Functions - *--------------------------------------------------------------------------*/ - -NwRcT -nwGtpv2cUlpInit(NwGtpv2cNodeUlpT* thiz, NwGtpv2cStackHandleT hGtpv2cStack, char* peerIpStr) -{ - NwRcT rc; - thiz->hGtpv2cStack = hGtpv2cStack; - strcpy(thiz->peerIpStr, peerIpStr); - return NW_OK; -} - -NwRcT -nwGtpv2cUlpDestroy(NwGtpv2cNodeUlpT* thiz) -{ - NW_ASSERT(thiz); - memset(thiz, 0, sizeof(NwGtpv2cNodeUlpT)); - return NW_OK; -} - -typedef struct NwGtpv2cPeerS { - uint32_t ipv4Addr; - uint32_t pingCount; - uint32_t pingInterval; - uint32_t t3Time; - uint32_t n3Count; - - uint32_t sendTimeStamp; - NwGtpv2cTunnelHandleT hTunnel; -} NwGtpv2cPeerT; - -NwGtpv2cPeerT* -nwGtpv2cUlpCreatePeerContext(NwGtpv2cNodeUlpT* thiz, uint32_t peerIp) -{ - NwRcT rc; - NwGtpv2cUlpApiT ulpReq; - NwGtpv2cPeerT *pPeer = (NwGtpv2cPeerT*) malloc(sizeof(NwGtpv2cPeerT)); - - if(pPeer) { - pPeer->ipv4Addr = peerIp; - - /* - * Send Message Request to Gtpv2c Stack Instance - */ - - ulpReq.apiType = NW_GTPV2C_ULP_CREATE_LOCAL_TUNNEL; - - ulpReq.apiInfo.createLocalTunnelInfo.hTunnel = 0; - ulpReq.apiInfo.createLocalTunnelInfo.hUlpTunnel = (NwGtpv2cUlpTrxnHandleT)thiz; - ulpReq.apiInfo.createLocalTunnelInfo.teidLocal = (NwGtpv2cUlpTrxnHandleT)0; - ulpReq.apiInfo.createLocalTunnelInfo.peerIp = htonl(peerIp); - - rc = nwGtpv2cProcessUlpReq(thiz->hGtpv2cStack, &ulpReq); - NW_ASSERT(NW_OK == rc); - pPeer->hTunnel = ulpReq.apiInfo.createLocalTunnelInfo.hTunnel; - } - - return pPeer; - -} - -NwRcT -nwGtpv2cUlpSendEchoRequestToPeer(NwGtpv2cNodeUlpT* thiz, NwGtpv2cPeerT *pPeer) -{ - NwRcT rc; - struct timeval tv; - NwGtpv2cUlpApiT ulpReq; - /* - * Send Message Request to Gtpv2c Stack Instance - */ - - ulpReq.apiType = NW_GTPV2C_ULP_API_INITIAL_REQ; - - ulpReq.apiInfo.initialReqInfo.hTunnel = pPeer->hTunnel; - ulpReq.apiInfo.initialReqInfo.hUlpTrxn = (NwGtpv2cUlpTrxnHandleT)pPeer; - ulpReq.apiInfo.initialReqInfo.hUlpTunnel = (NwGtpv2cUlpTunnelHandleT)pPeer; - - rc = nwGtpv2cMsgNew( thiz->hGtpv2cStack, - NW_FALSE, - NW_GTP_ECHO_REQ, - 0, - 0, - &(ulpReq.hMsg)); - - NW_ASSERT(NW_OK == rc); - - rc = nwGtpv2cMsgAddIeTV1((ulpReq.hMsg), NW_GTPV2C_IE_RECOVERY, 0, thiz->restartCounter); - NW_ASSERT(NW_OK == rc); - - NW_ASSERT(gettimeofday(&tv, NULL) == 0); - pPeer->sendTimeStamp = (tv.tv_sec * 1000000) + tv.tv_usec; - - rc = nwGtpv2cProcessUlpReq(thiz->hGtpv2cStack, &ulpReq); - NW_ASSERT(NW_OK == rc); - - return NW_OK; -} - -NwRcT -nwGtpv2cUlpPing(NwGtpv2cNodeUlpT* thiz, - uint32_t peerIp, - uint32_t pingCount, - uint32_t pingInterval, - uint32_t t3Time, - uint32_t n3Count) -{ - NwRcT rc; - NwGtpv2cPeerT *pPeer; - NwGtpv2cUlpApiT ulpReq; - - pPeer = nwGtpv2cUlpCreatePeerContext(thiz, peerIp); - - pPeer->pingCount = pingCount; - pPeer->pingInterval = pingInterval; - pPeer->t3Time = t3Time; - pPeer->n3Count = n3Count; - /* - * Send Echo Request to peer - */ - - rc = nwGtpv2cUlpSendEchoRequestToPeer(thiz, pPeer); - - return rc; -} - -NwRcT -nwGtpv2cUlpProcessStackReqCallback (NwGtpv2cUlpHandleT hUlp, - NwGtpv2cUlpApiT *pUlpApi) -{ - NwRcT rc; - uint32_t seqNum; - uint32_t len; - uint32_t recvTimeStamp; - struct timeval tv; - NwGtpv2cPeerT *pPeer; - NwGtpv2cNodeUlpT* thiz; - NW_ASSERT(pUlpApi != NULL); - - thiz = (NwGtpv2cNodeUlpT*) hUlp; - - switch(pUlpApi->apiType) { - case NW_GTPV2C_ULP_API_TRIGGERED_RSP_IND: { - pPeer = (NwGtpv2cPeerT*)pUlpApi->apiInfo.triggeredRspIndInfo.hUlpTrxn; - - if(pUlpApi->apiInfo.triggeredRspIndInfo.msgType == NW_GTP_ECHO_RSP) { - seqNum = nwGtpv2cMsgGetSeqNumber(pUlpApi->hMsg); - len = nwGtpv2cMsgGetLength(pUlpApi->hMsg); - - NW_ASSERT(gettimeofday(&tv, NULL) == 0); - recvTimeStamp = (tv.tv_sec * 1000000) + tv.tv_usec; - - NW_LOG(NW_LOG_LEVEL_NOTI, "%u bytes of response from "NW_IPV4_ADDR": gtp_seq=%u time=%2.2f ms", len, NW_IPV4_ADDR_FORMAT(pPeer->ipv4Addr), seqNum, - (float) (recvTimeStamp - pPeer->sendTimeStamp) / 1000 ); - - if(pPeer->pingCount) { - sleep(pPeer->pingInterval); - rc = nwGtpv2cUlpSendEchoRequestToPeer(thiz, pPeer); - - if(pPeer->pingCount != 0xffffffff) pPeer->pingCount--; - } - } - - } - break; - - case NW_GTPV2C_ULP_API_RSP_FAILURE_IND: { - pPeer = (NwGtpv2cPeerT*)pUlpApi->apiInfo.rspFailureInfo.hUlpTrxn; - NW_LOG(NW_LOG_LEVEL_DEBG, "No response from "NW_IPV4_ADDR" (2123)!", NW_IPV4_ADDR_FORMAT(pPeer->ipv4Addr)); - rc = nwGtpv2cUlpSendEchoRequestToPeer(thiz, pPeer); - } - break; - - default: - NW_LOG(NW_LOG_LEVEL_WARN, "Received undefined UlpApi from gtpv2c stack!"); - } - - return NW_OK; -} - -#ifdef __cplusplus -} -#endif - diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-egtping/NwMiniUlpEntity.h b/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-egtping/NwMiniUlpEntity.h deleted file mode 100644 index 3f56bf58e8..0000000000 --- a/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-egtping/NwMiniUlpEntity.h +++ /dev/null @@ -1,54 +0,0 @@ -/*----------------------------------------------------------------------------* - * * - * M I N I M A L I S T I C U L P E N T I T Y * - * * - * Copyright (C) 2010 Amit Chawre. * - * * - *----------------------------------------------------------------------------*/ - -/** - * @file NwMiniUlpEntity.h - * @brief This file contains example of a minimalistic ULP entity. -*/ - -#include <stdio.h> -#include <assert.h> -#include "NwEvt.h" -#include "NwLog.h" - -#ifndef __NW_MINI_ULP_H__ -#define __NW_MINI_ULP_H__ - -typedef struct { - uint8_t peerIpStr[16]; - uint32_t restartCounter; - NwGtpv2cStackHandleT hGtpv2cStack; -} NwGtpv2cNodeUlpT; - -#ifdef __cplusplus -extern "C" { -#endif - -NwRcT -nwGtpv2cUlpInit(NwGtpv2cNodeUlpT* thiz, NwGtpv2cStackHandleT hGtpv2cStack, char* peerIpStr ); - -NwRcT -nwGtpv2cUlpDestroy(NwGtpv2cNodeUlpT* thiz); - -NwRcT -nwGtpv2cUlpProcessStackReqCallback (NwGtpv2cUlpHandleT hUlp, - NwGtpv2cUlpApiT *pUlpApi); - -NwRcT -nwGtpv2cUlpPing(NwGtpv2cNodeUlpT* thiz, - uint32_t peerIp, - uint32_t pingCount, - uint32_t pingInterval, - uint32_t t3Time, - uint32_t n3Count); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-helloworld/Makefile.am b/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-helloworld/Makefile.am deleted file mode 100644 index 0cf90d9111..0000000000 --- a/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-helloworld/Makefile.am +++ /dev/null @@ -1,21 +0,0 @@ -AM_CFLAGS = -D__WITH_LIBEVENT__ \ - -I$(top_srcdir)/shared -I$(top_srcdir)/include \ - -I$(top_srcdir)/test-app/nw-udp -I$(top_srcdir)/test-app/nw-log \ - @AM_CFLAGS@ - -if ENABLE_TESTS_APP -bin_PROGRAMS = helloworld -helloworld_SOURCES = \ - NwEvt.h\ - NwMiniLogMgrEntity.h\ - NwMiniTmrMgrEntity.h\ - NwMiniUlpEntity.h\ - NwMiniUdpEntity.h\ - NwMiniLogMgrEntity.c\ - NwMiniTmrMgrEntity.c\ - NwMiniUlpEntity.c\ - NwMiniUdpEntity.c\ - helloworld.c - -helloworld_LDADD = $(top_builddir)/src/libNwGtpv2c.a -levent $(AM_LDFLAGS) -endif \ No newline at end of file diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-helloworld/NwEvt.h b/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-helloworld/NwEvt.h deleted file mode 100644 index 6df5794a5f..0000000000 --- a/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-helloworld/NwEvt.h +++ /dev/null @@ -1,80 +0,0 @@ -/*----------------------------------------------------------------------------* - * * - * Copyright (c) 2010-2011 Amit Chawre * - * All rights reserved. * - * * - * Redistribution and use in source and binary forms, with or without * - * modification, are permitted provided that the following conditions * - * are met: * - * * - * 1. Redistributions of source code must retain the above copyright * - * notice, this list of conditions and the following disclaimer. * - * 2. Redistributions in binary form must reproduce the above copyright * - * notice, this list of conditions and the following disclaimer in the * - * documentation and/or other materials provided with the distribution. * - * 3. The name of the author may not be used to endorse or promote products * - * derived from this software without specific prior written permission. * - * * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - *----------------------------------------------------------------------------*/ - -#ifndef __NW_EVT_H__ -#define __NW_EVT_H__ -/** - * @file NwEvt.h - * @brief -*/ - -#ifdef __WITH_LIBEVENT__ - -#include <event.h> - -typedef struct event NwEventT; - -#define NW_EVT_READ (EV_READ) -#define NW_EVT_PERSIST (EV_PERSIST) -#define NW_EVT_CALLBACK(__cbFunc) __cbFunc(int fd, short event, void *arg) -#define NW_TMR_CALLBACK(__cbFunc) __cbFunc(int fd, short event, void *arg) - -#define NW_EVT_INIT event_init -#define NW_EVT_LOOP event_dispatch - -#define NW_EVENT_ADD(__ev, __evSelObj, __evCallback, __evCallbackArg, __evFlags) \ - do { \ - event_set(&(__ev), __evSelObj, __evFlags, __evCallback, __evCallbackArg); \ - event_add(&(__ev), NULL); \ - } while(0) - -#else - -#warning "Event library not defined!" - -/* HACK : Defining dummy values for compilation!*/ - -typedef struct { - int __tbd; -} NwEventT; - -#define NW_EVT_READ (0) -#define NW_EVT_PERSIST (1) -#define NW_EVT_CALLBACK(__cbFunc) __cbFunc(void *arg) -#define NW_TMR_CALLBACK(__cbFunc) __cbFunc(void *arg) - - -#define NW_EVT_INIT() do { printf("error: Event library not defined!\n"); exit (0); } while(0) -#define NW_EVT_LOOP() do { printf("error: Event library not defined!\n"); exit (0); } while(0) -#define NW_EVENT_ADD(...) do { printf("error: Event library not defined!\n"); exit (0); } while(0) - - -#endif - -#endif /* __NW_EVT_H__ */ diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-helloworld/NwMiniLogMgrEntity.c b/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-helloworld/NwMiniLogMgrEntity.c deleted file mode 100644 index 3ebc6a3a23..0000000000 --- a/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-helloworld/NwMiniLogMgrEntity.c +++ /dev/null @@ -1,71 +0,0 @@ -/*----------------------------------------------------------------------------* - * * - * M I N I M A L I S T I C L O G M G R E N T I T Y * - * * - * Copyright (C) 2010 Amit Chawre. * - * * - *----------------------------------------------------------------------------*/ - -/** - * @file hello-world.c - * @brief This file contains example of a minimalistic log manager entity. -*/ - -#include <stdio.h> -#include <assert.h> -#include "NwEvt.h" -#include "NwTypes.h" -#include "NwError.h" -#include "NwLog.h" -#include "NwGtpv2c.h" - -#include "NwMiniLogMgrEntity.h" - -#ifdef __cplusplus -extern "C" { -#endif - -static -NwCharT* gLogLevelStr[] = {"EMER", "ALER", "CRIT", "ERRO", "WARN", "NOTI", "INFO", "DEBG"}; - -NwMiniLogMgrT __gLogMgr; - - -/*--------------------------------------------------------------------------- - * Public functions - *--------------------------------------------------------------------------*/ - -NwMiniLogMgrT* nwMiniLogMgrGetInstance() -{ - return &(__gLogMgr); -} - -NwRcT nwMiniLogMgrInit(NwMiniLogMgrT* thiz, uint32_t logLevel ) -{ - thiz->logLevel = logLevel; - return NW_OK; -} - -NwRcT nwMiniLogMgrSetLogLevel(NwMiniLogMgrT* thiz, uint32_t logLevel) -{ - thiz->logLevel = logLevel; -} - -NwRcT nwMiniLogMgrLogRequest (NwGtpv2cLogMgrHandleT hLogMgr, - uint32_t logLevel, - NwCharT* file, - uint32_t line, - NwCharT* logStr) -{ - NwMiniLogMgrT* thiz = (NwMiniLogMgrT*) hLogMgr; - - if(thiz->logLevel >= logLevel) - printf("NWGTPV2C-STK %s - %s <%s,%u>\n", gLogLevelStr[logLevel], logStr, basename(file), line); - - return NW_OK; -} - -#ifdef __cplusplus -} -#endif - diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-helloworld/NwMiniLogMgrEntity.h b/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-helloworld/NwMiniLogMgrEntity.h deleted file mode 100644 index 361a2c6d95..0000000000 --- a/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-helloworld/NwMiniLogMgrEntity.h +++ /dev/null @@ -1,89 +0,0 @@ -/*----------------------------------------------------------------------------* - * * - * M I N I M A L I S T I C L O G M G R E N T I T Y * - * * - * Copyright (C) 2010 Amit Chawre. * - * * - *----------------------------------------------------------------------------*/ - -/** - * @file hello-world.c - * @brief This file contains example of a minimalistic log manager entity. -*/ - -#include <stdio.h> -#include <assert.h> -#include "NwEvt.h" -#include "NwLog.h" - -#ifndef NW_ASSERT -#define NW_ASSERT assert -#endif - -#ifndef __NW_MINI_LOG_MGR_H__ -#define __NW_MINI_LOG_MGR_H__ - -#define NW_LOG( _logLevel, ...) \ - do { \ - if((nwMiniLogMgrGetInstance())->logLevel >= _logLevel) \ - { \ - char _logStr[1024]; \ - snprintf(_logStr, 1024, __VA_ARGS__); \ - printf("NWGTPV2C-APP %s - %s <%s,%u>\n", gLogLevelStr[_logLevel], _logStr, basename(__FILE__), __LINE__);\ - } \ - } while(0) - -/** - * MiniLogMgr Class Definition - */ -typedef struct NwMiniLogMgr { - uint8_t logLevel; /*< Log level */ -} NwMiniLogMgrT; - - -/*--------------------------------------------------------------------------- - * Public functions - *--------------------------------------------------------------------------*/ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * Get global singleton MiniLogMgr instance - */ -NwMiniLogMgrT* nwMiniLogMgrGetInstance(); - -/** - * Initialize MiniLogMgr - * @param thiz : Pointer to global singleton MiniLogMgr instance - * @param logLevel : Log Level - */ -NwRcT nwMiniLogMgrInit(NwMiniLogMgrT* thiz, uint32_t logLevel ); - -/** - * Set MiniLogMgr log level - * @param thiz : Pointer to global singleton MiniLogMgr instance - * @param logLevel : Log Level - */ -NwRcT nwMiniLogMgrSetLogLevel(NwMiniLogMgrT* thiz, uint32_t logLevel); - -/** - * Process log request from stack - * @param thiz : Pointer to global singleton MiniLogMgr instance - * @param logLevel : Log Level - * @param file : Filename - * @param line : Line Number - * @param logStr : Log string - */ -NwRcT nwMiniLogMgrLogRequest (NwGtpv2cLogMgrHandleT logMgrHandle, - uint32_t logLevel, - NwCharT* file, - uint32_t line, - NwCharT* logStr); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-helloworld/NwMiniTmrMgrEntity.c b/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-helloworld/NwMiniTmrMgrEntity.c deleted file mode 100644 index 38d2ee6374..0000000000 --- a/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-helloworld/NwMiniTmrMgrEntity.c +++ /dev/null @@ -1,100 +0,0 @@ -/*----------------------------------------------------------------------------* - * * - * M I N I M A L I S T I C T M R M G R E N T I T Y * - * * - * Copyright (C) 2010 Amit Chawre. * - * * - *----------------------------------------------------------------------------*/ - -/** - * @file NwMiniTmrMgrEntity.c - * @brief This file ontains example of a minimalistic timer manager entity. -*/ - -#include <stdio.h> -#include <assert.h> -#include "NwEvt.h" -#include "NwGtpv2c.h" -#include "NwMiniLogMgrEntity.h" -#include "NwMiniTmrMgrEntity.h" - -#ifndef NW_ASSERT -#define NW_ASSERT assert -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -static -NwCharT* gLogLevelStr[] = {"EMER", "ALER", "CRIT", "ERRO", "WARN", "NOTI", "INFO", "DEBG"}; - -/*--------------------------------------------------------------------------- - * Private functions - *--------------------------------------------------------------------------*/ - -static void -NW_TMR_CALLBACK(nwGtpv2cNodeHandleStackTimerTimeout) -{ - NwRcT rc; - NwGtpv2cNodeTmrT *pTmr = (NwGtpv2cNodeTmrT*) arg; - - /* - * Send Timeout Request to Gtpv2c Stack Instance - */ - rc = nwGtpv2cProcessTimeout(pTmr->timeoutArg); - NW_ASSERT(NW_OK == rc); - - free(pTmr); - - return; -} - -/*--------------------------------------------------------------------------- - * Public functions - *--------------------------------------------------------------------------*/ - -NwRcT nwTimerStart( NwGtpv2cTimerMgrHandleT tmrMgrHandle, - uint32_t timeoutSec, - uint32_t timeoutUsec, - uint32_t tmrType, - void* timeoutArg, - NwGtpv2cTimerHandleT* hTmr) -{ - NwRcT rc = NW_OK; - NwGtpv2cNodeTmrT *pTmr; - struct timeval tv; - - NW_LOG(NW_LOG_LEVEL_DEBG, "Received start timer request from stack with timer type %u, arg %x, for %u sec and %u usec", tmrType, timeoutArg, timeoutSec, timeoutUsec); - - pTmr = (NwGtpv2cNodeTmrT*) malloc(sizeof(NwGtpv2cNodeTmrT)); - - /* set the timevalues*/ - timerclear(&tv); - tv.tv_sec = timeoutSec; - tv.tv_usec = timeoutUsec; - - pTmr->timeoutArg = timeoutArg; - evtimer_set(&pTmr->ev, nwGtpv2cNodeHandleStackTimerTimeout, pTmr); - - /*add event*/ - - event_add(&(pTmr->ev), &tv); - - *hTmr = (NwGtpv2cTimerHandleT)pTmr; - - return rc; -} - -NwRcT nwTimerStop( NwGtpv2cTimerMgrHandleT tmrMgrHandle, - NwGtpv2cTimerHandleT hTmr) -{ - NW_LOG(NW_LOG_LEVEL_DEBG, "Received stop timer request from stack for timer handle %u", hTmr); - evtimer_del(&(((NwGtpv2cNodeTmrT*)hTmr)->ev)); - free((void*)hTmr); - return NW_OK; -} - -#ifdef __cplusplus -} -#endif diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-helloworld/NwMiniTmrMgrEntity.h b/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-helloworld/NwMiniTmrMgrEntity.h deleted file mode 100644 index 85970c6cc2..0000000000 --- a/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-helloworld/NwMiniTmrMgrEntity.h +++ /dev/null @@ -1,57 +0,0 @@ -/*----------------------------------------------------------------------------* - * * - * M I N I M A L I S T I C T M R M G R E N T I T Y * - * * - * Copyright (C) 2010 Amit Chawre. * - * * - *----------------------------------------------------------------------------*/ - - -/** - * @file NwMiniTmrMgrEntity.c - * @brief This file ontains example of a minimalistic timer manager entity. -*/ - -#include <stdio.h> -#include <assert.h> -#include "NwEvt.h" -#include "NwLog.h" - -#ifndef NW_ASSERT -#define NW_ASSERT assert -#endif - -#ifndef __NW_MINI_TMR_MGR_H__ -#define __NW_MINI_TMR_MGR_H__ - -typedef struct { - uint8_t _tbd; -} NwGtpv2cNodeTmrMgrT; - -typedef struct { - NwEventT ev; - void* timeoutArg; -} NwGtpv2cNodeTmrT; - - -#ifdef __cplusplus -extern "C" { -#endif - -NwRcT nwTimerStart( NwGtpv2cTimerMgrHandleT tmrMgrHandle, - uint32_t timeoutSec, - uint32_t timeoutUsec, - uint32_t tmrType, - void* timeoutArg, - NwGtpv2cTimerHandleT* hTmr); - - -NwRcT nwTimerStop( NwGtpv2cTimerMgrHandleT tmrMgrHandle, - NwGtpv2cTimerHandleT hTmr); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-helloworld/NwMiniUdpEntity.c b/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-helloworld/NwMiniUdpEntity.c deleted file mode 100644 index a5352349f5..0000000000 --- a/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-helloworld/NwMiniUdpEntity.c +++ /dev/null @@ -1,149 +0,0 @@ -/*----------------------------------------------------------------------------* - * * - * M I N I M A L I S T I C U D P E N T I T Y * - * * - * Copyright (C) 2010 Amit Chawre. * - * * - *----------------------------------------------------------------------------*/ - - -/** - * @file NwMiniUdpEntity.c - * @brief This file contains example of a minimalistic ULP entity. -*/ - -#include <stdio.h> -#include <string.h> -#include <assert.h> -#include <sys/socket.h> -#include <arpa/inet.h> -#include <unistd.h> -#include <errno.h> -#include <fcntl.h> -#include "NwEvt.h" -#include "NwGtpv2c.h" -#include "NwMiniLogMgrEntity.h" -#include "NwMiniUdpEntity.h" - -#ifndef NW_ASSERT -#define NW_ASSERT assert -#endif - -#define MAX_UDP_PAYLOAD_LEN (4096) - -#ifdef __cplusplus -extern "C" { -#endif - -static -NwCharT* gLogLevelStr[] = {"EMER", "ALER", "CRIT", "ERRO", "WARN", "NOTI", "INFO", "DEBG"}; - -/*--------------------------------------------------------------------------- - * Private functions - *--------------------------------------------------------------------------*/ - -static -void NW_EVT_CALLBACK(nwUdpDataIndicationCallbackData) -{ - NwRcT rc; - uint8_t udpBuf[MAX_UDP_PAYLOAD_LEN]; - NwS32T bytesRead; - uint32_t peerLen; - struct sockaddr_in peer; - NwGtpv2cNodeUdpT* thiz = (NwGtpv2cNodeUdpT*) arg; - - peerLen = sizeof(peer); - - bytesRead = recvfrom(fd, udpBuf, MAX_UDP_PAYLOAD_LEN , 0, (struct sockaddr *) &peer,(socklen_t*) &peerLen); - - if(bytesRead) { - uint32_t peerIp = (peer.sin_addr.s_addr); - NW_LOG(NW_LOG_LEVEL_DEBG, "Received UDP message of size %u from peer %u.%u.%u.%u:%u", bytesRead, - (peerIp & 0x000000ff), - (peerIp & 0x0000ff00) >> 8, - (peerIp & 0x00ff0000) >> 16, - (peerIp & 0xff000000) >> 24, - ntohs(peer.sin_port)); - rc = nwGtpv2cProcessUdpReq(thiz->hGtpv2cStack, udpBuf, bytesRead, ntohs(peer.sin_port), ntohl(peer.sin_addr.s_addr)); - } else { - NW_LOG(NW_LOG_LEVEL_ERRO, "%s", strerror(errno)); - } -} - - -/*--------------------------------------------------------------------------- - * Public functions - *--------------------------------------------------------------------------*/ - -NwRcT nwGtpv2cUdpInit(NwGtpv2cNodeUdpT* thiz, NwGtpv2cStackHandleT hGtpv2cStack, uint8_t* ipv4Addr) -{ - int sd; - struct sockaddr_in addr; - - sd = socket(AF_INET, SOCK_DGRAM, 0); - - if (sd < 0) { - NW_LOG(NW_LOG_LEVEL_ERRO, "%s", strerror(errno)); - NW_ASSERT(0); - } - - addr.sin_family = AF_INET; - addr.sin_port = htons(2123); - addr.sin_addr.s_addr = inet_addr(ipv4Addr); - memset(addr.sin_zero, '\0', sizeof (addr.sin_zero)); - - if(bind(sd, (struct sockaddr *)&addr, sizeof(addr)) < 0) { - NW_LOG(NW_LOG_LEVEL_ERRO, "%s", strerror(errno)); - NW_ASSERT(0); - } - - NW_EVENT_ADD((thiz->ev), sd, nwUdpDataIndicationCallbackData, thiz, NW_EVT_READ | NW_EVT_PERSIST); - - thiz->hSocket = sd; - thiz->hGtpv2cStack = hGtpv2cStack; - - return NW_OK; -} - -NwRcT nwGtpv2cUdpDestroy(NwGtpv2cNodeUdpT* thiz) -{ - close(thiz->hSocket); -} - -NwRcT nwGtpv2cUdpDataReq(NwGtpv2cUdpHandleT udpHandle, - uint8_t* dataBuf, - uint32_t dataSize, - uint32_t peerIp, - uint32_t peerPort) -{ - struct sockaddr_in peerAddr; - NwS32T bytesSent; - NwGtpv2cNodeUdpT* thiz = (NwGtpv2cNodeUdpT*) udpHandle; - - NW_LOG(NW_LOG_LEVEL_DEBG, "Sending buf of size %u for on handle %x to peer %u.%u.%u.%u:%u", dataSize, udpHandle, - (peerIp & 0xff000000) >> 24, - (peerIp & 0x00ff0000) >> 16, - (peerIp & 0x0000ff00) >> 8, - (peerIp & 0x000000ff), - peerPort); - - peerAddr.sin_family = AF_INET; - peerAddr.sin_port = htons(peerPort); - peerAddr.sin_addr.s_addr = htonl(peerIp); - memset(peerAddr.sin_zero, '\0', sizeof (peerAddr.sin_zero)); - - bytesSent = sendto (thiz->hSocket, dataBuf, dataSize, 0, (struct sockaddr *) &peerAddr, sizeof(peerAddr)); - - if(bytesSent < 0) { - NW_LOG(NW_LOG_LEVEL_ERRO, "%s", strerror(errno)); - NW_ASSERT(0); - } - - return NW_OK; -} - - -#ifdef __cplusplus -} -#endif - diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-helloworld/NwMiniUdpEntity.h b/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-helloworld/NwMiniUdpEntity.h deleted file mode 100644 index 4f1bb3eef9..0000000000 --- a/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-helloworld/NwMiniUdpEntity.h +++ /dev/null @@ -1,51 +0,0 @@ -/*----------------------------------------------------------------------------* - * * - * M I N I M A L I S T I C U D P E N T I T Y * - * * - * Copyright (C) 2010 Amit Chawre. * - * * - *----------------------------------------------------------------------------*/ - - -/** - * @file NwMiniUdpEntity.c - * @brief This file contains example of a minimalistic ULP entity. -*/ - -#include <stdio.h> -#include <assert.h> -#include "NwEvt.h" -#include "NwLog.h" - -#ifndef NW_ASSERT -#define NW_ASSERT assert -#endif - -#ifndef __NW_MINI_UDP_ENTITY_H__ -#define __NW_MINI_UDP_ENTITY_H__ - -typedef struct { - uint32_t hSocket; - NwEventT ev; - NwGtpv2cStackHandleT hGtpv2cStack; -} NwGtpv2cNodeUdpT; - -#ifdef __cplusplus -extern "C" { -#endif - -NwRcT nwGtpv2cUdpInit(NwGtpv2cNodeUdpT* thiz, NwGtpv2cStackHandleT hGtpv2cStack, uint8_t* ipv4Addr); - -NwRcT nwGtpv2cUdpDestroy(NwGtpv2cNodeUdpT* thiz); - -NwRcT nwGtpv2cUdpDataReq(NwGtpv2cUdpHandleT udpHandle, - uint8_t* dataBuf, - uint32_t dataSize, - uint32_t peerIp, - uint32_t peerPort); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-helloworld/NwMiniUlpEntity.c b/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-helloworld/NwMiniUlpEntity.c deleted file mode 100644 index 82bc6580af..0000000000 --- a/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-helloworld/NwMiniUlpEntity.c +++ /dev/null @@ -1,278 +0,0 @@ -/*----------------------------------------------------------------------------* - * * - * M I N I M A L I S T I C U L P E N T I T Y * - * * - * Copyright (C) 2010 Amit Chawre. * - * * - *----------------------------------------------------------------------------*/ - -/** - * @file NwMiniUlpEntity.c - * @brief This file contains example of a minimalistic ULP entity. -*/ - -#include <stdio.h> -#include <string.h> -#include <assert.h> -#include "NwEvt.h" -#include "NwGtpv2c.h" -#include "NwGtpv2cIe.h" -#include "NwGtpv2cMsg.h" -#include "NwGtpv2cMsgParser.h" -#include "NwMiniLogMgrEntity.h" -#include "NwMiniUlpEntity.h" - -#ifndef NW_ASSERT -#define NW_ASSERT assert -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -static -NwCharT* gLogLevelStr[] = {"EMER", "ALER", "CRIT", "ERRO", "WARN", "NOTI", "INFO", "DEBG"}; - -static NwRcT -nwGtpv2cCreateSessionRequestIeIndication(uint8_t ieType, uint8_t ieLength, uint8_t ieInstance, uint8_t* ieValue, void* arg) -{ - NW_LOG(NW_LOG_LEVEL_DEBG, "Received IE Parse Indication for of type %u, length %u, instance %u!", ieType, ieLength, ieInstance); - return NW_OK; -} - -/*--------------------------------------------------------------------------- - * Public Functions - *--------------------------------------------------------------------------*/ - -NwRcT -nwGtpv2cUlpInit(NwGtpv2cNodeUlpT* thiz, NwGtpv2cStackHandleT hGtpv2cStack, char* peerIpStr) -{ - NwRcT rc; - thiz->hGtpv2cStack = hGtpv2cStack; - strcpy(thiz->peerIpStr, peerIpStr); - return NW_OK; -} - -NwRcT -nwGtpv2cUlpDestroy(NwGtpv2cNodeUlpT* thiz) -{ - NW_ASSERT(thiz); - memset(thiz, 0, sizeof(NwGtpv2cNodeUlpT)); - return NW_OK; -} - -NwRcT -nwGtpv2cUlpSenEchoRequestToPeer(NwGtpv2cNodeUlpT* thiz, uint32_t peerIp) -{ - NwRcT rc; - NwGtpv2cUlpApiT ulpReq; - /* - * Send Message Request to Gtpv2c Stack Instance - */ - - ulpReq.apiType = NW_GTPV2C_ULP_API_INITIAL_REQ; - - ulpReq.apiInfo.initialReqInfo.hTunnel = 0; - ulpReq.apiInfo.initialReqInfo.hUlpTrxn = (NwGtpv2cUlpTrxnHandleT)thiz; - ulpReq.apiInfo.initialReqInfo.hUlpTunnel = (NwGtpv2cUlpTrxnHandleT)thiz; - ulpReq.apiInfo.initialReqInfo.teidLocal = (NwGtpv2cUlpTrxnHandleT)0; - ulpReq.apiInfo.initialReqInfo.peerIp = htonl(peerIp); - - rc = nwGtpv2cMsgNew( thiz->hGtpv2cStack, - NW_FALSE, - NW_GTP_ECHO_REQ, - 0, - 0, - &(ulpReq.hMsg)); - - NW_ASSERT(NW_OK == rc); - - rc = nwGtpv2cMsgAddIeTV1((ulpReq.hMsg), NW_GTPV2C_IE_RECOVERY, 0, thiz->restartCounter); - NW_ASSERT(NW_OK == rc); - - rc = nwGtpv2cProcessUlpReq(thiz->hGtpv2cStack, &ulpReq); - NW_ASSERT(NW_OK == rc); - - return NW_OK; -} - -NwRcT -nwGtpv2cUlpCreateSessionRequestToPeer(NwGtpv2cNodeUlpT* thiz) -{ - NwRcT rc; - NwGtpv2cUlpApiT ulpReq; - - /* - * Send Message Request to Gtpv2c Stack Instance - */ - - ulpReq.apiType = (NW_GTPV2C_ULP_API_INITIAL_REQ | NW_GTPV2C_ULP_API_FLAG_CREATE_LOCAL_TUNNEL); - - ulpReq.apiInfo.initialReqInfo.hUlpTrxn = (NwGtpv2cUlpTrxnHandleT)thiz; - ulpReq.apiInfo.initialReqInfo.teidLocal = (NwGtpv2cUlpTrxnHandleT)thiz; - ulpReq.apiInfo.initialReqInfo.peerIp = ntohl(inet_addr(thiz->peerIpStr)); - - rc = nwGtpv2cMsgNew( thiz->hGtpv2cStack, - NW_TRUE, - NW_GTP_CREATE_SESSION_REQ, - 0, - 0, - &(ulpReq.hMsg)); - - NW_ASSERT(NW_OK == rc); - - rc = nwGtpv2cMsgAddIeTV1((ulpReq.hMsg), NW_GTPV2C_IE_RECOVERY, 0, thiz->restartCounter); - NW_ASSERT(NW_OK == rc); - - rc = nwGtpv2cProcessUlpReq(thiz->hGtpv2cStack, &ulpReq); - NW_ASSERT(NW_OK == rc); - - return NW_OK; -} - -NwRcT -nwGtpv2cUlpProcessStackReqCallback (NwGtpv2cUlpHandleT hUlp, - NwGtpv2cUlpApiT *pUlpApi) -{ - NwRcT rc; - NwGtpv2cNodeUlpT* thiz; - NW_ASSERT(pUlpApi != NULL); - - thiz = (NwGtpv2cNodeUlpT*) hUlp; - - switch(pUlpApi->apiType) { - - case NW_GTPV2C_ULP_API_INITIAL_REQ_IND: { - NwGtpv2cUlpApiT ulpReq; - NwGtpv2cMsgParserT *pMsgParser; - NW_LOG(NW_LOG_LEVEL_DEBG, "Received NW_GTPV2C_ULP_API_INITIAL_REQ_IND from gtpv2c stack! %X:%u", pUlpApi->apiInfo.initialReqIndInfo.peerIp, pUlpApi->apiInfo.initialReqIndInfo.peerPort); - - rc = nwGtpv2cMsgParserNew(thiz->hGtpv2cStack, NW_GTP_CREATE_SESSION_REQ, nwGtpv2cCreateSessionRequestIeIndication, NULL, &pMsgParser); - NW_ASSERT(NW_OK == rc); - - if(pUlpApi->apiInfo.initialReqIndInfo.msgType == NW_GTP_CREATE_SESSION_REQ) { - - struct { - uint8_t causeValue; - uint8_t spare:5; - uint8_t pce:1; - uint8_t bce:1; - uint8_t cs:1; - } cause; - - - rc = nwGtpv2cMsgParserAddIe(pMsgParser, NW_GTPV2C_IE_RECOVERY, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_MANDATORY, nwGtpv2cCreateSessionRequestIeIndication, NULL); - NW_ASSERT(NW_OK == rc); - - uint8_t offendingIeType, OffendingIeLength; - rc = nwGtpv2cMsgParserRun(pMsgParser, (pUlpApi->hMsg), &offendingIeType, &OffendingIeLength); - - if( rc != NW_OK ) { - switch(rc) { - case NW_GTPV2C_MANDATORY_IE_MISSING: - NW_LOG(NW_LOG_LEVEL_ERRO, "Mandatory IE type '%u' of instance '%u' missing!", offendingIeType, OffendingIeLength); - cause.causeValue = NW_GTPV2C_CAUSE_MANDATORY_IE_MISSING; - break; - - default: - NW_LOG(NW_LOG_LEVEL_ERRO, "Unknown message parse error!"); - cause.causeValue = 0; - break; - } - - } else { - cause.causeValue = NW_GTPV2C_CAUSE_REQUEST_ACCEPTED; - } - - /* - * Send Message Request to Gtpv2c Stack Instance - */ - ulpReq.apiType = NW_GTPV2C_ULP_API_TRIGGERED_RSP; - - ulpReq.apiInfo.triggeredRspInfo.hTrxn = pUlpApi->apiInfo.initialReqIndInfo.hTrxn; - - rc = nwGtpv2cMsgNew( thiz->hGtpv2cStack, - NW_TRUE, - NW_GTP_CREATE_SESSION_RSP, - 0, - nwGtpv2cMsgGetSeqNumber(pUlpApi->hMsg), - &(ulpReq.hMsg)); - - rc = nwGtpv2cMsgAddIe((ulpReq.hMsg), NW_GTPV2C_IE_CAUSE, 2, 0, (uint8_t*)&cause); - NW_ASSERT(NW_OK == rc); - - NW_LOG(NW_LOG_LEVEL_NOTI, "Received NW_GTP_CREATE_SESSION_REQ, Sending NW_GTP_CREATE_SESSION_RSP!"); - rc = nwGtpv2cProcessUlpReq(thiz->hGtpv2cStack, &ulpReq); - NW_ASSERT(NW_OK == rc); - } - - rc = nwGtpv2cMsgParserDelete(thiz->hGtpv2cStack, pMsgParser); - NW_ASSERT(NW_OK == rc); - - rc = nwGtpv2cMsgDelete(thiz->hGtpv2cStack, (pUlpApi->hMsg)); - NW_ASSERT(NW_OK == rc); - - } - break; - - case NW_GTPV2C_ULP_API_TRIGGERED_RSP_IND: { - NwGtpv2cUlpApiT ulpReq; - NwGtpv2cMsgParserT *pMsgParser; - NW_LOG(NW_LOG_LEVEL_DEBG, "Received NW_GTPV2C_ULP_API_TRIGGERED_RSP_IND from gtpv2c stack!", pUlpApi->apiInfo.triggeredRspIndInfo, pUlpApi->apiInfo.triggeredRspIndInfo); - - rc = nwGtpv2cMsgParserNew(thiz->hGtpv2cStack, NW_GTP_CREATE_SESSION_REQ, nwGtpv2cCreateSessionRequestIeIndication, NULL, &pMsgParser); - NW_ASSERT(NW_OK == rc); - - if(pUlpApi->apiInfo.triggeredRspIndInfo.msgType == NW_GTP_CREATE_SESSION_RSP) { - rc = nwGtpv2cMsgParserAddIe(pMsgParser, NW_GTPV2C_IE_CAUSE, NW_GTPV2C_IE_INSTANCE_ZERO, NW_GTPV2C_IE_PRESENCE_MANDATORY, nwGtpv2cCreateSessionRequestIeIndication, NULL); - NW_ASSERT(NW_OK == rc); - - uint8_t offendingIeType, OffendingIeLength; - rc = nwGtpv2cMsgParserRun(pMsgParser, (pUlpApi->hMsg), &offendingIeType, &OffendingIeLength); - - if( rc != NW_OK ) { - switch(rc) { - case NW_GTPV2C_MANDATORY_IE_MISSING: - NW_LOG(NW_LOG_LEVEL_ERRO, "Mandatory IE Missing!"); - break; - - default: - NW_LOG(NW_LOG_LEVEL_ERRO, "Unknown message parse error!"); - break; - - } - - } - - /* - * Send Message Request to Gtpv2c Stack Instance - */ - NW_LOG(NW_LOG_LEVEL_NOTI, "Received NW_GTP_CREATE_SESSION_RSP, Sending NW_GTP_CREATE_SESSION_REQ!"); - nwGtpv2cUlpCreateSessionRequestToPeer(thiz); - } - - rc = nwGtpv2cMsgParserDelete(thiz->hGtpv2cStack, pMsgParser); - NW_ASSERT(NW_OK == rc); - - rc = nwGtpv2cMsgDelete(thiz->hGtpv2cStack, (pUlpApi->hMsg)); - NW_ASSERT(NW_OK == rc); - - } - break; - - case NW_GTPV2C_ULP_API_RSP_FAILURE_IND: { - NW_LOG(NW_LOG_LEVEL_ERRO, "Received NW_GTPV2C_ULP_API_RSP_FAILURE from gtpv2c stack for transaction '%x'!", thiz); - } - break; - - default: - NW_LOG(NW_LOG_LEVEL_WARN, "Received undefined UlpApi from gtpv2c stack!"); - } - - return NW_OK; -} - -#ifdef __cplusplus -} -#endif - diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-helloworld/NwMiniUlpEntity.h b/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-helloworld/NwMiniUlpEntity.h deleted file mode 100644 index e92a6ba6bc..0000000000 --- a/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-helloworld/NwMiniUlpEntity.h +++ /dev/null @@ -1,49 +0,0 @@ -/*----------------------------------------------------------------------------* - * * - * M I N I M A L I S T I C U L P E N T I T Y * - * * - * Copyright (C) 2010 Amit Chawre. * - * * - *----------------------------------------------------------------------------*/ - -/** - * @file NwMiniUlpEntity.h - * @brief This file contains example of a minimalistic ULP entity. -*/ - -#include <stdio.h> -#include <assert.h> -#include "NwEvt.h" -#include "NwLog.h" - -#ifndef __NW_MINI_ULP_H__ -#define __NW_MINI_ULP_H__ - -typedef struct { - uint8_t peerIpStr[16]; - uint32_t restartCounter; - NwGtpv2cStackHandleT hGtpv2cStack; -} NwGtpv2cNodeUlpT; - -#ifdef __cplusplus -extern "C" { -#endif - -NwRcT -nwGtpv2cUlpInit(NwGtpv2cNodeUlpT* thiz, NwGtpv2cStackHandleT hGtpv2cStack, char* peerIpStr ); - -NwRcT -nwGtpv2cUlpDestroy(NwGtpv2cNodeUlpT* thiz); - -NwRcT -nwGtpv2cUlpCreateSessionRequestToPeer(NwGtpv2cNodeUlpT* thiz); - -NwRcT -nwGtpv2cUlpProcessStackReqCallback (NwGtpv2cUlpHandleT hUlp, - NwGtpv2cUlpApiT *pUlpApi); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-helloworld/helloworld.c b/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-helloworld/helloworld.c deleted file mode 100644 index 2b78e104e2..0000000000 --- a/openair-cn/GTPV2-C/nwgtpv2c-0.11/test-app/nw-helloworld/helloworld.c +++ /dev/null @@ -1,179 +0,0 @@ -/*----------------------------------------------------------------------------* - * * - * n w - g t p v 2 c * - * G P R S T u n n e l i n g P r o t o c o l v 2 c S t a c k * - * * - * M I N I M A L I S T I C D E M O N S T R A T I O N * - * * - * Copyright (C) 2010 Amit Chawre. * - * * - *----------------------------------------------------------------------------*/ - - -/** - * @file hello-world.c - * @brief This is a test program demostrating usage of nw-gtpv2c library. -*/ - -#include <stdio.h> -#include <assert.h> -#include "NwEvt.h" -#include "NwLog.h" -#include "NwGtpv2c.h" - -#include "NwMiniLogMgrEntity.h" -#include "NwMiniTmrMgrEntity.h" -#include "NwMiniUdpEntity.h" -#include "NwMiniUlpEntity.h" - -#ifndef NW_ASSERT -#define NW_ASSERT assert -#endif - -static -NwCharT* gLogLevelStr[] = {"EMER", "ALER", "CRIT", "ERRO", "WARN", "NOTI", "INFO", "DEBG"}; - -/*--------------------------------------------------------------------------- - * T H E M A I N F U N C T I O N - *--------------------------------------------------------------------------*/ - -int main(int argc, char* argv[]) -{ - NwRcT rc; - uint32_t logLevel; - uint8_t* logLevelStr; - - NwGtpv2cStackHandleT hGtpv2cStack = 0; - - NwGtpv2cNodeUlpT ulpObj; - NwGtpv2cNodeUdpT udpObj; - - - NwGtpv2cUlpEntityT ulp; - NwGtpv2cUdpEntityT udp; - NwGtpv2cTimerMgrEntityT tmrMgr; - NwGtpv2cLogMgrEntityT logMgr; - - if(argc != 3) { - printf("Usage: %s <local-ip> <peer-ip>\n", argv[0]); - exit(0); - } - - logLevelStr = getenv ("NW_LOG_LEVEL"); - - if(logLevelStr == NULL) { - logLevel = NW_LOG_LEVEL_INFO; - } else { - if(strncmp(logLevelStr, "EMER",4) == 0) - logLevel = NW_LOG_LEVEL_EMER; - else if(strncmp(logLevelStr, "ALER",4) == 0) - logLevel = NW_LOG_LEVEL_ALER; - else if(strncmp(logLevelStr, "CRIT",4) == 0) - logLevel = NW_LOG_LEVEL_CRIT; - else if(strncmp(logLevelStr, "ERRO",4) == 0) - logLevel = NW_LOG_LEVEL_ERRO ; - else if(strncmp(logLevelStr, "WARN",4) == 0) - logLevel = NW_LOG_LEVEL_WARN; - else if(strncmp(logLevelStr, "NOTI",4) == 0) - logLevel = NW_LOG_LEVEL_NOTI; - else if(strncmp(logLevelStr, "INFO",4) == 0) - logLevel = NW_LOG_LEVEL_INFO; - else if(strncmp(logLevelStr, "DEBG",4) == 0) - logLevel = NW_LOG_LEVEL_DEBG; - } - - /*--------------------------------------------------------------------------- - * Initialize event library - *--------------------------------------------------------------------------*/ - - NW_EVT_INIT(); - - /*--------------------------------------------------------------------------- - * Initialize Log Manager - *--------------------------------------------------------------------------*/ - nwMiniLogMgrInit(nwMiniLogMgrGetInstance(), logLevel); - - /*--------------------------------------------------------------------------- - * Initialize Gtpv2c Stack Instance - *--------------------------------------------------------------------------*/ - rc = nwGtpv2cInitialize(&hGtpv2cStack); - - if(rc != NW_OK) { - NW_LOG(NW_LOG_LEVEL_ERRO, "Failed to create gtpv2c stack instance. Error '%u' occured", rc); - exit(1); - } - - NW_LOG(NW_LOG_LEVEL_INFO, "Gtpv2c Stack Handle '%X' Creation Successful!", hGtpv2cStack); - - rc = nwGtpv2cSetLogLevel(hGtpv2cStack, logLevel); - - /*--------------------------------------------------------------------------- - * Set up Ulp Entity - *--------------------------------------------------------------------------*/ - rc = nwGtpv2cUlpInit(&ulpObj, hGtpv2cStack, argv[2]); - NW_ASSERT(NW_OK == rc); - - ulp.hUlp = (NwGtpv2cUlpHandleT) &ulpObj; - ulp.ulpReqCallback = nwGtpv2cUlpProcessStackReqCallback; - - rc = nwGtpv2cSetUlpEntity(hGtpv2cStack, &ulp); - NW_ASSERT(NW_OK == rc); - - /*--------------------------------------------------------------------------- - * Set up Udp Entity - *--------------------------------------------------------------------------*/ - rc = nwGtpv2cUdpInit(&udpObj, hGtpv2cStack, (argv[1])); - NW_ASSERT(NW_OK == rc); - - udp.hUdp = (NwGtpv2cUdpHandleT) &udpObj; - udp.udpDataReqCallback = nwGtpv2cUdpDataReq; - - rc = nwGtpv2cSetUdpEntity(hGtpv2cStack, &udp); - NW_ASSERT(NW_OK == rc); - - /*--------------------------------------------------------------------------- - * Set up Log Entity - *--------------------------------------------------------------------------*/ - tmrMgr.tmrMgrHandle = 0; - tmrMgr.tmrStartCallback = nwTimerStart; - tmrMgr.tmrStopCallback = nwTimerStop; - - rc = nwGtpv2cSetTimerMgrEntity(hGtpv2cStack, &tmrMgr); - NW_ASSERT(NW_OK == rc); - - /*--------------------------------------------------------------------------- - * Set up Log Entity - *--------------------------------------------------------------------------*/ - logMgr.logMgrHandle = (NwGtpv2cLogMgrHandleT) nwMiniLogMgrGetInstance(); - logMgr.logReqCallback = nwMiniLogMgrLogRequest; - - rc = nwGtpv2cSetLogMgrEntity(hGtpv2cStack, &logMgr); - NW_ASSERT(NW_OK == rc); - - /*--------------------------------------------------------------------------- - * Send Message Request to Gtpv2c Stack Instance - *--------------------------------------------------------------------------*/ - //rc = nwGtpv2cUlpCreateSessionRequestToPeer(&ulpObj); - rc = nwGtpv2cUlpSenEchoRequestToPeer(&ulpObj, inet_addr(argv[2])); - NW_ASSERT(NW_OK == rc); - - /*--------------------------------------------------------------------------- - * Event loop - *--------------------------------------------------------------------------*/ - - NW_EVT_LOOP(); - NW_LOG(NW_LOG_LEVEL_ERRO, "Exit from eventloop, no events to process!"); - - /*--------------------------------------------------------------------------- - * Destroy Gtpv2c Stack Instance - *--------------------------------------------------------------------------*/ - rc = nwGtpv2cFinalize(hGtpv2cStack); - - if(rc != NW_OK) { - NW_LOG(NW_LOG_LEVEL_ERRO, "Failed to finalize gtpv2c stack instance. Error '%u' occured", rc); - } else { - NW_LOG(NW_LOG_LEVEL_INFO, "Gtpv2c Stack Handle '%X' Finalize Successful!", hGtpv2cStack); - } - - return rc; -} diff --git a/openair-cn/INSTALL b/openair-cn/INSTALL deleted file mode 100644 index 2099840756..0000000000 --- a/openair-cn/INSTALL +++ /dev/null @@ -1,370 +0,0 @@ -Installation Instructions -************************* - -Copyright (C) 1994-1996, 1999-2002, 2004-2013 Free Software Foundation, -Inc. - - Copying and distribution of this file, with or without modification, -are permitted in any medium without royalty provided the copyright -notice and this notice are preserved. This file is offered as-is, -without warranty of any kind. - -Basic Installation -================== - - Briefly, the shell command `./configure && make && make install' -should configure, build, and install this package. The following -more-detailed instructions are generic; see the `README' file for -instructions specific to this package. Some packages provide this -`INSTALL' file but do not implement all of the features documented -below. The lack of an optional feature in a given package is not -necessarily a bug. More recommendations for GNU packages can be found -in *note Makefile Conventions: (standards)Makefile Conventions. - - The `configure' shell script attempts to guess correct values for -various system-dependent variables used during compilation. It uses -those values to create a `Makefile' in each directory of the package. -It may also create one or more `.h' files containing system-dependent -definitions. Finally, it creates a shell script `config.status' that -you can run in the future to recreate the current configuration, and a -file `config.log' containing compiler output (useful mainly for -debugging `configure'). - - It can also use an optional file (typically called `config.cache' -and enabled with `--cache-file=config.cache' or simply `-C') that saves -the results of its tests to speed up reconfiguring. Caching is -disabled by default to prevent problems with accidental use of stale -cache files. - - If you need to do unusual things to compile the package, please try -to figure out how `configure' could check whether to do them, and mail -diffs or instructions to the address given in the `README' so they can -be considered for the next release. If you are using the cache, and at -some point `config.cache' contains results you don't want to keep, you -may remove or edit it. - - The file `configure.ac' (or `configure.in') is used to create -`configure' by a program called `autoconf'. You need `configure.ac' if -you want to change it or regenerate `configure' using a newer version -of `autoconf'. - - The simplest way to compile this package is: - - 1. `cd' to the directory containing the package's source code and type - `./configure' to configure the package for your system. - - Running `configure' might take a while. While running, it prints - some messages telling which features it is checking for. - - 2. Type `make' to compile the package. - - 3. Optionally, type `make check' to run any self-tests that come with - the package, generally using the just-built uninstalled binaries. - - 4. Type `make install' to install the programs and any data files and - documentation. When installing into a prefix owned by root, it is - recommended that the package be configured and built as a regular - user, and only the `make install' phase executed with root - privileges. - - 5. Optionally, type `make installcheck' to repeat any self-tests, but - this time using the binaries in their final installed location. - This target does not install anything. Running this target as a - regular user, particularly if the prior `make install' required - root privileges, verifies that the installation completed - correctly. - - 6. You can remove the program binaries and object files from the - source code directory by typing `make clean'. To also remove the - files that `configure' created (so you can compile the package for - a different kind of computer), type `make distclean'. There is - also a `make maintainer-clean' target, but that is intended mainly - for the package's developers. If you use it, you may have to get - all sorts of other programs in order to regenerate files that came - with the distribution. - - 7. Often, you can also type `make uninstall' to remove the installed - files again. In practice, not all packages have tested that - uninstallation works correctly, even though it is required by the - GNU Coding Standards. - - 8. Some packages, particularly those that use Automake, provide `make - distcheck', which can by used by developers to test that all other - targets like `make install' and `make uninstall' work correctly. - This target is generally not run by end users. - -Compilers and Options -===================== - - Some systems require unusual options for compilation or linking that -the `configure' script does not know about. Run `./configure --help' -for details on some of the pertinent environment variables. - - You can give `configure' initial values for configuration parameters -by setting variables in the command line or in the environment. Here -is an example: - - ./configure CC=c99 CFLAGS=-g LIBS=-lposix - - *Note Defining Variables::, for more details. - -Compiling For Multiple Architectures -==================================== - - You can compile the package for more than one kind of computer at the -same time, by placing the object files for each architecture in their -own directory. To do this, you can use GNU `make'. `cd' to the -directory where you want the object files and executables to go and run -the `configure' script. `configure' automatically checks for the -source code in the directory that `configure' is in and in `..'. This -is known as a "VPATH" build. - - With a non-GNU `make', it is safer to compile the package for one -architecture at a time in the source code directory. After you have -installed the package for one architecture, use `make distclean' before -reconfiguring for another architecture. - - On MacOS X 10.5 and later systems, you can create libraries and -executables that work on multiple system types--known as "fat" or -"universal" binaries--by specifying multiple `-arch' options to the -compiler but only a single `-arch' option to the preprocessor. Like -this: - - ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ - CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ - CPP="gcc -E" CXXCPP="g++ -E" - - This is not guaranteed to produce working output in all cases, you -may have to build one architecture at a time and combine the results -using the `lipo' tool if you have problems. - -Installation Names -================== - - By default, `make install' installs the package's commands under -`/usr/local/bin', include files under `/usr/local/include', etc. You -can specify an installation prefix other than `/usr/local' by giving -`configure' the option `--prefix=PREFIX', where PREFIX must be an -absolute file name. - - You can specify separate installation prefixes for -architecture-specific files and architecture-independent files. If you -pass the option `--exec-prefix=PREFIX' to `configure', the package uses -PREFIX as the prefix for installing programs and libraries. -Documentation and other data files still use the regular prefix. - - In addition, if you use an unusual directory layout you can give -options like `--bindir=DIR' to specify different values for particular -kinds of files. Run `configure --help' for a list of the directories -you can set and what kinds of files go in them. In general, the -default for these options is expressed in terms of `${prefix}', so that -specifying just `--prefix' will affect all of the other directory -specifications that were not explicitly provided. - - The most portable way to affect installation locations is to pass the -correct locations to `configure'; however, many packages provide one or -both of the following shortcuts of passing variable assignments to the -`make install' command line to change installation locations without -having to reconfigure or recompile. - - The first method involves providing an override variable for each -affected directory. For example, `make install -prefix=/alternate/directory' will choose an alternate location for all -directory configuration variables that were expressed in terms of -`${prefix}'. Any directories that were specified during `configure', -but not in terms of `${prefix}', must each be overridden at install -time for the entire installation to be relocated. The approach of -makefile variable overrides for each directory variable is required by -the GNU Coding Standards, and ideally causes no recompilation. -However, some platforms have known limitations with the semantics of -shared libraries that end up requiring recompilation when using this -method, particularly noticeable in packages that use GNU Libtool. - - The second method involves providing the `DESTDIR' variable. For -example, `make install DESTDIR=/alternate/directory' will prepend -`/alternate/directory' before all installation names. The approach of -`DESTDIR' overrides is not required by the GNU Coding Standards, and -does not work on platforms that have drive letters. On the other hand, -it does better at avoiding recompilation issues, and works well even -when some directory options were not specified in terms of `${prefix}' -at `configure' time. - -Optional Features -================= - - If the package supports it, you can cause programs to be installed -with an extra prefix or suffix on their names by giving `configure' the -option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. - - Some packages pay attention to `--enable-FEATURE' options to -`configure', where FEATURE indicates an optional part of the package. -They may also pay attention to `--with-PACKAGE' options, where PACKAGE -is something like `gnu-as' or `x' (for the X Window System). The -`README' should mention any `--enable-' and `--with-' options that the -package recognizes. - - For packages that use the X Window System, `configure' can usually -find the X include and library files automatically, but if it doesn't, -you can use the `configure' options `--x-includes=DIR' and -`--x-libraries=DIR' to specify their locations. - - Some packages offer the ability to configure how verbose the -execution of `make' will be. For these packages, running `./configure ---enable-silent-rules' sets the default to minimal output, which can be -overridden with `make V=1'; while running `./configure ---disable-silent-rules' sets the default to verbose, which can be -overridden with `make V=0'. - -Particular systems -================== - - On HP-UX, the default C compiler is not ANSI C compatible. If GNU -CC is not installed, it is recommended to use the following options in -order to use an ANSI C compiler: - - ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" - -and if that doesn't work, install pre-built binaries of GCC for HP-UX. - - HP-UX `make' updates targets which have the same time stamps as -their prerequisites, which makes it generally unusable when shipped -generated files such as `configure' are involved. Use GNU `make' -instead. - - On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot -parse its `<wchar.h>' header file. The option `-nodtk' can be used as -a workaround. If GNU CC is not installed, it is therefore recommended -to try - - ./configure CC="cc" - -and if that doesn't work, try - - ./configure CC="cc -nodtk" - - On Solaris, don't put `/usr/ucb' early in your `PATH'. This -directory contains several dysfunctional programs; working variants of -these programs are available in `/usr/bin'. So, if you need `/usr/ucb' -in your `PATH', put it _after_ `/usr/bin'. - - On Haiku, software installed for all users goes in `/boot/common', -not `/usr/local'. It is recommended to use the following options: - - ./configure --prefix=/boot/common - -Specifying the System Type -========================== - - There may be some features `configure' cannot figure out -automatically, but needs to determine by the type of machine the package -will run on. Usually, assuming the package is built to be run on the -_same_ architectures, `configure' can figure that out, but if it prints -a message saying it cannot guess the machine type, give it the -`--build=TYPE' option. TYPE can either be a short name for the system -type, such as `sun4', or a canonical name which has the form: - - CPU-COMPANY-SYSTEM - -where SYSTEM can have one of these forms: - - OS - KERNEL-OS - - See the file `config.sub' for the possible values of each field. If -`config.sub' isn't included in this package, then this package doesn't -need to know the machine type. - - If you are _building_ compiler tools for cross-compiling, you should -use the option `--target=TYPE' to select the type of system they will -produce code for. - - If you want to _use_ a cross compiler, that generates code for a -platform different from the build platform, you should specify the -"host" platform (i.e., that on which the generated programs will -eventually be run) with `--host=TYPE'. - -Sharing Defaults -================ - - If you want to set default values for `configure' scripts to share, -you can create a site shell script called `config.site' that gives -default values for variables like `CC', `cache_file', and `prefix'. -`configure' looks for `PREFIX/share/config.site' if it exists, then -`PREFIX/etc/config.site' if it exists. Or, you can set the -`CONFIG_SITE' environment variable to the location of the site script. -A warning: not all `configure' scripts look for a site script. - -Defining Variables -================== - - Variables not defined in a site shell script can be set in the -environment passed to `configure'. However, some packages may run -configure again during the build, and the customized values of these -variables may be lost. In order to avoid this problem, you should set -them in the `configure' command line, using `VAR=value'. For example: - - ./configure CC=/usr/local2/bin/gcc - -causes the specified `gcc' to be used as the C compiler (unless it is -overridden in the site shell script). - -Unfortunately, this technique does not work for `CONFIG_SHELL' due to -an Autoconf limitation. Until the limitation is lifted, you can use -this workaround: - - CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash - -`configure' Invocation -====================== - - `configure' recognizes the following options to control how it -operates. - -`--help' -`-h' - Print a summary of all of the options to `configure', and exit. - -`--help=short' -`--help=recursive' - Print a summary of the options unique to this package's - `configure', and exit. The `short' variant lists options used - only in the top level, while the `recursive' variant lists options - also present in any nested packages. - -`--version' -`-V' - Print the version of Autoconf used to generate the `configure' - script, and exit. - -`--cache-file=FILE' - Enable the cache: use and save the results of the tests in FILE, - traditionally `config.cache'. FILE defaults to `/dev/null' to - disable caching. - -`--config-cache' -`-C' - Alias for `--cache-file=config.cache'. - -`--quiet' -`--silent' -`-q' - Do not print messages saying which checks are being made. To - suppress all normal output, redirect it to `/dev/null' (any error - messages will still be shown). - -`--srcdir=DIR' - Look for the package's source code in directory DIR. Usually - `configure' can determine that directory automatically. - -`--prefix=DIR' - Use DIR as the installation prefix. *note Installation Names:: - for more details, including other options available for fine-tuning - the installation locations. - -`--no-create' -`-n' - Run the configure checks, but stop before creating any output - files. - -`configure' also accepts some other, not widely useful, options. Run -`configure --help' for more details. diff --git a/openair-cn/MME_APP/COPYING b/openair-cn/MME_APP/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair-cn/MME_APP/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program 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. - - This program 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 this program. If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - <program> Copyright (C) <year> <name of author> - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<http://www.gnu.org/licenses/>. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<http://www.gnu.org/philosophy/why-not-lgpl.html>. diff --git a/openair-cn/MME_APP/Makefile.am b/openair-cn/MME_APP/Makefile.am deleted file mode 100644 index c736fb38ba..0000000000 --- a/openair-cn/MME_APP/Makefile.am +++ /dev/null @@ -1,59 +0,0 @@ -################################################################################ -# 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@eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ -AM_CFLAGS = \ - @ADD_CFLAGS@ \ - -I$(top_srcdir)/COMMON \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/api/network \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/include \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/ies \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/emm/msg \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/esm/msg \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/util \ - -I$(top_srcdir)/INTERTASK_INTERFACE \ - -I$(top_srcdir)/S1AP \ - -I$(top_srcdir)/SGW-LITE \ - -I$(top_srcdir)/S6A \ - -I$(top_srcdir)/SCTP \ - -I$(top_srcdir)/SECU \ - -I$(top_srcdir)/UTILS - -noinst_LTLIBRARIES = libmmeapp.la -libmmeapp_la_LDFLAGS = -all-static - -libmmeapp_la_SOURCES = \ - mme_app_capabilities.c \ - mme_app_context.c \ - mme_app_main.c mme_app_defs.h \ - mme_app_bearer.c \ - mme_app_authentication.c \ - mme_app_location.c \ - mme_app_statistics.c mme_app_statistics.h \ - mme_app_defs.h mme_app_extern.h \ - mme_app_itti_messaging.h \ - s6a_2_nas_cause.c diff --git a/openair-cn/MME_APP/mme_app_authentication.c b/openair-cn/MME_APP/mme_app_authentication.c deleted file mode 100644 index d10e7d645b..0000000000 --- a/openair-cn/MME_APP/mme_app_authentication.c +++ /dev/null @@ -1,365 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -#include "msc.h" -#include "intertask_interface.h" -#include "mme_app_itti_messaging.h" - -#include "mme_config.h" - -#include "mme_app_ue_context.h" -#include "mme_app_defs.h" -#include "mcc_mnc_itu.h" - -#include "assertions.h" - -static -int mme_app_request_authentication_info(const char *imsi, - const uint8_t nb_of_vectors, - const plmn_t *plmn, - const uint8_t *auts); - -static -int mme_app_request_authentication_info(const char *imsi, - const uint8_t nb_of_vectors, - const plmn_t *plmn, - const uint8_t *auts) -{ - s6a_auth_info_req_t *auth_info_req = NULL; - MessageDef *message_p = NULL; - int imsi_length = strlen(imsi); - - DevAssert(plmn != NULL); - - message_p = itti_alloc_new_message(TASK_MME_APP, S6A_AUTH_INFO_REQ); - - auth_info_req = &message_p->ittiMsg.s6a_auth_info_req; - memset(auth_info_req, 0, sizeof(*auth_info_req)); - - strncpy(auth_info_req->imsi, imsi, imsi_length); - auth_info_req->imsi_length = imsi_length; - //MME_APP_IMSI_TO_STRING(imsi, auth_info_req->imsi); - - memcpy(&auth_info_req->visited_plmn, plmn, sizeof(plmn_t)); - MME_APP_DEBUG("%s visited_plmn MCC %X%X%X MNC %X%X%X\n", - __FUNCTION__, - auth_info_req->visited_plmn.MCCdigit1, - auth_info_req->visited_plmn.MCCdigit2, - auth_info_req->visited_plmn.MCCdigit3, - auth_info_req->visited_plmn.MNCdigit1, - auth_info_req->visited_plmn.MNCdigit2, - auth_info_req->visited_plmn.MNCdigit3); - uint8_t *ptr = (uint8_t *)&auth_info_req->visited_plmn; - MME_APP_DEBUG("%s visited_plmn %02X%02X%02X\n", - __FUNCTION__, - ptr[0], - ptr[1], - ptr[2]); - - auth_info_req->nb_of_vectors = nb_of_vectors; - - if (auts != NULL) { - auth_info_req->re_synchronization = 1; - memcpy(auth_info_req->auts, auts, sizeof(auth_info_req->auts)); - } else { - auth_info_req->re_synchronization = 0; - memset(auth_info_req->auts, 0, sizeof(auth_info_req->auts)); - } - - MSC_LOG_TX_MESSAGE( - MSC_MMEAPP_MME, - MSC_S6A_MME, - NULL,0, - "0 S6A_AUTH_INFO_REQ IMSI %s visited_plmn %02X%02X%02X re_sync %u", - imsi,ptr[0],ptr[1],ptr[2],auth_info_req->re_synchronization); - - return itti_send_msg_to_task(TASK_S6A, INSTANCE_DEFAULT, message_p); -} - -int mme_app_handle_nas_auth_resp(const nas_auth_resp_t * const nas_auth_resp_pP) -{ - struct ue_context_s *ue_context = NULL; - uint64_t imsi = 0; - - DevAssert(nas_auth_resp_pP != NULL); - - MME_APP_STRING_TO_IMSI((char *)nas_auth_resp_pP->imsi, &imsi); - - MME_APP_DEBUG("Handling imsi %"IMSI_FORMAT"\n", imsi); - - - if ((ue_context = mme_ue_context_exists_imsi(&mme_app_desc.mme_ue_contexts, - imsi)) == NULL) { - MME_APP_ERROR("That's embarrassing as we don't know this IMSI\n"); - MSC_LOG_EVENT( - MSC_MMEAPP_MME, - "0 NAS_AUTH_RESP Unknown imsi %"IMSI_FORMAT,imsi); - AssertFatal(0, "That's embarrassing as we don't know this IMSI\n"); - return -1; - } - - /* Consider the UE authenticated */ - ue_context->imsi_auth = IMSI_AUTHENTICATED; - - /* TODO: Get keys... */ - - /* Now generate S6A ULR */ - { - MessageDef *message_p = NULL; - s6a_update_location_req_t *s6a_ulr = NULL; - - message_p = itti_alloc_new_message(TASK_MME_APP, S6A_UPDATE_LOCATION_REQ); - - if (message_p == NULL) { - return -1; - } - - s6a_ulr = &message_p->ittiMsg.s6a_update_location_req; - - memcpy(s6a_ulr->imsi, nas_auth_resp_pP->imsi, 16); - s6a_ulr->initial_attach = INITIAL_ATTACH; - s6a_ulr->rat_type = RAT_EUTRAN; - /* Check if we already have UE data */ - s6a_ulr->skip_subscriber_data = 0; - - MSC_LOG_TX_MESSAGE( - MSC_MMEAPP_MME, - MSC_S6A_MME, - NULL,0, - " S6A_UPDATE_LOCATION_REQ IMSI %s RAT_EUTRAN", - imsi); - - return itti_send_msg_to_task(TASK_S6A, INSTANCE_DEFAULT, message_p); - } - return -1; -} - -int -mme_app_handle_authentication_info_answer( - const s6a_auth_info_ans_t * const s6a_auth_info_ans_pP) -{ - struct ue_context_s *ue_context = NULL; - uint64_t imsi = 0; - - DevAssert(s6a_auth_info_ans_pP != NULL); - - MME_APP_STRING_TO_IMSI((char *)s6a_auth_info_ans_pP->imsi, &imsi); - - MME_APP_DEBUG("Handling imsi %"IMSI_FORMAT"\n", imsi); - - - if ((ue_context = mme_ue_context_exists_imsi(&mme_app_desc.mme_ue_contexts, - imsi)) == NULL) { - MME_APP_ERROR("That's embarrassing as we don't know this IMSI\n"); - MSC_LOG_EVENT( - MSC_MMEAPP_MME, - "0 S6A_AUTH_INFO_ANS Unknown imsi %"IMSI_FORMAT,imsi); - return -1; - } - - if ((s6a_auth_info_ans_pP->result.present == S6A_RESULT_BASE) && - (s6a_auth_info_ans_pP->result.choice.base == DIAMETER_SUCCESS)) { - /* S6A procedure has succeeded. - * We have to request UE authentication. - */ - - /* Check that list is not empty and contain only one element */ - DevCheck(s6a_auth_info_ans_pP->auth_info.nb_of_vectors == 1, - s6a_auth_info_ans_pP->auth_info.nb_of_vectors, 1, 0); - - if (ue_context->vector_list == NULL) { - ue_context->vector_list = malloc(sizeof(eutran_vector_t)); - DevAssert(ue_context->vector_list != NULL); - } else { - /* Some vector already exist */ - ue_context->vector_list = realloc( - ue_context->vector_list, - (ue_context->nb_of_vectors + s6a_auth_info_ans_pP->auth_info.nb_of_vectors) * sizeof(eutran_vector_t)); - - DevAssert(ue_context->vector_list != NULL); - } - - memcpy(&ue_context->vector_list[ue_context->nb_of_vectors], - &s6a_auth_info_ans_pP->auth_info.eutran_vector, sizeof(eutran_vector_t)); - - ue_context->vector_in_use = &ue_context->vector_list[ue_context->nb_of_vectors]; - - ue_context->nb_of_vectors += s6a_auth_info_ans_pP->auth_info.nb_of_vectors; - - MME_APP_DEBUG("INFORMING NAS ABOUT AUTH RESP SUCCESS got %u vector(s)\n", - s6a_auth_info_ans_pP->auth_info.nb_of_vectors); - - mme_app_itti_auth_rsp(ue_context->ue_id, - 1, - &s6a_auth_info_ans_pP->auth_info.eutran_vector); - } else { - MME_APP_ERROR("INFORMING NAS ABOUT AUTH RESP ERROR CODE\n"); - MSC_LOG_EVENT( - MSC_MMEAPP_MME, - "0 S6A_AUTH_INFO_ANS S6A Failure imsi %"IMSI_FORMAT,imsi); - - - - /* Inform NAS layer with the right failure */ - if (s6a_auth_info_ans_pP->result.present == S6A_RESULT_BASE) { - mme_app_itti_auth_fail(ue_context->ue_id, s6a_error_2_nas_cause( - s6a_auth_info_ans_pP->result.choice.base, 0)); - } else { - mme_app_itti_auth_fail(ue_context->ue_id, s6a_error_2_nas_cause( - s6a_auth_info_ans_pP->result.choice.experimental, 1)); - } - } - - return 0; -} - - -void -mme_app_handle_nas_auth_param_req( - const nas_auth_param_req_t * const nas_auth_param_req_pP) -{ - plmn_t *visited_plmn = NULL; - struct ue_context_s *ue_context = NULL; - uint64_t imsi = 0; - int mnc_length = 0; - plmn_t visited_plmn_from_req = { - .MCCdigit3 = 0, - .MCCdigit2 = 0, - .MCCdigit1 = 0, - .MNCdigit1 = 0, - .MNCdigit2 = 0, - .MNCdigit3 = 0, - }; - DevAssert(nas_auth_param_req_pP != NULL); - - visited_plmn = &visited_plmn_from_req; - - visited_plmn_from_req.MCCdigit1 = nas_auth_param_req_pP->imsi[0]; - visited_plmn_from_req.MCCdigit2 = nas_auth_param_req_pP->imsi[1]; - visited_plmn_from_req.MCCdigit3 = nas_auth_param_req_pP->imsi[2]; - - mnc_length = find_mnc_length( - nas_auth_param_req_pP->imsi[0], - nas_auth_param_req_pP->imsi[1], - nas_auth_param_req_pP->imsi[2], - nas_auth_param_req_pP->imsi[3], - nas_auth_param_req_pP->imsi[4], - nas_auth_param_req_pP->imsi[5] - ); - - if (mnc_length == 2) { - visited_plmn_from_req.MNCdigit1 = nas_auth_param_req_pP->imsi[3]; - visited_plmn_from_req.MNCdigit2 = nas_auth_param_req_pP->imsi[4]; - visited_plmn_from_req.MNCdigit3 = 15; - } else if (mnc_length == 3) { - visited_plmn_from_req.MNCdigit1 = nas_auth_param_req_pP->imsi[3]; - visited_plmn_from_req.MNCdigit2 = nas_auth_param_req_pP->imsi[4]; - visited_plmn_from_req.MNCdigit3 = nas_auth_param_req_pP->imsi[5]; - } else { - AssertFatal(0, "MNC Not found (mcc_mnc_list)"); - } - - if (mnc_length == 3) { - MME_APP_DEBUG("%s visited_plmn_from_req %1d%1d%1d.%1d%1d%1d\n", - __FUNCTION__, - visited_plmn_from_req.MCCdigit1, - visited_plmn_from_req.MCCdigit2, - visited_plmn_from_req.MCCdigit3, - visited_plmn_from_req.MNCdigit1, - visited_plmn_from_req.MNCdigit2, - visited_plmn_from_req.MNCdigit3); - } else { - MME_APP_DEBUG("%s visited_plmn_from_req %1d%1d%1d.%1d%1d\n", - __FUNCTION__, - visited_plmn_from_req.MCCdigit1, - visited_plmn_from_req.MCCdigit2, - visited_plmn_from_req.MCCdigit3, - visited_plmn_from_req.MNCdigit1, - visited_plmn_from_req.MNCdigit2); - } - - MME_APP_STRING_TO_IMSI(nas_auth_param_req_pP->imsi, &imsi); - - MME_APP_DEBUG("%s Handling imsi %"IMSI_FORMAT"\n", __FUNCTION__, imsi); - MME_APP_DEBUG("%s Handling imsi from req %s (mnc length %d)\n", - __FUNCTION__, - nas_auth_param_req_pP->imsi, - mnc_length); - - /* Fetch the context associated with this IMSI */ - ue_context = mme_ue_context_exists_imsi(&mme_app_desc.mme_ue_contexts, imsi); - - if (ue_context == NULL) { - /* Currently no context available -> trigger an authentication request - * to the HSS. - */ - MME_APP_DEBUG("UE context search by IMSI failed, try by ue id\n"); - ue_context = mme_ue_context_exists_nas_ue_id(&mme_app_desc.mme_ue_contexts, nas_auth_param_req_pP->ue_id); - - if (ue_context == NULL) { - // should have been created by initial ue message - MME_APP_ERROR("UE context doesn't exist -> create one\n"); - - if ((ue_context = mme_create_new_ue_context()) == NULL) { - /* Error during ue context malloc */ - /* TODO */ - DevMessage("mme_create_new_ue_context"); - return; - } - - ue_context->ue_id = nas_auth_param_req_pP->ue_id; - ue_context->mme_ue_s1ap_id = nas_auth_param_req_pP->ue_id; - DevAssert(mme_insert_ue_context(&mme_app_desc.mme_ue_contexts, ue_context) == 0); - } - - ue_context->imsi = imsi; - - /* We have no vector for this UE, send an authentication request - * to the HSS. - */ - - /* Acquire the current time */ - time(&ue_context->cell_age); - - memcpy(&ue_context->guti.gummei.plmn, visited_plmn, sizeof(plmn_t)); - MME_APP_DEBUG("and we have no auth. vector for it, request" - " authentication information\n"); - mme_app_request_authentication_info(nas_auth_param_req_pP->imsi, 1, visited_plmn, NULL); - } else { - memcpy(&ue_context->guti.gummei.plmn, visited_plmn, sizeof(plmn_t)); - - mme_app_request_authentication_info(nas_auth_param_req_pP->imsi, 1, visited_plmn, nas_auth_param_req_pP->auts); - } -} diff --git a/openair-cn/MME_APP/mme_app_bearer.c b/openair-cn/MME_APP/mme_app_bearer.c deleted file mode 100644 index fd909b198e..0000000000 --- a/openair-cn/MME_APP/mme_app_bearer.c +++ /dev/null @@ -1,906 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -/*! \file mme_app_bearer.c -* \brief -* \author Sebastien ROUX, Lionel Gauthier -* \company Eurecom -* \email: lionel.gauthier@eurecom.fr -*/ -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "intertask_interface.h" -#include "mme_config.h" - -#include "mme_app_extern.h" -#include "mme_app_ue_context.h" -#include "mme_app_defs.h" -#include "sgw_lite_ie_defs.h" - -#include "secu_defs.h" - -#include "assertions.h" -#include "common_types.h" -#include "msc.h" - - -//------------------------------------------------------------------------------ -int -mme_app_send_s11_release_access_bearers_req( - struct ue_context_s * const ue_context_pP) -//------------------------------------------------------------------------------ -{ - uint8_t i = 0; - task_id_t to_task = TASK_UNKNOWN; - /* Keep the identifier to the default APN */ - context_identifier_t context_identifier; - MessageDef *message_p = NULL; - SgwReleaseAccessBearersRequest *release_access_bearers_request_p = NULL; - - - DevAssert(ue_context_pP != NULL); - -#if !defined(ENABLE_STANDALONE_EPC) - to_task = TASK_S11; -#else - to_task = TASK_SPGW_APP; -#endif - - message_p = itti_alloc_new_message(TASK_MME_APP, SGW_RELEASE_ACCESS_BEARERS_REQUEST); - release_access_bearers_request_p = &message_p->ittiMsg.sgwReleaseAccessBearersRequest; - memset(release_access_bearers_request_p, 0, sizeof(SgwReleaseAccessBearersRequest)); - - release_access_bearers_request_p->teid = ue_context_pP->sgw_s11_teid; - release_access_bearers_request_p->num_rabs = 1; - release_access_bearers_request_p->list_of_rabs[0] = ue_context_pP->default_bearer_id; - release_access_bearers_request_p->originating_node = NODE_TYPE_MME; - - MSC_LOG_TX_MESSAGE( - MSC_MMEAPP_MME, - (to_task == TASK_S11) ? MSC_S11_MME:MSC_SP_GWAPP_MME, - NULL,0, - "0 SGW_RELEASE_ACCESS_BEARERS_REQUEST teid %u ebi %u", - release_access_bearers_request_p->teid, - release_access_bearers_request_p->list_of_rabs[0]); - - itti_send_msg_to_task(to_task, INSTANCE_DEFAULT, message_p); -} - - - -//------------------------------------------------------------------------------ -int -mme_app_send_s11_create_session_req( - struct ue_context_s * const ue_context_pP) -//------------------------------------------------------------------------------ -{ - uint8_t i = 0; - task_id_t to_task = TASK_UNKNOWN; - /* Keep the identifier to the default APN */ - context_identifier_t context_identifier; - MessageDef *message_p = NULL; - SgwCreateSessionRequest *session_request_p = NULL; - struct apn_configuration_s *default_apn_p = NULL; - - - DevAssert(ue_context_pP != NULL); - -#if !defined(ENABLE_STANDALONE_EPC) - to_task = TASK_S11; -#else - to_task = TASK_SPGW_APP; -#endif - - - MME_APP_DEBUG("Handling imsi %"IMSI_FORMAT"\n", ue_context_pP->imsi); - - if (ue_context_pP->sub_status != SS_SERVICE_GRANTED) { - /* HSS rejected the bearer creation or roaming is not allowed for this - * UE. This result will trigger an ESM Failure message sent to UE. - */ - DevMessage("Not implemented: ACCESS NOT GRANTED, send ESM Failure to NAS\n"); - } - - message_p = itti_alloc_new_message(TASK_MME_APP, SGW_CREATE_SESSION_REQUEST); - - /* WARNING: - * Some parameters should be provided by NAS Layer: - * - ue_time_zone - * - mei - * - uli - * - uci - * Some parameters should be provided by HSS: - * - PGW address for CP - * - paa - * - ambr - * and by MME Application layer: - * - selection_mode - * Set these parameters with random values for now. - */ - - session_request_p = &message_p->ittiMsg.sgwCreateSessionRequest; - memset(session_request_p, 0, sizeof(SgwCreateSessionRequest)); - - /* As the create session request is the first exchanged message and as - * no tunnel had been previously setup, the distant teid is set to 0. - * The remote teid will be provided in the response message. - */ - session_request_p->teid = 0; - - MME_APP_IMSI_TO_STRING(ue_context_pP->imsi, (char *)session_request_p->imsi.digit); - // message content was set to 0 - session_request_p->imsi.length = strlen((const char *)session_request_p->imsi.digit); - - /* Copy the MSISDN */ - memcpy( - session_request_p->msisdn.digit, - ue_context_pP->msisdn, - ue_context_pP->msisdn_length); - session_request_p->msisdn.length = ue_context_pP->msisdn_length; - - session_request_p->rat_type = RAT_EUTRAN; - - /* Copy the subscribed ambr to the sgw create session request message */ - memcpy( - &session_request_p->ambr, - &ue_context_pP->subscribed_ambr, - sizeof(ambr_t)); - - if (ue_context_pP->apn_profile.nb_apns == 0) { - DevMessage("No APN returned by the HSS"); - } - - context_identifier = ue_context_pP->apn_profile.context_identifier; - - for (i = 0; i < ue_context_pP->apn_profile.nb_apns; i++) { - default_apn_p = &ue_context_pP->apn_profile.apn_configuration[i]; - - /* OK we got our default APN */ - if (default_apn_p->context_identifier == context_identifier) - break; - } - - if (!default_apn_p) { - /* Unfortunately we didn't find our default APN... */ - DevMessage("No default APN found"); - } - - memcpy(&session_request_p->bearer_to_create.bearer_level_qos.gbr, - &default_apn_p->ambr, sizeof(ambr_t)); - memcpy(&session_request_p->bearer_to_create.bearer_level_qos.mbr, - &default_apn_p->ambr, sizeof(ambr_t)); - - session_request_p->bearer_to_create.bearer_level_qos.qci = - default_apn_p->subscribed_qos.qci; - - session_request_p->bearer_to_create.bearer_level_qos.pvi = - default_apn_p->subscribed_qos.allocation_retention_priority.pre_emp_vulnerability; - session_request_p->bearer_to_create.bearer_level_qos.pci = - default_apn_p->subscribed_qos.allocation_retention_priority.pre_emp_capability; - session_request_p->bearer_to_create.bearer_level_qos.pl = - default_apn_p->subscribed_qos.allocation_retention_priority.priority_level; - - /* Asking for default bearer in initial UE message. - * Use the address of ue_context as unique TEID: Need to find better here - * and will generate unique id only for 32 bits platforms. - */ - session_request_p->sender_fteid_for_cp.teid = (uint32_t)ue_context_pP; - session_request_p->sender_fteid_for_cp.interface_type = S11_MME_GTP_C; - session_request_p->bearer_to_create.eps_bearer_id = 5; - - ue_context_pP->mme_s11_teid = session_request_p->sender_fteid_for_cp.teid; - ue_context_pP->sgw_s11_teid = 0; - - memcpy(session_request_p->apn, default_apn_p->service_selection, - default_apn_p->service_selection_length); - - /* Set PDN type for pdn_type and PAA even if this IE is redundant */ - session_request_p->pdn_type = default_apn_p->pdn_type; - session_request_p->paa.pdn_type = default_apn_p->pdn_type; - - if (default_apn_p->nb_ip_address == 0) { - /* UE DHCPv4 allocated ip address */ - memset(session_request_p->paa.ipv4_address, 0, 4); - memset(session_request_p->paa.ipv6_address, 0, 16); - } else { - uint8_t j; - - for (j = 0; j < default_apn_p->nb_ip_address; j++) { - ip_address_t *ip_address; - ip_address = &default_apn_p->ip_address[j]; - - if (ip_address->pdn_type == IPv4) { - memcpy(session_request_p->paa.ipv4_address, ip_address->address.ipv4_address, 4); - } else if (ip_address->pdn_type == IPv6) { - memcpy(session_request_p->paa.ipv6_address, ip_address->address.ipv6_address, 16); - } - - // free(ip_address); - } - } - - if ((ue_context_pP->pending_pdn_connectivity_req_pco.length >= PCO_MIN_LENGTH) && (ue_context_pP->pending_pdn_connectivity_req_pco.length <= PCO_MAX_LENGTH)) { - memcpy(&session_request_p->pco.byte[0], - &ue_context_pP->pending_pdn_connectivity_req_pco.byte[0], - ue_context_pP->pending_pdn_connectivity_req_pco.length); - session_request_p->pco.length = ue_context_pP->pending_pdn_connectivity_req_pco.length; - } - - config_read_lock(&mme_config); - session_request_p->peer_ip = mme_config.ipv4.sgw_ip_address_for_S11; - config_unlock(&mme_config); - - session_request_p->serving_network.mcc[0] = ue_context_pP->e_utran_cgi.plmn.MCCdigit1; - session_request_p->serving_network.mcc[1] = ue_context_pP->e_utran_cgi.plmn.MCCdigit2; - session_request_p->serving_network.mcc[2] = ue_context_pP->e_utran_cgi.plmn.MCCdigit3; - - session_request_p->serving_network.mnc[0] = ue_context_pP->e_utran_cgi.plmn.MNCdigit1; - session_request_p->serving_network.mnc[1] = ue_context_pP->e_utran_cgi.plmn.MNCdigit2; - session_request_p->serving_network.mnc[2] = ue_context_pP->e_utran_cgi.plmn.MNCdigit3; - - session_request_p->selection_mode = MS_O_N_P_APN_S_V; - - MSC_LOG_TX_MESSAGE( - MSC_MMEAPP_MME, - (to_task == TASK_S11) ? MSC_S11_MME:MSC_SP_GWAPP_MME, - NULL,0, - "0 SGW_CREATE_SESSION_REQUEST imsi %"IMSI_FORMAT,ue_context_pP->imsi); - - return itti_send_msg_to_task(to_task, INSTANCE_DEFAULT, message_p); -} - - - -//------------------------------------------------------------------------------ -int -mme_app_handle_nas_pdn_connectivity_req( - nas_pdn_connectivity_req_t * const nas_pdn_connectivity_req_pP) -//------------------------------------------------------------------------------ -{ - struct ue_context_s *ue_context_p = NULL; - uint64_t imsi = 0; - - MME_APP_DEBUG("Received NAS_PDN_CONNECTIVITY_REQ from NAS\n"); - DevAssert(nas_pdn_connectivity_req_pP != NULL); - - MME_APP_STRING_TO_IMSI((char *)nas_pdn_connectivity_req_pP->imsi, &imsi); - - MME_APP_DEBUG("Handling imsi %"IMSI_FORMAT"\n", imsi); - - - if ((ue_context_p = mme_ue_context_exists_imsi(&mme_app_desc.mme_ue_contexts, - imsi)) == NULL) { - MSC_LOG_EVENT( - MSC_MMEAPP_MME, - "NAS_PDN_CONNECTIVITY_REQ Unknown imsi %"IMSI_FORMAT,imsi); - MME_APP_ERROR("That's embarrassing as we don't know this IMSI\n"); - return -1; - } - - /* Consider the UE authenticated */ - ue_context_p->imsi_auth = IMSI_AUTHENTICATED; - - // Temp: save request, in near future merge wisely params in context - memset(ue_context_p->pending_pdn_connectivity_req_imsi,0, 16); - AssertFatal((nas_pdn_connectivity_req_pP->imsi_length > 0) && - (nas_pdn_connectivity_req_pP->imsi_length < 16), - "BAD IMSI LENGTH %d", nas_pdn_connectivity_req_pP->imsi_length); - - AssertFatal((nas_pdn_connectivity_req_pP->imsi_length > 0) && - (nas_pdn_connectivity_req_pP->imsi_length < 16), - "STOP ON IMSI LENGTH %d", nas_pdn_connectivity_req_pP->imsi_length); - memcpy(ue_context_p->pending_pdn_connectivity_req_imsi, - nas_pdn_connectivity_req_pP->imsi, - nas_pdn_connectivity_req_pP->imsi_length); - ue_context_p->pending_pdn_connectivity_req_imsi_length = nas_pdn_connectivity_req_pP->imsi_length; - DUP_OCTET_STRING(nas_pdn_connectivity_req_pP->apn, ue_context_p->pending_pdn_connectivity_req_apn); - FREE_OCTET_STRING(nas_pdn_connectivity_req_pP->apn) - // dup OctetString - DUP_OCTET_STRING(nas_pdn_connectivity_req_pP->pdn_addr, ue_context_p->pending_pdn_connectivity_req_pdn_addr); - FREE_OCTET_STRING(nas_pdn_connectivity_req_pP->pdn_addr) - ue_context_p->pending_pdn_connectivity_req_pti = nas_pdn_connectivity_req_pP->pti; - ue_context_p->pending_pdn_connectivity_req_ue_id = nas_pdn_connectivity_req_pP->ue_id; - - memcpy(&ue_context_p->pending_pdn_connectivity_req_pco.byte[0], - &nas_pdn_connectivity_req_pP->pco.byte[0], - nas_pdn_connectivity_req_pP->pco.length); - ue_context_p->pending_pdn_connectivity_req_pco.length = nas_pdn_connectivity_req_pP->pco.length; - - memcpy(&ue_context_p->pending_pdn_connectivity_req_qos, - &nas_pdn_connectivity_req_pP->qos, - sizeof(network_qos_t)); - ue_context_p->pending_pdn_connectivity_req_proc_data = nas_pdn_connectivity_req_pP->proc_data; - nas_pdn_connectivity_req_pP->proc_data = NULL; - ue_context_p->pending_pdn_connectivity_req_request_type = nas_pdn_connectivity_req_pP->request_type; - - //if ((nas_pdn_connectivity_req_pP->apn.value == NULL) || (nas_pdn_connectivity_req_pP->apn.length == 0)) { - /* TODO: Get keys... */ - /* Now generate S6A ULR */ - return mme_app_send_s6a_update_location_req(ue_context_p); - //} else { - //return mme_app_send_s11_create_session_req(ue_context_p); - - //} - //return -1; -} - - - -// sent by NAS -//------------------------------------------------------------------------------ -void -mme_app_handle_conn_est_cnf( - const nas_conn_est_cnf_t * const nas_conn_est_cnf_pP) -//------------------------------------------------------------------------------ -{ - struct ue_context_s *ue_context_p = NULL; - MessageDef *message_p = NULL; - mme_app_connection_establishment_cnf_t *establishment_cnf_p = NULL; - bearer_context_t *current_bearer_p = NULL; - ebi_t bearer_id = 0; - uint8_t keNB[32]; - - MME_APP_DEBUG("Received NAS_CONNECTION_ESTABLISHMENT_CNF from NAS\n"); - - ue_context_p = mme_ue_context_exists_nas_ue_id(&mme_app_desc.mme_ue_contexts, nas_conn_est_cnf_pP->UEid); - - - if (ue_context_p == NULL) { - MSC_LOG_EVENT( - MSC_MMEAPP_MME, - "NAS_CONNECTION_ESTABLISHMENT_CNF Unknown ue %u",nas_conn_est_cnf_pP->UEid); - MME_APP_ERROR("UE context doesn't exist for UE %06"PRIX32"/dec%u\n", - nas_conn_est_cnf_pP->UEid, - nas_conn_est_cnf_pP->UEid); - return; - } - - message_p = itti_alloc_new_message(TASK_MME_APP, MME_APP_CONNECTION_ESTABLISHMENT_CNF); - establishment_cnf_p = &message_p->ittiMsg.mme_app_connection_establishment_cnf; - memset(establishment_cnf_p, 0, sizeof(mme_app_connection_establishment_cnf_t)); - - memcpy(&establishment_cnf_p->nas_conn_est_cnf, - nas_conn_est_cnf_pP, - sizeof(nas_conn_est_cnf_t)); - - bearer_id = ue_context_p->default_bearer_id; - current_bearer_p = &ue_context_p->eps_bearers[bearer_id]; - establishment_cnf_p->eps_bearer_id = bearer_id; - - establishment_cnf_p->bearer_s1u_sgw_fteid.interface_type = S1_U_SGW_GTP_U; - establishment_cnf_p->bearer_s1u_sgw_fteid.teid = current_bearer_p->s_gw_teid; - - if ((current_bearer_p->s_gw_address.pdn_type == IPv4) || - (current_bearer_p->s_gw_address.pdn_type == IPv4_AND_v6)) { - establishment_cnf_p->bearer_s1u_sgw_fteid.ipv4 = 1; - memcpy(&establishment_cnf_p->bearer_s1u_sgw_fteid.ipv4_address, - current_bearer_p->s_gw_address.address.ipv4_address, - 4); - } - - if ((current_bearer_p->s_gw_address.pdn_type == IPv6) || - (current_bearer_p->s_gw_address.pdn_type == IPv4_AND_v6)) { - establishment_cnf_p->bearer_s1u_sgw_fteid.ipv6 = 1; - memcpy(establishment_cnf_p->bearer_s1u_sgw_fteid.ipv6_address, - current_bearer_p->s_gw_address.address.ipv6_address, - 16); - } - - establishment_cnf_p->bearer_qos_qci = current_bearer_p->qci; - establishment_cnf_p->bearer_qos_prio_level = current_bearer_p->prio_level; - establishment_cnf_p->bearer_qos_pre_emp_vulnerability = current_bearer_p->pre_emp_vulnerability; - establishment_cnf_p->bearer_qos_pre_emp_capability = current_bearer_p->pre_emp_capability; -#warning "Check ue_context_p ambr" - establishment_cnf_p->ambr.br_ul = ue_context_p->subscribed_ambr.br_ul; - establishment_cnf_p->ambr.br_dl = ue_context_p->subscribed_ambr.br_dl; - - establishment_cnf_p->security_capabilities_encryption_algorithms = nas_conn_est_cnf_pP->selected_encryption_algorithm; - establishment_cnf_p->security_capabilities_integrity_algorithms = nas_conn_est_cnf_pP->selected_integrity_algorithm; - MME_APP_DEBUG("security_capabilities_encryption_algorithms 0x%04X\n", establishment_cnf_p->security_capabilities_encryption_algorithms); - MME_APP_DEBUG("security_capabilities_integrity_algorithms 0x%04X\n", establishment_cnf_p->security_capabilities_integrity_algorithms); - - MME_APP_DEBUG("Derive keNB with UL NAS COUNT %x\n", nas_conn_est_cnf_pP->ul_nas_count); - derive_keNB(ue_context_p->vector_in_use->kasme, nas_conn_est_cnf_pP->ul_nas_count, keNB); //156 - memcpy(establishment_cnf_p->keNB, keNB, 32); - - MSC_LOG_TX_MESSAGE( - MSC_MMEAPP_MME, - MSC_S1AP_MME, - NULL,0, - "0 MME_APP_CONNECTION_ESTABLISHMENT_CNF ebi %u s1u_sgw teid %u qci %u prio level %u sea 0x%x sia 0x%x", - establishment_cnf_p->eps_bearer_id, - establishment_cnf_p->bearer_s1u_sgw_fteid.teid, - establishment_cnf_p->bearer_qos_qci, - establishment_cnf_p->bearer_qos_prio_level, - establishment_cnf_p->security_capabilities_encryption_algorithms, - establishment_cnf_p->security_capabilities_integrity_algorithms); - - itti_send_msg_to_task(TASK_S1AP, INSTANCE_DEFAULT, message_p); -} - - - -// sent by S1AP -//------------------------------------------------------------------------------ -void -mme_app_handle_conn_est_ind( - const mme_app_connection_establishment_ind_t * const conn_est_ind_pP) -//------------------------------------------------------------------------------ -{ - struct ue_context_s *ue_context_p = NULL; - MessageDef *message_p = NULL; - - MME_APP_DEBUG("Received MME_APP_CONNECTION_ESTABLISHMENT_IND from S1AP\n"); - - ue_context_p = mme_ue_context_exists_mme_ue_s1ap_id( - &mme_app_desc.mme_ue_contexts, - conn_est_ind_pP->mme_ue_s1ap_id); - - - - if (ue_context_p == NULL) { - MME_APP_DEBUG("We didn't find this mme_ue_s1ap_id in list of UE: %06"PRIX32"/dec%u\n", - conn_est_ind_pP->mme_ue_s1ap_id, - conn_est_ind_pP->mme_ue_s1ap_id); - MME_APP_DEBUG("UE context doesn't exist -> create one\n"); - - if ((ue_context_p = mme_create_new_ue_context()) == NULL) { - /* Error during ue context malloc */ - /* TODO */ - DevMessage("mme_create_new_ue_context"); - return; - } - - // S1AP UE ID AND NAS UE ID ARE THE SAME - ue_context_p->mme_ue_s1ap_id = conn_est_ind_pP->mme_ue_s1ap_id; - ue_context_p->ue_id = conn_est_ind_pP->mme_ue_s1ap_id; - DevAssert(mme_insert_ue_context(&mme_app_desc.mme_ue_contexts, ue_context_p) == 0); - - // tests - ue_context_p = mme_ue_context_exists_mme_ue_s1ap_id( - &mme_app_desc.mme_ue_contexts, - conn_est_ind_pP->mme_ue_s1ap_id); - AssertFatal(ue_context_p != NULL, "mme_ue_context_exists_mme_ue_s1ap_id Failed"); - ue_context_p = mme_ue_context_exists_nas_ue_id( - &mme_app_desc.mme_ue_contexts, - conn_est_ind_pP->mme_ue_s1ap_id); - AssertFatal(ue_context_p != NULL, "mme_ue_context_exists_nas_ue_id Failed"); - } - - message_p = itti_alloc_new_message(TASK_MME_APP, NAS_CONNECTION_ESTABLISHMENT_IND); - memcpy(&NAS_CONN_EST_IND(message_p).nas, - &conn_est_ind_pP->nas, - sizeof (nas_establish_ind_t)); - - - MSC_LOG_TX_MESSAGE( - MSC_MMEAPP_MME, - MSC_NAS_MME, - NULL,0, - "0 NAS_CONNECTION_ESTABLISHMENT_IND"); - - itti_send_msg_to_task(TASK_NAS_MME, INSTANCE_DEFAULT, message_p); -} - - - -//------------------------------------------------------------------------------ -int -mme_app_handle_create_sess_resp( - const SgwCreateSessionResponse * const create_sess_resp_pP) -//------------------------------------------------------------------------------ -{ - struct ue_context_s *ue_context_p = NULL; - bearer_context_t *current_bearer_p = NULL; - MessageDef *message_p = NULL; - - int16_t bearer_id; - - DevAssert(create_sess_resp_pP != NULL); - - MME_APP_DEBUG("Received SGW_CREATE_SESSION_RESPONSE from S+P-GW\n"); - - ue_context_p = mme_ue_context_exists_s11_teid(&mme_app_desc.mme_ue_contexts, - create_sess_resp_pP->teid); - - - if (ue_context_p == NULL) { - MME_APP_DEBUG("We didn't find this teid in list of UE: %08x\n", - create_sess_resp_pP->teid); - return -1; - } - - /* Store the S-GW teid */ - ue_context_p->sgw_s11_teid = create_sess_resp_pP->s11_sgw_teid.teid; - - //--------------------------------------------------------- - // Process SgwCreateSessionResponse.bearer_context_created - //--------------------------------------------------------- - bearer_id = create_sess_resp_pP->bearer_context_created.eps_bearer_id/* - 5*/; - /* Depending on s11 result we have to send reject or accept for bearers */ - DevCheck((bearer_id < BEARERS_PER_UE) && (bearer_id >= 0), - bearer_id, - BEARERS_PER_UE, - 0); - ue_context_p->default_bearer_id = bearer_id; - - if (create_sess_resp_pP->bearer_context_created.cause != REQUEST_ACCEPTED) { - DevMessage("Cases where bearer cause != REQUEST_ACCEPTED are not handled\n"); - } - - DevAssert(create_sess_resp_pP->bearer_context_created.s1u_sgw_fteid.interface_type == S1_U_SGW_GTP_U); - - /* Updating statistics */ - mme_app_desc.mme_ue_contexts.nb_bearers_managed++; - mme_app_desc.mme_ue_contexts.nb_bearers_since_last_stat++; - - current_bearer_p = &ue_context_p->eps_bearers[bearer_id]; - current_bearer_p->s_gw_teid = create_sess_resp_pP->bearer_context_created.s1u_sgw_fteid.teid; - - switch (create_sess_resp_pP->bearer_context_created.s1u_sgw_fteid.ipv4 + - (create_sess_resp_pP->bearer_context_created.s1u_sgw_fteid.ipv6 << 1)) { - default: - case 0: { - /* No address provided: impossible case */ - DevMessage("No ip address for user-plane provided...\n"); - } - break; - - case 1: { - /* Only IPv4 address */ - current_bearer_p->s_gw_address.pdn_type = IPv4; - memcpy(current_bearer_p->s_gw_address.address.ipv4_address, - &create_sess_resp_pP->bearer_context_created.s1u_sgw_fteid.ipv4_address, 4); - } - break; - - case 2: { - /* Only IPv6 address */ - current_bearer_p->s_gw_address.pdn_type = IPv6; - memcpy(current_bearer_p->s_gw_address.address.ipv6_address, - create_sess_resp_pP->bearer_context_created.s1u_sgw_fteid.ipv6_address, 16); - } - break; - - case 3: { - /* Both IPv4 and Ipv6 */ - current_bearer_p->s_gw_address.pdn_type = IPv4_AND_v6; - memcpy(current_bearer_p->s_gw_address.address.ipv4_address, - &create_sess_resp_pP->bearer_context_created.s1u_sgw_fteid.ipv4_address, 4); - memcpy(current_bearer_p->s_gw_address.address.ipv6_address, - create_sess_resp_pP->bearer_context_created.s1u_sgw_fteid.ipv6_address, 16); - } - break; - } - - current_bearer_p->p_gw_teid = create_sess_resp_pP->bearer_context_created.s5_s8_u_pgw_fteid.teid; - memset(¤t_bearer_p->p_gw_address,0, sizeof(ip_address_t)); - - if (create_sess_resp_pP->bearer_context_created.bearer_level_qos != NULL) { - current_bearer_p->qci = create_sess_resp_pP->bearer_context_created.bearer_level_qos->qci; - current_bearer_p->prio_level = create_sess_resp_pP->bearer_context_created.bearer_level_qos->pl; - current_bearer_p->pre_emp_vulnerability = create_sess_resp_pP->bearer_context_created.bearer_level_qos->pvi; - current_bearer_p->pre_emp_capability = create_sess_resp_pP->bearer_context_created.bearer_level_qos->pci; - MME_APP_DEBUG("%s set qci %u in bearer %u\n", - __FUNCTION__, - current_bearer_p->qci, - ue_context_p->default_bearer_id); - } else { - // if null, it is not modified - //current_bearer_p->qci = ue_context_p->pending_pdn_connectivity_req_qos.qci; -#warning "may force QCI here to 9" - current_bearer_p->qci = 9; - current_bearer_p->prio_level = 1; - current_bearer_p->pre_emp_vulnerability = 0; - current_bearer_p->pre_emp_capability = 0; - MME_APP_DEBUG("%s set qci %u in bearer %u (qos not modified by S/P-GW)\n", - __FUNCTION__, - current_bearer_p->qci, - ue_context_p->default_bearer_id); - } - - mme_app_dump_ue_contexts(&mme_app_desc.mme_ue_contexts); - - { - //uint8_t *keNB = NULL; - - message_p = itti_alloc_new_message(TASK_MME_APP, NAS_PDN_CONNECTIVITY_RSP); - memset((void*)&message_p->ittiMsg.nas_pdn_connectivity_rsp, - 0, - sizeof(nas_pdn_connectivity_rsp_t)); - - // moved to NAS_CONNECTION_ESTABLISHMENT_CONF, keNB not handled in NAS MME - //derive_keNB(ue_context_p->vector_in_use->kasme, 156, &keNB); - //memcpy(NAS_PDN_CONNECTIVITY_RSP(message_p).keNB, keNB, 32); - - //free(keNB); - - NAS_PDN_CONNECTIVITY_RSP(message_p).pti = ue_context_p->pending_pdn_connectivity_req_pti; // NAS internal ref - NAS_PDN_CONNECTIVITY_RSP(message_p).ue_id = ue_context_p->pending_pdn_connectivity_req_ue_id; // NAS internal ref - - // TO REWORK: - if ((ue_context_p->pending_pdn_connectivity_req_apn.value != NULL) - && (ue_context_p->pending_pdn_connectivity_req_apn.length != 0)) { - DUP_OCTET_STRING( - ue_context_p->pending_pdn_connectivity_req_apn, - NAS_PDN_CONNECTIVITY_RSP(message_p).apn); - MME_APP_DEBUG("SET APN FROM NAS PDN CONNECTIVITY CREATE: %s\n", NAS_PDN_CONNECTIVITY_RSP(message_p).apn.value); - } else { - int i; - context_identifier_t context_identifier = ue_context_p->apn_profile.context_identifier; - - for (i = 0; i < ue_context_p->apn_profile.nb_apns; i++) { - if (ue_context_p->apn_profile.apn_configuration[i].context_identifier == context_identifier) { - AssertFatal(ue_context_p->apn_profile.apn_configuration[i].service_selection_length > 0, "Bad APN string (len = 0)"); - - if (ue_context_p->apn_profile.apn_configuration[i].service_selection_length > 0) { - NAS_PDN_CONNECTIVITY_RSP(message_p).apn.value = malloc(ue_context_p->apn_profile.apn_configuration[i].service_selection_length + 1); - NAS_PDN_CONNECTIVITY_RSP(message_p).apn.length = ue_context_p->apn_profile.apn_configuration[i].service_selection_length; - AssertFatal(ue_context_p->apn_profile.apn_configuration[i].service_selection_length <= APN_MAX_LENGTH, - "Bad APN string length %d", - ue_context_p->apn_profile.apn_configuration[i].service_selection_length); - memcpy(NAS_PDN_CONNECTIVITY_RSP(message_p).apn.value, - ue_context_p->apn_profile.apn_configuration[i].service_selection, - ue_context_p->apn_profile.apn_configuration[i].service_selection_length); - NAS_PDN_CONNECTIVITY_RSP(message_p).apn.value[ue_context_p->apn_profile.apn_configuration[i].service_selection_length] = '\0'; - MME_APP_DEBUG("SET APN FROM HSS ULA: %s\n", NAS_PDN_CONNECTIVITY_RSP(message_p).apn.value); - break; - } - } - } - } - - MME_APP_DEBUG("APN: %s\n", NAS_PDN_CONNECTIVITY_RSP(message_p).apn.value); - - switch (create_sess_resp_pP->paa.pdn_type) { - case IPv4: - NAS_PDN_CONNECTIVITY_RSP(message_p).pdn_addr.length = 4; - NAS_PDN_CONNECTIVITY_RSP(message_p).pdn_addr.value = malloc(NAS_PDN_CONNECTIVITY_RSP(message_p).pdn_addr.length+1); - DevAssert(NAS_PDN_CONNECTIVITY_RSP(message_p).pdn_addr.value != NULL); - memcpy( - NAS_PDN_CONNECTIVITY_RSP(message_p).pdn_addr.value, - create_sess_resp_pP->paa.ipv4_address, - NAS_PDN_CONNECTIVITY_RSP(message_p).pdn_addr.length); - NAS_PDN_CONNECTIVITY_RSP(message_p).pdn_addr.value[NAS_PDN_CONNECTIVITY_RSP(message_p).pdn_addr.length] = '0'; - break; - - case IPv6: - DevAssert(create_sess_resp_pP->paa.ipv6_prefix_length == 64); // NAS seems to only support 64 bits - NAS_PDN_CONNECTIVITY_RSP(message_p).pdn_addr.length = create_sess_resp_pP->paa.ipv6_prefix_length/8; - NAS_PDN_CONNECTIVITY_RSP(message_p).pdn_addr.value = malloc(NAS_PDN_CONNECTIVITY_RSP(message_p).pdn_addr.length+1); - DevAssert(NAS_PDN_CONNECTIVITY_RSP(message_p).pdn_addr.value != NULL); - memcpy( - NAS_PDN_CONNECTIVITY_RSP(message_p).pdn_addr.value, - create_sess_resp_pP->paa.ipv6_address, - NAS_PDN_CONNECTIVITY_RSP(message_p).pdn_addr.length); - NAS_PDN_CONNECTIVITY_RSP(message_p).pdn_addr.value[NAS_PDN_CONNECTIVITY_RSP(message_p).pdn_addr.length] = '0'; - break; - - case IPv4_AND_v6: - DevAssert(create_sess_resp_pP->paa.ipv6_prefix_length == 64); // NAS seems to only support 64 bits - NAS_PDN_CONNECTIVITY_RSP(message_p).pdn_addr.length = 4 + create_sess_resp_pP->paa.ipv6_prefix_length/8; - NAS_PDN_CONNECTIVITY_RSP(message_p).pdn_addr.value = malloc(NAS_PDN_CONNECTIVITY_RSP(message_p).pdn_addr.length+1); - DevAssert(NAS_PDN_CONNECTIVITY_RSP(message_p).pdn_addr.value != NULL); - memcpy( - NAS_PDN_CONNECTIVITY_RSP(message_p).pdn_addr.value, - create_sess_resp_pP->paa.ipv4_address, - 4); - memcpy( - &NAS_PDN_CONNECTIVITY_RSP(message_p).pdn_addr.value[4], - create_sess_resp_pP->paa.ipv6_address, - create_sess_resp_pP->paa.ipv6_prefix_length/8); - NAS_PDN_CONNECTIVITY_RSP(message_p).pdn_addr.value[NAS_PDN_CONNECTIVITY_RSP(message_p).pdn_addr.length] = '0'; - break; - - case IPv4_OR_v6: - NAS_PDN_CONNECTIVITY_RSP(message_p).pdn_addr.length = 4; - NAS_PDN_CONNECTIVITY_RSP(message_p).pdn_addr.value = malloc(NAS_PDN_CONNECTIVITY_RSP(message_p).pdn_addr.length+1); - DevAssert(NAS_PDN_CONNECTIVITY_RSP(message_p).pdn_addr.value != NULL); - memcpy( - NAS_PDN_CONNECTIVITY_RSP(message_p).pdn_addr.value, - create_sess_resp_pP->paa.ipv4_address, - NAS_PDN_CONNECTIVITY_RSP(message_p).pdn_addr.length); - NAS_PDN_CONNECTIVITY_RSP(message_p).pdn_addr.value[NAS_PDN_CONNECTIVITY_RSP(message_p).pdn_addr.length] = '0'; - break; - - default: - DevAssert(0); - } - - NAS_PDN_CONNECTIVITY_RSP(message_p).pdn_type = create_sess_resp_pP->paa.pdn_type; - NAS_PDN_CONNECTIVITY_RSP(message_p).proc_data = ue_context_p->pending_pdn_connectivity_req_proc_data; // NAS internal ref - ue_context_p->pending_pdn_connectivity_req_proc_data = NULL; - -#warning "QOS hardcoded here" - //memcpy(&NAS_PDN_CONNECTIVITY_RSP(message_p).qos, - // &ue_context_p->pending_pdn_connectivity_req_qos, - // sizeof(network_qos_t)); - NAS_PDN_CONNECTIVITY_RSP(message_p).qos.gbrUL = 64; /* 64=64kb/s Guaranteed Bit Rate for uplink */ - NAS_PDN_CONNECTIVITY_RSP(message_p).qos.gbrDL = 120; /* 120=512kb/s Guaranteed Bit Rate for downlink */ - NAS_PDN_CONNECTIVITY_RSP(message_p).qos.mbrUL = 72; /* 72=128kb/s Maximum Bit Rate for uplink */ - NAS_PDN_CONNECTIVITY_RSP(message_p).qos.mbrDL = 135; /*135=1024kb/s Maximum Bit Rate for downlink */ - NAS_PDN_CONNECTIVITY_RSP(message_p).qos.qci = 9; /* QoS Class Identifier */ - - NAS_PDN_CONNECTIVITY_RSP(message_p).request_type = ue_context_p->pending_pdn_connectivity_req_request_type; // NAS internal ref - ue_context_p->pending_pdn_connectivity_req_request_type = 0; - - // here at this point OctetString are saved in resp, no loss of memory (apn, pdn_addr) - - NAS_PDN_CONNECTIVITY_RSP(message_p).eNB_ue_s1ap_id = ue_context_p->eNB_ue_s1ap_id; - NAS_PDN_CONNECTIVITY_RSP(message_p).mme_ue_s1ap_id = ue_context_p->mme_ue_s1ap_id; - - NAS_PDN_CONNECTIVITY_RSP(message_p).ebi = bearer_id; - - NAS_PDN_CONNECTIVITY_RSP(message_p).qci = current_bearer_p->qci; - NAS_PDN_CONNECTIVITY_RSP(message_p).prio_level = current_bearer_p->prio_level; - NAS_PDN_CONNECTIVITY_RSP(message_p).pre_emp_vulnerability = current_bearer_p->pre_emp_vulnerability; - NAS_PDN_CONNECTIVITY_RSP(message_p).pre_emp_capability = current_bearer_p->pre_emp_capability; - - NAS_PDN_CONNECTIVITY_RSP(message_p).sgw_s1u_teid = current_bearer_p->s_gw_teid; - memcpy(&NAS_PDN_CONNECTIVITY_RSP(message_p).sgw_s1u_address, - ¤t_bearer_p->s_gw_address, sizeof(ip_address_t)); - - NAS_PDN_CONNECTIVITY_RSP(message_p).ambr.br_ul = ue_context_p->subscribed_ambr.br_ul; - NAS_PDN_CONNECTIVITY_RSP(message_p).ambr.br_dl = ue_context_p->subscribed_ambr.br_dl; - - - memcpy(&NAS_PDN_CONNECTIVITY_RSP(message_p).pco.byte[0], - &create_sess_resp_pP->pco.byte[0], - create_sess_resp_pP->pco.length); - NAS_PDN_CONNECTIVITY_RSP(message_p).pco.length = create_sess_resp_pP->pco.length; - - MSC_LOG_TX_MESSAGE( - MSC_MMEAPP_MME, - MSC_NAS_MME, - NULL,0, - "0 NAS_PDN_CONNECTIVITY_RSP sgw_s1u_teid %u ebi %u qci %u prio %u", - current_bearer_p->s_gw_teid, - bearer_id, - current_bearer_p->qci, - current_bearer_p->prio_level); - - return itti_send_msg_to_task(TASK_NAS_MME, INSTANCE_DEFAULT, message_p); - } - return 0; -} - - - -//------------------------------------------------------------------------------ -void -mme_app_handle_initial_context_setup_rsp( - const mme_app_initial_context_setup_rsp_t * const initial_ctxt_setup_rsp_pP) -//------------------------------------------------------------------------------ -{ - struct ue_context_s *ue_context_p = NULL; - MessageDef *message_p = NULL; - task_id_t to_task = TASK_UNKNOWN; - - MME_APP_DEBUG("Received MME_APP_INITIAL_CONTEXT_SETUP_RSP from S1AP\n"); - - ue_context_p = mme_ue_context_exists_mme_ue_s1ap_id( - &mme_app_desc.mme_ue_contexts, - initial_ctxt_setup_rsp_pP->mme_ue_s1ap_id); - - - if (ue_context_p == NULL) { - MME_APP_DEBUG("We didn't find this mme_ue_s1ap_id in list of UE: %08x %d(dec)\n", - initial_ctxt_setup_rsp_pP->mme_ue_s1ap_id, - initial_ctxt_setup_rsp_pP->mme_ue_s1ap_id); - MSC_LOG_EVENT( - MSC_MMEAPP_MME, - "MME_APP_INITIAL_CONTEXT_SETUP_RSP Unknown ue %u",initial_ctxt_setup_rsp_pP->mme_ue_s1ap_id); - return; - } - -#if !defined(ENABLE_STANDALONE_EPC) - to_task = TASK_S11; -#else - to_task = TASK_SPGW_APP; -#endif - - message_p = itti_alloc_new_message(TASK_MME_APP, SGW_MODIFY_BEARER_REQUEST); - - AssertFatal(message_p != NULL, "itti_alloc_new_message Failed"); - memset((void*)&message_p->ittiMsg.sgwModifyBearerRequest, - 0, - sizeof(SgwModifyBearerRequest)); - - SGW_MODIFY_BEARER_REQUEST(message_p).teid = ue_context_p->sgw_s11_teid; - - /* Delay Value in integer multiples of 50 millisecs, or zero */ - SGW_MODIFY_BEARER_REQUEST(message_p).delay_dl_packet_notif_req = 0; // TO DO - - SGW_MODIFY_BEARER_REQUEST(message_p).bearer_context_to_modify.eps_bearer_id = initial_ctxt_setup_rsp_pP->eps_bearer_id; - memcpy(&SGW_MODIFY_BEARER_REQUEST(message_p).bearer_context_to_modify.s1_eNB_fteid, - &initial_ctxt_setup_rsp_pP->bearer_s1u_enb_fteid, - sizeof(SGW_MODIFY_BEARER_REQUEST(message_p).bearer_context_to_modify.s1_eNB_fteid)); - - SGW_MODIFY_BEARER_REQUEST(message_p).mme_fq_csid.node_id_type = GLOBAL_UNICAST_IPv4; // TO DO - SGW_MODIFY_BEARER_REQUEST(message_p).mme_fq_csid.csid = 0; // TO DO ... - SGW_MODIFY_BEARER_REQUEST(message_p).indication_flags = 0; // TO DO - SGW_MODIFY_BEARER_REQUEST(message_p).rat_type = RAT_EUTRAN; - - /* S11 stack specific parameter. Not used in standalone epc mode */ - SGW_MODIFY_BEARER_REQUEST(message_p).trxn = NULL; - - - MSC_LOG_TX_MESSAGE( - MSC_MMEAPP_MME, - (to_task == TASK_S11) ? MSC_S11_MME:MSC_SP_GWAPP_MME, - NULL,0, - "0 SGW_MODIFY_BEARER_REQUEST teid %u ebi %u", - SGW_MODIFY_BEARER_REQUEST(message_p).teid, - SGW_MODIFY_BEARER_REQUEST(message_p).bearer_context_to_modify.eps_bearer_id); - - - itti_send_msg_to_task(to_task, INSTANCE_DEFAULT, message_p); -} - - - -//------------------------------------------------------------------------------ -void mme_app_handle_release_access_bearers_resp( - const SgwReleaseAccessBearersResponse * const rel_access_bearers_rsp_pP) -//------------------------------------------------------------------------------ -{ - MessageDef *message_p = NULL; - struct ue_context_s *ue_context_p = NULL; - - ue_context_p = mme_ue_context_exists_s11_teid(&mme_app_desc.mme_ue_contexts, - rel_access_bearers_rsp_pP->teid); - - - if (ue_context_p == NULL) { - MME_APP_DEBUG("We didn't find this teid in list of UE: %06"PRIX32"\n", - rel_access_bearers_rsp_pP->teid); - return; - } - - message_p = itti_alloc_new_message(TASK_MME_APP, S1AP_UE_CONTEXT_RELEASE_COMMAND); - - AssertFatal(message_p != NULL, "itti_alloc_new_message Failed"); - memset((void*)&message_p->ittiMsg.s1ap_ue_context_release_command, - 0, - sizeof(s1ap_ue_context_release_command_t)); - - S1AP_UE_CONTEXT_RELEASE_COMMAND(message_p).mme_ue_s1ap_id = ue_context_p->mme_ue_s1ap_id; - MSC_LOG_TX_MESSAGE( - MSC_MMEAPP_MME, - MSC_S1AP_MME, - NULL,0, - "0 S1AP_UE_CONTEXT_RELEASE_COMMAND mme_ue_s1ap_id %06"PRIX32" ", - S1AP_UE_CONTEXT_RELEASE_COMMAND(message_p).mme_ue_s1ap_id); - - - itti_send_msg_to_task(TASK_S1AP, INSTANCE_DEFAULT, message_p); -} - diff --git a/openair-cn/MME_APP/mme_app_capabilities.c b/openair-cn/MME_APP/mme_app_capabilities.c deleted file mode 100755 index 83a857ce91..0000000000 --- a/openair-cn/MME_APP/mme_app_capabilities.c +++ /dev/null @@ -1,62 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -/*! \file mme_app_capabilities.c -* \brief -* \author Lionel Gauthier -* \company Eurecom -* \email: lionel.gauthier@eurecom.fr -*/ -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "intertask_interface.h" -#include "mme_config.h" - -#include "mme_app_extern.h" -#include "mme_app_ue_context.h" -#include "mme_app_defs.h" - -#include "secu_defs.h" - -#include "assertions.h" -#include "common_types.h" - -int -mme_app_handle_s1ap_ue_capabilities_ind( - const s1ap_ue_cap_ind_t const * s1ap_ue_cap_ind_pP) -{ - DevAssert(s1ap_ue_cap_ind_pP != NULL); - //unsigned eNB_ue_s1ap_id:24; - //uint32_t mme_ue_s1ap_id; - //uint8_t radio_capabilities[100]; - //uint32_t radio_capabilities_length; - return 0; -} diff --git a/openair-cn/MME_APP/mme_app_config.c b/openair-cn/MME_APP/mme_app_config.c deleted file mode 100755 index 2fabb43ab1..0000000000 --- a/openair-cn/MME_APP/mme_app_config.c +++ /dev/null @@ -1,307 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -/*! \file mme_app_config.c - * \brief - * \author Lionel GAUTHIER - * \version 1.0 - * \company Eurecom - * \email: lionel.gauthier@eurecom.fr - */ -#define MME_APP -#define MME_APP_CONFIG_C - -#include <string.h> -#include <libconfig.h> -#include "mme_app_config.h" - -int mme_app_config_init(char* lib_config_file_name_pP, mme_app_config_t* config_pP) -{ - - config_t cfg; - config_setting_t *setting_sgw = NULL; - char *sgw_interface_name_for_S1u_S12_S4_up = NULL; - char *sgw_ipv4_address_for_S1u_S12_S4_up = NULL; - char *sgw_interface_name_for_S5_S8_up = NULL; - char *sgw_ipv4_address_for_S5_S8_up = NULL; - char *sgw_interface_name_for_S11 = NULL; - char *sgw_ipv4_address_for_S11 = NULL; - - config_setting_t *setting_pgw = NULL; - config_setting_t *subsetting = NULL; - config_setting_t *sub2setting = NULL; - char *pgw_interface_name_for_S5_S8 = NULL; - char *pgw_ipv4_address_for_S5_S8 = NULL; - char *pgw_interface_name_for_SGI = NULL; - char *pgw_ipv4_address_for_SGI = NULL; - - char *delimiters=NULL; - char *saveptr1= NULL; - char *astring = NULL; - char *atoken = NULL; - char *atoken2 = NULL; - char *address = NULL; - char *cidr = NULL; - char *mask = NULL; - int num = 0; - int i = 0; - int jh, jn; - unsigned char buf_in6_addr[sizeof(struct in6_addr)]; - struct in6_addr addr6_start; - struct in6_addr addr6_mask; - int prefix_mask; - uint64_t counter64; - unsigned char buf_in_addr[sizeof(struct in_addr)]; - struct in_addr addr_start; - struct in_addr addr_end; - - - memset((char*)config_pP, 0 , sizeof(mme_app_config_t)); - - config_init(&cfg); - - if(lib_config_file_name_pP != NULL) { - /* Read the file. If there is an error, report it and exit. */ - if(! config_read_file(&cfg, lib_config_file_name_pP)) { - MME_APP_ERROR("%s:%d - %s\n", lib_config_file_name_pP, config_error_line(&cfg), config_error_text(&cfg)); - config_destroy(&cfg); - AssertFatal (1 == 0, "Failed to parse eNB configuration file %s!\n", lib_config_file_name_pP); - } - } else { - SPGW_APP_ERROR("No SP-GW configuration file provided!\n"); - config_destroy(&cfg); - AssertFatal (0, "No SP-GW configuration file provided!\n"); - } - - setting_sgw = config_lookup(&cfg, SGW_CONFIG_STRING_SGW_CONFIG); - - if(setting_sgw != NULL) { - subsetting = config_setting_get_member (setting_sgw, SGW_CONFIG_STRING_NETWORK_INTERFACES_CONFIG); - - if(subsetting != NULL) { - if( ( - config_setting_lookup_string( subsetting, SGW_CONFIG_STRING_SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP, (const char **)&sgw_interface_name_for_S1u_S12_S4_up) - && config_setting_lookup_string( subsetting, SGW_CONFIG_STRING_SGW_IPV4_ADDRESS_FOR_S1U_S12_S4_UP, (const char **)&sgw_ipv4_address_for_S1u_S12_S4_up) - && config_setting_lookup_string( subsetting, SGW_CONFIG_STRING_SGW_INTERFACE_NAME_FOR_S5_S8_UP, (const char **)&sgw_interface_name_for_S5_S8_up) - && config_setting_lookup_string( subsetting, SGW_CONFIG_STRING_SGW_IPV4_ADDRESS_FOR_S5_S8_UP, (const char **)&sgw_ipv4_address_for_S5_S8_up) - && config_setting_lookup_string( subsetting, SGW_CONFIG_STRING_SGW_INTERFACE_NAME_FOR_S11, (const char **)&sgw_interface_name_for_S11) - && config_setting_lookup_string( subsetting, SGW_CONFIG_STRING_SGW_IPV4_ADDRESS_FOR_S11, (const char **)&sgw_ipv4_address_for_S11) - ) - ) { - config_pP->sgw_config.ipv4.sgw_interface_name_for_S1u_S12_S4_up = strdup(sgw_interface_name_for_S1u_S12_S4_up); - cidr = strdup(sgw_ipv4_address_for_S1u_S12_S4_up); - address = strtok(cidr, "/"); - mask = strtok(NULL, "/"); - IPV4_STR_ADDR_TO_INT_NWBO ( address, config_pP->sgw_config.ipv4.sgw_ipv4_address_for_S1u_S12_S4_up, "BAD IP ADDRESS FORMAT FOR S1u_S12_S4 !\n" ) - config_pP->sgw_config.ipv4.sgw_ip_netmask_for_S1u_S12_S4_up = atoi(mask); - free(cidr); - - config_pP->sgw_config.ipv4.sgw_interface_name_for_S5_S8_up = strdup(sgw_interface_name_for_S5_S8_up); - cidr = strdup(sgw_ipv4_address_for_S5_S8_up); - address = strtok(cidr, "/"); - mask = strtok(NULL, "/"); - IPV4_STR_ADDR_TO_INT_NWBO ( address, config_pP->sgw_config.ipv4.sgw_ipv4_address_for_S5_S8_up, "BAD IP ADDRESS FORMAT FOR S5_S8 !\n" ) - config_pP->sgw_config.ipv4.sgw_ip_netmask_for_S5_S8_up = atoi(mask); - free(cidr); - - config_pP->sgw_config.ipv4.sgw_interface_name_for_S11 = strdup(sgw_interface_name_for_S11); - cidr = strdup(sgw_ipv4_address_for_S11); - address = strtok(cidr, "/"); - mask = strtok(NULL, "/"); - IPV4_STR_ADDR_TO_INT_NWBO ( address, config_pP->sgw_config.ipv4.sgw_ipv4_address_for_S11, "BAD IP ADDRESS FORMAT FOR S11 !\n" ) - config_pP->sgw_config.ipv4.sgw_ip_netmask_for_S11 = atoi(mask); - free(cidr); - } - } - } - - setting_pgw = config_lookup(&cfg, PGW_CONFIG_STRING_PGW_CONFIG); - - if(setting_pgw != NULL) { - subsetting = config_setting_get_member (setting_pgw, SGW_CONFIG_STRING_NETWORK_INTERFACES_CONFIG); - - if(subsetting != NULL) { - if( ( - config_setting_lookup_string(subsetting, - PGW_CONFIG_STRING_PGW_INTERFACE_NAME_FOR_S5_S8, - (const char **)&pgw_interface_name_for_S5_S8) - && config_setting_lookup_string(subsetting, - PGW_CONFIG_STRING_PGW_IPV4_ADDRESS_FOR_S5_S8, - (const char **)&pgw_ipv4_address_for_S5_S8) - && config_setting_lookup_string(subsetting, - PGW_CONFIG_STRING_PGW_INTERFACE_NAME_FOR_SGI, - (const char **)&pgw_interface_name_for_SGI) - && config_setting_lookup_string(subsetting, - PGW_CONFIG_STRING_PGW_IPV4_ADDR_FOR_SGI, - (const char **)&pgw_ipv4_address_for_SGI) - ) - ) { - config_pP->pgw_config.ipv4.pgw_interface_name_for_S5_S8 = strdup(pgw_interface_name_for_S5_S8); - cidr = strdup(pgw_ipv4_address_for_S5_S8); - address = strtok(cidr, "/"); - mask = strtok(NULL, "/"); - IPV4_STR_ADDR_TO_INT_NWBO ( address, config_pP->pgw_config.ipv4.pgw_ipv4_address_for_S5_S8, "BAD IP ADDRESS FORMAT FOR S5_S8 !\n" ) - config_pP->pgw_config.ipv4.pgw_ip_netmask_for_S5_S8 = atoi(mask); - free(cidr); - - config_pP->pgw_config.ipv4.pgw_interface_name_for_SGI = strdup(pgw_interface_name_for_SGI); - cidr = strdup(pgw_ipv4_address_for_SGI); - address = strtok(cidr, "/"); - mask = strtok(NULL, "/"); - IPV4_STR_ADDR_TO_INT_NWBO ( address, config_pP->pgw_config.ipv4.pgw_ipv4_address_for_SGI, "BAD IP ADDRESS FORMAT FOR SGI !\n" ) - config_pP->pgw_config.ipv4.pgw_ip_netmask_for_SGI = atoi(mask); - free(cidr); - } - } - - subsetting = config_setting_get_member (setting_pgw, PGW_CONFIG_STRING_IP_ADDRESS_POOL); - - if(subsetting != NULL) { - sub2setting = config_setting_get_member (subsetting, PGW_CONFIG_STRING_IPV4_ADDRESS_LIST); - - if(sub2setting != NULL) { - num = config_setting_length(sub2setting); - - for (i = 0; i < num; i++) { - astring = config_setting_get_string_elem(sub2setting,i); - - if (astring != NULL) { - trim(astring, strlen(astring)+1); - - if (inet_pton(AF_INET, astring, buf_in_addr) < 1) { - // failure, test if there is a range specified in the string - atoken = strtok(astring, PGW_CONFIG_STRING_IP_ADDRESS_RANGE_DELIMITERS); - - if (inet_pton(AF_INET, astring, buf_in_addr) == 1) { - memcpy (&addr_start, buf_in_addr, sizeof(struct in_addr)); - // valid address - atoken2 = strtok(NULL, PGW_CONFIG_STRING_IP_ADDRESS_RANGE_DELIMITERS); - - if (inet_pton(AF_INET, atoken2, buf_in_addr) == 1) { - memcpy (&addr_end, buf_in_addr, sizeof(struct in_addr)); - - // valid address - for (jh = ntohl(addr_start.s_addr); jh <= ntohl(addr_end.s_addr); jh++) { - DevAssert(PGW_MAX_ALLOCATED_PDN_ADDRESSES > config_pP->pgw_config.pool_pdn_addresses.num_ipv4_addresses); - jn = htonl(jh); - - if (IN_CLASSA(addr_start.s_addr)) { - if ((jh & 0xFF) && (jh & 0xFF) != 0xFF) { - config_pP->pgw_config.pool_pdn_addresses.ipv4_addresses[config_pP->pgw_config.pool_pdn_addresses.num_ipv4_addresses++].s_addr = jn; - } - } else if (IN_CLASSB(addr_start.s_addr)) { - if ((jh & 0xFF) && (jh & 0xFF) != 0xFF) { - config_pP->pgw_config.pool_pdn_addresses.ipv4_addresses[config_pP->pgw_config.pool_pdn_addresses.num_ipv4_addresses++].s_addr = jn; - } - } else if (IN_CLASSC(addr_start.s_addr)) { - if ((jh & 0xFF) && (jh & 0xFF) != 0xFF) { - config_pP->pgw_config.pool_pdn_addresses.ipv4_addresses[config_pP->pgw_config.pool_pdn_addresses.num_ipv4_addresses++].s_addr = jn; - } - } else { - printf("ERROR ON ADDRESS CLASS %d.%d.%d.%d\n", NIPADDR(jn)); - } - } - } - } - } else { - DevAssert(PGW_MAX_ALLOCATED_PDN_ADDRESSES > config_pP->pgw_config.pool_pdn_addresses.num_ipv4_addresses); - memcpy (&addr_start, buf_in_addr, sizeof(struct in_addr)); - config_pP->pgw_config.pool_pdn_addresses.ipv4_addresses[config_pP->pgw_config.pool_pdn_addresses.num_ipv4_addresses++].s_addr = addr_start.s_addr; - } - } - } - } - - sub2setting = config_setting_get_member (subsetting, PGW_CONFIG_STRING_IPV6_ADDRESS_LIST); - - if(sub2setting != NULL) { - num = config_setting_length(sub2setting); - - for (i = 0; i < num; i++) { - astring = config_setting_get_string_elem(sub2setting,i); - - if (astring != NULL) { - trim(astring, strlen(astring)+1); - - if (inet_pton(AF_INET6, astring, buf_in6_addr) < 1) { - // failure, test if there is a range specified in the string - atoken = strtok(astring, PGW_CONFIG_STRING_IPV6_PREFIX_DELIMITER); - - if (inet_pton(AF_INET6, astring, buf_in6_addr) == 1) { - atoken2 = strtok(NULL, PGW_CONFIG_STRING_IPV6_PREFIX_DELIMITER); - prefix_mask = atoi(atoken2); - // arbitrary values - DevAssert((prefix_mask < 128) && (prefix_mask >= 64)); - - memcpy (&addr6_start, buf_in6_addr, sizeof(struct in6_addr)); - memcpy (&addr6_mask, buf_in6_addr, sizeof(struct in6_addr)); - sgw_ipv6_mask_in6_addr(&addr6_mask, prefix_mask); - - if (memcmp(&addr6_start, &addr6_mask, sizeof(struct in6_addr)) != 0) { - AssertFatal(0, "BAD IPV6 ADDR CONFIG/MASK PAIRING %s/%d\n", astring, prefix_mask); - } - - counter64 = 0xFFFFFFFFFFFFFFFF >> prefix_mask; // address Prefix_mask/0..0 not valid - - do { - addr6_start.s6_addr32[3] = addr6_start.s6_addr32[3] + htonl(1); - - if (addr6_start.s6_addr32[3] == 0) { - addr6_start.s6_addr32[2] = addr6_start.s6_addr32[2] + htonl(1); - - if (addr6_start.s6_addr32[2] == 0) { - // should not happen since mask is no less than 64 - addr6_start.s6_addr32[1] = addr6_start.s6_addr32[1] + htonl(1); - - if (addr6_start.s6_addr32[1] == 0) { - addr6_start.s6_addr32[0] = addr6_start.s6_addr32[0] + htonl(1); - } - } - } - - memcpy (&config_pP->pgw_config.pool_pdn_addresses.ipv6_addresses[config_pP->pgw_config.pool_pdn_addresses.num_ipv6_addresses++], - &addr6_start, - sizeof(struct in6_addr)); - counter64 = counter64 - 1; - } while (counter64 > 0); - } - } else { - DevAssert(PGW_MAX_ALLOCATED_PDN_ADDRESSES > config_pP->pgw_config.pool_pdn_addresses.num_ipv6_addresses); - memcpy (&config_pP->pgw_config.pool_pdn_addresses.ipv6_addresses[config_pP->pgw_config.pool_pdn_addresses.num_ipv6_addresses++], - buf_in6_addr, - sizeof(struct in6_addr)); - } - } - } - } - } - } - - return 0; -} diff --git a/openair-cn/MME_APP/mme_app_config.h b/openair-cn/MME_APP/mme_app_config.h deleted file mode 100755 index 047678d60d..0000000000 --- a/openair-cn/MME_APP/mme_app_config.h +++ /dev/null @@ -1,41 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -/*! \file mme_app_config.h - * \brief - * \author Lionel GAUTHIER - * \version 1.0 - * \company Eurecom - * \email: lionel.gauthier@eurecom.fr - */ -#ifndef MME_APP_CONFIG_H_ -#define MME_APP_CONFIG_H_ - - -#endif /* MME_APP_CONFIG_H_ */ diff --git a/openair-cn/MME_APP/mme_app_context.c b/openair-cn/MME_APP/mme_app_context.c deleted file mode 100644 index f7ca54f8da..0000000000 --- a/openair-cn/MME_APP/mme_app_context.c +++ /dev/null @@ -1,555 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - - -#include <pthread.h> -#include <unistd.h> -#include <string.h> -#include <errno.h> -#include <stdint.h> -#include <inttypes.h> - -#include <arpa/inet.h> - -#include "intertask_interface.h" -#include "mme_config.h" - -#include "assertions.h" -#include "conversions.h" -#include "tree.h" -#include "enum_string.h" -#include "common_types.h" - -#include "mme_app_extern.h" -#include "mme_app_ue_context.h" -#include "mme_app_defs.h" -#include "msc.h" - -int ue_context_compare_identifiers(struct ue_context_s *p1, - struct ue_context_s *p2); - -RB_PROTOTYPE(ue_context_map, ue_context_s, rb_entry, - ue_context_compare_identifiers); - -RB_GENERATE(ue_context_map, ue_context_s, rb_entry, - ue_context_compare_identifiers); - -//------------------------------------------------------------------------------ -extern inline int ue_context_compare_identifiers( - struct ue_context_s *p1, struct ue_context_s *p2) -//------------------------------------------------------------------------------ -{ - MME_APP_DEBUG(" ue_context_compare_identifiers IMSI %"SCNu64"\n", p1->imsi); - MME_APP_DEBUG(" ue_context_compare_identifiers mme_s11_teid %08x\n" , p1->mme_s11_teid); - MME_APP_DEBUG(" ue_context_compare_identifiers mme_ue_s1ap_id %08x\n" , p1->mme_ue_s1ap_id); - MME_APP_DEBUG(" ue_context_compare_identifiers ue_id %08x\n" , p1->ue_id); - - if (p1->imsi > 0) { - MME_APP_DEBUG(" with IMSI %"SCNu64"\n", p2->imsi); - - /* if IMSI provided */ - if (p1->imsi > p2->imsi) { - return 1; - } - - if (p1->imsi < p2->imsi) { - return -1; - } - } else if (p1->mme_s11_teid > 0) { - MME_APP_DEBUG(" with mme_s11_teid %08x\n", p2->mme_s11_teid); - - /* if s11 teid provided */ - if (p1->mme_s11_teid > p2->mme_s11_teid) { - return 1; - } - - if (p1->mme_s11_teid < p2->mme_s11_teid) { - return -1; - } - } else if (p1->mme_ue_s1ap_id > 0) { - MME_APP_DEBUG(" with mme_ue_s1ap_id %08x\n", p2->mme_ue_s1ap_id); - - /* if s1ap ue id provided */ - if (p1->mme_ue_s1ap_id > p2->mme_ue_s1ap_id) { - return 1; - } - - if (p1->mme_ue_s1ap_id < p2->mme_ue_s1ap_id) { - return -1; - } - } else if (p1->ue_id > 0) { - MME_APP_DEBUG(" with ue_id %08x\n", p2->ue_id); - - /* if nas ue_id provided */ - if (p1->ue_id > p2->ue_id) { - return 1; - } - - if (p1->ue_id < p2->ue_id) { - return -1; - } - } else { - uint16_t mcc1; - uint16_t mnc1; - uint16_t mnc1_len; - uint16_t mcc2; - uint16_t mnc2; - uint16_t mnc2_len; - - PLMN_T_TO_MCC_MNC(p1->guti.gummei.plmn, mcc1, mnc1, mnc1_len); - PLMN_T_TO_MCC_MNC(p1->guti.gummei.plmn, mcc2, mnc2, mnc2_len); - - /* else compare by GUTI */ - if ((p1->guti.m_tmsi < p2->guti.m_tmsi) && - (p1->guti.gummei.MMEcode < p2->guti.gummei.MMEcode) && - (p1->guti.gummei.MMEgid < p2->guti.gummei.MMEgid) && - (mcc1 < mcc2) && - (mnc1 < mnc2) && - (mnc1_len < mnc2_len)) - return 1; - - if ((p1->guti.m_tmsi > p2->guti.m_tmsi) && - (p1->guti.gummei.MMEcode > p2->guti.gummei.MMEcode) && - (p1->guti.gummei.MMEgid > p2->guti.gummei.MMEgid) && - (mcc1 > mcc2) && - (mnc1 > mnc2) && - (mnc1_len > mnc2_len)) - return -1; - } - - /* Match -> return 0 */ - return 0; -} - -//------------------------------------------------------------------------------ -ue_context_t *mme_create_new_ue_context(void) -//------------------------------------------------------------------------------ -{ - ue_context_t *new_p; - - new_p = malloc(sizeof(ue_context_t)); - - if (new_p == NULL) { - return NULL; - } - - memset(new_p, 0, sizeof(ue_context_t)); - return new_p; -} - - -//------------------------------------------------------------------------------ -struct ue_context_s *mme_ue_context_exists_imsi(mme_ue_context_t *mme_ue_context, - mme_app_imsi_t imsi) -//------------------------------------------------------------------------------ -{ - struct ue_context_s reference; - - DevAssert(mme_ue_context != NULL); - - memset(&reference, 0, sizeof(struct ue_context_s)); - reference.imsi = imsi; - return RB_FIND(ue_context_map, &mme_ue_context->ue_context_tree, - &reference); -} - - -//------------------------------------------------------------------------------ -struct ue_context_s *mme_ue_context_exists_s11_teid(mme_ue_context_t *mme_ue_context, - uint32_t teid) -//------------------------------------------------------------------------------ -{ - struct ue_context_s reference; - - DevAssert(mme_ue_context != NULL); - - memset(&reference, 0, sizeof(struct ue_context_s)); - reference.mme_s11_teid = teid; - return RB_FIND(ue_context_map, &mme_ue_context->ue_context_tree, - &reference); -} - - - -//------------------------------------------------------------------------------ -ue_context_t *mme_ue_context_exists_mme_ue_s1ap_id( - mme_ue_context_t *mme_ue_context, - uint32_t mme_ue_s1ap_id) -//------------------------------------------------------------------------------ -{ - struct ue_context_s reference; - - DevAssert(mme_ue_context != NULL); - - memset(&reference, 0, sizeof(struct ue_context_s)); - reference.mme_ue_s1ap_id = mme_ue_s1ap_id; - return RB_FIND(ue_context_map, &mme_ue_context->ue_context_tree, - &reference); -} - - - -//------------------------------------------------------------------------------ -ue_context_t *mme_ue_context_exists_nas_ue_id( - mme_ue_context_t *mme_ue_context, - uint32_t nas_ue_id) -//------------------------------------------------------------------------------ -{ - struct ue_context_s reference; - - DevAssert(mme_ue_context != NULL); - - memset(&reference, 0, sizeof(struct ue_context_s)); - reference.ue_id = nas_ue_id; - return RB_FIND(ue_context_map, &mme_ue_context->ue_context_tree, - &reference); -} - - - - -//------------------------------------------------------------------------------ -ue_context_t *mme_ue_context_exists_guti(mme_ue_context_t *mme_ue_context, - GUTI_t guti) -//------------------------------------------------------------------------------ -{ - struct ue_context_s reference; - - DevAssert(mme_ue_context != NULL); - - memset(&reference, 0, sizeof(struct ue_context_s)); - - memcpy(&reference.guti, &guti, sizeof(GUTI_t)); - - return RB_FIND(ue_context_map, &mme_ue_context->ue_context_tree, - &reference); -} - -//------------------------------------------------------------------------------ -int mme_insert_ue_context(mme_ue_context_t *mme_ue_context, struct ue_context_s *ue_context_p) -//------------------------------------------------------------------------------ -{ - struct ue_context_s *collision_p = NULL; - - DevAssert(mme_ue_context != NULL); - DevAssert(ue_context_p != NULL); - - /* Updating statistics */ - mme_ue_context->nb_ue_managed++; - mme_ue_context->nb_ue_since_last_stat++; - - collision_p = RB_INSERT(ue_context_map, &mme_ue_context->ue_context_tree, - ue_context_p); - - if (collision_p != NULL) { - fprintf(stderr, "This ue context already exists...\n"); - return -1; - } - - return 0; -} - - - -//------------------------------------------------------------------------------ -void mme_remove_ue_context(mme_ue_context_t *mme_ue_context, struct ue_context_s *ue_context_p) -//------------------------------------------------------------------------------ -{ - struct ue_context_s *collision_p = NULL; - - DevAssert(mme_ue_context != NULL); - DevAssert(ue_context_p != NULL); - - /* Updating statistics */ - mme_ue_context->nb_ue_managed++; - mme_ue_context->nb_ue_since_last_stat++; - - collision_p = RB_REMOVE(ue_context_map, &mme_ue_context->ue_context_tree, - ue_context_p); -#warning "TODO mme_ue_context_free_content" - //TODO mme_ue_context_free_content(ue_context_p); - free(ue_context_p); - return 0; -} - -//------------------------------------------------------------------------------ -void mme_app_dump_ue_contexts(mme_ue_context_t *mme_ue_context) -//------------------------------------------------------------------------------ -{ - struct ue_context_s *context_p; - - MME_APP_DEBUG("-----------------------UE contexts-----------------------\n"); - RB_FOREACH(context_p, ue_context_map, &mme_ue_context->ue_context_tree) { - uint8_t j; - - MME_APP_DEBUG(" - IMSI ...........: %"SCNu64"\n", context_p->imsi); - MME_APP_DEBUG(" | m_tmsi | mmec | mmegid | mcc | mnc |\n"); - MME_APP_DEBUG(" - GUTI............: | %08x | %02x | %04x | %03u | %03u |\n", - context_p->guti.m_tmsi, context_p->guti.gummei.MMEcode, - context_p->guti.gummei.MMEgid, - /* TODO check if two or three digits MNC... */ - context_p->guti.gummei.plmn.MCCdigit3 * 100 + - context_p->guti.gummei.plmn.MCCdigit2 * 10 + - context_p->guti.gummei.plmn.MCCdigit1, - context_p->guti.gummei.plmn.MNCdigit3 * 100 + - context_p->guti.gummei.plmn.MNCdigit2 * 10 + - context_p->guti.gummei.plmn.MNCdigit1); - MME_APP_DEBUG(" - Authenticated ..: %s\n", - (context_p->imsi_auth == IMSI_UNAUTHENTICATED) ? "FALSE": "TRUE"); - MME_APP_DEBUG(" - eNB UE s1ap ID .: %08x\n", context_p->eNB_ue_s1ap_id); - MME_APP_DEBUG(" - MME UE s1ap ID .: %08x\n", context_p->mme_ue_s1ap_id); - MME_APP_DEBUG(" - MME S11 TEID ...: %08x\n", context_p->mme_s11_teid); - MME_APP_DEBUG(" - SGW S11 TEID ...: %08x\n", context_p->sgw_s11_teid); - MME_APP_DEBUG(" | mcc | mnc | cell id |\n"); - MME_APP_DEBUG(" - E-UTRAN CGI ....: | %03u | %03u | %08x |\n", - context_p->e_utran_cgi.plmn.MCCdigit3 * 100 + - context_p->e_utran_cgi.plmn.MCCdigit2 * 10 + - context_p->e_utran_cgi.plmn.MCCdigit1, - context_p->e_utran_cgi.plmn.MNCdigit3 * 100 + - context_p->e_utran_cgi.plmn.MNCdigit2 * 10 + - context_p->e_utran_cgi.plmn.MNCdigit1, - context_p->e_utran_cgi.cell_identity); - /* Ctime return a \n in the string */ - MME_APP_DEBUG(" - Last acquired ..: %s", ctime(&context_p->cell_age)); - - /* Display UE info only if we know them */ - if (context_p->subscription_known == SUBSCRIPTION_KNOWN) { - MME_APP_DEBUG(" - Status .........: %s\n", - (context_p->sub_status == SS_SERVICE_GRANTED) ? "Granted" : "Barred"); -#define DISPLAY_BIT_MASK_PRESENT(mASK) \ - ((context_p->access_restriction_data & mASK) ? 'X' : 'O') - MME_APP_DEBUG(" (O = allowed, X = !O) |UTRAN|GERAN|GAN|HSDPA EVO|E_UTRAN|HO TO NO 3GPP|\n"); - MME_APP_DEBUG(" - Access restriction | %c | %c | %c | %c | %c | %c |\n", - DISPLAY_BIT_MASK_PRESENT(ARD_UTRAN_NOT_ALLOWED), - DISPLAY_BIT_MASK_PRESENT(ARD_GERAN_NOT_ALLOWED), - DISPLAY_BIT_MASK_PRESENT(ARD_GAN_NOT_ALLOWED), - DISPLAY_BIT_MASK_PRESENT(ARD_I_HSDPA_EVO_NOT_ALLOWED), - DISPLAY_BIT_MASK_PRESENT(ARD_E_UTRAN_NOT_ALLOWED), - DISPLAY_BIT_MASK_PRESENT(ARD_HO_TO_NON_3GPP_NOT_ALLOWED)); - MME_APP_DEBUG(" - Access Mode ....: %s\n", - ACCESS_MODE_TO_STRING(context_p->access_mode)); - MME_APP_DEBUG(" - MSISDN .........: %-*s\n", - MSISDN_LENGTH, context_p->msisdn); - MME_APP_DEBUG(" - RAU/TAU timer ..: %u\n", context_p->rau_tau_timer); - MME_APP_DEBUG(" - IMEISV .........: %*s\n", 15, - context_p->me_identity.imeisv); - MME_APP_DEBUG(" - AMBR (bits/s) ( Downlink | Uplink )\n"); - MME_APP_DEBUG(" Subscribed ...: (%010"PRIu64"|%010"PRIu64")\n", - context_p->subscribed_ambr.br_dl, - context_p->subscribed_ambr.br_ul); - MME_APP_DEBUG(" Allocated ....: (%010"PRIu64"|%010"PRIu64")\n", - context_p->used_ambr.br_dl, context_p->used_ambr.br_ul); - MME_APP_DEBUG(" - Known vectors ..: %u\n", context_p->nb_of_vectors); - - for (j = 0; j < context_p->nb_of_vectors; j++) { - int k; - char xres_string[3 * XRES_LENGTH_MAX + 1]; - eutran_vector_t *vector_p; - - vector_p = &context_p->vector_list[j]; - - MME_APP_DEBUG(" - RAND ..: "RAND_FORMAT"\n", - RAND_DISPLAY(vector_p->rand)); - MME_APP_DEBUG(" - AUTN ..: "AUTN_FORMAT"\n", - AUTN_DISPLAY(vector_p->autn)); - MME_APP_DEBUG(" - KASME .: "KASME_FORMAT"\n", - KASME_DISPLAY_1(vector_p->kasme)); - MME_APP_DEBUG(" "KASME_FORMAT"\n", - KASME_DISPLAY_2(vector_p->kasme)); - - for (k = 0; k < vector_p->xres.size; k++) { - sprintf(&xres_string[k * 3], "%02x,", vector_p->xres.data[k]); - } - - xres_string[k * 3 - 1] = '\0'; - MME_APP_DEBUG(" - XRES ..: %s\n", xres_string); - } - - MME_APP_DEBUG(" - PDN List:\n"); - - for (j = 0; j < context_p->apn_profile.nb_apns; j++) { - struct apn_configuration_s *apn_config_p; - - apn_config_p = &context_p->apn_profile.apn_configuration[j]; - - /* Default APN ? */ - MME_APP_DEBUG(" - Default APN ...: %s\n", - (apn_config_p->context_identifier == context_p->apn_profile.context_identifier) - ? "TRUE" : "FALSE"); - MME_APP_DEBUG(" - APN ...........: %s\n", apn_config_p->service_selection); - MME_APP_DEBUG(" - AMBR (bits/s) ( Downlink | Uplink )\n"); - MME_APP_DEBUG(" (%010"PRIu64"|%010"PRIu64")\n", - apn_config_p->ambr.br_dl, apn_config_p->ambr.br_ul); - MME_APP_DEBUG(" - PDN type ......: %s\n", - PDN_TYPE_TO_STRING(apn_config_p->pdn_type)); - MME_APP_DEBUG(" - QOS\n"); - MME_APP_DEBUG(" QCI .........: %u\n", - apn_config_p->subscribed_qos.qci); - MME_APP_DEBUG(" Prio level ..: %u\n", - apn_config_p->subscribed_qos.allocation_retention_priority.priority_level); - MME_APP_DEBUG(" Pre-emp vul .: %s\n", - (apn_config_p->subscribed_qos.allocation_retention_priority.pre_emp_vulnerability - == PRE_EMPTION_VULNERABILITY_ENABLED) ? "ENABLED" : "DISABLED"); - MME_APP_DEBUG(" Pre-emp cap .: %s\n", - (apn_config_p->subscribed_qos.allocation_retention_priority.pre_emp_capability - == PRE_EMPTION_CAPABILITY_ENABLED) ? "ENABLED" : "DISABLED"); - - if (apn_config_p->nb_ip_address == 0) { - MME_APP_DEBUG(" IP addr .....: Dynamic allocation\n"); - } else { - int i; - MME_APP_DEBUG(" IP addresses :\n"); - - for (i = 0; i < apn_config_p->nb_ip_address; i++) { - if (apn_config_p->ip_address[i].pdn_type == IPv4) { - MME_APP_DEBUG(" ["IPV4_ADDR"]\n", - IPV4_ADDR_DISPLAY_8(apn_config_p->ip_address[i].address.ipv4_address)); - } else { - char ipv6[40]; - inet_ntop(AF_INET6, apn_config_p->ip_address[i].address.ipv6_address,ipv6, 40); - MME_APP_DEBUG(" [%s]\n", ipv6); - } - } - } - - MME_APP_DEBUG("\n"); - } - - MME_APP_DEBUG(" - Bearer List:\n"); - - for (j = 0; j < BEARERS_PER_UE; j++) { - bearer_context_t *bearer_context_p; - - bearer_context_p = &context_p->eps_bearers[j]; - - if (bearer_context_p->s_gw_teid != 0) { - MME_APP_DEBUG(" Bearer id .......: %02u\n", j); - MME_APP_DEBUG(" S-GW TEID (UP)...: %08x\n", bearer_context_p->s_gw_teid); - MME_APP_DEBUG(" P-GW TEID (UP)...: %08x\n", bearer_context_p->p_gw_teid); - MME_APP_DEBUG(" QCI .............: %u\n", - bearer_context_p->qci); - MME_APP_DEBUG(" Priority level ..: %u\n", - bearer_context_p->prio_level); - MME_APP_DEBUG(" Pre-emp vul .....: %s\n", - (bearer_context_p->pre_emp_vulnerability - == PRE_EMPTION_VULNERABILITY_ENABLED) ? "ENABLED" : "DISABLED"); - MME_APP_DEBUG(" Pre-emp cap .....: %s\n", - (bearer_context_p->pre_emp_capability - == PRE_EMPTION_CAPABILITY_ENABLED) ? "ENABLED" : "DISABLED"); - } - } - } - } - MME_APP_DEBUG("---------------------------------------------------------\n"); -} - - -//------------------------------------------------------------------------------ -void mme_app_handle_s1ap_ue_context_release_req(const s1ap_ue_context_release_req_t const *s1ap_ue_context_release_req) -//------------------------------------------------------------------------------ -{ - struct ue_context_s *ue_context_p = NULL; - MessageDef *message_p = NULL; - - MME_APP_DEBUG("Received S1AP_UE_CONTEXT_RELEASE_REQ from S1AP\n"); - ue_context_p = mme_ue_context_exists_nas_ue_id(&mme_app_desc.mme_ue_contexts, s1ap_ue_context_release_req->mme_ue_s1ap_id); - - if (ue_context_p == NULL) { - MSC_LOG_EVENT( - MSC_MMEAPP_MME, - "0 S1AP_UE_CONTEXT_RELEASE_REQ Unknown mme_ue_s1ap_id 0x%06"PRIX32" ",s1ap_ue_context_release_req->mme_ue_s1ap_id); - MME_APP_ERROR("UE context doesn't exist for UE 0x%06"PRIX32"/dec%u\n", - s1ap_ue_context_release_req->mme_ue_s1ap_id, - s1ap_ue_context_release_req->mme_ue_s1ap_id); - return; - } - if ((ue_context_p->mme_s11_teid == 0) && - (ue_context_p->sgw_s11_teid == 0)) { - // no session was created, no need for releasing bearers in SGW - message_p = itti_alloc_new_message(TASK_MME_APP, S1AP_UE_CONTEXT_RELEASE_COMMAND); - - AssertFatal(message_p != NULL, "itti_alloc_new_message Failed"); - memset((void*)&message_p->ittiMsg.s1ap_ue_context_release_command, - 0, - sizeof(s1ap_ue_context_release_command_t)); - - S1AP_UE_CONTEXT_RELEASE_COMMAND(message_p).mme_ue_s1ap_id = ue_context_p->mme_ue_s1ap_id; - MSC_LOG_TX_MESSAGE( - MSC_MMEAPP_MME, - MSC_S1AP_MME, - NULL,0, - "0 S1AP_UE_CONTEXT_RELEASE_COMMAND mme_ue_s1ap_id %06"PRIX32" ", - S1AP_UE_CONTEXT_RELEASE_COMMAND(message_p).mme_ue_s1ap_id); - - - itti_send_msg_to_task(TASK_S1AP, INSTANCE_DEFAULT, message_p); - } else { - mme_app_send_s11_release_access_bearers_req(ue_context_p); - } -} - - -//------------------------------------------------------------------------------ -void mme_app_handle_s1ap_ue_context_release_complete(const s1ap_ue_context_release_complete_t const *s1ap_ue_context_release_complete) -//------------------------------------------------------------------------------ -{ - struct ue_context_s *ue_context_p = NULL; - MessageDef *message_p = NULL; - - MME_APP_DEBUG("Received S1AP_UE_CONTEXT_RELEASE_COMPLETE from S1AP\n"); - - ue_context_p = mme_ue_context_exists_nas_ue_id(&mme_app_desc.mme_ue_contexts, s1ap_ue_context_release_complete->mme_ue_s1ap_id); - - if (ue_context_p == NULL) { - MSC_LOG_EVENT( - MSC_MMEAPP_MME, - "0 S1AP_UE_CONTEXT_RELEASE_COMPLETE Unknown mme_ue_s1ap_id 0x%06"PRIX32" ",s1ap_ue_context_release_complete->mme_ue_s1ap_id); - MME_APP_ERROR("UE context doesn't exist for mme_ue_s1ap_id 0x%06"PRIX32"/dec%u\n", - s1ap_ue_context_release_complete->mme_ue_s1ap_id, - s1ap_ue_context_release_complete->mme_ue_s1ap_id); - return; - } - message_p = itti_alloc_new_message(TASK_MME_APP, S1AP_DEREGISTER_UE_REQ); - memset((void*)&message_p->ittiMsg.s1ap_deregister_ue_req, - 0, - sizeof(s1ap_deregister_ue_req_t)); - - S1AP_DEREGISTER_UE_REQ(message_p).mme_ue_s1ap_id = s1ap_ue_context_release_complete->mme_ue_s1ap_id; - - - MSC_LOG_TX_MESSAGE( - MSC_MMEAPP_MME, - MSC_NAS_MME, - NULL,0, - "0 S1AP_DEREGISTER_UE_REQ"); - - itti_send_msg_to_task(TASK_NAS_MME, INSTANCE_DEFAULT, message_p); - - mme_remove_ue_context(&mme_app_desc.mme_ue_contexts, ue_context_p); -} diff --git a/openair-cn/MME_APP/mme_app_defs.h b/openair-cn/MME_APP/mme_app_defs.h deleted file mode 100644 index 11fbfdc2c8..0000000000 --- a/openair-cn/MME_APP/mme_app_defs.h +++ /dev/null @@ -1,92 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - - -/* This file contains definitions related to mme applicative layer and should - * not be included within other layers. - * Use mme_app_extern.h to expose mme applicative layer procedures/data. - */ - -#include "intertask_interface.h" -#include "mme_app_ue_context.h" - -#ifndef MME_APP_DEFS_H_ -#define MME_APP_DEFS_H_ - -#ifndef MME_APP_DEBUG -# define MME_APP_DEBUG(x, args...) do { fprintf(stdout, "[MMEA][D]"x, ##args); } while(0) -#endif -#ifndef MME_APP_ERROR -# define MME_APP_ERROR(x, args...) do { fprintf(stdout, "[MMEA][E]"x, ##args); } while(0) -#endif - -typedef struct { - /* UE contexts + some statistics variables */ - mme_ue_context_t mme_ue_contexts; - - long statistic_timer_id; - uint32_t statistic_timer_period; -} mme_app_desc_t; - -extern mme_app_desc_t mme_app_desc; - - -#if defined(DISABLE_USE_NAS) -int mme_app_handle_attach_req(nas_attach_req_t *attach_req_p); -#endif - -int mme_app_handle_s1ap_ue_capabilities_ind (const s1ap_ue_cap_ind_t const * s1ap_ue_cap_ind_pP); - -int mme_app_send_s11_create_session_req (struct ue_context_s * const ue_context_pP); - -int mme_app_send_s6a_update_location_req (struct ue_context_s * const ue_context_pP); - -int mme_app_handle_s6a_update_location_ans (const s6a_update_location_ans_t * const ula_pP); - -int mme_app_handle_nas_pdn_connectivity_req ( nas_pdn_connectivity_req_t * const nas_pdn_connectivity_req_p); - -void mme_app_handle_conn_est_cnf (const nas_conn_est_cnf_t * const nas_conn_est_cnf_pP); - -void mme_app_handle_conn_est_ind (const mme_app_connection_establishment_ind_t * const conn_est_ind_pP); - -int mme_app_handle_create_sess_resp (const SgwCreateSessionResponse * const create_sess_resp_pP); - -int mme_app_handle_establish_ind (const nas_establish_ind_t * const nas_establish_ind_pP); - -int mme_app_handle_authentication_info_answer(const s6a_auth_info_ans_t * const s6a_auth_info_ans_pP); - -int mme_app_handle_nas_auth_resp (const nas_auth_resp_t * const nas_auth_resp_pP); - -nas_cause_t s6a_error_2_nas_cause (const uint32_t s6a_errorP, const int experimentalP); - -void mme_app_handle_nas_auth_param_req (const nas_auth_param_req_t * const nas_auth_param_req_pP); - -void mme_app_handle_initial_context_setup_rsp(const mme_app_initial_context_setup_rsp_t * const initial_ctxt_setup_rsp_pP); - -#endif /* MME_APP_DEFS_H_ */ diff --git a/openair-cn/MME_APP/mme_app_extern.h b/openair-cn/MME_APP/mme_app_extern.h deleted file mode 100644 index b34a849aff..0000000000 --- a/openair-cn/MME_APP/mme_app_extern.h +++ /dev/null @@ -1,36 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - - -#ifndef MME_APP_EXTERN_H_ -#define MME_APP_EXTERN_H_ - -int mme_app_init(const mme_config_t *mme_config); - -#endif /* MME_APP_EXTERN_H_ */ diff --git a/openair-cn/MME_APP/mme_app_itti_messaging.h b/openair-cn/MME_APP/mme_app_itti_messaging.h deleted file mode 100644 index df23ba7d7e..0000000000 --- a/openair-cn/MME_APP/mme_app_itti_messaging.h +++ /dev/null @@ -1,81 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - - -#ifndef MME_APP_ITTI_MESSAGING_H_ -#define MME_APP_ITTI_MESSAGING_H_ - -static inline void -mme_app_itti_auth_fail( - const uint32_t ue_id, - const nas_cause_t cause) -{ - MessageDef *message_p; - - - message_p = itti_alloc_new_message(TASK_MME_APP, NAS_AUTHENTICATION_PARAM_FAIL); - - NAS_AUTHENTICATION_PARAM_FAIL(message_p).ue_id = ue_id; - NAS_AUTHENTICATION_PARAM_FAIL(message_p).cause = cause; - - MSC_LOG_TX_MESSAGE( - MSC_MMEAPP_MME, - MSC_NAS_MME, - NULL,0, - "0 NAS_AUTHENTICATION_PARAM_FAIL ue_id %06"PRIX32" cause %u", - ue_id, cause); - - itti_send_msg_to_task(TASK_NAS_MME, INSTANCE_DEFAULT, message_p); -} - - - -static inline void mme_app_itti_auth_rsp( - const uint32_t ue_id, - const uint8_t nb_vectors, - const eutran_vector_t * const vector) -{ - MessageDef *message_p; - - message_p = itti_alloc_new_message(TASK_MME_APP, NAS_AUTHENTICATION_PARAM_RSP); - - NAS_AUTHENTICATION_PARAM_RSP(message_p).ue_id = ue_id; - NAS_AUTHENTICATION_PARAM_RSP(message_p).nb_vectors = nb_vectors; - memcpy(&NAS_AUTHENTICATION_PARAM_RSP(message_p).vector, vector, sizeof(*vector)); - - MSC_LOG_TX_MESSAGE( - MSC_MMEAPP_MME, - MSC_NAS_MME, - NULL,0, - "0 NAS_AUTHENTICATION_PARAM_RSP ue_id %06"PRIX32" nb_vectors %u", - ue_id, nb_vectors); - itti_send_msg_to_task(TASK_NAS_MME, INSTANCE_DEFAULT, message_p); -} - -#endif /* MME_APP_ITTI_MESSAGING_H_ */ diff --git a/openair-cn/MME_APP/mme_app_location.c b/openair-cn/MME_APP/mme_app_location.c deleted file mode 100755 index 969b7b6ffb..0000000000 --- a/openair-cn/MME_APP/mme_app_location.c +++ /dev/null @@ -1,167 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -/*! \file mme_app_location.c - * \brief - * \author Sebastien ROUX, Lionel GAUTHIER - * \version 1.0 - * \company Eurecom - * \email: lionel.gauthier@eurecom.fr - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "intertask_interface.h" -#include "mme_config.h" - -#include "mme_app_extern.h" -#include "mme_app_ue_context.h" -#include "mme_app_defs.h" - -#include "secu_defs.h" - -#include "assertions.h" -#include "common_types.h" -#include "msc.h" - - -int -mme_app_send_s6a_update_location_req( - struct ue_context_s * const ue_context_pP) -{ - struct ue_context_s *ue_context_p = NULL; - uint64_t imsi = 0; - MessageDef *message_p = NULL; - s6a_update_location_req_t *s6a_ulr_p = NULL; - - - MME_APP_STRING_TO_IMSI((char *)ue_context_pP->pending_pdn_connectivity_req_imsi, &imsi); - - MME_APP_DEBUG("Handling imsi %"IMSI_FORMAT"\n", imsi); - - if ((ue_context_p = mme_ue_context_exists_imsi(&mme_app_desc.mme_ue_contexts, - imsi)) == NULL) { - MME_APP_ERROR("That's embarrassing as we don't know this IMSI\n"); - return -1; - } - - message_p = itti_alloc_new_message(TASK_MME_APP, S6A_UPDATE_LOCATION_REQ); - - if (message_p == NULL) { - return -1; - } - - s6a_ulr_p = &message_p->ittiMsg.s6a_update_location_req; - memset((void*)s6a_ulr_p, 0, sizeof(s6a_update_location_req_t)); - - MME_APP_IMSI_TO_STRING(imsi, s6a_ulr_p->imsi); - s6a_ulr_p->imsi_length = strlen(s6a_ulr_p->imsi); - s6a_ulr_p->initial_attach = INITIAL_ATTACH; - memcpy(&s6a_ulr_p->visited_plmn, &ue_context_p->guti.gummei.plmn, sizeof(plmn_t)); - s6a_ulr_p->rat_type = RAT_EUTRAN; - /* Check if we already have UE data */ - s6a_ulr_p->skip_subscriber_data = 0; - - MSC_LOG_TX_MESSAGE( - MSC_MMEAPP_MME, - MSC_S6A_MME, - NULL,0, - "0 S6A_UPDATE_LOCATION_REQ imsi %"IMSI_FORMAT,imsi); - - return itti_send_msg_to_task(TASK_S6A, INSTANCE_DEFAULT, message_p); -} - - - -int -mme_app_handle_s6a_update_location_ans( - const s6a_update_location_ans_t * const ula_pP) -{ - uint64_t imsi = 0; - struct ue_context_s *ue_context_p = NULL; - - DevAssert(ula_pP != NULL); - - if (ula_pP->result.present == S6A_RESULT_BASE) { - if (ula_pP->result.choice.base != DIAMETER_SUCCESS) { - /* The update location procedure has failed. Notify the NAS layer - * and don't initiate the bearer creation on S-GW side. - */ - MME_APP_DEBUG("ULR/ULA procedure returned non success (ULA.result.choice.base=%d)\n", ula_pP->result.choice.base); - DevMessage("ULR/ULA procedure returned non success\n"); - } - } else { - /* The update location procedure has failed. Notify the NAS layer - * and don't initiate the bearer creation on S-GW side. - */ - MME_APP_DEBUG("ULR/ULA procedure returned non success (ULA.result.present=%d)\n", ula_pP->result.present); - DevMessage("ULR/ULA procedure returned non success\n"); - } - - MME_APP_STRING_TO_IMSI((char *)ula_pP->imsi, &imsi); - - MME_APP_DEBUG("%s Handling imsi %"IMSI_FORMAT"\n", __FUNCTION__, imsi); - - - if ((ue_context_p = mme_ue_context_exists_imsi(&mme_app_desc.mme_ue_contexts, imsi)) == NULL) { - MME_APP_ERROR("That's embarrassing as we don't know this IMSI\n"); - MSC_LOG_EVENT( - MSC_MMEAPP_MME, - "0 S6A_UPDATE_LOCATION unknown imsi %"IMSI_FORMAT,imsi); - return -1; - } - - ue_context_p->subscription_known = SUBSCRIPTION_KNOWN; - - ue_context_p->sub_status = ula_pP->subscription_data.subscriber_status; - ue_context_p->access_restriction_data = ula_pP->subscription_data.access_restriction; - - /* Copy the subscribed ambr to the sgw create session request message */ - memcpy(&ue_context_p->subscribed_ambr, &ula_pP->subscription_data.subscribed_ambr, - sizeof(ambr_t)); - memcpy( - ue_context_p->msisdn, - ula_pP->subscription_data.msisdn, - ula_pP->subscription_data.msisdn_length); - ue_context_p->msisdn_length = ula_pP->subscription_data.msisdn_length; - AssertFatal(ula_pP->subscription_data.msisdn_length != 0, "MSISDN LENGTH IS 0"); - AssertFatal(ula_pP->subscription_data.msisdn_length <= MSISDN_LENGTH, "MSISDN LENGTH is too high %u", MSISDN_LENGTH); - ue_context_p->msisdn[ue_context_p->msisdn_length] = '\0'; - - ue_context_p->rau_tau_timer = ula_pP->subscription_data.rau_tau_timer; - ue_context_p->access_mode = ula_pP->subscription_data.access_mode; - - memcpy(&ue_context_p->apn_profile, &ula_pP->subscription_data.apn_config_profile, - sizeof(apn_config_profile_t)); - - return mme_app_send_s11_create_session_req(ue_context_p); -} - diff --git a/openair-cn/MME_APP/mme_app_main.c b/openair-cn/MME_APP/mme_app_main.c deleted file mode 100644 index ddd00e1faf..0000000000 --- a/openair-cn/MME_APP/mme_app_main.c +++ /dev/null @@ -1,205 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "intertask_interface.h" -#include "mme_config.h" -#include "timer.h" - -#include "mme_app_extern.h" -#include "mme_app_ue_context.h" -#include "mme_app_defs.h" -#include "mme_app_statistics.h" - -#include "assertions.h" -#include "msc.h" - -mme_app_desc_t mme_app_desc; - -void *mme_app_thread(void *args); - -void *mme_app_thread(void *args) -{ - itti_mark_task_ready(TASK_MME_APP); - MSC_START_USE(); - - while(1) { - MessageDef *received_message_p = NULL; - /* Trying to fetch a message from the message queue. - * If the queue is empty, this function will block till a - * message is sent to the task. - */ - itti_receive_msg(TASK_MME_APP, &received_message_p); - DevAssert(received_message_p != NULL); - - switch (ITTI_MSG_ID(received_message_p)) { - case S6A_AUTH_INFO_ANS: { - /* We received the authentication vectors from HSS, trigger a ULR - * for now. Normaly should trigger an authentication procedure with UE. - */ - mme_app_handle_authentication_info_answer(&received_message_p->ittiMsg.s6a_auth_info_ans); - } - break; - - case S6A_UPDATE_LOCATION_ANS: { - /* We received the update location answer message from HSS -> Handle it */ - mme_app_handle_s6a_update_location_ans(&received_message_p->ittiMsg.s6a_update_location_ans); - } - break; - - case SGW_CREATE_SESSION_RESPONSE: { - mme_app_handle_create_sess_resp(&received_message_p->ittiMsg.sgwCreateSessionResponse); - } - break; - - case SGW_MODIFY_BEARER_RESPONSE: { - MME_APP_DEBUG(" TO DO HANDLE SGW_MODIFY_BEARER_RESPONSE"); - // TO DO - } - break; - - case SGW_RELEASE_ACCESS_BEARERS_RESPONSE: { - mme_app_handle_release_access_bearers_resp(&received_message_p->ittiMsg.sgwReleaseAccessBearersResponse); - } - break; - -#if defined(DISABLE_USE_NAS) - - case NAS_ATTACH_REQ: { - mme_app_handle_attach_req(&received_message_p->ittiMsg.nas_attach_req); - } - break; - - case NAS_AUTHENTICATION_RESP: { - mme_app_handle_nas_auth_resp(&received_message_p->ittiMsg.nas_auth_resp); - } - break; -#else - - case NAS_AUTHENTICATION_PARAM_REQ: { - mme_app_handle_nas_auth_param_req(&received_message_p->ittiMsg.nas_auth_param_req); - } - break; -#endif - - case NAS_PDN_CONNECTIVITY_REQ: { - mme_app_handle_nas_pdn_connectivity_req(&received_message_p->ittiMsg.nas_pdn_connectivity_req); - } - break; - - case NAS_CONNECTION_ESTABLISHMENT_CNF: { - mme_app_handle_conn_est_cnf(&NAS_CONNECTION_ESTABLISHMENT_CNF(received_message_p)); - } - break; - - // From S1AP Initiating Message/EMM Attach Request - case MME_APP_CONNECTION_ESTABLISHMENT_IND: { - mme_app_handle_conn_est_ind(&MME_APP_CONNECTION_ESTABLISHMENT_IND(received_message_p)); - } - break; - - case MME_APP_INITIAL_CONTEXT_SETUP_RSP: { - mme_app_handle_initial_context_setup_rsp(&MME_APP_INITIAL_CONTEXT_SETUP_RSP(received_message_p)); - } - break; - - case TIMER_HAS_EXPIRED: { - /* Check if it is the statistic timer */ - if (received_message_p->ittiMsg.timer_has_expired.timer_id == - mme_app_desc.statistic_timer_id) { - mme_app_statistics_display(); - } - } - break; - - case TERMINATE_MESSAGE: { - /* Termination message received TODO -> release any data allocated */ - itti_exit_task(); - } - break; - - case S1AP_UE_CAPABILITIES_IND: { - mme_app_handle_s1ap_ue_capabilities_ind(&received_message_p->ittiMsg.s1ap_ue_cap_ind); - } - break; - - case S1AP_UE_CONTEXT_RELEASE_REQ: { - mme_app_handle_s1ap_ue_context_release_req(&received_message_p->ittiMsg.s1ap_ue_context_release_req); - } - break; - - case S1AP_UE_CONTEXT_RELEASE_COMPLETE: { - mme_app_handle_s1ap_ue_context_release_complete(&received_message_p->ittiMsg.s1ap_ue_context_release_complete); - } - break; - default: { - MME_APP_DEBUG("Unkwnon message ID %d:%s\n", - ITTI_MSG_ID(received_message_p), ITTI_MSG_NAME(received_message_p)); - AssertFatal(0, "Unkwnon message ID %d:%s\n", - ITTI_MSG_ID(received_message_p), ITTI_MSG_NAME(received_message_p)); - } - break; - } - - itti_free(ITTI_MSG_ORIGIN_ID(received_message_p), received_message_p); - received_message_p = NULL; - } - - return NULL; -} - -int mme_app_init(const mme_config_t *mme_config_p) -{ - MME_APP_DEBUG("Initializing MME applicative layer\n"); - - memset(&mme_app_desc, 0, sizeof(mme_app_desc)); - - /* Create the thread associated with MME applicative layer */ - if (itti_create_task(TASK_MME_APP, &mme_app_thread, NULL) < 0) { - MME_APP_ERROR("MME APP create task failed\n"); - return -1; - } - - mme_app_desc.statistic_timer_period = mme_config_p->mme_statistic_timer; - - /* Request for periodic timer */ - if (timer_setup(mme_config_p->mme_statistic_timer, 0, TASK_MME_APP, INSTANCE_DEFAULT, - TIMER_PERIODIC, NULL, &mme_app_desc.statistic_timer_id) < 0) { - MME_APP_ERROR("Failed to request new timer for statistics with %ds " - "of periocidity\n", mme_config_p->mme_statistic_timer); - mme_app_desc.statistic_timer_id = 0; - } - - MME_APP_DEBUG("Initializing MME applicative layer: DONE\n"); - return 0; -} diff --git a/openair-cn/MME_APP/mme_app_statistics.c b/openair-cn/MME_APP/mme_app_statistics.c deleted file mode 100644 index e9eea88a42..0000000000 --- a/openair-cn/MME_APP/mme_app_statistics.c +++ /dev/null @@ -1,55 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -#include <stdlib.h> -#include <stdio.h> - -#include "intertask_interface.h" - -#include "mme_app_ue_context.h" -#include "mme_app_defs.h" -#include "mme_app_statistics.h" - -int -mme_app_statistics_display(void) -{ - fprintf(stdout, "================== Statistics ==================\n"); - fprintf(stdout, " | Global | Since last display |\n"); - fprintf(stdout, "UE | %10u | %10u |\n", - mme_app_desc.mme_ue_contexts.nb_ue_managed, - mme_app_desc.mme_ue_contexts.nb_ue_since_last_stat); - fprintf(stdout, "Bearers | %10u | %10u |\n", - mme_app_desc.mme_ue_contexts.nb_bearers_managed, - mme_app_desc.mme_ue_contexts.nb_bearers_since_last_stat); - - mme_app_desc.mme_ue_contexts.nb_ue_since_last_stat = 0; - mme_app_desc.mme_ue_contexts.nb_bearers_since_last_stat = 0; - - return 0; -} diff --git a/openair-cn/MME_APP/mme_app_statistics.h b/openair-cn/MME_APP/mme_app_statistics.h deleted file mode 100644 index 886cb9acd8..0000000000 --- a/openair-cn/MME_APP/mme_app_statistics.h +++ /dev/null @@ -1,35 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -#ifndef MME_APP_STATISTICS_H_ -#define MME_APP_STATISTICS_H_ - -int mme_app_statistics_display(void); - -#endif /* MME_APP_STATISTICS_H_ */ diff --git a/openair-cn/MME_APP/mme_app_ue_context.h b/openair-cn/MME_APP/mme_app_ue_context.h deleted file mode 100644 index d87f0fa4c0..0000000000 --- a/openair-cn/MME_APP/mme_app_ue_context.h +++ /dev/null @@ -1,265 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - - -/*! \file mme_app_ue_context.h - * \brief MME applicative layer - * \author Sebastien ROUX - * \date 2013 - * \version 1.0 - * @defgroup _mme_app_impl_ MME applicative layer - * @ingroup _ref_implementation_ - * @{ - */ - -#include <stdint.h> -#include <inttypes.h> /* For sscanf formats */ -#include <time.h> /* to provide time_t */ - -#include "s1ap_messages_types.h" -#include "nas_messages_types.h" -#include "s6a_messages_types.h" -#include "security_types.h" -#include "tree.h" - -#ifndef MME_APP_UE_CONTEXT_H_ -#define MME_APP_UE_CONTEXT_H_ - -typedef enum { - ECM_IDLE, - ECM_CONNECTED, - ECM_DEREGISTERED, -} mm_state_t; - -typedef uint64_t mme_app_imsi_t; - -#define IMSI_FORMAT SCNu64 - -/* Convert the IMSI contained by a char string NULL terminated to uint64_t */ -#define MME_APP_STRING_TO_IMSI(sTRING, iMSI) sscanf(sTRING, "%"IMSI_FORMAT, iMSI) -#define MME_APP_IMSI_TO_STRING(iMSI, sTRING) snprintf(sTRING, IMSI_DIGITS_MAX+1, "%"IMSI_FORMAT, iMSI) - -/** @struct bearer_context_t - * @brief Parameters that should be kept for an eps bearer. - */ -typedef struct bearer_context_s { - /* S-GW Tunnel Endpoint for User-Plane */ - Teid_t s_gw_teid; - - /* S-GW IP address for User-Plane */ - ip_address_t s_gw_address; - - /* P-GW Tunnel Endpoint for User-Plane */ - Teid_t p_gw_teid; - - /* P-GW IP address for User-Plane */ - ip_address_t p_gw_address; - - /* QoS for this bearer */ - qci_t qci; - priority_level_t prio_level; - pre_emp_vulnerability_t pre_emp_vulnerability; - pre_emp_capability_t pre_emp_capability; - - /* TODO: add TFT */ -} bearer_context_t; - -/** @struct ue_context_t - * @brief Useful parameters to know in MME application layer. They are set - * according to 3GPP TS.23.401 #5.7.2 - */ -typedef struct ue_context_s { - /* Tree entry */ - RB_ENTRY(ue_context_s) rb_entry; - - /* Basic identifier for ue. IMSI is encoded on maximum of 15 digits of 4 bits, - * so usage of an unsigned integer on 64 bits is necessary. - */ - mme_app_imsi_t imsi; // set by nas_auth_param_req_t -#define IMSI_UNAUTHENTICATED (0x0) -#define IMSI_AUTHENTICATED (0x1) - /* Indicator to show the IMSI authentication state */ - unsigned imsi_auth:1; // set by nas_auth_resp_t - - unsigned eNB_ue_s1ap_id:24; - uint32_t mme_ue_s1ap_id; - - /* ue_id is equal to mme_ue_s1ap_id */ - uint32_t ue_id; // set by nas_auth_param_req_t - - uint8_t nb_of_vectors; // updated by S6A AUTHENTICATION ANSWER - /* List of authentication vectors for E-UTRAN */ - eutran_vector_t *vector_list; // updated by S6A AUTHENTICATION ANSWER - // pointer in vector_list - eutran_vector_t *vector_in_use; // updated by S6A AUTHENTICATION ANSWER - -#define SUBSCRIPTION_UNKNOWN 0x0 -#define SUBSCRIPTION_KNOWN 0x1 - unsigned subscription_known:1; // set by S6A UPDATE LOCATION ANSWER - uint8_t msisdn[MSISDN_LENGTH+1]; // set by S6A UPDATE LOCATION ANSWER - uint8_t msisdn_length; // set by S6A UPDATE LOCATION ANSWER - - mm_state_t mm_state; // not set/read - /* Globally Unique Temporary Identity */ - GUTI_t guti; // guti.gummei.plmn set by nas_auth_param_req_t - // read by S6A UPDATE LOCATION REQUEST - me_identity_t me_identity; // not set/read except read by display utility - - /* TODO: Add TAI list */ - - /* Last known cell identity */ - cgi_t e_utran_cgi; // set by nas_attach_req_t - // read for S11 CREATE_SESSION_REQUEST - /* Time when the cell identity was acquired */ - time_t cell_age; // set by nas_auth_param_req_t - - /* TODO: add csg_id */ - /* TODO: add csg_membership */ - - network_access_mode_t access_mode; // set by S6A UPDATE LOCATION ANSWER - - /* TODO: add ue radio cap, ms classmarks, supported codecs */ - - /* TODO: add ue network capability, ms network capability */ - /* TODO: add selected NAS algorithm */ - - /* TODO: add DRX parameter */ - - apn_config_profile_t apn_profile; // set by S6A UPDATE LOCATION ANSWER - ard_t access_restriction_data; // set by S6A UPDATE LOCATION ANSWER - subscriber_status_t sub_status; // set by S6A UPDATE LOCATION ANSWER - ambr_t subscribed_ambr; // set by S6A UPDATE LOCATION ANSWER - ambr_t used_ambr; - - rau_tau_timer_t rau_tau_timer; // set by S6A UPDATE LOCATION ANSWER - - /* Store the radio capabilities as received in S1AP UE capability indication - * message. - */ - char *ue_radio_capabilities; // not set/read - int ue_radio_cap_length; // not set/read - - Teid_t mme_s11_teid; // set by mme_app_send_s11_create_session_req - Teid_t sgw_s11_teid; // set by S11 CREATE_SESSION_RESPONSE - PAA_t paa; // set by S11 CREATE_SESSION_RESPONSE - - // temp - char pending_pdn_connectivity_req_imsi[16]; - uint8_t pending_pdn_connectivity_req_imsi_length; - OctetString pending_pdn_connectivity_req_apn; - OctetString pending_pdn_connectivity_req_pdn_addr; - int pending_pdn_connectivity_req_pti; - unsigned pending_pdn_connectivity_req_ue_id; - network_qos_t pending_pdn_connectivity_req_qos; - pco_flat_t pending_pdn_connectivity_req_pco; - void *pending_pdn_connectivity_req_proc_data; - int pending_pdn_connectivity_req_request_type; - - ebi_t default_bearer_id; - bearer_context_t eps_bearers[BEARERS_PER_UE]; -} ue_context_t; - -typedef struct { - uint32_t nb_ue_managed; - uint32_t nb_ue_idle; - - uint32_t nb_bearers_managed; - - uint32_t nb_ue_since_last_stat; - uint32_t nb_bearers_since_last_stat; - - /* Entry to the root */ - RB_HEAD(ue_context_map, ue_context_s) ue_context_tree; -} mme_ue_context_t; - -/** \brief Retrieve an UE context by selecting the provided IMSI - * \param imsi Imsi to find in UE map - * @returns an UE context matching the IMSI or NULL if the context doesn't exists - **/ -ue_context_t *mme_ue_context_exists_imsi(mme_ue_context_t *mme_ue_context, - mme_app_imsi_t imsi); - -/** \brief Retrieve an UE context by selecting the provided S11 teid - * \param teid The tunnel endpoint identifier used between MME and S-GW - * @returns an UE context matching the teid or NULL if the context doesn't exists - **/ -ue_context_t *mme_ue_context_exists_s11_teid(mme_ue_context_t *mme_ue_context, - uint32_t teid); - -/** \brief Retrieve an UE context by selecting the provided mme_ue_s1ap_id - * \param mme_ue_s1ap_id The UE id identifier used in S1AP MME (and NAS) - * @returns an UE context matching the mme_ue_s1ap_id or NULL if the context doesn't exists - **/ -ue_context_t *mme_ue_context_exists_mme_ue_s1ap_id(mme_ue_context_t *mme_ue_context, - uint32_t mme_ue_s1ap_id); - -/** \brief Retrieve an UE context by selecting the provided nas_ue_id - * \param nas_ue_id The UE id identifier used in S1AP MME and NAS - * @returns an UE context matching the nas_ue_id or NULL if the context doesn't exists - **/ -ue_context_t *mme_ue_context_exists_nas_ue_id(mme_ue_context_t *mme_ue_context, - uint32_t nas_ue_id); - -/** \brief Retrieve an UE context by selecting the provided guti - * \param guti The GUTI used by the UE - * @returns an UE context matching the guti or NULL if the context doesn't exists - **/ -ue_context_t *mme_ue_context_exists_guti(mme_ue_context_t *mme_ue_context, - GUTI_t guti); - -/** \brief Insert a new UE context in the tree of known UEs. - * At least the IMSI should be known to insert the context in the tree. - * \param ue_context_p The UE context to insert - * @returns 0 in case of success, -1 otherwise - **/ -int mme_insert_ue_context(mme_ue_context_t *mme_ue_context, - struct ue_context_s *ue_context_p); - -/** \brief Remove a UE context of the tree of known UEs. - * \param ue_context_p The UE context to remove - **/ -void mme_remove_ue_context(mme_ue_context_t *mme_ue_context, - struct ue_context_s *ue_context_p); - - -/** \brief Allocate memory for a new UE context - * @returns Pointer to the new structure, NULL if allocation failed - **/ -ue_context_t *mme_create_new_ue_context(void); - -/** \brief Dump the UE contexts present in the tree - **/ -void mme_app_dump_ue_contexts(mme_ue_context_t *mme_ue_context); - - -void mme_app_handle_s1ap_ue_context_release_req(const s1ap_ue_context_release_req_t const *s1ap_ue_context_release_req); - -#endif /* MME_APP_UE_CONTEXT_H_ */ - -/* @} */ diff --git a/openair-cn/MME_APP/s6a_2_nas_cause.c b/openair-cn/MME_APP/s6a_2_nas_cause.c deleted file mode 100644 index 979247b076..0000000000 --- a/openair-cn/MME_APP/s6a_2_nas_cause.c +++ /dev/null @@ -1,96 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - - -#include "as_message.h" -#include "common_types.h" -#include "s6a_defs.h" -#include "mme_app_defs.h" - -nas_cause_t s6a_error_2_nas_cause(uint32_t s6a_error, int experimental) -{ - if (experimental == 0) { - /* Base protocol errors */ - switch (s6a_error) { - /* 3002 */ - case ER_DIAMETER_UNABLE_TO_DELIVER: /* Fall through */ - - /* 3003 */ - case ER_DIAMETER_REALM_NOT_SERVED: /* Fall through */ - - /* 5003 */ - case ER_DIAMETER_AUTHORIZATION_REJECTED: - return NAS_CAUSE_NO_SUITABLE_CELLS_IN_TRACKING_AREA; - - /* 5012 */ - case ER_DIAMETER_UNABLE_TO_COMPLY: /* Fall through */ - - /* 5004 */ - case ER_DIAMETER_INVALID_AVP_VALUE: /* Fall through */ - - /* Any other permanent errors from the diameter base protocol */ - default: - break; - } - } else { - switch (s6a_error) { - /* 5001 */ - case DIAMETER_ERROR_USER_UNKNOWN: - return NAS_CAUSE_EPS_SERVICES_AND_NON_EPS_SERVICES_NOT_ALLOWED; - - /* TODO: distinguish GPRS_DATA_SUBSCRIPTION */ - /* 5420 */ - case DIAMETER_ERROR_UNKNOWN_EPS_SUBSCRIPTION: - return NAS_CAUSE_NO_SUITABLE_CELLS_IN_TRACKING_AREA; - - /* 5421 */ - case DIAMETER_ERROR_RAT_NOT_ALLOWED: - /* One of the following parameter can be sent depending on - * operator preference: - * ROAMING_NOT_ALLOWED_IN_THIS_TRACKING_AREA - * TRACKING_AREA_NOT_ALLOWED - * NO_SUITABLE_CELLS_IN_TRACKING_AREA - */ - return NAS_CAUSE_TRACKING_AREA_NOT_ALLOWED; - - /* 5004 without error diagnostic */ - case DIAMETER_ERROR_ROAMING_NOT_ALLOWED: - return NAS_CAUSE_PLMN_NOT_ALLOWED; - - /* TODO: 5004 with error diagnostic of ODB_HPLMN_APN or - * ODB_VPLMN_APN - */ - /* TODO: 5004 with error diagnostic of ODB_ALL_APN */ - default: - break; - } - } - - return NAS_CAUSE_NETWORK_FAILURE; -} diff --git a/openair-cn/Makefile.am b/openair-cn/Makefile.am deleted file mode 100644 index 9a829d7c74..0000000000 --- a/openair-cn/Makefile.am +++ /dev/null @@ -1,102 +0,0 @@ -################################################################################ -# 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@eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ -ACLOCAL_AMFLAGS = -I m4 - -AM_CFLAGS = @ADD_CFLAGS@ \ - -I$(top_srcdir)/COMMON \ - -I$(top_srcdir)/UTILS \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/api/network \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/include \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/ies \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/emm/msg \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/esm/msg \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/util \ - -I$(top_srcdir)/INTERTASK_INTERFACE - -if HAVE_GCCXML -BUILT_SOURCES = \ - messages.xml \ - messages_xml.h - -messages_hdr = \ - $(top_srcdir)/INTERTASK_INTERFACE/intertask_messages_def.h \ - $(top_srcdir)/INTERTASK_INTERFACE/timer_messages_def.h \ - $(top_srcdir)/INTERTASK_INTERFACE/timer_messages_types.h \ - $(top_srcdir)/COMMON/tasks_def.h \ - $(top_srcdir)/COMMON/messages_def.h \ - $(top_srcdir)/COMMON/messages_types.h \ - $(top_srcdir)/COMMON/gtpv1_u_messages_def.h \ - $(top_srcdir)/COMMON/gtpv1_u_messages_types.h \ - $(top_srcdir)/COMMON/nas_messages_def.h \ - $(top_srcdir)/COMMON/nas_messages_types.h \ - $(top_srcdir)/COMMON/s11_messages_def.h \ - $(top_srcdir)/COMMON/s11_messages_types.h \ - $(top_srcdir)/COMMON/s1ap_messages_def.h \ - $(top_srcdir)/COMMON/s1ap_messages_types.h \ - $(top_srcdir)/COMMON/s6a_messages_def.h \ - $(top_srcdir)/COMMON/s6a_messages_types.h \ - $(top_srcdir)/COMMON/sgw_lite_def.h \ - $(top_srcdir)/COMMON/sgw_lite_messages_types.h \ - $(top_srcdir)/COMMON/sctp_messages_def.h \ - $(top_srcdir)/COMMON/sctp_messages_types.h \ - $(top_srcdir)/COMMON/udp_messages_def.h \ - $(top_srcdir)/COMMON/udp_messages_types.h - -messages.xml: $(top_srcdir)/INTERTASK_INTERFACE/intertask_interface_types.h $(messages_hdr) - @echo "Generating $<" - @gccxml $(AM_CFLAGS) $< -fxml=$(top_builddir)/$@ - -messages_xml.h: messages.xml - @echo "Generating $<" - @sed -e 's/[ ]*//' -e 's/"/\\"/g' -e 's/^/"/' -e 's/$$/\\n"/' messages.xml > messages_xml.h - -clean-local: - @rm -rf -v messages.xml messages_xml.h -endif - -SUBDIRS = \ - . \ - GTPV1-U \ - GTPV2-C \ - INTERTASK_INTERFACE \ - SGI \ - NAS \ - SCTP \ - S11 \ - S1AP \ - S6A \ - SECU \ - SGW-LITE \ - UTILS \ - UDP \ - MME_APP \ - TEST \ - OAISIM_MME \ - OAI_EPC \ - OAI_SGW \ No newline at end of file diff --git a/openair-cn/NAS/COMMON/API/NETWORK/COPYING b/openair-cn/NAS/COMMON/API/NETWORK/COPYING index 94a9ed024d..c888423064 100644 --- a/openair-cn/NAS/COMMON/API/NETWORK/COPYING +++ b/openair-cn/NAS/COMMON/API/NETWORK/COPYING @@ -1,674 +1,28 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program 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. - - This program 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 this program. If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - <program> Copyright (C) <year> <name of author> - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<http://www.gnu.org/licenses/>. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<http://www.gnu.org/philosophy/why-not-lgpl.html>. +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ \ No newline at end of file diff --git a/openair-cn/NAS/COMMON/API/NETWORK/Makefile b/openair-cn/NAS/COMMON/API/NETWORK/Makefile index cce6a240ee..03b706bc5d 100644 --- a/openair-cn/NAS/COMMON/API/NETWORK/Makefile +++ b/openair-cn/NAS/COMMON/API/NETWORK/Makefile @@ -1,31 +1,3 @@ -################################################################################ -# 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@eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ ifndef PROJDIR PROJDIR = $(PWD)/../../.. INCLUDES = -I. -I$(INCDIR) -I$(UTILDIR) -I$(IESDIR) -I$(EMMMSGDIR) -I$(ESMMSGDIR) diff --git a/openair-cn/NAS/COMMON/API/NETWORK/as_message.c b/openair-cn/NAS/COMMON/API/NETWORK/as_message.c index 5b29016f3a..be850d31af 100644 --- a/openair-cn/NAS/COMMON/API/NETWORK/as_message.c +++ b/openair-cn/NAS/COMMON/API/NETWORK/as_message.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ /***************************************************************************** Source as_message.c diff --git a/openair-cn/NAS/COMMON/API/NETWORK/l2_message.h b/openair-cn/NAS/COMMON/API/NETWORK/l2_message.h index d24d78b503..02e5d87354 100644 --- a/openair-cn/NAS/COMMON/API/NETWORK/l2_message.h +++ b/openair-cn/NAS/COMMON/API/NETWORK/l2_message.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ /***************************************************************************** Source as_message.h diff --git a/openair-cn/NAS/COMMON/API/NETWORK/nas_message.c b/openair-cn/NAS/COMMON/API/NETWORK/nas_message.c index 611ad6fc3a..a7e5802765 100644 --- a/openair-cn/NAS/COMMON/API/NETWORK/nas_message.c +++ b/openair-cn/NAS/COMMON/API/NETWORK/nas_message.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ /***************************************************************************** Source nas_message.h diff --git a/openair-cn/NAS/COMMON/API/NETWORK/nas_message.h b/openair-cn/NAS/COMMON/API/NETWORK/nas_message.h index f4187b7396..cecd676c93 100644 --- a/openair-cn/NAS/COMMON/API/NETWORK/nas_message.h +++ b/openair-cn/NAS/COMMON/API/NETWORK/nas_message.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ /***************************************************************************** Source nas_message.h diff --git a/openair-cn/NAS/COMMON/API/NETWORK/network_api.c b/openair-cn/NAS/COMMON/API/NETWORK/network_api.c index 61814c3e11..a057c7e5b0 100644 --- a/openair-cn/NAS/COMMON/API/NETWORK/network_api.c +++ b/openair-cn/NAS/COMMON/API/NETWORK/network_api.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ /***************************************************************************** Source network_api.c diff --git a/openair-cn/NAS/COMMON/API/NETWORK/network_api.h b/openair-cn/NAS/COMMON/API/NETWORK/network_api.h index f9b04371fe..bf531539bd 100644 --- a/openair-cn/NAS/COMMON/API/NETWORK/network_api.h +++ b/openair-cn/NAS/COMMON/API/NETWORK/network_api.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ /***************************************************************************** Source network_api.h diff --git a/openair-cn/NAS/COMMON/COPYING b/openair-cn/NAS/COMMON/COPYING index 94a9ed024d..c888423064 100644 --- a/openair-cn/NAS/COMMON/COPYING +++ b/openair-cn/NAS/COMMON/COPYING @@ -1,674 +1,28 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program 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. - - This program 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 this program. If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - <program> Copyright (C) <year> <name of author> - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<http://www.gnu.org/licenses/>. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<http://www.gnu.org/philosophy/why-not-lgpl.html>. +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ \ No newline at end of file diff --git a/openair-cn/NAS/COMMON/EMM/MSG/AttachAccept.c b/openair-cn/NAS/COMMON/EMM/MSG/AttachAccept.c index 62eab5acb9..3d800d5c19 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/AttachAccept.c +++ b/openair-cn/NAS/COMMON/EMM/MSG/AttachAccept.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/AttachAccept.h b/openair-cn/NAS/COMMON/EMM/MSG/AttachAccept.h index 2c1fc64bae..760d85ec05 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/AttachAccept.h +++ b/openair-cn/NAS/COMMON/EMM/MSG/AttachAccept.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/AttachComplete.c b/openair-cn/NAS/COMMON/EMM/MSG/AttachComplete.c index 386694eadf..f36176f16b 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/AttachComplete.c +++ b/openair-cn/NAS/COMMON/EMM/MSG/AttachComplete.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/AttachComplete.h b/openair-cn/NAS/COMMON/EMM/MSG/AttachComplete.h index 6856d9fd32..f11623ff44 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/AttachComplete.h +++ b/openair-cn/NAS/COMMON/EMM/MSG/AttachComplete.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/AttachReject.c b/openair-cn/NAS/COMMON/EMM/MSG/AttachReject.c index 16621cf25e..eed7199635 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/AttachReject.c +++ b/openair-cn/NAS/COMMON/EMM/MSG/AttachReject.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/AttachReject.h b/openair-cn/NAS/COMMON/EMM/MSG/AttachReject.h index 3d12b7fdad..e65fe17325 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/AttachReject.h +++ b/openair-cn/NAS/COMMON/EMM/MSG/AttachReject.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/AttachRequest.c b/openair-cn/NAS/COMMON/EMM/MSG/AttachRequest.c index f301b44a86..fa11d84ed7 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/AttachRequest.c +++ b/openair-cn/NAS/COMMON/EMM/MSG/AttachRequest.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/AttachRequest.h b/openair-cn/NAS/COMMON/EMM/MSG/AttachRequest.h index f19c53f1ad..26937ad5d6 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/AttachRequest.h +++ b/openair-cn/NAS/COMMON/EMM/MSG/AttachRequest.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/AuthenticationFailure.c b/openair-cn/NAS/COMMON/EMM/MSG/AuthenticationFailure.c index 979ade2f24..79a12874cf 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/AuthenticationFailure.c +++ b/openair-cn/NAS/COMMON/EMM/MSG/AuthenticationFailure.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/AuthenticationFailure.h b/openair-cn/NAS/COMMON/EMM/MSG/AuthenticationFailure.h index 8c9b66dd32..978bf31f18 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/AuthenticationFailure.h +++ b/openair-cn/NAS/COMMON/EMM/MSG/AuthenticationFailure.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/AuthenticationReject.c b/openair-cn/NAS/COMMON/EMM/MSG/AuthenticationReject.c index 1d486e070b..1b8643083e 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/AuthenticationReject.c +++ b/openair-cn/NAS/COMMON/EMM/MSG/AuthenticationReject.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/AuthenticationReject.h b/openair-cn/NAS/COMMON/EMM/MSG/AuthenticationReject.h index 85111297ee..629b032074 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/AuthenticationReject.h +++ b/openair-cn/NAS/COMMON/EMM/MSG/AuthenticationReject.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/AuthenticationRequest.c b/openair-cn/NAS/COMMON/EMM/MSG/AuthenticationRequest.c index e6f10c9ef6..bba6ea7f3b 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/AuthenticationRequest.c +++ b/openair-cn/NAS/COMMON/EMM/MSG/AuthenticationRequest.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/AuthenticationRequest.h b/openair-cn/NAS/COMMON/EMM/MSG/AuthenticationRequest.h index 1bfe9f1719..2997836b0f 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/AuthenticationRequest.h +++ b/openair-cn/NAS/COMMON/EMM/MSG/AuthenticationRequest.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/AuthenticationResponse.c b/openair-cn/NAS/COMMON/EMM/MSG/AuthenticationResponse.c index 775932e18f..db508c5786 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/AuthenticationResponse.c +++ b/openair-cn/NAS/COMMON/EMM/MSG/AuthenticationResponse.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/AuthenticationResponse.h b/openair-cn/NAS/COMMON/EMM/MSG/AuthenticationResponse.h index 2e93301ee7..3442e34064 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/AuthenticationResponse.h +++ b/openair-cn/NAS/COMMON/EMM/MSG/AuthenticationResponse.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/COPYING b/openair-cn/NAS/COMMON/EMM/MSG/COPYING index 94a9ed024d..c888423064 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/COPYING +++ b/openair-cn/NAS/COMMON/EMM/MSG/COPYING @@ -1,674 +1,28 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program 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. - - This program 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 this program. If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - <program> Copyright (C) <year> <name of author> - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<http://www.gnu.org/licenses/>. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<http://www.gnu.org/philosophy/why-not-lgpl.html>. +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ \ No newline at end of file diff --git a/openair-cn/NAS/COMMON/EMM/MSG/CsServiceNotification.c b/openair-cn/NAS/COMMON/EMM/MSG/CsServiceNotification.c index d299fd8d13..08514dfbe1 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/CsServiceNotification.c +++ b/openair-cn/NAS/COMMON/EMM/MSG/CsServiceNotification.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/CsServiceNotification.h b/openair-cn/NAS/COMMON/EMM/MSG/CsServiceNotification.h index 6fcb5e0bab..e726802840 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/CsServiceNotification.h +++ b/openair-cn/NAS/COMMON/EMM/MSG/CsServiceNotification.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/DetachAccept.c b/openair-cn/NAS/COMMON/EMM/MSG/DetachAccept.c index 242020c4bf..7b3a79453a 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/DetachAccept.c +++ b/openair-cn/NAS/COMMON/EMM/MSG/DetachAccept.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/DetachAccept.h b/openair-cn/NAS/COMMON/EMM/MSG/DetachAccept.h index 2966bbad79..a04905aef6 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/DetachAccept.h +++ b/openair-cn/NAS/COMMON/EMM/MSG/DetachAccept.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/DetachRequest.c b/openair-cn/NAS/COMMON/EMM/MSG/DetachRequest.c index 32b9a8f37f..81675e6fd0 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/DetachRequest.c +++ b/openair-cn/NAS/COMMON/EMM/MSG/DetachRequest.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/DetachRequest.h b/openair-cn/NAS/COMMON/EMM/MSG/DetachRequest.h index 9577b9a9cd..572466d139 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/DetachRequest.h +++ b/openair-cn/NAS/COMMON/EMM/MSG/DetachRequest.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/DownlinkNasTransport.c b/openair-cn/NAS/COMMON/EMM/MSG/DownlinkNasTransport.c index b4a1658c57..a5255e99ea 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/DownlinkNasTransport.c +++ b/openair-cn/NAS/COMMON/EMM/MSG/DownlinkNasTransport.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/DownlinkNasTransport.h b/openair-cn/NAS/COMMON/EMM/MSG/DownlinkNasTransport.h index 4aaf43449b..111958fdf1 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/DownlinkNasTransport.h +++ b/openair-cn/NAS/COMMON/EMM/MSG/DownlinkNasTransport.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/EmmInformation.c b/openair-cn/NAS/COMMON/EMM/MSG/EmmInformation.c index c7a041ed7d..2901998eb6 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/EmmInformation.c +++ b/openair-cn/NAS/COMMON/EMM/MSG/EmmInformation.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/EmmInformation.h b/openair-cn/NAS/COMMON/EMM/MSG/EmmInformation.h index ce87feb4e7..a3f8059561 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/EmmInformation.h +++ b/openair-cn/NAS/COMMON/EMM/MSG/EmmInformation.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/EmmStatus.c b/openair-cn/NAS/COMMON/EMM/MSG/EmmStatus.c index ec3154728b..274f8d47c0 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/EmmStatus.c +++ b/openair-cn/NAS/COMMON/EMM/MSG/EmmStatus.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/EmmStatus.h b/openair-cn/NAS/COMMON/EMM/MSG/EmmStatus.h index 6fe769dac6..716d08763a 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/EmmStatus.h +++ b/openair-cn/NAS/COMMON/EMM/MSG/EmmStatus.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/ExtendedServiceRequest.c b/openair-cn/NAS/COMMON/EMM/MSG/ExtendedServiceRequest.c index 85e337bc31..903d92c51f 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/ExtendedServiceRequest.c +++ b/openair-cn/NAS/COMMON/EMM/MSG/ExtendedServiceRequest.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/ExtendedServiceRequest.h b/openair-cn/NAS/COMMON/EMM/MSG/ExtendedServiceRequest.h index 06d40edc19..d0a9d02e92 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/ExtendedServiceRequest.h +++ b/openair-cn/NAS/COMMON/EMM/MSG/ExtendedServiceRequest.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/GutiReallocationCommand.c b/openair-cn/NAS/COMMON/EMM/MSG/GutiReallocationCommand.c index e3f7764139..313212c09d 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/GutiReallocationCommand.c +++ b/openair-cn/NAS/COMMON/EMM/MSG/GutiReallocationCommand.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/GutiReallocationCommand.h b/openair-cn/NAS/COMMON/EMM/MSG/GutiReallocationCommand.h index 7e7ffb7636..68a68d6dc6 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/GutiReallocationCommand.h +++ b/openair-cn/NAS/COMMON/EMM/MSG/GutiReallocationCommand.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/GutiReallocationComplete.c b/openair-cn/NAS/COMMON/EMM/MSG/GutiReallocationComplete.c index 8c3b0ed9ff..c7bdda8a0f 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/GutiReallocationComplete.c +++ b/openair-cn/NAS/COMMON/EMM/MSG/GutiReallocationComplete.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/GutiReallocationComplete.h b/openair-cn/NAS/COMMON/EMM/MSG/GutiReallocationComplete.h index 977e51709a..63a51cbe2c 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/GutiReallocationComplete.h +++ b/openair-cn/NAS/COMMON/EMM/MSG/GutiReallocationComplete.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/IdentityRequest.c b/openair-cn/NAS/COMMON/EMM/MSG/IdentityRequest.c index 3aafece930..3d785cddf8 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/IdentityRequest.c +++ b/openair-cn/NAS/COMMON/EMM/MSG/IdentityRequest.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/IdentityRequest.h b/openair-cn/NAS/COMMON/EMM/MSG/IdentityRequest.h index 1846253389..97f783addd 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/IdentityRequest.h +++ b/openair-cn/NAS/COMMON/EMM/MSG/IdentityRequest.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/IdentityResponse.c b/openair-cn/NAS/COMMON/EMM/MSG/IdentityResponse.c index bbef1794f7..827b9e64e0 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/IdentityResponse.c +++ b/openair-cn/NAS/COMMON/EMM/MSG/IdentityResponse.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/IdentityResponse.h b/openair-cn/NAS/COMMON/EMM/MSG/IdentityResponse.h index cf58487f94..c6bb0d8f71 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/IdentityResponse.h +++ b/openair-cn/NAS/COMMON/EMM/MSG/IdentityResponse.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/Makefile b/openair-cn/NAS/COMMON/EMM/MSG/Makefile index 0b434ba8ab..10f3cda68b 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/Makefile +++ b/openair-cn/NAS/COMMON/EMM/MSG/Makefile @@ -1,31 +1,3 @@ -################################################################################ -# 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@eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ ifndef PROJDIR PROJDIR = $(PWD)/../../.. endif diff --git a/openair-cn/NAS/COMMON/EMM/MSG/NASSecurityModeCommand.h b/openair-cn/NAS/COMMON/EMM/MSG/NASSecurityModeCommand.h index 96bef59660..66baa17269 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/NASSecurityModeCommand.h +++ b/openair-cn/NAS/COMMON/EMM/MSG/NASSecurityModeCommand.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/NASSecurityModeComplete.h b/openair-cn/NAS/COMMON/EMM/MSG/NASSecurityModeComplete.h index 5643e0ef8a..0c4c5400d9 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/NASSecurityModeComplete.h +++ b/openair-cn/NAS/COMMON/EMM/MSG/NASSecurityModeComplete.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/SecurityModeCommand.c b/openair-cn/NAS/COMMON/EMM/MSG/SecurityModeCommand.c index 60946cd4ea..2086d59489 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/SecurityModeCommand.c +++ b/openair-cn/NAS/COMMON/EMM/MSG/SecurityModeCommand.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/SecurityModeComplete.c b/openair-cn/NAS/COMMON/EMM/MSG/SecurityModeComplete.c index 971f94f05f..e3fbbf3a78 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/SecurityModeComplete.c +++ b/openair-cn/NAS/COMMON/EMM/MSG/SecurityModeComplete.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/SecurityModeReject.c b/openair-cn/NAS/COMMON/EMM/MSG/SecurityModeReject.c index 6347772667..972aad0444 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/SecurityModeReject.c +++ b/openair-cn/NAS/COMMON/EMM/MSG/SecurityModeReject.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/SecurityModeReject.h b/openair-cn/NAS/COMMON/EMM/MSG/SecurityModeReject.h index 6dcbeea379..0067104fcd 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/SecurityModeReject.h +++ b/openair-cn/NAS/COMMON/EMM/MSG/SecurityModeReject.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/ServiceReject.c b/openair-cn/NAS/COMMON/EMM/MSG/ServiceReject.c index 21a2d8a2ba..0e2aff4374 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/ServiceReject.c +++ b/openair-cn/NAS/COMMON/EMM/MSG/ServiceReject.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/ServiceReject.h b/openair-cn/NAS/COMMON/EMM/MSG/ServiceReject.h index acafd9247b..8a5525d00c 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/ServiceReject.h +++ b/openair-cn/NAS/COMMON/EMM/MSG/ServiceReject.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/ServiceRequest.c b/openair-cn/NAS/COMMON/EMM/MSG/ServiceRequest.c index 28e22b773d..df51149b88 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/ServiceRequest.c +++ b/openair-cn/NAS/COMMON/EMM/MSG/ServiceRequest.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/ServiceRequest.h b/openair-cn/NAS/COMMON/EMM/MSG/ServiceRequest.h index 7f8f78f95d..999d5d9f37 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/ServiceRequest.h +++ b/openair-cn/NAS/COMMON/EMM/MSG/ServiceRequest.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/TrackingAreaUpdateAccept.c b/openair-cn/NAS/COMMON/EMM/MSG/TrackingAreaUpdateAccept.c index 267534f18a..0d4aea3f12 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/TrackingAreaUpdateAccept.c +++ b/openair-cn/NAS/COMMON/EMM/MSG/TrackingAreaUpdateAccept.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/TrackingAreaUpdateAccept.h b/openair-cn/NAS/COMMON/EMM/MSG/TrackingAreaUpdateAccept.h index 1765f38836..1b07da4c7f 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/TrackingAreaUpdateAccept.h +++ b/openair-cn/NAS/COMMON/EMM/MSG/TrackingAreaUpdateAccept.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/TrackingAreaUpdateComplete.c b/openair-cn/NAS/COMMON/EMM/MSG/TrackingAreaUpdateComplete.c index 6ef5b1adcb..5facc985f5 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/TrackingAreaUpdateComplete.c +++ b/openair-cn/NAS/COMMON/EMM/MSG/TrackingAreaUpdateComplete.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/TrackingAreaUpdateComplete.h b/openair-cn/NAS/COMMON/EMM/MSG/TrackingAreaUpdateComplete.h index 3ebb3fe6fb..bdb7083c35 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/TrackingAreaUpdateComplete.h +++ b/openair-cn/NAS/COMMON/EMM/MSG/TrackingAreaUpdateComplete.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/TrackingAreaUpdateReject.c b/openair-cn/NAS/COMMON/EMM/MSG/TrackingAreaUpdateReject.c index ebb6ffd376..56bbcdc7e5 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/TrackingAreaUpdateReject.c +++ b/openair-cn/NAS/COMMON/EMM/MSG/TrackingAreaUpdateReject.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/TrackingAreaUpdateReject.h b/openair-cn/NAS/COMMON/EMM/MSG/TrackingAreaUpdateReject.h index 56452a58d4..055ae55ae7 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/TrackingAreaUpdateReject.h +++ b/openair-cn/NAS/COMMON/EMM/MSG/TrackingAreaUpdateReject.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/TrackingAreaUpdateRequest.c b/openair-cn/NAS/COMMON/EMM/MSG/TrackingAreaUpdateRequest.c index ca614ce1af..53fe541e47 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/TrackingAreaUpdateRequest.c +++ b/openair-cn/NAS/COMMON/EMM/MSG/TrackingAreaUpdateRequest.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/TrackingAreaUpdateRequest.h b/openair-cn/NAS/COMMON/EMM/MSG/TrackingAreaUpdateRequest.h index d8ce48027b..b4ee5bcb42 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/TrackingAreaUpdateRequest.h +++ b/openair-cn/NAS/COMMON/EMM/MSG/TrackingAreaUpdateRequest.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/UplinkNasTransport.c b/openair-cn/NAS/COMMON/EMM/MSG/UplinkNasTransport.c index ad1fe82b30..61b85ca2ca 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/UplinkNasTransport.c +++ b/openair-cn/NAS/COMMON/EMM/MSG/UplinkNasTransport.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/UplinkNasTransport.h b/openair-cn/NAS/COMMON/EMM/MSG/UplinkNasTransport.h index 09f1bd2e00..02a58b104f 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/UplinkNasTransport.h +++ b/openair-cn/NAS/COMMON/EMM/MSG/UplinkNasTransport.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/EMM/MSG/emm_cause.h b/openair-cn/NAS/COMMON/EMM/MSG/emm_cause.h index c5419201d2..231e8bfe86 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/emm_cause.h +++ b/openair-cn/NAS/COMMON/EMM/MSG/emm_cause.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ /***************************************************************************** Source emm_cause.h diff --git a/openair-cn/NAS/COMMON/EMM/MSG/emm_msg.c b/openair-cn/NAS/COMMON/EMM/MSG/emm_msg.c index 979210c615..b727b09a73 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/emm_msg.c +++ b/openair-cn/NAS/COMMON/EMM/MSG/emm_msg.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ /***************************************************************************** Source emm_msg.c diff --git a/openair-cn/NAS/COMMON/EMM/MSG/emm_msg.h b/openair-cn/NAS/COMMON/EMM/MSG/emm_msg.h index bb66c5e68b..db36f45948 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/emm_msg.h +++ b/openair-cn/NAS/COMMON/EMM/MSG/emm_msg.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ /***************************************************************************** Source emm_msg.h diff --git a/openair-cn/NAS/COMMON/EMM/MSG/emm_msgDef.h b/openair-cn/NAS/COMMON/EMM/MSG/emm_msgDef.h index 862204d37e..3e7ba3b50f 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/emm_msgDef.h +++ b/openair-cn/NAS/COMMON/EMM/MSG/emm_msgDef.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ /***************************************************************************** Version 0.1 diff --git a/openair-cn/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextAccept.c b/openair-cn/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextAccept.c index c377e11680..1e95091471 100644 --- a/openair-cn/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextAccept.c +++ b/openair-cn/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextAccept.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextAccept.h b/openair-cn/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextAccept.h index c8e1275086..90db94714b 100644 --- a/openair-cn/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextAccept.h +++ b/openair-cn/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextAccept.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextReject.c b/openair-cn/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextReject.c index 95c6591281..09b9ef66f6 100644 --- a/openair-cn/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextReject.c +++ b/openair-cn/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextReject.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextReject.h b/openair-cn/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextReject.h index e766ba18fe..30e1e72d62 100644 --- a/openair-cn/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextReject.h +++ b/openair-cn/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextReject.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextRequest.c b/openair-cn/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextRequest.c index 750793784d..2c081468b2 100644 --- a/openair-cn/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextRequest.c +++ b/openair-cn/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextRequest.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextRequest.h b/openair-cn/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextRequest.h index cc7d65555a..89ce283302 100644 --- a/openair-cn/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextRequest.h +++ b/openair-cn/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextRequest.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextAccept.c b/openair-cn/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextAccept.c index a4806d58d4..116160b0e1 100644 --- a/openair-cn/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextAccept.c +++ b/openair-cn/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextAccept.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextAccept.h b/openair-cn/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextAccept.h index c678d9b9d2..231a87d117 100644 --- a/openair-cn/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextAccept.h +++ b/openair-cn/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextAccept.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextReject.c b/openair-cn/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextReject.c index a8252622c8..ecb40aee2b 100644 --- a/openair-cn/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextReject.c +++ b/openair-cn/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextReject.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextReject.h b/openair-cn/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextReject.h index 2bfe844c6b..b18cf46a62 100644 --- a/openair-cn/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextReject.h +++ b/openair-cn/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextReject.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextRequest.c b/openair-cn/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextRequest.c index 3dec0a429a..56e570903d 100644 --- a/openair-cn/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextRequest.c +++ b/openair-cn/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextRequest.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextRequest.h b/openair-cn/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextRequest.h index 749c64f93d..254087da4e 100644 --- a/openair-cn/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextRequest.h +++ b/openair-cn/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextRequest.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/ESM/MSG/BearerResourceAllocationReject.c b/openair-cn/NAS/COMMON/ESM/MSG/BearerResourceAllocationReject.c index 9ca43d45f8..ff859d659b 100644 --- a/openair-cn/NAS/COMMON/ESM/MSG/BearerResourceAllocationReject.c +++ b/openair-cn/NAS/COMMON/ESM/MSG/BearerResourceAllocationReject.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/ESM/MSG/BearerResourceAllocationReject.h b/openair-cn/NAS/COMMON/ESM/MSG/BearerResourceAllocationReject.h index e31a6f6d8a..41073b2aa6 100644 --- a/openair-cn/NAS/COMMON/ESM/MSG/BearerResourceAllocationReject.h +++ b/openair-cn/NAS/COMMON/ESM/MSG/BearerResourceAllocationReject.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/ESM/MSG/BearerResourceAllocationRequest.c b/openair-cn/NAS/COMMON/ESM/MSG/BearerResourceAllocationRequest.c index 73968f489b..2ad5018d15 100644 --- a/openair-cn/NAS/COMMON/ESM/MSG/BearerResourceAllocationRequest.c +++ b/openair-cn/NAS/COMMON/ESM/MSG/BearerResourceAllocationRequest.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/ESM/MSG/BearerResourceAllocationRequest.h b/openair-cn/NAS/COMMON/ESM/MSG/BearerResourceAllocationRequest.h index 48a28c5090..8b4ef0fff9 100644 --- a/openair-cn/NAS/COMMON/ESM/MSG/BearerResourceAllocationRequest.h +++ b/openair-cn/NAS/COMMON/ESM/MSG/BearerResourceAllocationRequest.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/ESM/MSG/BearerResourceModificationReject.c b/openair-cn/NAS/COMMON/ESM/MSG/BearerResourceModificationReject.c index 52fbc55b69..57591de457 100644 --- a/openair-cn/NAS/COMMON/ESM/MSG/BearerResourceModificationReject.c +++ b/openair-cn/NAS/COMMON/ESM/MSG/BearerResourceModificationReject.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/ESM/MSG/BearerResourceModificationReject.h b/openair-cn/NAS/COMMON/ESM/MSG/BearerResourceModificationReject.h index 07a9d00e08..e06922fa20 100644 --- a/openair-cn/NAS/COMMON/ESM/MSG/BearerResourceModificationReject.h +++ b/openair-cn/NAS/COMMON/ESM/MSG/BearerResourceModificationReject.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/ESM/MSG/BearerResourceModificationRequest.c b/openair-cn/NAS/COMMON/ESM/MSG/BearerResourceModificationRequest.c index a3b821ee47..b5e623343a 100644 --- a/openair-cn/NAS/COMMON/ESM/MSG/BearerResourceModificationRequest.c +++ b/openair-cn/NAS/COMMON/ESM/MSG/BearerResourceModificationRequest.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/ESM/MSG/BearerResourceModificationRequest.h b/openair-cn/NAS/COMMON/ESM/MSG/BearerResourceModificationRequest.h index f17a89b348..e209c74bfe 100644 --- a/openair-cn/NAS/COMMON/ESM/MSG/BearerResourceModificationRequest.h +++ b/openair-cn/NAS/COMMON/ESM/MSG/BearerResourceModificationRequest.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/ESM/MSG/COPYING b/openair-cn/NAS/COMMON/ESM/MSG/COPYING index 94a9ed024d..c888423064 100644 --- a/openair-cn/NAS/COMMON/ESM/MSG/COPYING +++ b/openair-cn/NAS/COMMON/ESM/MSG/COPYING @@ -1,674 +1,28 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program 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. - - This program 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 this program. If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - <program> Copyright (C) <year> <name of author> - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<http://www.gnu.org/licenses/>. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<http://www.gnu.org/philosophy/why-not-lgpl.html>. +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ \ No newline at end of file diff --git a/openair-cn/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextAccept.c b/openair-cn/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextAccept.c index 38383ecc07..3d05c2e7d1 100644 --- a/openair-cn/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextAccept.c +++ b/openair-cn/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextAccept.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextAccept.h b/openair-cn/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextAccept.h index 0ef58548f5..23b46c7b2f 100644 --- a/openair-cn/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextAccept.h +++ b/openair-cn/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextAccept.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextRequest.c b/openair-cn/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextRequest.c index 6030a119a3..77038dee23 100644 --- a/openair-cn/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextRequest.c +++ b/openair-cn/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextRequest.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextRequest.h b/openair-cn/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextRequest.h index b85c5710e8..3cfa64a57a 100644 --- a/openair-cn/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextRequest.h +++ b/openair-cn/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextRequest.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/ESM/MSG/EsmInformationRequest.c b/openair-cn/NAS/COMMON/ESM/MSG/EsmInformationRequest.c index 0f3d22f63f..79e5b3d732 100644 --- a/openair-cn/NAS/COMMON/ESM/MSG/EsmInformationRequest.c +++ b/openair-cn/NAS/COMMON/ESM/MSG/EsmInformationRequest.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/ESM/MSG/EsmInformationRequest.h b/openair-cn/NAS/COMMON/ESM/MSG/EsmInformationRequest.h index 21bf9bc0ca..d2dad73b46 100644 --- a/openair-cn/NAS/COMMON/ESM/MSG/EsmInformationRequest.h +++ b/openair-cn/NAS/COMMON/ESM/MSG/EsmInformationRequest.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/ESM/MSG/EsmInformationResponse.c b/openair-cn/NAS/COMMON/ESM/MSG/EsmInformationResponse.c index 1609de75f4..c278784ae2 100644 --- a/openair-cn/NAS/COMMON/ESM/MSG/EsmInformationResponse.c +++ b/openair-cn/NAS/COMMON/ESM/MSG/EsmInformationResponse.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/ESM/MSG/EsmInformationResponse.h b/openair-cn/NAS/COMMON/ESM/MSG/EsmInformationResponse.h index 186c582e91..3b66dadcc4 100644 --- a/openair-cn/NAS/COMMON/ESM/MSG/EsmInformationResponse.h +++ b/openair-cn/NAS/COMMON/ESM/MSG/EsmInformationResponse.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/ESM/MSG/EsmStatus.c b/openair-cn/NAS/COMMON/ESM/MSG/EsmStatus.c index 0297b0eecd..7f6be43a9f 100644 --- a/openair-cn/NAS/COMMON/ESM/MSG/EsmStatus.c +++ b/openair-cn/NAS/COMMON/ESM/MSG/EsmStatus.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/ESM/MSG/EsmStatus.h b/openair-cn/NAS/COMMON/ESM/MSG/EsmStatus.h index 5bbce9e06d..afcf3142af 100644 --- a/openair-cn/NAS/COMMON/ESM/MSG/EsmStatus.h +++ b/openair-cn/NAS/COMMON/ESM/MSG/EsmStatus.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/ESM/MSG/Makefile b/openair-cn/NAS/COMMON/ESM/MSG/Makefile index 8786e88c13..7f8c40a5a0 100644 --- a/openair-cn/NAS/COMMON/ESM/MSG/Makefile +++ b/openair-cn/NAS/COMMON/ESM/MSG/Makefile @@ -1,31 +1,4 @@ -################################################################################ -# 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@eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ + ifndef PROJDIR PROJDIR = $(PWD)/../../.. endif diff --git a/openair-cn/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextAccept.c b/openair-cn/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextAccept.c index b7da151edb..b4f6833dfc 100644 --- a/openair-cn/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextAccept.c +++ b/openair-cn/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextAccept.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextAccept.h b/openair-cn/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextAccept.h index e80a7f8dbc..688e0ec814 100644 --- a/openair-cn/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextAccept.h +++ b/openair-cn/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextAccept.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextReject.c b/openair-cn/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextReject.c index c3b216bb24..01aaa5575d 100644 --- a/openair-cn/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextReject.c +++ b/openair-cn/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextReject.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextReject.h b/openair-cn/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextReject.h index 2c023c914b..5c40f44879 100644 --- a/openair-cn/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextReject.h +++ b/openair-cn/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextReject.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextRequest.c b/openair-cn/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextRequest.c index 62e7fc8a22..1624e4e3c3 100644 --- a/openair-cn/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextRequest.c +++ b/openair-cn/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextRequest.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextRequest.h b/openair-cn/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextRequest.h index 1c2f24950c..2b21e1b2fd 100644 --- a/openair-cn/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextRequest.h +++ b/openair-cn/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextRequest.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/ESM/MSG/PdnConnectivityReject.c b/openair-cn/NAS/COMMON/ESM/MSG/PdnConnectivityReject.c index 6d08e046cc..30fa4242f4 100644 --- a/openair-cn/NAS/COMMON/ESM/MSG/PdnConnectivityReject.c +++ b/openair-cn/NAS/COMMON/ESM/MSG/PdnConnectivityReject.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/ESM/MSG/PdnConnectivityReject.h b/openair-cn/NAS/COMMON/ESM/MSG/PdnConnectivityReject.h index 9712f2118c..3e5ad16c02 100644 --- a/openair-cn/NAS/COMMON/ESM/MSG/PdnConnectivityReject.h +++ b/openair-cn/NAS/COMMON/ESM/MSG/PdnConnectivityReject.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/ESM/MSG/PdnConnectivityRequest.c b/openair-cn/NAS/COMMON/ESM/MSG/PdnConnectivityRequest.c index 6ff9acab12..6ca5ca94ab 100644 --- a/openair-cn/NAS/COMMON/ESM/MSG/PdnConnectivityRequest.c +++ b/openair-cn/NAS/COMMON/ESM/MSG/PdnConnectivityRequest.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/ESM/MSG/PdnConnectivityRequest.h b/openair-cn/NAS/COMMON/ESM/MSG/PdnConnectivityRequest.h index 2a30138f9e..78b227ce37 100644 --- a/openair-cn/NAS/COMMON/ESM/MSG/PdnConnectivityRequest.h +++ b/openair-cn/NAS/COMMON/ESM/MSG/PdnConnectivityRequest.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/ESM/MSG/PdnDisconnectReject.c b/openair-cn/NAS/COMMON/ESM/MSG/PdnDisconnectReject.c index 0e710bf968..73a095d15d 100644 --- a/openair-cn/NAS/COMMON/ESM/MSG/PdnDisconnectReject.c +++ b/openair-cn/NAS/COMMON/ESM/MSG/PdnDisconnectReject.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/ESM/MSG/PdnDisconnectReject.h b/openair-cn/NAS/COMMON/ESM/MSG/PdnDisconnectReject.h index 3d6508a869..980d0f6d09 100644 --- a/openair-cn/NAS/COMMON/ESM/MSG/PdnDisconnectReject.h +++ b/openair-cn/NAS/COMMON/ESM/MSG/PdnDisconnectReject.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/ESM/MSG/PdnDisconnectRequest.c b/openair-cn/NAS/COMMON/ESM/MSG/PdnDisconnectRequest.c index 2127384006..7ab48c6c39 100644 --- a/openair-cn/NAS/COMMON/ESM/MSG/PdnDisconnectRequest.c +++ b/openair-cn/NAS/COMMON/ESM/MSG/PdnDisconnectRequest.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/ESM/MSG/PdnDisconnectRequest.h b/openair-cn/NAS/COMMON/ESM/MSG/PdnDisconnectRequest.h index 449a088c6a..9ac114df3a 100644 --- a/openair-cn/NAS/COMMON/ESM/MSG/PdnDisconnectRequest.h +++ b/openair-cn/NAS/COMMON/ESM/MSG/PdnDisconnectRequest.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/ESM/MSG/esm_cause.h b/openair-cn/NAS/COMMON/ESM/MSG/esm_cause.h index 65063a8dda..e731ec1a8b 100644 --- a/openair-cn/NAS/COMMON/ESM/MSG/esm_cause.h +++ b/openair-cn/NAS/COMMON/ESM/MSG/esm_cause.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ /***************************************************************************** Source esm_cause.h diff --git a/openair-cn/NAS/COMMON/ESM/MSG/esm_msg.c b/openair-cn/NAS/COMMON/ESM/MSG/esm_msg.c index 2f5dbc8727..d9f7df6854 100644 --- a/openair-cn/NAS/COMMON/ESM/MSG/esm_msg.c +++ b/openair-cn/NAS/COMMON/ESM/MSG/esm_msg.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ /***************************************************************************** Source esm_msg.c diff --git a/openair-cn/NAS/COMMON/ESM/MSG/esm_msg.h b/openair-cn/NAS/COMMON/ESM/MSG/esm_msg.h index 4c93296989..9ed64ea2a5 100644 --- a/openair-cn/NAS/COMMON/ESM/MSG/esm_msg.h +++ b/openair-cn/NAS/COMMON/ESM/MSG/esm_msg.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ /***************************************************************************** Source esm_msg.h diff --git a/openair-cn/NAS/COMMON/ESM/MSG/esm_msgDef.h b/openair-cn/NAS/COMMON/ESM/MSG/esm_msgDef.h index 71a76a8f36..2bb0a4e188 100644 --- a/openair-cn/NAS/COMMON/ESM/MSG/esm_msgDef.h +++ b/openair-cn/NAS/COMMON/ESM/MSG/esm_msgDef.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ /***************************************************************************** Version 0.1 diff --git a/openair-cn/NAS/COMMON/IES/AccessPointName.c b/openair-cn/NAS/COMMON/IES/AccessPointName.c index 286b0afd7f..3a40d84a23 100644 --- a/openair-cn/NAS/COMMON/IES/AccessPointName.c +++ b/openair-cn/NAS/COMMON/IES/AccessPointName.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/AccessPointName.h b/openair-cn/NAS/COMMON/IES/AccessPointName.h index f121d8833d..a05d6f0d53 100644 --- a/openair-cn/NAS/COMMON/IES/AccessPointName.h +++ b/openair-cn/NAS/COMMON/IES/AccessPointName.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/AdditionalUpdateResult.c b/openair-cn/NAS/COMMON/IES/AdditionalUpdateResult.c index d8c306ba43..7a24f4a31e 100644 --- a/openair-cn/NAS/COMMON/IES/AdditionalUpdateResult.c +++ b/openair-cn/NAS/COMMON/IES/AdditionalUpdateResult.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/AdditionalUpdateResult.h b/openair-cn/NAS/COMMON/IES/AdditionalUpdateResult.h index 70edbc2634..6c96baaa2a 100644 --- a/openair-cn/NAS/COMMON/IES/AdditionalUpdateResult.h +++ b/openair-cn/NAS/COMMON/IES/AdditionalUpdateResult.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/AdditionalUpdateType.c b/openair-cn/NAS/COMMON/IES/AdditionalUpdateType.c index f253c43a82..d3e713480e 100644 --- a/openair-cn/NAS/COMMON/IES/AdditionalUpdateType.c +++ b/openair-cn/NAS/COMMON/IES/AdditionalUpdateType.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/AdditionalUpdateType.h b/openair-cn/NAS/COMMON/IES/AdditionalUpdateType.h index dd7bc36643..49fbcc137e 100644 --- a/openair-cn/NAS/COMMON/IES/AdditionalUpdateType.h +++ b/openair-cn/NAS/COMMON/IES/AdditionalUpdateType.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/ApnAggregateMaximumBitRate.c b/openair-cn/NAS/COMMON/IES/ApnAggregateMaximumBitRate.c index b92ed3732e..f892f93450 100644 --- a/openair-cn/NAS/COMMON/IES/ApnAggregateMaximumBitRate.c +++ b/openair-cn/NAS/COMMON/IES/ApnAggregateMaximumBitRate.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/ApnAggregateMaximumBitRate.h b/openair-cn/NAS/COMMON/IES/ApnAggregateMaximumBitRate.h index b7666084d2..e7eb8da33f 100644 --- a/openair-cn/NAS/COMMON/IES/ApnAggregateMaximumBitRate.h +++ b/openair-cn/NAS/COMMON/IES/ApnAggregateMaximumBitRate.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/AuthenticationFailureParameter.c b/openair-cn/NAS/COMMON/IES/AuthenticationFailureParameter.c index 68b6424307..179808307e 100644 --- a/openair-cn/NAS/COMMON/IES/AuthenticationFailureParameter.c +++ b/openair-cn/NAS/COMMON/IES/AuthenticationFailureParameter.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/AuthenticationFailureParameter.h b/openair-cn/NAS/COMMON/IES/AuthenticationFailureParameter.h index c8384685f1..f2208ef057 100644 --- a/openair-cn/NAS/COMMON/IES/AuthenticationFailureParameter.h +++ b/openair-cn/NAS/COMMON/IES/AuthenticationFailureParameter.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/AuthenticationParameterAutn.c b/openair-cn/NAS/COMMON/IES/AuthenticationParameterAutn.c index f338b11f48..b2b9c72696 100644 --- a/openair-cn/NAS/COMMON/IES/AuthenticationParameterAutn.c +++ b/openair-cn/NAS/COMMON/IES/AuthenticationParameterAutn.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/AuthenticationParameterAutn.h b/openair-cn/NAS/COMMON/IES/AuthenticationParameterAutn.h index f4246ca5da..d75855e45a 100644 --- a/openair-cn/NAS/COMMON/IES/AuthenticationParameterAutn.h +++ b/openair-cn/NAS/COMMON/IES/AuthenticationParameterAutn.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/AuthenticationParameterRand.c b/openair-cn/NAS/COMMON/IES/AuthenticationParameterRand.c index ebc44a5d7c..ae402e41c7 100644 --- a/openair-cn/NAS/COMMON/IES/AuthenticationParameterRand.c +++ b/openair-cn/NAS/COMMON/IES/AuthenticationParameterRand.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/AuthenticationParameterRand.h b/openair-cn/NAS/COMMON/IES/AuthenticationParameterRand.h index 6690aceb5f..b940e8304f 100644 --- a/openair-cn/NAS/COMMON/IES/AuthenticationParameterRand.h +++ b/openair-cn/NAS/COMMON/IES/AuthenticationParameterRand.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/AuthenticationResponseParameter.c b/openair-cn/NAS/COMMON/IES/AuthenticationResponseParameter.c index 94dd1c0dd4..b142fed5a6 100644 --- a/openair-cn/NAS/COMMON/IES/AuthenticationResponseParameter.c +++ b/openair-cn/NAS/COMMON/IES/AuthenticationResponseParameter.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/AuthenticationResponseParameter.h b/openair-cn/NAS/COMMON/IES/AuthenticationResponseParameter.h index 9b4c72bfad..0ea7c1af04 100644 --- a/openair-cn/NAS/COMMON/IES/AuthenticationResponseParameter.h +++ b/openair-cn/NAS/COMMON/IES/AuthenticationResponseParameter.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/COPYING b/openair-cn/NAS/COMMON/IES/COPYING index 94a9ed024d..c888423064 100644 --- a/openair-cn/NAS/COMMON/IES/COPYING +++ b/openair-cn/NAS/COMMON/IES/COPYING @@ -1,674 +1,28 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program 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. - - This program 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 this program. If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - <program> Copyright (C) <year> <name of author> - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<http://www.gnu.org/licenses/>. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<http://www.gnu.org/philosophy/why-not-lgpl.html>. +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ \ No newline at end of file diff --git a/openair-cn/NAS/COMMON/IES/CipheringKeySequenceNumber.c b/openair-cn/NAS/COMMON/IES/CipheringKeySequenceNumber.c index 16f039627e..c2e395f4fb 100644 --- a/openair-cn/NAS/COMMON/IES/CipheringKeySequenceNumber.c +++ b/openair-cn/NAS/COMMON/IES/CipheringKeySequenceNumber.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/CipheringKeySequenceNumber.h b/openair-cn/NAS/COMMON/IES/CipheringKeySequenceNumber.h index d75b686ab4..d1fd9627f4 100644 --- a/openair-cn/NAS/COMMON/IES/CipheringKeySequenceNumber.h +++ b/openair-cn/NAS/COMMON/IES/CipheringKeySequenceNumber.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/Cli.c b/openair-cn/NAS/COMMON/IES/Cli.c index 7a534dee11..e8c662e289 100644 --- a/openair-cn/NAS/COMMON/IES/Cli.c +++ b/openair-cn/NAS/COMMON/IES/Cli.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/Cli.h b/openair-cn/NAS/COMMON/IES/Cli.h index 998289359b..293bdf28a2 100644 --- a/openair-cn/NAS/COMMON/IES/Cli.h +++ b/openair-cn/NAS/COMMON/IES/Cli.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/CsfbResponse.c b/openair-cn/NAS/COMMON/IES/CsfbResponse.c index 84ce13a322..aa0e2478af 100644 --- a/openair-cn/NAS/COMMON/IES/CsfbResponse.c +++ b/openair-cn/NAS/COMMON/IES/CsfbResponse.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/CsfbResponse.h b/openair-cn/NAS/COMMON/IES/CsfbResponse.h index 20172a0be8..b20a50bcb0 100644 --- a/openair-cn/NAS/COMMON/IES/CsfbResponse.h +++ b/openair-cn/NAS/COMMON/IES/CsfbResponse.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/DaylightSavingTime.c b/openair-cn/NAS/COMMON/IES/DaylightSavingTime.c index 07791bfc4d..fe10157bb9 100644 --- a/openair-cn/NAS/COMMON/IES/DaylightSavingTime.c +++ b/openair-cn/NAS/COMMON/IES/DaylightSavingTime.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/DaylightSavingTime.h b/openair-cn/NAS/COMMON/IES/DaylightSavingTime.h index c8397132f4..6e676d6e72 100644 --- a/openair-cn/NAS/COMMON/IES/DaylightSavingTime.h +++ b/openair-cn/NAS/COMMON/IES/DaylightSavingTime.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/DetachType.c b/openair-cn/NAS/COMMON/IES/DetachType.c index 7a92ffebca..b27fae53d4 100644 --- a/openair-cn/NAS/COMMON/IES/DetachType.c +++ b/openair-cn/NAS/COMMON/IES/DetachType.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/DetachType.h b/openair-cn/NAS/COMMON/IES/DetachType.h index 52da84e474..3728aa7702 100644 --- a/openair-cn/NAS/COMMON/IES/DetachType.h +++ b/openair-cn/NAS/COMMON/IES/DetachType.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/DrxParameter.c b/openair-cn/NAS/COMMON/IES/DrxParameter.c index c9528e1cae..f920ead27f 100644 --- a/openair-cn/NAS/COMMON/IES/DrxParameter.c +++ b/openair-cn/NAS/COMMON/IES/DrxParameter.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/DrxParameter.h b/openair-cn/NAS/COMMON/IES/DrxParameter.h index 49452c1215..d30c0e033a 100644 --- a/openair-cn/NAS/COMMON/IES/DrxParameter.h +++ b/openair-cn/NAS/COMMON/IES/DrxParameter.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/EmergencyNumberList.c b/openair-cn/NAS/COMMON/IES/EmergencyNumberList.c index 3939acd6f8..084dbd15fa 100644 --- a/openair-cn/NAS/COMMON/IES/EmergencyNumberList.c +++ b/openair-cn/NAS/COMMON/IES/EmergencyNumberList.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/EmergencyNumberList.h b/openair-cn/NAS/COMMON/IES/EmergencyNumberList.h index 0ac2d8cace..090ce1ec38 100644 --- a/openair-cn/NAS/COMMON/IES/EmergencyNumberList.h +++ b/openair-cn/NAS/COMMON/IES/EmergencyNumberList.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/EmmCause.c b/openair-cn/NAS/COMMON/IES/EmmCause.c index a6734b7122..a89d0d6c30 100644 --- a/openair-cn/NAS/COMMON/IES/EmmCause.c +++ b/openair-cn/NAS/COMMON/IES/EmmCause.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/EmmCause.h b/openair-cn/NAS/COMMON/IES/EmmCause.h index 1aa2e7b961..42d9f51904 100644 --- a/openair-cn/NAS/COMMON/IES/EmmCause.h +++ b/openair-cn/NAS/COMMON/IES/EmmCause.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/EpsAttachResult.c b/openair-cn/NAS/COMMON/IES/EpsAttachResult.c index dff7004ff6..6b70585324 100644 --- a/openair-cn/NAS/COMMON/IES/EpsAttachResult.c +++ b/openair-cn/NAS/COMMON/IES/EpsAttachResult.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/EpsAttachResult.h b/openair-cn/NAS/COMMON/IES/EpsAttachResult.h index 56192c7034..1c459ce914 100644 --- a/openair-cn/NAS/COMMON/IES/EpsAttachResult.h +++ b/openair-cn/NAS/COMMON/IES/EpsAttachResult.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/EpsAttachType.c b/openair-cn/NAS/COMMON/IES/EpsAttachType.c index b7946edb0e..8bc691fe55 100644 --- a/openair-cn/NAS/COMMON/IES/EpsAttachType.c +++ b/openair-cn/NAS/COMMON/IES/EpsAttachType.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/EpsAttachType.h b/openair-cn/NAS/COMMON/IES/EpsAttachType.h index fd2676b760..268c997db2 100644 --- a/openair-cn/NAS/COMMON/IES/EpsAttachType.h +++ b/openair-cn/NAS/COMMON/IES/EpsAttachType.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/EpsBearerContextStatus.c b/openair-cn/NAS/COMMON/IES/EpsBearerContextStatus.c index 9ef3a4e8f5..b51cf95b67 100644 --- a/openair-cn/NAS/COMMON/IES/EpsBearerContextStatus.c +++ b/openair-cn/NAS/COMMON/IES/EpsBearerContextStatus.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/EpsBearerContextStatus.h b/openair-cn/NAS/COMMON/IES/EpsBearerContextStatus.h index 7c2e1a0403..be1fd2f21c 100644 --- a/openair-cn/NAS/COMMON/IES/EpsBearerContextStatus.h +++ b/openair-cn/NAS/COMMON/IES/EpsBearerContextStatus.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/EpsBearerIdentity.c b/openair-cn/NAS/COMMON/IES/EpsBearerIdentity.c index 2a49a67d15..f7d405a415 100644 --- a/openair-cn/NAS/COMMON/IES/EpsBearerIdentity.c +++ b/openair-cn/NAS/COMMON/IES/EpsBearerIdentity.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/EpsBearerIdentity.h b/openair-cn/NAS/COMMON/IES/EpsBearerIdentity.h index e9c368ec69..2c6c9868ab 100644 --- a/openair-cn/NAS/COMMON/IES/EpsBearerIdentity.h +++ b/openair-cn/NAS/COMMON/IES/EpsBearerIdentity.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/EpsMobileIdentity.c b/openair-cn/NAS/COMMON/IES/EpsMobileIdentity.c index 4d154a3b66..448858f55c 100644 --- a/openair-cn/NAS/COMMON/IES/EpsMobileIdentity.c +++ b/openair-cn/NAS/COMMON/IES/EpsMobileIdentity.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/EpsMobileIdentity.h b/openair-cn/NAS/COMMON/IES/EpsMobileIdentity.h index 6f2360c56d..105db68a05 100644 --- a/openair-cn/NAS/COMMON/IES/EpsMobileIdentity.h +++ b/openair-cn/NAS/COMMON/IES/EpsMobileIdentity.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/EpsNetworkFeatureSupport.c b/openair-cn/NAS/COMMON/IES/EpsNetworkFeatureSupport.c index 0063fb5339..162db783d5 100644 --- a/openair-cn/NAS/COMMON/IES/EpsNetworkFeatureSupport.c +++ b/openair-cn/NAS/COMMON/IES/EpsNetworkFeatureSupport.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/EpsNetworkFeatureSupport.h b/openair-cn/NAS/COMMON/IES/EpsNetworkFeatureSupport.h index d9e0423aec..cbe1a0d6f1 100644 --- a/openair-cn/NAS/COMMON/IES/EpsNetworkFeatureSupport.h +++ b/openair-cn/NAS/COMMON/IES/EpsNetworkFeatureSupport.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/EpsQualityOfService.c b/openair-cn/NAS/COMMON/IES/EpsQualityOfService.c index ade4ca8ed2..0a467baffe 100644 --- a/openair-cn/NAS/COMMON/IES/EpsQualityOfService.c +++ b/openair-cn/NAS/COMMON/IES/EpsQualityOfService.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/EpsQualityOfService.h b/openair-cn/NAS/COMMON/IES/EpsQualityOfService.h index e8af0fc4d6..10703399e9 100644 --- a/openair-cn/NAS/COMMON/IES/EpsQualityOfService.h +++ b/openair-cn/NAS/COMMON/IES/EpsQualityOfService.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/EpsUpdateResult.c b/openair-cn/NAS/COMMON/IES/EpsUpdateResult.c index 5f1822d4ab..8ee25b4aba 100644 --- a/openair-cn/NAS/COMMON/IES/EpsUpdateResult.c +++ b/openair-cn/NAS/COMMON/IES/EpsUpdateResult.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/EpsUpdateResult.h b/openair-cn/NAS/COMMON/IES/EpsUpdateResult.h index 7d91f83dcb..d3aabc3402 100644 --- a/openair-cn/NAS/COMMON/IES/EpsUpdateResult.h +++ b/openair-cn/NAS/COMMON/IES/EpsUpdateResult.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/EpsUpdateType.c b/openair-cn/NAS/COMMON/IES/EpsUpdateType.c index 39dd4461d9..571b267dcb 100644 --- a/openair-cn/NAS/COMMON/IES/EpsUpdateType.c +++ b/openair-cn/NAS/COMMON/IES/EpsUpdateType.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/EpsUpdateType.h b/openair-cn/NAS/COMMON/IES/EpsUpdateType.h index 80bfc2e76b..09578574f6 100644 --- a/openair-cn/NAS/COMMON/IES/EpsUpdateType.h +++ b/openair-cn/NAS/COMMON/IES/EpsUpdateType.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/EsmCause.c b/openair-cn/NAS/COMMON/IES/EsmCause.c index e20ece8ee5..8c5436d855 100644 --- a/openair-cn/NAS/COMMON/IES/EsmCause.c +++ b/openair-cn/NAS/COMMON/IES/EsmCause.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/EsmCause.h b/openair-cn/NAS/COMMON/IES/EsmCause.h index 7be75c4a7f..e79c51ac19 100644 --- a/openair-cn/NAS/COMMON/IES/EsmCause.h +++ b/openair-cn/NAS/COMMON/IES/EsmCause.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/EsmInformationTransferFlag.c b/openair-cn/NAS/COMMON/IES/EsmInformationTransferFlag.c index 1c42a93058..b4d69c44f7 100644 --- a/openair-cn/NAS/COMMON/IES/EsmInformationTransferFlag.c +++ b/openair-cn/NAS/COMMON/IES/EsmInformationTransferFlag.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/EsmInformationTransferFlag.h b/openair-cn/NAS/COMMON/IES/EsmInformationTransferFlag.h index 3a201d7baf..cfaf82a560 100644 --- a/openair-cn/NAS/COMMON/IES/EsmInformationTransferFlag.h +++ b/openair-cn/NAS/COMMON/IES/EsmInformationTransferFlag.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/EsmMessageContainer.c b/openair-cn/NAS/COMMON/IES/EsmMessageContainer.c index edb4cef9d8..080374e681 100644 --- a/openair-cn/NAS/COMMON/IES/EsmMessageContainer.c +++ b/openair-cn/NAS/COMMON/IES/EsmMessageContainer.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/EsmMessageContainer.h b/openair-cn/NAS/COMMON/IES/EsmMessageContainer.h index 4d8664ecaf..326a9dd4e5 100644 --- a/openair-cn/NAS/COMMON/IES/EsmMessageContainer.h +++ b/openair-cn/NAS/COMMON/IES/EsmMessageContainer.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/GprsTimer.c b/openair-cn/NAS/COMMON/IES/GprsTimer.c index 056355d34f..9d8889ec6b 100644 --- a/openair-cn/NAS/COMMON/IES/GprsTimer.c +++ b/openair-cn/NAS/COMMON/IES/GprsTimer.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/GprsTimer.h b/openair-cn/NAS/COMMON/IES/GprsTimer.h index 57547842f2..66468b75aa 100644 --- a/openair-cn/NAS/COMMON/IES/GprsTimer.h +++ b/openair-cn/NAS/COMMON/IES/GprsTimer.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/GutiType.c b/openair-cn/NAS/COMMON/IES/GutiType.c index 8edf37dbe7..7391edb53c 100644 --- a/openair-cn/NAS/COMMON/IES/GutiType.c +++ b/openair-cn/NAS/COMMON/IES/GutiType.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/GutiType.h b/openair-cn/NAS/COMMON/IES/GutiType.h index 8f96fc75ee..4df547ff06 100644 --- a/openair-cn/NAS/COMMON/IES/GutiType.h +++ b/openair-cn/NAS/COMMON/IES/GutiType.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/IdentityType2.c b/openair-cn/NAS/COMMON/IES/IdentityType2.c index ddcfb54c2d..c50a1fc0f7 100644 --- a/openair-cn/NAS/COMMON/IES/IdentityType2.c +++ b/openair-cn/NAS/COMMON/IES/IdentityType2.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/IdentityType2.h b/openair-cn/NAS/COMMON/IES/IdentityType2.h index be342ffe04..9d7e075b7a 100644 --- a/openair-cn/NAS/COMMON/IES/IdentityType2.h +++ b/openair-cn/NAS/COMMON/IES/IdentityType2.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/ImeisvRequest.c b/openair-cn/NAS/COMMON/IES/ImeisvRequest.c index c6dfbe5f72..798ce55dce 100644 --- a/openair-cn/NAS/COMMON/IES/ImeisvRequest.c +++ b/openair-cn/NAS/COMMON/IES/ImeisvRequest.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/ImeisvRequest.h b/openair-cn/NAS/COMMON/IES/ImeisvRequest.h index 6f8e9f87bf..71c319bc8d 100644 --- a/openair-cn/NAS/COMMON/IES/ImeisvRequest.h +++ b/openair-cn/NAS/COMMON/IES/ImeisvRequest.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/KsiAndSequenceNumber.c b/openair-cn/NAS/COMMON/IES/KsiAndSequenceNumber.c index 4be3a1d729..c552654aa8 100644 --- a/openair-cn/NAS/COMMON/IES/KsiAndSequenceNumber.c +++ b/openair-cn/NAS/COMMON/IES/KsiAndSequenceNumber.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/KsiAndSequenceNumber.h b/openair-cn/NAS/COMMON/IES/KsiAndSequenceNumber.h index 524309bf89..042f56d1f8 100644 --- a/openair-cn/NAS/COMMON/IES/KsiAndSequenceNumber.h +++ b/openair-cn/NAS/COMMON/IES/KsiAndSequenceNumber.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/LcsClientIdentity.c b/openair-cn/NAS/COMMON/IES/LcsClientIdentity.c index 5c59acb781..9daf2125e1 100644 --- a/openair-cn/NAS/COMMON/IES/LcsClientIdentity.c +++ b/openair-cn/NAS/COMMON/IES/LcsClientIdentity.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/LcsClientIdentity.h b/openair-cn/NAS/COMMON/IES/LcsClientIdentity.h index 690914741e..4f4880956d 100644 --- a/openair-cn/NAS/COMMON/IES/LcsClientIdentity.h +++ b/openair-cn/NAS/COMMON/IES/LcsClientIdentity.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/LcsIndicator.c b/openair-cn/NAS/COMMON/IES/LcsIndicator.c index 371e195da1..224886fae8 100644 --- a/openair-cn/NAS/COMMON/IES/LcsIndicator.c +++ b/openair-cn/NAS/COMMON/IES/LcsIndicator.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/LcsIndicator.h b/openair-cn/NAS/COMMON/IES/LcsIndicator.h index d4ad52e11d..341c5f2caf 100644 --- a/openair-cn/NAS/COMMON/IES/LcsIndicator.h +++ b/openair-cn/NAS/COMMON/IES/LcsIndicator.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/LinkedEpsBearerIdentity.c b/openair-cn/NAS/COMMON/IES/LinkedEpsBearerIdentity.c index 47a55b50fc..eec53404ef 100644 --- a/openair-cn/NAS/COMMON/IES/LinkedEpsBearerIdentity.c +++ b/openair-cn/NAS/COMMON/IES/LinkedEpsBearerIdentity.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/LinkedEpsBearerIdentity.h b/openair-cn/NAS/COMMON/IES/LinkedEpsBearerIdentity.h index 5fa07834f4..393da23e41 100644 --- a/openair-cn/NAS/COMMON/IES/LinkedEpsBearerIdentity.h +++ b/openair-cn/NAS/COMMON/IES/LinkedEpsBearerIdentity.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/LlcServiceAccessPointIdentifier.c b/openair-cn/NAS/COMMON/IES/LlcServiceAccessPointIdentifier.c index 231676ba9e..e30f4dcdbe 100644 --- a/openair-cn/NAS/COMMON/IES/LlcServiceAccessPointIdentifier.c +++ b/openair-cn/NAS/COMMON/IES/LlcServiceAccessPointIdentifier.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/LlcServiceAccessPointIdentifier.h b/openair-cn/NAS/COMMON/IES/LlcServiceAccessPointIdentifier.h index b699ded1b4..ba6e40c61b 100644 --- a/openair-cn/NAS/COMMON/IES/LlcServiceAccessPointIdentifier.h +++ b/openair-cn/NAS/COMMON/IES/LlcServiceAccessPointIdentifier.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/LocationAreaIdentification.c b/openair-cn/NAS/COMMON/IES/LocationAreaIdentification.c index 43b9868a99..1fc04dc038 100644 --- a/openair-cn/NAS/COMMON/IES/LocationAreaIdentification.c +++ b/openair-cn/NAS/COMMON/IES/LocationAreaIdentification.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/LocationAreaIdentification.h b/openair-cn/NAS/COMMON/IES/LocationAreaIdentification.h index d2b6880779..3c52e94809 100644 --- a/openair-cn/NAS/COMMON/IES/LocationAreaIdentification.h +++ b/openair-cn/NAS/COMMON/IES/LocationAreaIdentification.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/Makefile b/openair-cn/NAS/COMMON/IES/Makefile index 8cc286e671..d4a24f657c 100644 --- a/openair-cn/NAS/COMMON/IES/Makefile +++ b/openair-cn/NAS/COMMON/IES/Makefile @@ -1,31 +1,4 @@ -################################################################################ -# 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@eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ + ifndef PROJDIR PROJDIR = $(PWD)/../.. endif diff --git a/openair-cn/NAS/COMMON/IES/MessageType.c b/openair-cn/NAS/COMMON/IES/MessageType.c index d66bd9b662..17a23ab383 100644 --- a/openair-cn/NAS/COMMON/IES/MessageType.c +++ b/openair-cn/NAS/COMMON/IES/MessageType.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/MessageType.h b/openair-cn/NAS/COMMON/IES/MessageType.h index 810efb60ca..7dd001ae96 100644 --- a/openair-cn/NAS/COMMON/IES/MessageType.h +++ b/openair-cn/NAS/COMMON/IES/MessageType.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/MobileIdentity.c b/openair-cn/NAS/COMMON/IES/MobileIdentity.c index 14d9902142..75c152106a 100644 --- a/openair-cn/NAS/COMMON/IES/MobileIdentity.c +++ b/openair-cn/NAS/COMMON/IES/MobileIdentity.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/MobileIdentity.h b/openair-cn/NAS/COMMON/IES/MobileIdentity.h index 206685c7f3..791dfc6f72 100644 --- a/openair-cn/NAS/COMMON/IES/MobileIdentity.h +++ b/openair-cn/NAS/COMMON/IES/MobileIdentity.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/MobileStationClassmark2.c b/openair-cn/NAS/COMMON/IES/MobileStationClassmark2.c index 3e97e164ad..459d716fcb 100644 --- a/openair-cn/NAS/COMMON/IES/MobileStationClassmark2.c +++ b/openair-cn/NAS/COMMON/IES/MobileStationClassmark2.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/MobileStationClassmark2.h b/openair-cn/NAS/COMMON/IES/MobileStationClassmark2.h index d8a9c596a4..06c6250de9 100644 --- a/openair-cn/NAS/COMMON/IES/MobileStationClassmark2.h +++ b/openair-cn/NAS/COMMON/IES/MobileStationClassmark2.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/MobileStationClassmark3.c b/openair-cn/NAS/COMMON/IES/MobileStationClassmark3.c index 84bf06c3c1..d53f054532 100644 --- a/openair-cn/NAS/COMMON/IES/MobileStationClassmark3.c +++ b/openair-cn/NAS/COMMON/IES/MobileStationClassmark3.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/MobileStationClassmark3.h b/openair-cn/NAS/COMMON/IES/MobileStationClassmark3.h index 504678bbdf..25de9191ee 100644 --- a/openair-cn/NAS/COMMON/IES/MobileStationClassmark3.h +++ b/openair-cn/NAS/COMMON/IES/MobileStationClassmark3.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/MsNetworkCapability.c b/openair-cn/NAS/COMMON/IES/MsNetworkCapability.c index 2fc8a72c87..bda91e876a 100644 --- a/openair-cn/NAS/COMMON/IES/MsNetworkCapability.c +++ b/openair-cn/NAS/COMMON/IES/MsNetworkCapability.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/MsNetworkCapability.h b/openair-cn/NAS/COMMON/IES/MsNetworkCapability.h index 7f6d1699da..e940d91218 100644 --- a/openair-cn/NAS/COMMON/IES/MsNetworkCapability.h +++ b/openair-cn/NAS/COMMON/IES/MsNetworkCapability.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/MsNetworkFeatureSupport.c b/openair-cn/NAS/COMMON/IES/MsNetworkFeatureSupport.c index e05968c2d5..d8efa5312b 100644 --- a/openair-cn/NAS/COMMON/IES/MsNetworkFeatureSupport.c +++ b/openair-cn/NAS/COMMON/IES/MsNetworkFeatureSupport.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/MsNetworkFeatureSupport.h b/openair-cn/NAS/COMMON/IES/MsNetworkFeatureSupport.h index 334430de1a..0210e787a7 100644 --- a/openair-cn/NAS/COMMON/IES/MsNetworkFeatureSupport.h +++ b/openair-cn/NAS/COMMON/IES/MsNetworkFeatureSupport.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/NasKeySetIdentifier.c b/openair-cn/NAS/COMMON/IES/NasKeySetIdentifier.c index 2ab41a17e8..1f1e2bd726 100644 --- a/openair-cn/NAS/COMMON/IES/NasKeySetIdentifier.c +++ b/openair-cn/NAS/COMMON/IES/NasKeySetIdentifier.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/NasKeySetIdentifier.h b/openair-cn/NAS/COMMON/IES/NasKeySetIdentifier.h index f2a09c6864..46af36c5b5 100644 --- a/openair-cn/NAS/COMMON/IES/NasKeySetIdentifier.h +++ b/openair-cn/NAS/COMMON/IES/NasKeySetIdentifier.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/NasMessageContainer.c b/openair-cn/NAS/COMMON/IES/NasMessageContainer.c index 248d14c890..2f295b0cc1 100644 --- a/openair-cn/NAS/COMMON/IES/NasMessageContainer.c +++ b/openair-cn/NAS/COMMON/IES/NasMessageContainer.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/NasMessageContainer.h b/openair-cn/NAS/COMMON/IES/NasMessageContainer.h index 35d3d4d58d..a16684a088 100644 --- a/openair-cn/NAS/COMMON/IES/NasMessageContainer.h +++ b/openair-cn/NAS/COMMON/IES/NasMessageContainer.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/NasRequestType.c b/openair-cn/NAS/COMMON/IES/NasRequestType.c index d2afc7f0f8..9cbbbdb7f7 100644 --- a/openair-cn/NAS/COMMON/IES/NasRequestType.c +++ b/openair-cn/NAS/COMMON/IES/NasRequestType.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/NasRequestType.h b/openair-cn/NAS/COMMON/IES/NasRequestType.h index 42d2627799..c6e28298d6 100644 --- a/openair-cn/NAS/COMMON/IES/NasRequestType.h +++ b/openair-cn/NAS/COMMON/IES/NasRequestType.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/NasSecurityAlgorithms.c b/openair-cn/NAS/COMMON/IES/NasSecurityAlgorithms.c index b1713b74f9..cafb734811 100644 --- a/openair-cn/NAS/COMMON/IES/NasSecurityAlgorithms.c +++ b/openair-cn/NAS/COMMON/IES/NasSecurityAlgorithms.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/NasSecurityAlgorithms.h b/openair-cn/NAS/COMMON/IES/NasSecurityAlgorithms.h index 8125e0adf8..f74b2c39ab 100644 --- a/openair-cn/NAS/COMMON/IES/NasSecurityAlgorithms.h +++ b/openair-cn/NAS/COMMON/IES/NasSecurityAlgorithms.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/NetworkName.c b/openair-cn/NAS/COMMON/IES/NetworkName.c index 284b451ce5..521e421c8d 100644 --- a/openair-cn/NAS/COMMON/IES/NetworkName.c +++ b/openair-cn/NAS/COMMON/IES/NetworkName.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/NetworkName.h b/openair-cn/NAS/COMMON/IES/NetworkName.h index d627605f61..c2a8850bc3 100644 --- a/openair-cn/NAS/COMMON/IES/NetworkName.h +++ b/openair-cn/NAS/COMMON/IES/NetworkName.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/Nonce.c b/openair-cn/NAS/COMMON/IES/Nonce.c index a274c2b8d9..438d117fd7 100644 --- a/openair-cn/NAS/COMMON/IES/Nonce.c +++ b/openair-cn/NAS/COMMON/IES/Nonce.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/Nonce.h b/openair-cn/NAS/COMMON/IES/Nonce.h index b37b35a7f3..7956177494 100644 --- a/openair-cn/NAS/COMMON/IES/Nonce.h +++ b/openair-cn/NAS/COMMON/IES/Nonce.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/PTmsiSignature.c b/openair-cn/NAS/COMMON/IES/PTmsiSignature.c index 21738a02db..3ed25f994a 100644 --- a/openair-cn/NAS/COMMON/IES/PTmsiSignature.c +++ b/openair-cn/NAS/COMMON/IES/PTmsiSignature.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/PTmsiSignature.h b/openair-cn/NAS/COMMON/IES/PTmsiSignature.h index 9f063dd461..e51bcc41a9 100644 --- a/openair-cn/NAS/COMMON/IES/PTmsiSignature.h +++ b/openair-cn/NAS/COMMON/IES/PTmsiSignature.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/PacketFlowIdentifier.c b/openair-cn/NAS/COMMON/IES/PacketFlowIdentifier.c index 2e694ae8b0..a108760cfa 100644 --- a/openair-cn/NAS/COMMON/IES/PacketFlowIdentifier.c +++ b/openair-cn/NAS/COMMON/IES/PacketFlowIdentifier.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/PacketFlowIdentifier.h b/openair-cn/NAS/COMMON/IES/PacketFlowIdentifier.h index 26c0e6467c..24f5dc9a97 100644 --- a/openair-cn/NAS/COMMON/IES/PacketFlowIdentifier.h +++ b/openair-cn/NAS/COMMON/IES/PacketFlowIdentifier.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/PagingIdentity.c b/openair-cn/NAS/COMMON/IES/PagingIdentity.c index 2c5a05a45a..9b0c72b7af 100644 --- a/openair-cn/NAS/COMMON/IES/PagingIdentity.c +++ b/openair-cn/NAS/COMMON/IES/PagingIdentity.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/PagingIdentity.h b/openair-cn/NAS/COMMON/IES/PagingIdentity.h index a817ae116f..60f93caebd 100644 --- a/openair-cn/NAS/COMMON/IES/PagingIdentity.h +++ b/openair-cn/NAS/COMMON/IES/PagingIdentity.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/PdnAddress.c b/openair-cn/NAS/COMMON/IES/PdnAddress.c index c95cb1528f..12dee958f5 100644 --- a/openair-cn/NAS/COMMON/IES/PdnAddress.c +++ b/openair-cn/NAS/COMMON/IES/PdnAddress.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/PdnAddress.h b/openair-cn/NAS/COMMON/IES/PdnAddress.h index 5b923b2310..22a7dd282c 100644 --- a/openair-cn/NAS/COMMON/IES/PdnAddress.h +++ b/openair-cn/NAS/COMMON/IES/PdnAddress.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/PdnType.c b/openair-cn/NAS/COMMON/IES/PdnType.c index e4a39d1f1c..0dc20ba6e1 100644 --- a/openair-cn/NAS/COMMON/IES/PdnType.c +++ b/openair-cn/NAS/COMMON/IES/PdnType.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/PdnType.h b/openair-cn/NAS/COMMON/IES/PdnType.h index c3a3ac9133..13c97a6602 100644 --- a/openair-cn/NAS/COMMON/IES/PdnType.h +++ b/openair-cn/NAS/COMMON/IES/PdnType.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/PlmnList.c b/openair-cn/NAS/COMMON/IES/PlmnList.c index 226a26c661..2e84bdb74a 100644 --- a/openair-cn/NAS/COMMON/IES/PlmnList.c +++ b/openair-cn/NAS/COMMON/IES/PlmnList.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/PlmnList.h b/openair-cn/NAS/COMMON/IES/PlmnList.h index 7c2247381f..485e88a6a2 100644 --- a/openair-cn/NAS/COMMON/IES/PlmnList.h +++ b/openair-cn/NAS/COMMON/IES/PlmnList.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/ProcedureTransactionIdentity.c b/openair-cn/NAS/COMMON/IES/ProcedureTransactionIdentity.c index 92a0f3e502..522307467e 100644 --- a/openair-cn/NAS/COMMON/IES/ProcedureTransactionIdentity.c +++ b/openair-cn/NAS/COMMON/IES/ProcedureTransactionIdentity.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/ProcedureTransactionIdentity.h b/openair-cn/NAS/COMMON/IES/ProcedureTransactionIdentity.h index 28eabb6a15..2bc3f098d9 100644 --- a/openair-cn/NAS/COMMON/IES/ProcedureTransactionIdentity.h +++ b/openair-cn/NAS/COMMON/IES/ProcedureTransactionIdentity.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/ProtocolConfigurationOptions.c b/openair-cn/NAS/COMMON/IES/ProtocolConfigurationOptions.c index dc17201da0..15f20ef195 100644 --- a/openair-cn/NAS/COMMON/IES/ProtocolConfigurationOptions.c +++ b/openair-cn/NAS/COMMON/IES/ProtocolConfigurationOptions.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/ProtocolConfigurationOptions.h b/openair-cn/NAS/COMMON/IES/ProtocolConfigurationOptions.h index bd59d2c4ac..8110cb96bc 100644 --- a/openair-cn/NAS/COMMON/IES/ProtocolConfigurationOptions.h +++ b/openair-cn/NAS/COMMON/IES/ProtocolConfigurationOptions.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/ProtocolDiscriminator.c b/openair-cn/NAS/COMMON/IES/ProtocolDiscriminator.c index b87ddb490a..a58ae57faa 100644 --- a/openair-cn/NAS/COMMON/IES/ProtocolDiscriminator.c +++ b/openair-cn/NAS/COMMON/IES/ProtocolDiscriminator.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/ProtocolDiscriminator.h b/openair-cn/NAS/COMMON/IES/ProtocolDiscriminator.h index 3945556a74..04c04e801f 100644 --- a/openair-cn/NAS/COMMON/IES/ProtocolDiscriminator.h +++ b/openair-cn/NAS/COMMON/IES/ProtocolDiscriminator.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/QualityOfService.c b/openair-cn/NAS/COMMON/IES/QualityOfService.c index 2d5ea1c5ea..27d4a78e55 100644 --- a/openair-cn/NAS/COMMON/IES/QualityOfService.c +++ b/openair-cn/NAS/COMMON/IES/QualityOfService.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/QualityOfService.h b/openair-cn/NAS/COMMON/IES/QualityOfService.h index 193eb6c4e2..6ce363aacc 100644 --- a/openair-cn/NAS/COMMON/IES/QualityOfService.h +++ b/openair-cn/NAS/COMMON/IES/QualityOfService.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/RadioPriority.c b/openair-cn/NAS/COMMON/IES/RadioPriority.c index 1350cb0ba1..8e1183eb7b 100644 --- a/openair-cn/NAS/COMMON/IES/RadioPriority.c +++ b/openair-cn/NAS/COMMON/IES/RadioPriority.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/RadioPriority.h b/openair-cn/NAS/COMMON/IES/RadioPriority.h index e079247598..629a624eec 100644 --- a/openair-cn/NAS/COMMON/IES/RadioPriority.h +++ b/openair-cn/NAS/COMMON/IES/RadioPriority.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/SecurityHeaderType.c b/openair-cn/NAS/COMMON/IES/SecurityHeaderType.c index 5d80c562f3..89facd28c1 100644 --- a/openair-cn/NAS/COMMON/IES/SecurityHeaderType.c +++ b/openair-cn/NAS/COMMON/IES/SecurityHeaderType.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/SecurityHeaderType.h b/openair-cn/NAS/COMMON/IES/SecurityHeaderType.h index 0447e857db..d83ec1e17a 100644 --- a/openair-cn/NAS/COMMON/IES/SecurityHeaderType.h +++ b/openair-cn/NAS/COMMON/IES/SecurityHeaderType.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/ServiceType.c b/openair-cn/NAS/COMMON/IES/ServiceType.c index bab2e96bb0..3f35abbfaa 100644 --- a/openair-cn/NAS/COMMON/IES/ServiceType.c +++ b/openair-cn/NAS/COMMON/IES/ServiceType.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/ServiceType.h b/openair-cn/NAS/COMMON/IES/ServiceType.h index 44e9084140..c3aedebc0c 100644 --- a/openair-cn/NAS/COMMON/IES/ServiceType.h +++ b/openair-cn/NAS/COMMON/IES/ServiceType.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/ShortMac.c b/openair-cn/NAS/COMMON/IES/ShortMac.c index 9cebc07ca8..d481b1bba7 100644 --- a/openair-cn/NAS/COMMON/IES/ShortMac.c +++ b/openair-cn/NAS/COMMON/IES/ShortMac.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/ShortMac.h b/openair-cn/NAS/COMMON/IES/ShortMac.h index b6152bd027..896f9e42da 100644 --- a/openair-cn/NAS/COMMON/IES/ShortMac.h +++ b/openair-cn/NAS/COMMON/IES/ShortMac.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/SsCode.c b/openair-cn/NAS/COMMON/IES/SsCode.c index 256a67e0fc..e0566c9f15 100644 --- a/openair-cn/NAS/COMMON/IES/SsCode.c +++ b/openair-cn/NAS/COMMON/IES/SsCode.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/SsCode.h b/openair-cn/NAS/COMMON/IES/SsCode.h index f53e5e2dc0..68017184ce 100644 --- a/openair-cn/NAS/COMMON/IES/SsCode.h +++ b/openair-cn/NAS/COMMON/IES/SsCode.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/SupportedCodecList.c b/openair-cn/NAS/COMMON/IES/SupportedCodecList.c index 284ee27dc9..375d2255a4 100644 --- a/openair-cn/NAS/COMMON/IES/SupportedCodecList.c +++ b/openair-cn/NAS/COMMON/IES/SupportedCodecList.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/SupportedCodecList.h b/openair-cn/NAS/COMMON/IES/SupportedCodecList.h index a9be6640ff..83396b62d4 100644 --- a/openair-cn/NAS/COMMON/IES/SupportedCodecList.h +++ b/openair-cn/NAS/COMMON/IES/SupportedCodecList.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/TimeZone.c b/openair-cn/NAS/COMMON/IES/TimeZone.c index 332abb54bc..39fe50c307 100644 --- a/openair-cn/NAS/COMMON/IES/TimeZone.c +++ b/openair-cn/NAS/COMMON/IES/TimeZone.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/TimeZone.h b/openair-cn/NAS/COMMON/IES/TimeZone.h index 812477be4d..bfa2d38996 100644 --- a/openair-cn/NAS/COMMON/IES/TimeZone.h +++ b/openair-cn/NAS/COMMON/IES/TimeZone.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/TimeZoneAndTime.c b/openair-cn/NAS/COMMON/IES/TimeZoneAndTime.c index dacfb22896..08a8bcdf70 100644 --- a/openair-cn/NAS/COMMON/IES/TimeZoneAndTime.c +++ b/openair-cn/NAS/COMMON/IES/TimeZoneAndTime.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/TimeZoneAndTime.h b/openair-cn/NAS/COMMON/IES/TimeZoneAndTime.h index 4665b84316..27c763cf88 100644 --- a/openair-cn/NAS/COMMON/IES/TimeZoneAndTime.h +++ b/openair-cn/NAS/COMMON/IES/TimeZoneAndTime.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/TmsiStatus.c b/openair-cn/NAS/COMMON/IES/TmsiStatus.c index 7d21e5f758..1ebbf5beaf 100644 --- a/openair-cn/NAS/COMMON/IES/TmsiStatus.c +++ b/openair-cn/NAS/COMMON/IES/TmsiStatus.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/TmsiStatus.h b/openair-cn/NAS/COMMON/IES/TmsiStatus.h index c6c7e87a7d..6387ca7cec 100644 --- a/openair-cn/NAS/COMMON/IES/TmsiStatus.h +++ b/openair-cn/NAS/COMMON/IES/TmsiStatus.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/TrackingAreaIdentity.c b/openair-cn/NAS/COMMON/IES/TrackingAreaIdentity.c index dd50d9566f..14b08e7e24 100644 --- a/openair-cn/NAS/COMMON/IES/TrackingAreaIdentity.c +++ b/openair-cn/NAS/COMMON/IES/TrackingAreaIdentity.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/TrackingAreaIdentity.h b/openair-cn/NAS/COMMON/IES/TrackingAreaIdentity.h index eb3826cab1..7249d3c5c1 100644 --- a/openair-cn/NAS/COMMON/IES/TrackingAreaIdentity.h +++ b/openair-cn/NAS/COMMON/IES/TrackingAreaIdentity.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/TrackingAreaIdentityList.c b/openair-cn/NAS/COMMON/IES/TrackingAreaIdentityList.c index eb0e30d01c..eae44e8e58 100644 --- a/openair-cn/NAS/COMMON/IES/TrackingAreaIdentityList.c +++ b/openair-cn/NAS/COMMON/IES/TrackingAreaIdentityList.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/TrackingAreaIdentityList.h b/openair-cn/NAS/COMMON/IES/TrackingAreaIdentityList.h index a849fd04b0..345aacf438 100644 --- a/openair-cn/NAS/COMMON/IES/TrackingAreaIdentityList.h +++ b/openair-cn/NAS/COMMON/IES/TrackingAreaIdentityList.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/TrafficFlowAggregateDescription.c b/openair-cn/NAS/COMMON/IES/TrafficFlowAggregateDescription.c index cb6aaff14f..b2ea6a83b9 100644 --- a/openair-cn/NAS/COMMON/IES/TrafficFlowAggregateDescription.c +++ b/openair-cn/NAS/COMMON/IES/TrafficFlowAggregateDescription.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/TrafficFlowAggregateDescription.h b/openair-cn/NAS/COMMON/IES/TrafficFlowAggregateDescription.h index cda9369666..3058873621 100644 --- a/openair-cn/NAS/COMMON/IES/TrafficFlowAggregateDescription.h +++ b/openair-cn/NAS/COMMON/IES/TrafficFlowAggregateDescription.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/TrafficFlowTemplate.c b/openair-cn/NAS/COMMON/IES/TrafficFlowTemplate.c index 931e2326aa..e18ffc92c5 100644 --- a/openair-cn/NAS/COMMON/IES/TrafficFlowTemplate.c +++ b/openair-cn/NAS/COMMON/IES/TrafficFlowTemplate.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/TrafficFlowTemplate.h b/openair-cn/NAS/COMMON/IES/TrafficFlowTemplate.h index 5c01c228aa..40f9c6b4a6 100644 --- a/openair-cn/NAS/COMMON/IES/TrafficFlowTemplate.h +++ b/openair-cn/NAS/COMMON/IES/TrafficFlowTemplate.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/TransactionIdentifier.c b/openair-cn/NAS/COMMON/IES/TransactionIdentifier.c index c3afd42950..c48ae31a63 100644 --- a/openair-cn/NAS/COMMON/IES/TransactionIdentifier.c +++ b/openair-cn/NAS/COMMON/IES/TransactionIdentifier.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/TransactionIdentifier.h b/openair-cn/NAS/COMMON/IES/TransactionIdentifier.h index 153432e3b7..061db1c654 100644 --- a/openair-cn/NAS/COMMON/IES/TransactionIdentifier.h +++ b/openair-cn/NAS/COMMON/IES/TransactionIdentifier.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/UeNetworkCapability.c b/openair-cn/NAS/COMMON/IES/UeNetworkCapability.c index 839acc080b..41393e7689 100644 --- a/openair-cn/NAS/COMMON/IES/UeNetworkCapability.c +++ b/openair-cn/NAS/COMMON/IES/UeNetworkCapability.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/UeNetworkCapability.h b/openair-cn/NAS/COMMON/IES/UeNetworkCapability.h index a385fefea9..56451159a5 100644 --- a/openair-cn/NAS/COMMON/IES/UeNetworkCapability.h +++ b/openair-cn/NAS/COMMON/IES/UeNetworkCapability.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/UeRadioCapabilityInformationUpdateNeeded.c b/openair-cn/NAS/COMMON/IES/UeRadioCapabilityInformationUpdateNeeded.c index 08020581e4..36d612bf6f 100644 --- a/openair-cn/NAS/COMMON/IES/UeRadioCapabilityInformationUpdateNeeded.c +++ b/openair-cn/NAS/COMMON/IES/UeRadioCapabilityInformationUpdateNeeded.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/UeRadioCapabilityInformationUpdateNeeded.h b/openair-cn/NAS/COMMON/IES/UeRadioCapabilityInformationUpdateNeeded.h index 0876f663da..853ecea045 100644 --- a/openair-cn/NAS/COMMON/IES/UeRadioCapabilityInformationUpdateNeeded.h +++ b/openair-cn/NAS/COMMON/IES/UeRadioCapabilityInformationUpdateNeeded.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/UeSecurityCapability.c b/openair-cn/NAS/COMMON/IES/UeSecurityCapability.c index 5c4610ccde..ecc55ae5ff 100644 --- a/openair-cn/NAS/COMMON/IES/UeSecurityCapability.c +++ b/openair-cn/NAS/COMMON/IES/UeSecurityCapability.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/UeSecurityCapability.h b/openair-cn/NAS/COMMON/IES/UeSecurityCapability.h index 9009937cf4..dede6af9f8 100644 --- a/openair-cn/NAS/COMMON/IES/UeSecurityCapability.h +++ b/openair-cn/NAS/COMMON/IES/UeSecurityCapability.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/VoiceDomainPreferenceAndUeUsageSetting.c b/openair-cn/NAS/COMMON/IES/VoiceDomainPreferenceAndUeUsageSetting.c index 38a8cf10a6..0c84ba0a8e 100644 --- a/openair-cn/NAS/COMMON/IES/VoiceDomainPreferenceAndUeUsageSetting.c +++ b/openair-cn/NAS/COMMON/IES/VoiceDomainPreferenceAndUeUsageSetting.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/IES/VoiceDomainPreferenceAndUeUsageSetting.h b/openair-cn/NAS/COMMON/IES/VoiceDomainPreferenceAndUeUsageSetting.h index 221620fa6a..13a8b668ec 100644 --- a/openair-cn/NAS/COMMON/IES/VoiceDomainPreferenceAndUeUsageSetting.h +++ b/openair-cn/NAS/COMMON/IES/VoiceDomainPreferenceAndUeUsageSetting.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/UTIL/COPYING b/openair-cn/NAS/COMMON/UTIL/COPYING index 94a9ed024d..c888423064 100644 --- a/openair-cn/NAS/COMMON/UTIL/COPYING +++ b/openair-cn/NAS/COMMON/UTIL/COPYING @@ -1,674 +1,28 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program 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. - - This program 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 this program. If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - <program> Copyright (C) <year> <name of author> - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<http://www.gnu.org/licenses/>. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<http://www.gnu.org/philosophy/why-not-lgpl.html>. +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ \ No newline at end of file diff --git a/openair-cn/NAS/COMMON/UTIL/Makefile b/openair-cn/NAS/COMMON/UTIL/Makefile index 799bb8599a..b0977b8112 100644 --- a/openair-cn/NAS/COMMON/UTIL/Makefile +++ b/openair-cn/NAS/COMMON/UTIL/Makefile @@ -1,31 +1,4 @@ -################################################################################ -# 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@eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ + ifndef PROJDIR PROJDIR = $(PWD)/../.. endif diff --git a/openair-cn/NAS/COMMON/UTIL/OctetString.c b/openair-cn/NAS/COMMON/UTIL/OctetString.c index fd16e27014..4a429d84a7 100644 --- a/openair-cn/NAS/COMMON/UTIL/OctetString.c +++ b/openair-cn/NAS/COMMON/UTIL/OctetString.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/UTIL/OctetString.h b/openair-cn/NAS/COMMON/UTIL/OctetString.h index 15cd8f6823..b3ea818cc8 100644 --- a/openair-cn/NAS/COMMON/UTIL/OctetString.h +++ b/openair-cn/NAS/COMMON/UTIL/OctetString.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdint.h> #include <assert.h> diff --git a/openair-cn/NAS/COMMON/UTIL/TLVDecoder.c b/openair-cn/NAS/COMMON/UTIL/TLVDecoder.c index 744a00d99c..c1ce58ea00 100644 --- a/openair-cn/NAS/COMMON/UTIL/TLVDecoder.c +++ b/openair-cn/NAS/COMMON/UTIL/TLVDecoder.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/NAS/COMMON/UTIL/TLVDecoder.h b/openair-cn/NAS/COMMON/UTIL/TLVDecoder.h index 152fd9c737..99e1b9d90f 100644 --- a/openair-cn/NAS/COMMON/UTIL/TLVDecoder.h +++ b/openair-cn/NAS/COMMON/UTIL/TLVDecoder.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #ifndef TLV_DECODER_H_ #define TLV_DECODER_H_ diff --git a/openair-cn/NAS/COMMON/UTIL/TLVEncoder.c b/openair-cn/NAS/COMMON/UTIL/TLVEncoder.c index 39a5d94761..0ad394e97a 100644 --- a/openair-cn/NAS/COMMON/UTIL/TLVEncoder.c +++ b/openair-cn/NAS/COMMON/UTIL/TLVEncoder.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/NAS/COMMON/UTIL/TLVEncoder.h b/openair-cn/NAS/COMMON/UTIL/TLVEncoder.h index 287635e9be..2917594618 100644 --- a/openair-cn/NAS/COMMON/UTIL/TLVEncoder.h +++ b/openair-cn/NAS/COMMON/UTIL/TLVEncoder.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #ifndef TLV_ENCODER_H_ #define TLV_ENCODER_H_ diff --git a/openair-cn/NAS/COMMON/UTIL/device.c b/openair-cn/NAS/COMMON/UTIL/device.c index d6ab908a6c..375ffe0846 100644 --- a/openair-cn/NAS/COMMON/UTIL/device.c +++ b/openair-cn/NAS/COMMON/UTIL/device.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ /***************************************************************************** Source device.c diff --git a/openair-cn/NAS/COMMON/UTIL/device.h b/openair-cn/NAS/COMMON/UTIL/device.h index b67a2cdbc3..ded1aca095 100644 --- a/openair-cn/NAS/COMMON/UTIL/device.h +++ b/openair-cn/NAS/COMMON/UTIL/device.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ /***************************************************************************** Source device.h diff --git a/openair-cn/NAS/COMMON/UTIL/memory.c b/openair-cn/NAS/COMMON/UTIL/memory.c index 739509c228..18c7f8b1af 100644 --- a/openair-cn/NAS/COMMON/UTIL/memory.c +++ b/openair-cn/NAS/COMMON/UTIL/memory.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ /***************************************************************************** Source memory.c diff --git a/openair-cn/NAS/COMMON/UTIL/memory.h b/openair-cn/NAS/COMMON/UTIL/memory.h index 5d7734fc47..0314630f0c 100644 --- a/openair-cn/NAS/COMMON/UTIL/memory.h +++ b/openair-cn/NAS/COMMON/UTIL/memory.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ /***************************************************************************** Source memory.h diff --git a/openair-cn/NAS/COMMON/UTIL/nas_log.c b/openair-cn/NAS/COMMON/UTIL/nas_log.c index a781d25971..f0d6a24ffe 100644 --- a/openair-cn/NAS/COMMON/UTIL/nas_log.c +++ b/openair-cn/NAS/COMMON/UTIL/nas_log.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ /***************************************************************************** Source nas_log.c diff --git a/openair-cn/NAS/COMMON/UTIL/nas_log.h b/openair-cn/NAS/COMMON/UTIL/nas_log.h index b947e33563..c17efb3383 100644 --- a/openair-cn/NAS/COMMON/UTIL/nas_log.h +++ b/openair-cn/NAS/COMMON/UTIL/nas_log.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ /***************************************************************************** Source nas_log.h diff --git a/openair-cn/NAS/COMMON/UTIL/nas_timer.c b/openair-cn/NAS/COMMON/UTIL/nas_timer.c index d7c1eb9f0e..5dc6923140 100644 --- a/openair-cn/NAS/COMMON/UTIL/nas_timer.c +++ b/openair-cn/NAS/COMMON/UTIL/nas_timer.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ /***************************************************************************** Source nas_timer.c diff --git a/openair-cn/NAS/COMMON/UTIL/nas_timer.h b/openair-cn/NAS/COMMON/UTIL/nas_timer.h index 891eeab5e7..0b65da4159 100644 --- a/openair-cn/NAS/COMMON/UTIL/nas_timer.h +++ b/openair-cn/NAS/COMMON/UTIL/nas_timer.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ /***************************************************************************** Source nas_timer.h diff --git a/openair-cn/NAS/COMMON/UTIL/parser.c b/openair-cn/NAS/COMMON/UTIL/parser.c index cb69a63703..5f8350ea58 100644 --- a/openair-cn/NAS/COMMON/UTIL/parser.c +++ b/openair-cn/NAS/COMMON/UTIL/parser.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ /***************************************************************************** Source parser.c diff --git a/openair-cn/NAS/COMMON/UTIL/parser.h b/openair-cn/NAS/COMMON/UTIL/parser.h index 0fe247015f..fc8a9ad126 100644 --- a/openair-cn/NAS/COMMON/UTIL/parser.h +++ b/openair-cn/NAS/COMMON/UTIL/parser.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ /***************************************************************************** Source parser.h diff --git a/openair-cn/NAS/COMMON/UTIL/socket.c b/openair-cn/NAS/COMMON/UTIL/socket.c index f7793204f2..b76506109b 100644 --- a/openair-cn/NAS/COMMON/UTIL/socket.c +++ b/openair-cn/NAS/COMMON/UTIL/socket.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ /***************************************************************************** Source socket.c diff --git a/openair-cn/NAS/COMMON/UTIL/socket.h b/openair-cn/NAS/COMMON/UTIL/socket.h index 1bf885d962..4be749d3cc 100644 --- a/openair-cn/NAS/COMMON/UTIL/socket.h +++ b/openair-cn/NAS/COMMON/UTIL/socket.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ /***************************************************************************** Source socket.h diff --git a/openair-cn/NAS/COMMON/UTIL/stty.c b/openair-cn/NAS/COMMON/UTIL/stty.c index 67819a8e46..1fb72e9204 100644 --- a/openair-cn/NAS/COMMON/UTIL/stty.c +++ b/openair-cn/NAS/COMMON/UTIL/stty.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ /***************************************************************************** Source stty.c diff --git a/openair-cn/NAS/COMMON/UTIL/tst/Makefile b/openair-cn/NAS/COMMON/UTIL/tst/Makefile index ab0d17c982..efaaff22fa 100644 --- a/openair-cn/NAS/COMMON/UTIL/tst/Makefile +++ b/openair-cn/NAS/COMMON/UTIL/tst/Makefile @@ -1,31 +1,4 @@ -################################################################################ -# 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@eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ + ifndef PROJDIR PROJDIR = $(PWD)/../../.. endif diff --git a/openair-cn/NAS/COMMON/UTIL/tst/timer.c b/openair-cn/NAS/COMMON/UTIL/tst/timer.c index 458a94861d..7b963fba30 100644 --- a/openair-cn/NAS/COMMON/UTIL/tst/timer.c +++ b/openair-cn/NAS/COMMON/UTIL/tst/timer.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ /***************************************************************************** Source timer.c diff --git a/openair-cn/NAS/COMMON/securityDef.h b/openair-cn/NAS/COMMON/securityDef.h index 88325f0aaf..c418de2c60 100644 --- a/openair-cn/NAS/COMMON/securityDef.h +++ b/openair-cn/NAS/COMMON/securityDef.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ /***************************************************************************** Source securityDef.h diff --git a/openair-cn/NAS/COMMON/userDef.h b/openair-cn/NAS/COMMON/userDef.h index b99e263382..f6398794fe 100644 --- a/openair-cn/NAS/COMMON/userDef.h +++ b/openair-cn/NAS/COMMON/userDef.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ /***************************************************************************** Source userDef.h diff --git a/openair-cn/NAS/MME/API/MME/COPYING b/openair-cn/NAS/MME/API/MME/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair-cn/NAS/MME/API/MME/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program 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. - - This program 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 this program. If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - <program> Copyright (C) <year> <name of author> - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<http://www.gnu.org/licenses/>. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<http://www.gnu.org/philosophy/why-not-lgpl.html>. diff --git a/openair-cn/NAS/MME/API/MME/Makefile b/openair-cn/NAS/MME/API/MME/Makefile deleted file mode 100644 index 7c92861153..0000000000 --- a/openair-cn/NAS/MME/API/MME/Makefile +++ /dev/null @@ -1,49 +0,0 @@ -################################################################################ -# 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@eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ -ifndef PROJDIR -PROJDIR = $(PWD)/../../.. -INCLUDES = -I. -I$(INCDIR) -I$(UTILDIR) -endif - -include $(PROJDIR)/Makerules -include $(PROJDIR)/Makefile.inc - -all: $(OBJS) - -%.o: %.c Makefile - @echo Compiling $< - @$(CC) $(CFLAGS) -c $< -o $@ - -clean: - $(RM) $(OBJS) *.bak *~ - -depend: - makedepend -- ${CFLAGS} -- ${SRCS} - -# DO NOT DELETE THIS LINE -- make depend depends on it. diff --git a/openair-cn/NAS/MME/API/MME/mme_api.c b/openair-cn/NAS/MME/API/MME/mme_api.c deleted file mode 100644 index 91b688558c..0000000000 --- a/openair-cn/NAS/MME/API/MME/mme_api.c +++ /dev/null @@ -1,569 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source mme_api.c - -Version 0.1 - -Date 2013/02/28 - -Product NAS stack - -Subsystem Application Programming Interface - -Author Frederic Maurel - -Description Implements the API used by the NAS layer running in the MME - to interact with a Mobility Management Entity - -*****************************************************************************/ - - -#include "mme_api.h" -#include "nas_log.h" -#include "assertions.h" - -#include <string.h> // memcpy - -/****************************************************************************/ -/**************** E X T E R N A L D E F I N I T I O N S ****************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************* L O C A L D E F I N I T I O N S *******************/ -/****************************************************************************/ - -/* Maximum number of PDN connections the MME may simultaneously support */ -#define MME_API_PDN_MAX 10 - -/* MME group identifier */ -#define MME_API_MME_GID 0x0102 - -/* MME code */ -#define MME_API_MME_CODE 0x12 - -/* Default APN */ -static const OctetString mme_api_default_apn = { - /* LW: apn seems to be coded using a one byte size field before each part of the name */ -#if 1 - 15, (uint8_t *)("\x0e" "www.eurecom.fr") -#else - 35, (uint8_t *)("\x08" "internet" - "\x02" "v4" - "\x03" "pft" - "\x06" "mnc092" - "\x06" "mcc208" - "\x04" "gprs") -#endif -}; - -/* APN configured for emergency bearer services */ -static const OctetString mme_api_emergency_apn = { - 19, (uint8_t *)("\x12" "www.eurecom_sos.fr") -}; - -/* Public Land Mobile Network identifier */ -static const plmn_t mme_api_plmn = {0, 2, 0xf, 8, 0, 1}; // 20810 - -/* Number of concecutive tracking areas */ -#define MME_API_NB_TACS 4 -/* Code of the first tracking area belonging to the PLMN */ -#define MME_API_FIRST_TAC 0x0001 - - -/* Authentication parameter RAND */ -static const uint8_t _mme_api_rand[AUTH_RAND_SIZE] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x02, 0x03, 0x04 -}; - -/* Authentication parameter AUTN */ -static const uint8_t _mme_api_autn[AUTH_AUTN_SIZE] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x05, 0x04, 0x03, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00 -}; - -/* Authentication response parameter */ -static const uint8_t _mme_api_xres[AUTH_XRES_SIZE] = { - 0x67, 0x70, 0x3a, 0x31, 0xf2, 0x2a, 0x2d, 0x51, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00 -}; - -static mme_api_ip_version_t _mme_api_ip_capability = MME_API_IPV4V6_ADDR; - -/* Pool of IPv4 addresses */ -static uint8_t _mme_api_ipv4_addr[MME_API_PDN_MAX][4] = { - {0xC0, 0xA8, 0x02, 0x3C}, /* 192.168.02.60 */ - {0xC0, 0xA8, 0x0C, 0xBB}, /* 192.168.12.187 */ - {0xC0, 0xA8, 0x0C, 0xBC}, /* 192.168.12.188 */ - {0xC0, 0xA8, 0x0C, 0xBD}, /* 192.168.12.189 */ - {0xC0, 0xA8, 0x0C, 0xBE}, /* 192.168.12.190 */ - {0xC0, 0xA8, 0x0C, 0xBF}, /* 192.168.12.191 */ - {0xC0, 0xA8, 0x0C, 0xC0}, /* 192.168.12.192 */ - {0xC0, 0xA8, 0x0C, 0xC1}, /* 192.168.12.193 */ - {0xC0, 0xA8, 0x0C, 0xC2}, /* 192.168.12.194 */ - {0xC0, 0xA8, 0x0C, 0xC3}, /* 192.168.12.195 */ -}; -/* Pool of IPv6 addresses */ -static uint8_t _mme_api_ipv6_addr[MME_API_PDN_MAX][8] = { - /* FE80::221:70FF:C0A8:023C/64 */ - {0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x02, 0x3C}, - /* FE80::221:70FF:C0A8:0CBB/64 */ - {0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x0C, 0xBB}, - /* FE80::221:70FF:C0A8:0CBC/64 */ - {0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x0C, 0xBC}, - /* FE80::221:70FF:C0A8:0CBD/64 */ - {0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x0C, 0xBD}, - /* FE80::221:70FF:C0A8:0CBE/64 */ - {0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x0C, 0xBE}, - /* FE80::221:70FF:C0A8:0CBF/64 */ - {0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x0C, 0xBF}, - /* FE80::221:70FF:C0A8:0CC0/64 */ - {0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x0C, 0xC0}, - /* FE80::221:70FF:C0A8:0CC1/64 */ - {0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x0C, 0xC1}, - /* FE80::221:70FF:C0A8:0CC2/64 */ - {0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x0C, 0xC2}, - /* FE80::221:70FF:C0A8:0CC3/64 */ - {0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x0C, 0xC3}, -}; -/* Pool of IPv4v6 addresses */ -static uint8_t _mme_api_ipv4v6_addr[MME_API_PDN_MAX][12] = { - /* 192.168.02.60, FE80::221:70FF:C0A8:023C/64 */ - {0xC0, 0xA8, 0x02, 0x3C, 0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x02, 0x3C}, - /* 192.168.12.187, FE80::221:70FF:C0A8:0CBB/64 */ - {0xC0, 0xA8, 0x0C, 0xBB, 0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x0C, 0xBB}, - /* 192.168.12.188, FE80::221:70FF:C0A8:0CBC/64 */ - {0xC0, 0xA8, 0x0C, 0xBC, 0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x0C, 0xBC}, - /* 192.168.12.189, FE80::221:70FF:C0A8:0CBD/64 */ - {0xC0, 0xA8, 0x0C, 0xBD, 0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x0C, 0xBD}, - /* 192.168.12.189, FE80::221:70FF:C0A8:0CBE/64 */ - {0xC0, 0xA8, 0x0C, 0xBD, 0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x0C, 0xBE}, - /* 192.168.12.189, FE80::221:70FF:C0A8:0CBF/64 */ - {0xC0, 0xA8, 0x0C, 0xBD, 0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x0C, 0xBF}, - /* 192.168.12.189, FE80::221:70FF:C0A8:0CC0/64 */ - {0xC0, 0xA8, 0x0C, 0xBD, 0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x0C, 0xC0}, - /* 192.168.12.189, FE80::221:70FF:C0A8:0CC1/64 */ - {0xC0, 0xA8, 0x0C, 0xBD, 0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x0C, 0xC1}, - /* 192.168.12.189, FE80::221:70FF:C0A8:0CC2/64 */ - {0xC0, 0xA8, 0x0C, 0xBD, 0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x0C, 0xC2}, - /* 192.168.12.189, FE80::221:70FF:C0A8:0CC3/64 */ - {0xC0, 0xA8, 0x0C, 0xBD, 0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x0C, 0xC3}, -}; -static const OctetString _mme_api_pdn_addr[MME_API_ADDR_MAX][MME_API_PDN_MAX] = { - { /* IPv4 network capability */ - {4, _mme_api_ipv4_addr[0]}, - {4, _mme_api_ipv4_addr[1]}, - {4, _mme_api_ipv4_addr[2]}, - {4, _mme_api_ipv4_addr[3]}, - {4, _mme_api_ipv4_addr[4]}, - {4, _mme_api_ipv4_addr[5]}, - {4, _mme_api_ipv4_addr[6]}, - {4, _mme_api_ipv4_addr[7]}, - {4, _mme_api_ipv4_addr[8]}, - {4, _mme_api_ipv4_addr[9]}, - }, - { /* IPv6 network capability */ - {8, _mme_api_ipv6_addr[0]}, - {8, _mme_api_ipv6_addr[1]}, - {8, _mme_api_ipv6_addr[2]}, - {8, _mme_api_ipv6_addr[3]}, - {8, _mme_api_ipv6_addr[4]}, - {8, _mme_api_ipv6_addr[5]}, - {8, _mme_api_ipv6_addr[6]}, - {8, _mme_api_ipv6_addr[7]}, - {8, _mme_api_ipv6_addr[8]}, - {8, _mme_api_ipv6_addr[9]}, - }, - { /* IPv4v6 network capability */ - {12, _mme_api_ipv4v6_addr[0]}, - {12, _mme_api_ipv4v6_addr[1]}, - {12, _mme_api_ipv4v6_addr[2]}, - {12, _mme_api_ipv4v6_addr[3]}, - {12, _mme_api_ipv4v6_addr[4]}, - {12, _mme_api_ipv4v6_addr[5]}, - {12, _mme_api_ipv4v6_addr[6]}, - {12, _mme_api_ipv4v6_addr[7]}, - {12, _mme_api_ipv4v6_addr[8]}, - {12, _mme_api_ipv4v6_addr[9]}, - }, -}; - -/* Subscribed QCI */ -#define MME_API_QCI 3 - -/* Data bit rates */ -#define MME_API_BIT_RATE_64K 0x40 -#define MME_API_BIT_RATE_128K 0x48 -#define MME_API_BIT_RATE_512K 0x78 -#define MME_API_BIT_RATE_1024K 0x87 - -/* Total number of PDN connections (should not exceed MME_API_PDN_MAX) */ -static int _mme_api_pdn_id = 0; - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -/****************************************************************************/ -/********************* L O C A L F U N C T I O N S *********************/ -/****************************************************************************/ - -/**************************************************************************** - ** ** - ** Name: mme_api_get_emm_config() ** - ** ** - ** Description: Retreives MME configuration data related to EPS mobility ** - ** management ** - ** ** - ** Inputs: None ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -#if defined(NAS_BUILT_IN_EPC) -int mme_api_get_emm_config(mme_api_emm_config_t *config, - mme_config_t *mme_config_p) -#else -int mme_api_get_emm_config(mme_api_emm_config_t *config) -#endif -{ -#if defined(NAS_BUILT_IN_EPC) - int i; -#endif - LOG_FUNC_IN; - AssertFatal(mme_config_p->gummei.nb_plmns >= 1, "No PLMN configured"); - AssertFatal(mme_config_p->gummei.nb_mmec >= 1, "No MME Code configured"); - AssertFatal(mme_config_p->gummei.nb_mme_gid >= 1, "No MME Group ID configured"); - - config->gummei.plmn.MCCdigit1 = (mme_config_p->gummei.plmn_mcc[0]/100)%10; - config->gummei.plmn.MCCdigit2 = (mme_config_p->gummei.plmn_mcc[0]/10)%10; - config->gummei.plmn.MCCdigit3 = mme_config_p->gummei.plmn_mcc[0]%10; - - if (mme_config_p->gummei.plmn_mnc_len[0] == 2) { - config->gummei.plmn.MNCdigit1 = (mme_config_p->gummei.plmn_mnc[0]/10)%10; - config->gummei.plmn.MNCdigit2 = mme_config_p->gummei.plmn_mnc[0]%10; - config->gummei.plmn.MNCdigit3 = 0xf; - } else if (mme_config_p->gummei.plmn_mnc_len[0] == 3) { - config->gummei.plmn.MNCdigit1 = (mme_config_p->gummei.plmn_mnc[0]/100)%10; - config->gummei.plmn.MNCdigit2 = (mme_config_p->gummei.plmn_mnc[0]/10)%10; - config->gummei.plmn.MNCdigit3 = mme_config_p->gummei.plmn_mnc[0]%10; - } else { - AssertFatal((mme_config_p->gummei.plmn_mnc_len[0] >= 2) && - (mme_config_p->gummei.plmn_mnc_len[0] <= 3), "BAD MNC length for GUMMEI"); - } - - config->gummei.MMEgid = mme_config_p->gummei.mme_gid[0]; - config->gummei.MMEcode = mme_config_p->gummei.mmec[0]; -#if defined(NAS_BUILT_IN_EPC) - - /* SR: this config param comes from MME global config */ - if (mme_config_p->emergency_attach_supported != 0) { - config->features |= MME_API_EMERGENCY_ATTACH; - } - - if (mme_config_p->unauthenticated_imsi_supported != 0) { - config->features |= MME_API_UNAUTHENTICATED_IMSI; - } - - for (i = 0 ; i < 8; i++) { - config->prefered_integrity_algorithm[i] = mme_config_p->nas_config.prefered_integrity_algorithm[i]; - config->prefered_ciphering_algorithm[i] = mme_config_p->nas_config.prefered_ciphering_algorithm[i]; - } - -#else - config->features = MME_API_EMERGENCY_ATTACH | MME_API_UNAUTHENTICATED_IMSI; -#endif - - LOG_FUNC_RETURN (RETURNok); -} - -/**************************************************************************** - ** ** - ** Name: mme_api_get_config() ** - ** ** - ** Description: Retreives MME configuration data related to EPS session ** - ** management ** - ** ** - ** Inputs: None ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int mme_api_get_esm_config(mme_api_esm_config_t *config) -{ - LOG_FUNC_IN; - - if (_mme_api_ip_capability == MME_API_IPV4_ADDR) { - config->features = MME_API_IPV4; - } else if (_mme_api_ip_capability == MME_API_IPV6_ADDR) { - config->features = MME_API_IPV6; - } else if (_mme_api_ip_capability == MME_API_IPV4V6_ADDR) { - config->features = MME_API_IPV4 | MME_API_IPV6; - } else { - config->features = 0; - } - - LOG_FUNC_RETURN (RETURNok); -} - -/**************************************************************************** - ** ** - ** Name: mme_api_identify_guti() ** - ** ** - ** Description: Requests the MME to identify the UE using the specified ** - ** GUTI. If the UE is known by the MME (a Mobility Manage- ** - ** ment context exists for this UE in the MME), its se- ** - ** curity context is returned. ** - ** ** - ** Inputs: guti: EPS Globally Unique Temporary UE Identity ** - ** Others: None ** - ** ** - ** Outputs: vector: The EPS authentication vector of the UE if ** - ** known by the network; NULL otherwise. ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int mme_api_identify_guti(const GUTI_t *guti, auth_vector_t *vector) -{ - int rc = RETURNerror; - - LOG_FUNC_IN; - - LOG_FUNC_RETURN(rc); -} - -/**************************************************************************** - ** ** - ** Name: mme_api_identify_imsi() ** - ** ** - ** Description: Requests the MME to identify the UE using the specified ** - ** IMSI. If the UE is known by the MME (a Mobility Manage- ** - ** ment context exists for this UE in the MME), its se- ** - ** curity context is returned. ** - ** ** - ** Inputs: imsi: International Mobile Subscriber Identity ** - ** Others: None ** - ** ** - ** Outputs: vector: The EPS authentication vector of the UE if ** - ** known by the network; NULL otherwise. ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int mme_api_identify_imsi(const imsi_t *imsi, auth_vector_t *vector) -{ - int rc = RETURNok; - - LOG_FUNC_IN; - AssertFatal(0, "Hardcoded values"); - - memcpy(vector->rand, _mme_api_rand, AUTH_RAND_SIZE); - memcpy(vector->autn, _mme_api_autn, AUTH_AUTN_SIZE); - memcpy(vector->xres, _mme_api_xres, AUTH_XRES_SIZE); - - LOG_FUNC_RETURN(rc); -} - -/**************************************************************************** - ** ** - ** Name: mme_api_identify_imei() ** - ** ** - ** Description: Requests the MME to identify the UE using the specified ** - ** IMEI. If the UE is known by the MME (a Mobility Manage- ** - ** ment context exists for this UE in the MME), its se- ** - ** curity context is returned. ** - ** ** - ** Inputs: imei: International Mobile Equipment Identity ** - ** Others: None ** - ** ** - ** Outputs: vector: The EPS authentication vector of the UE if ** - ** known by the network; NULL otherwise. ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int mme_api_identify_imei(const imei_t *imei, auth_vector_t *vector) -{ - int rc = RETURNerror; - - LOG_FUNC_IN; - - LOG_FUNC_RETURN(rc); -} - -/**************************************************************************** - ** ** - ** Name: mme_api_new_guti() ** - ** ** - ** Description: Requests the MME to assign a new GUTI to the UE identi- ** - ** fied by the given IMSI. ** - ** ** - ** Description: Requests the MME to assign a new GUTI to the UE identi- ** - ** fied by the given IMSI and returns the list of consecu- ** - ** tive tracking areas the UE is registered to. ** - ** ** - ** Inputs: imsi: International Mobile Subscriber Identity ** - ** Others: None ** - ** ** - ** Outputs: guti: The new assigned GUTI ** - ** tac: Code of the first tracking area belonging ** - ** to the PLMN ** - ** n_tacs: Number of concecutive tracking areas ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int mme_api_new_guti(const imsi_t *imsi, GUTI_t *guti, tac_t *tac, int *n_tacs) -{ - int rc = RETURNok; - - static unsigned int tmsi = 1; - - LOG_FUNC_IN; - AssertFatal(0, "Hardcoded values"); - - guti->gummei.plmn = mme_api_plmn; - guti->gummei.MMEgid = MME_API_MME_GID; - guti->gummei.MMEcode = MME_API_MME_CODE; - guti->m_tmsi = tmsi++; - - *tac = MME_API_FIRST_TAC; - *n_tacs = MME_API_NB_TACS; - - LOG_FUNC_RETURN(rc); -} - -/**************************************************************************** - ** ** - ** Name: mme_api_subscribe() ** - ** ** - ** Description: Requests the MME to check whether connectivity with the ** - ** requested PDN can be established using the specified APN. ** - ** If accepted the MME returns PDN subscription context con- ** - ** taining EPS subscribed QoS profile, the default APN if ** - ** required and UE's IPv4 address and/or the IPv6 prefix. ** - ** ** - ** Inputs: apn: If not NULL, Access Point Name of the PDN ** - ** to connect to ** - ** is_emergency: TRUE if the PDN connectivity is requested ** - ** for emergency bearer services ** - ** Others: None ** - ** ** - ** Outputs: apn: If NULL, default APN or APN configured for ** - ** emergency bearer services ** - ** pdn_addr: PDN connection IPv4 address or IPv6 inter- ** - ** face identifier to be used to build the ** - ** IPv6 link local address ** - ** qos: EPS subscribed QoS profile ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int mme_api_subscribe(OctetString *apn, mme_api_ip_version_t mme_pdn_index, OctetString *pdn_addr, - int is_emergency, mme_api_qos_t *qos) -{ - int rc = RETURNok; - - LOG_FUNC_IN; - - if ( apn && (apn->length == 0) ) { - /* PDN connectivity to default APN */ - if (is_emergency) { - apn->length = mme_api_emergency_apn.length; - apn->value = mme_api_emergency_apn.value; - } else { - apn->length = mme_api_default_apn.length; - apn->value = mme_api_default_apn.value; - } - } - - /* Assign PDN address */ - if ( pdn_addr && (_mme_api_pdn_id < MME_API_PDN_MAX) ) { - pdn_addr->length = - _mme_api_pdn_addr[mme_pdn_index][_mme_api_pdn_id].length; - pdn_addr->value = - _mme_api_pdn_addr[mme_pdn_index][_mme_api_pdn_id].value; - /* Increment the total number of PDN connections */ - _mme_api_pdn_id += 1; - } else { - /* Maximum number of PDN connections exceeded */ - rc = RETURNerror; - } - - /* Setup EPS subscribed QoS profile */ - if (qos) { - qos->qci = MME_API_QCI; - /* Uplink bit rate */ - qos->gbr[MME_API_UPLINK] = MME_API_BIT_RATE_64K; - qos->mbr[MME_API_UPLINK] = MME_API_BIT_RATE_128K; - /* Downlink bit rate */ - qos->gbr[MME_API_DOWNLINK] = MME_API_BIT_RATE_512K; - qos->mbr[MME_API_DOWNLINK] = MME_API_BIT_RATE_1024K; - } else { - rc = RETURNerror; - } - - LOG_FUNC_RETURN(rc); -} - -/**************************************************************************** - ** ** - ** Name: mme_api_unsubscribe() ** - ** ** - ** Description: Requests the MME to release connectivity with the reques- ** - ** ted PDN using the specified APN. ** - ** ** - ** Inputs: apn: Access Point Name of the PDN to disconnect ** - ** from ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int mme_api_unsubscribe(OctetString *apn) -{ - LOG_FUNC_IN; - - int rc = RETURNok; - - /* Decrement the total number of PDN connections */ - _mme_api_pdn_id -= 1; - - LOG_FUNC_RETURN(rc); -} diff --git a/openair-cn/NAS/MME/API/MME/mme_api.h b/openair-cn/NAS/MME/API/MME/mme_api.h deleted file mode 100644 index a8f83e1237..0000000000 --- a/openair-cn/NAS/MME/API/MME/mme_api.h +++ /dev/null @@ -1,146 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source mme_api.h - -Version 0.1 - -Date 2013/02/28 - -Product NAS stack - -Subsystem Application Programming Interface - -Author Frederic Maurel - -Description Implements the API used by the NAS layer running in the MME - to interact with a Mobility Management Entity - -*****************************************************************************/ -#ifndef __MME_API_H__ -#define __MME_API_H__ - -# if defined(NAS_BUILT_IN_EPC) -# include "mme_config.h" -# endif -#include "commonDef.h" -#include "securityDef.h" -#include "OctetString.h" - -/****************************************************************************/ -/********************* G L O B A L C O N S T A N T S *******************/ -/****************************************************************************/ - -/* Maximum number of UEs the MME may simultaneously support */ -#define MME_API_NB_UE_MAX 256 - - -/* Features supported by the MME */ -typedef enum mme_api_feature_s { - MME_API_NO_FEATURE_SUPPORTED = 0, - MME_API_EMERGENCY_ATTACH = (1<<0), - MME_API_UNAUTHENTICATED_IMSI = (1<<1), - MME_API_IPV4 = (1<<2), - MME_API_IPV6 = (1<<3), - MME_API_SINGLE_ADDR_BEARERS = (1<<4), -} mme_api_feature_t; - -/* Network IP version capability */ -typedef enum mme_api_ip_version_e { - MME_API_IPV4_ADDR, - MME_API_IPV6_ADDR, - MME_API_IPV4V6_ADDR, - MME_API_ADDR_MAX -} mme_api_ip_version_t; - -/* - * EPS Mobility Management configuration data - * ------------------------------------------ - */ -typedef struct mme_api_emm_config_s { - mme_api_feature_t features; /* Supported features */ - gummei_t gummei; /* EPS Globally Unique MME Identity */ - uint8_t prefered_integrity_algorithm[8];// choice in NAS_SECURITY_ALGORITHMS_EIA0, etc - uint8_t prefered_ciphering_algorithm[8];// choice in NAS_SECURITY_ALGORITHMS_EEA0, etc -} mme_api_emm_config_t; - -/* - * EPS Session Management configuration data - * ----------------------------------------- - */ -typedef struct mme_api_esm_config_s { - mme_api_feature_t features; /* Supported features */ - uint8_t dns_prim_ipv4[4]; /* Network byte order */ - uint8_t dns_sec_ipv4[4]; /* Network byte order */ -} mme_api_esm_config_t; - -/****************************************************************************/ -/************************ G L O B A L T Y P E S ************************/ -/****************************************************************************/ - -/* EPS subscribed QoS profile */ -typedef struct mme_api_qos_s { -#define MME_API_UPLINK 0 -#define MME_API_DOWNLINK 1 -#define MME_API_DIRECTION 2 - int gbr[MME_API_DIRECTION]; /* Guaranteed Bit Rate */ - int mbr[MME_API_DIRECTION]; /* Maximum Bit Rate */ - int qci; /* QoS Class Identifier */ -} mme_api_qos_t; - -/* Traffic Flow Template */ -typedef struct mme_api_tft_s { -} mme_api_tft_t; - -/****************************************************************************/ -/******************** G L O B A L V A R I A B L E S ********************/ -/****************************************************************************/ - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -#if defined(NAS_BUILT_IN_EPC) -int mme_api_get_emm_config(mme_api_emm_config_t *config, - mme_config_t *mme_config_p); -#else -int mme_api_get_emm_config(mme_api_emm_config_t *config); -#endif -int mme_api_get_esm_config(mme_api_esm_config_t *config); - -int mme_api_identify_guti(const GUTI_t *guti, auth_vector_t *vector); -int mme_api_identify_imsi(const imsi_t *imsi, auth_vector_t *vector); -int mme_api_identify_imei(const imei_t *imei, auth_vector_t *vector); -int mme_api_new_guti(const imsi_t *imsi, GUTI_t *guti, tac_t *tac, int *n_tacs); - -int mme_api_subscribe(OctetString *apn, mme_api_ip_version_t mme_pdn_index, OctetString *pdn_addr, - int is_emergency, mme_api_qos_t *qos); -int mme_api_unsubscribe(OctetString *apn); - -#endif /* __MME_API_H__*/ diff --git a/openair-cn/NAS/MME/EMM/Attach.c b/openair-cn/NAS/MME/EMM/Attach.c deleted file mode 100644 index ec7a873cd9..0000000000 --- a/openair-cn/NAS/MME/EMM/Attach.c +++ /dev/null @@ -1,1692 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** - -Source Attach.c - -Version 0.1 - -Date 2012/12/04 - -Product NAS stack - -Subsystem EPS Mobility Management - -Author Frederic Maurel - -Description Defines the attach related EMM procedure executed by the - Non-Access Stratum. - - To get internet connectivity from the network, the network - have to know about the UE. When the UE is switched on, it - has to initiate the attach procedure to get initial access - to the network and register its presence to the Evolved - Packet Core (EPC) network in order to receive EPS services. - - As a result of a successful attach procedure, a context is - created for the UE in the MME, and a default bearer is esta- - blished between the UE and the PDN-GW. The UE gets the home - agent IPv4 and IPv6 addresses and full connectivity to the - IP network. - - The network may also initiate the activation of additional - dedicated bearers for the support of a specific service. - -*****************************************************************************/ - -#include "emm_proc.h" -#include "networkDef.h" -#include "nas_log.h" -#include "nas_timer.h" - -#include "emmData.h" - -#include "emm_sap.h" -#include "esm_sap.h" -#include "emm_cause.h" - -#include "NasSecurityAlgorithms.h" - -#include "mme_api.h" -#include "mme_config.h" -# if defined(NAS_BUILT_IN_EPC) -# include "nas_itti_messaging.h" -# endif - -#include <string.h> // memcmp, memcpy -#include <stdlib.h> // malloc, free - -/****************************************************************************/ -/**************** E X T E R N A L D E F I N I T I O N S ****************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************* L O C A L D E F I N I T I O N S *******************/ -/****************************************************************************/ - -/* String representation of the EPS attach type */ -static const char *_emm_attach_type_str[] = { - "EPS", "IMSI", "EMERGENCY", "RESERVED" -}; - - -/* - * -------------------------------------------------------------------------- - * Internal data handled by the attach procedure in the MME - * -------------------------------------------------------------------------- - */ -/* - * Timer handlers - */ -static void *_emm_attach_t3450_handler(void *); - -/* - * Functions that may initiate EMM common procedures - */ -static int _emm_attach_identify(void *); -static int _emm_attach_security(void *); -static int _emm_attach(void *); - -/* - * Abnormal case attach procedures - */ -static int _emm_attach_release(void *); -static int _emm_attach_reject(void *); -static int _emm_attach_abort(void *); - -static int _emm_attach_have_changed(const emm_data_context_t *ctx, - emm_proc_attach_type_t type, int ksi, - GUTI_t *guti, imsi_t *imsi, imei_t *imei, - int eea, int eia, int ucs2, int uea, int uia, int gea, - int umts_present, int gprs_present); -static int _emm_attach_update(emm_data_context_t *ctx, unsigned int ueid, - emm_proc_attach_type_t type, int ksi, - GUTI_t *guti, imsi_t *imsi, imei_t *imei, - int eea, int eia, int ucs2, int uea, int uia, int gea, - int umts_present, int gprs_present, - const OctetString *esm_msg_pP); - -/* - * Internal data used for attach procedure - */ -typedef struct attach_data_s { - unsigned int ueid; /* UE identifier */ -#define ATTACH_COUNTER_MAX 5 - unsigned int retransmission_count; /* Retransmission counter */ - OctetString esm_msg; /* ESM message to be sent within - * the Attach Accept message */ -} attach_data_t; - -static int _emm_attach_accept(emm_data_context_t *emm_ctx, attach_data_t *data); - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - - -/* - * -------------------------------------------------------------------------- - * Attach procedure executed by the MME - * -------------------------------------------------------------------------- - */ -/**************************************************************************** - ** ** - ** Name: emm_proc_attach_request() ** - ** ** - ** Description: Performs the UE requested attach procedure ** - ** ** - ** 3GPP TS 24.301, section 5.5.1.2.3 ** - ** The network may initiate EMM common procedures, e.g. the ** - ** identification, authentication and security mode control ** - ** procedures during the attach procedure, depending on the ** - ** information received in the ATTACH REQUEST message (e.g. ** - ** IMSI, GUTI and KSI). ** - ** ** - ** Inputs: ueid: UE lower layer identifier ** - ** type: Type of the requested attach ** - ** native_ksi: TRUE if the security context is of type ** - ** native (for KSIASME) ** - ** ksi: The NAS ket sey identifier ** - ** native_guti: TRUE if the provided GUTI is native GUTI ** - ** guti: The GUTI if provided by the UE ** - ** imsi: The IMSI if provided by the UE ** - ** imei: The IMEI if provided by the UE ** - ** tai: Identifies the last visited tracking area ** - ** the UE is registered to ** - ** eea: Supported EPS encryption algorithms ** - ** eia: Supported EPS integrity algorithms ** - ** esm_msg_pP: PDN connectivity request ESM message ** - ** Others: _emm_data ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: _emm_data ** - ** ** - ***************************************************************************/ -int emm_proc_attach_request( - unsigned int ueid, - emm_proc_attach_type_t type, - int native_ksi, int ksi, - int native_guti, - GUTI_t *guti, - imsi_t *imsi, - imei_t *imei, - tai_t *tai, - int eea, int eia, int ucs2, int uea, int uia, int gea, - int umts_present, int gprs_present, - const OctetString *esm_msg_pP) -{ - LOG_FUNC_IN; - - int rc; - emm_data_context_t ue_ctx; - - LOG_TRACE(INFO, "EMM-PROC - EPS attach type = %s (%d) requested (ueid="NAS_UE_ID_FMT")", - _emm_attach_type_str[type], type, ueid); - LOG_TRACE(INFO, "EMM-PROC - umts_present = %u umts_present = %u", - umts_present, gprs_present); - - /* Initialize the temporary UE context */ - memset(&ue_ctx, 0 , sizeof(emm_data_context_t)); - ue_ctx.is_dynamic = FALSE; - ue_ctx.ueid = ueid; - -#if !defined(NAS_BUILT_IN_EPC) - - /* UE identifier sanity check */ - if (ueid >= EMM_DATA_NB_UE_MAX) { - ue_ctx.emm_cause = EMM_CAUSE_ILLEGAL_UE; - /* Do not accept UE with invalid identifier */ - rc = _emm_attach_reject(&ue_ctx); - LOG_FUNC_RETURN(rc); - } - -#endif - - /* 3GPP TS 24.301, section 5.5.1.1 - * MME not configured to support attach for emergency bearer services - * shall reject any request to attach with an attach type set to "EPS - * emergency attach". - */ - if ( !(_emm_data.conf.features & MME_API_EMERGENCY_ATTACH) && - (type == EMM_ATTACH_TYPE_EMERGENCY) ) { - ue_ctx.emm_cause = EMM_CAUSE_IMEI_NOT_ACCEPTED; - /* Do not accept the UE to attach for emergency services */ - rc = _emm_attach_reject(&ue_ctx); - LOG_FUNC_RETURN(rc); - } - - /* Get the UE's EMM context if it exists */ - emm_data_context_t **emm_ctx = NULL; - -#if defined(NAS_BUILT_IN_EPC) - emm_data_context_t *temp = NULL; - - temp = emm_data_context_get(&_emm_data, ueid); - emm_ctx = &temp; -#else - emm_ctx = &_emm_data.ctx[ueid]; -#endif - - if (*emm_ctx != NULL) { - /* An EMM context already exists for the UE in the network */ - if (_emm_attach_have_changed(*emm_ctx, type, ksi, guti, imsi, imei, - eea, eia, ucs2, uea, uia, gea, umts_present, gprs_present)) { - /* - * 3GPP TS 24.301, section 5.5.1.2.7, abnormal case e - * The attach parameters have changed from the one received within - * the previous Attach Request message; - * the previously initiated attach procedure shall be aborted and - * the new attach procedure shall be executed; - */ - LOG_TRACE(WARNING, "EMM-PROC - Attach parameters have changed"); - /* - * Notify EMM that the attach procedure is aborted - */ - emm_sap_t emm_sap; - emm_sap.primitive = EMMREG_PROC_ABORT; - emm_sap.u.emm_reg.ueid = ueid; - emm_sap.u.emm_reg.ctx = *emm_ctx; - - rc = emm_sap_send(&emm_sap); - - if (rc != RETURNerror) { - /* Process new attach procedure */ - LOG_TRACE(WARNING, "EMM-PROC - Initiate new attach procedure"); - rc = emm_proc_attach_request(ueid, type, native_ksi, ksi, - native_guti, guti, imsi, imei, - tai, eea, eia, ucs2, uea, uia, gea, - umts_present, gprs_present, esm_msg_pP); - } - - LOG_FUNC_RETURN(rc); - } else { - /* Continue with the previous attach procedure */ - LOG_TRACE(WARNING, "EMM-PROC - Received duplicated Attach Request"); - LOG_FUNC_RETURN(RETURNok); - } - } else { - /* Create UE's EMM context */ - *emm_ctx = (emm_data_context_t *)calloc(1, sizeof(emm_data_context_t)); - - if (emm_ctx == NULL) { - LOG_TRACE(WARNING, "EMM-PROC - Failed to create EMM context"); - ue_ctx.emm_cause = EMM_CAUSE_ILLEGAL_UE; - /* Do not accept the UE to attach to the network */ - rc = _emm_attach_reject(&ue_ctx); - LOG_FUNC_RETURN(rc); - } - - (*emm_ctx)->is_dynamic = TRUE; - (*emm_ctx)->guti = NULL; - (*emm_ctx)->old_guti = NULL; - (*emm_ctx)->imsi = NULL; - (*emm_ctx)->imei = NULL; - (*emm_ctx)->security = NULL; - (*emm_ctx)->esm_msg.length = 0; - (*emm_ctx)->esm_msg.value = NULL; - (*emm_ctx)->emm_cause = EMM_CAUSE_SUCCESS; - (*emm_ctx)->_emm_fsm_status = EMM_INVALID; - (*emm_ctx)->ueid = ueid; - /* - * Initialize EMM timers - */ - (*emm_ctx)->T3450.id = NAS_TIMER_INACTIVE_ID; - (*emm_ctx)->T3450.sec = T3450_DEFAULT_VALUE; - (*emm_ctx)->T3460.id = NAS_TIMER_INACTIVE_ID; - (*emm_ctx)->T3460.sec = T3460_DEFAULT_VALUE; - (*emm_ctx)->T3470.id = NAS_TIMER_INACTIVE_ID; - (*emm_ctx)->T3470.sec = T3470_DEFAULT_VALUE; - - emm_fsm_set_status(ueid, *emm_ctx, EMM_DEREGISTERED); -#if defined(NAS_BUILT_IN_EPC) - emm_data_context_add(&_emm_data, *(emm_ctx)); -#endif - -#warning "TRICK TO SET TAC, BUT LOOK AT SPEC" - - if (tai) { - LOG_TRACE(WARNING, - "EMM-PROC - Set tac %u in context", - tai->tac); - (*emm_ctx)->tac = tai->tac; - } else { - LOG_TRACE(WARNING, - "EMM-PROC - Could not set tac in context, cause tai is NULL "); - } - } - - /* Update the EMM context with the current attach procedure parameters */ - rc = _emm_attach_update(*emm_ctx, ueid, type, ksi, guti, imsi, imei, - eea, eia, ucs2, uea, uia, gea, umts_present, gprs_present, esm_msg_pP); - - if (rc != RETURNok) { - LOG_TRACE(WARNING, "EMM-PROC - Failed to update EMM context"); - /* Do not accept the UE to attach to the network */ - (*emm_ctx)->emm_cause = EMM_CAUSE_ILLEGAL_UE; - rc = _emm_attach_reject(*emm_ctx); - } else { - /* - * Performs UE identification - */ - rc = _emm_attach_identify(*emm_ctx); - } - - LOG_FUNC_RETURN(rc); -} - -/**************************************************************************** - ** ** - ** Name: emm_proc_attach_reject() ** - ** ** - ** Description: Performs the protocol error abnormal case ** - ** ** - ** 3GPP TS 24.301, section 5.5.1.2.7, case b ** - ** If the ATTACH REQUEST message is received with a protocol ** - ** error, the network shall return an ATTACH REJECT message. ** - ** ** - ** Inputs: ueid: UE lower layer identifier ** - ** emm_cause: EMM cause code to be reported ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: _emm_data ** - ** ** - ***************************************************************************/ -int emm_proc_attach_reject(unsigned int ueid, int emm_cause) -{ - LOG_FUNC_IN; - - int rc; - - /* Create temporary UE context */ - emm_data_context_t ue_ctx; - memset(&ue_ctx, 0 , sizeof(emm_data_context_t)); - ue_ctx.is_dynamic = FALSE; - ue_ctx.ueid = ueid; - - /* Update the EMM cause code */ -#if defined(NAS_BUILT_IN_EPC) - - if (ueid > 0) -#else - if (ueid < EMM_DATA_NB_UE_MAX) -#endif - { - ue_ctx.emm_cause = emm_cause; - } else { - ue_ctx.emm_cause = EMM_CAUSE_ILLEGAL_UE; - } - - /* Do not accept attach request with protocol error */ - rc = _emm_attach_reject(&ue_ctx); - - LOG_FUNC_RETURN(rc); -} - -/**************************************************************************** - ** ** - ** Name: emm_proc_attach_complete() ** - ** ** - ** Description: Terminates the attach procedure upon receiving Attach ** - ** Complete message from the UE. ** - ** ** - ** 3GPP TS 24.301, section 5.5.1.2.4 ** - ** Upon receiving an ATTACH COMPLETE message, the MME shall ** - ** stop timer T3450, enter state EMM-REGISTERED and consider ** - ** the GUTI sent in the ATTACH ACCEPT message as valid. ** - ** ** - ** Inputs: ueid: UE lower layer identifier ** - ** esm_msg_pP: Activate default EPS bearer context accept ** - ** ESM message ** - ** Others: _emm_data ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: _emm_data, T3450 ** - ** ** - ***************************************************************************/ -int emm_proc_attach_complete(unsigned int ueid, const OctetString *esm_msg_pP) -{ - emm_data_context_t *emm_ctx = NULL; - int rc = RETURNerror; - emm_sap_t emm_sap; - esm_sap_t esm_sap; - - LOG_FUNC_IN; - - LOG_TRACE(INFO, "EMM-PROC - EPS attach complete (ueid="NAS_UE_ID_FMT")", ueid); - - /* Release retransmission timer parameters */ - attach_data_t *data = (attach_data_t *)(emm_proc_common_get_args(ueid)); - - if (data) { - if (data->esm_msg.length > 0) { - free(data->esm_msg.value); - } - free(data); - } - - /* Get the UE context */ -#if defined(NAS_BUILT_IN_EPC) - if (ueid > 0) { - emm_ctx = emm_data_context_get(&_emm_data, ueid); - } -#else - if (ueid < EMM_DATA_NB_UE_MAX) { - emm_ctx = _emm_data.ctx[ueid]; - } -#endif - - if (emm_ctx) { - /* Stop timer T3450 */ - LOG_TRACE(INFO, "EMM-PROC - Stop timer T3450 (%d)", emm_ctx->T3450.id); - emm_ctx->T3450.id = nas_timer_stop(emm_ctx->T3450.id); - MSC_LOG_EVENT(MSC_NAS_EMM_MME, "0 T3450 stopped UE "NAS_UE_ID_FMT" ", ueid); - - /* Delete the old GUTI and consider the GUTI sent in the Attach - * Accept message as valid */ - emm_ctx->guti_is_new = FALSE; - emm_ctx->old_guti = NULL; - /* - * Forward the Activate Default EPS Bearer Context Accept message - * to the EPS session management sublayer - */ - esm_sap.primitive = ESM_DEFAULT_EPS_BEARER_CONTEXT_ACTIVATE_CNF; - esm_sap.is_standalone = FALSE; - esm_sap.ueid = ueid; - esm_sap.recv = esm_msg_pP; - esm_sap.ctx = emm_ctx; - rc = esm_sap_send(&esm_sap); - } else { - LOG_TRACE(ERROR, "EMM-PROC - No EMM context exists"); - } - - if ( (rc != RETURNerror) && (esm_sap.err == ESM_SAP_SUCCESS) ) { - /* Set the network attachment indicator */ - emm_ctx->is_attached = TRUE; - /* - * Notify EMM that attach procedure has successfully completed - */ - emm_sap.primitive = EMMREG_ATTACH_CNF; - emm_sap.u.emm_reg.ueid = ueid; - emm_sap.u.emm_reg.ctx = emm_ctx; - rc = emm_sap_send(&emm_sap); - } else if (esm_sap.err != ESM_SAP_DISCARDED) { - /* - * Notify EMM that attach procedure failed - */ - emm_sap.primitive = EMMREG_ATTACH_REJ; - emm_sap.u.emm_reg.ueid = ueid; - emm_sap.u.emm_reg.ctx = emm_ctx; - rc = emm_sap_send(&emm_sap); - } else { - /* - * ESM procedure failed and, received message has been discarded or - * Status message has been returned; ignore ESM procedure failure - */ - rc = RETURNok; - } - - LOG_FUNC_RETURN(rc); -} - - -/****************************************************************************/ -/********************* L O C A L F U N C T I O N S *********************/ -/****************************************************************************/ - - - -/* - * -------------------------------------------------------------------------- - * Timer handlers - * -------------------------------------------------------------------------- - */ - -/**************************************************************************** - ** ** - ** Name: _emm_attach_t3450_handler() ** - ** ** - ** Description: T3450 timeout handler ** - ** ** - ** 3GPP TS 24.301, section 5.5.1.2.7, case c ** - ** On the first expiry of the timer T3450, the network shall ** - ** retransmit the ATTACH ACCEPT message and shall reset and ** - ** restart timer T3450. This retransmission is repeated four ** - ** times, i.e. on the fifth expiry of timer T3450, the at- ** - ** tach procedure shall be aborted and the MME enters state ** - ** EMM-DEREGISTERED. ** - ** ** - ** Inputs: args: handler parameters ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: None ** - ** Others: None ** - ** ** - ***************************************************************************/ -static void *_emm_attach_t3450_handler(void *args) -{ - LOG_FUNC_IN; - - int rc; - - attach_data_t *data = (attach_data_t *)(args); - - /* Increment the retransmission counter */ - data->retransmission_count += 1; - - LOG_TRACE(WARNING, "EMM-PROC - T3450 timer expired, retransmission " - "counter = %d", data->retransmission_count); - - /* Get the UE's EMM context */ - emm_data_context_t *emm_ctx = NULL; - -#if defined(NAS_BUILT_IN_EPC) - emm_ctx = emm_data_context_get(&_emm_data, data->ueid); -#else - emm_ctx = _emm_data.ctx[data->ueid]; -#endif - - if (data->retransmission_count < ATTACH_COUNTER_MAX) { - /* Send attach accept message to the UE */ - rc = _emm_attach_accept(emm_ctx, data); - } else { - /* Abort the attach procedure */ - rc = _emm_attach_abort(data); - } - - LOG_FUNC_RETURN(NULL); -} - -/* - * -------------------------------------------------------------------------- - * Abnormal cases in the MME - * -------------------------------------------------------------------------- - */ - -/**************************************************************************** - ** ** - ** Name: _emm_attach_release() ** - ** ** - ** Description: Releases the UE context data. ** - ** ** - ** Inputs: args: Data to be released ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: None ** - ** Others: None ** - ** ** - ***************************************************************************/ -static int _emm_attach_release(void *args) -{ - LOG_FUNC_IN; - - int rc = RETURNerror; - - emm_data_context_t *emm_ctx = (emm_data_context_t *)(args); - - if (emm_ctx) { - LOG_TRACE(WARNING, "EMM-PROC - Release UE context data (ueid="NAS_UE_ID_FMT")", - emm_ctx->ueid); - - unsigned int ueid = emm_ctx->ueid; - - if (emm_ctx->guti) { - free(emm_ctx->guti); - emm_ctx->guti = NULL; - } - - if (emm_ctx->imsi) { - free(emm_ctx->imsi); - emm_ctx->imsi = NULL; - } - - if (emm_ctx->imei) { - free(emm_ctx->imei); - emm_ctx->imei = NULL; - } - - if (emm_ctx->esm_msg.length > 0) { - free(emm_ctx->esm_msg.value); - emm_ctx->esm_msg.value = NULL; - } - - /* Release NAS security context */ - if (emm_ctx->security) { - emm_security_context_t *security = emm_ctx->security; - - if (security->kasme.value) { - free(security->kasme.value); - security->kasme.value = NULL; - security->kasme.length = 0; - } - - if (security->knas_enc.value) { - free(security->knas_enc.value); - security->knas_enc.value = NULL; - security->knas_enc.length = 0; - } - - if (security->knas_int.value) { - free(security->knas_int.value); - security->knas_int.value = NULL; - security->knas_int.length = 0; - } - - free(emm_ctx->security); - emm_ctx->security = NULL; - } - - /* Stop timer T3450 */ - if (emm_ctx->T3450.id != NAS_TIMER_INACTIVE_ID) { - LOG_TRACE(INFO, "EMM-PROC - Stop timer T3450 (%d)", emm_ctx->T3450.id); - emm_ctx->T3450.id = nas_timer_stop(emm_ctx->T3450.id); - MSC_LOG_EVENT(MSC_NAS_EMM_MME, "0 T3450 stopped UE "NAS_UE_ID_FMT" ", emm_ctx->ueid); - } - /* Stop timer T3460 */ - if (emm_ctx->T3460.id != NAS_TIMER_INACTIVE_ID) { - LOG_TRACE(INFO, "EMM-PROC - Stop timer T3460 (%d)", emm_ctx->T3460.id); - emm_ctx->T3460.id = nas_timer_stop(emm_ctx->T3460.id); - MSC_LOG_EVENT(MSC_NAS_EMM_MME, "0 T3460 stopped UE "NAS_UE_ID_FMT" ", emm_ctx->ueid); - } - /* Stop timer T3470 */ - if (emm_ctx->T3470.id != NAS_TIMER_INACTIVE_ID) { - LOG_TRACE(INFO, "EMM-PROC - Stop timer T3470 (%d)", emm_ctx->T3460.id); - emm_ctx->T3470.id = nas_timer_stop(emm_ctx->T3470.id); - MSC_LOG_EVENT(MSC_NAS_EMM_MME, "0 T3470 stopped UE "NAS_UE_ID_FMT" ", emm_ctx->ueid); - } - - /* Release the EMM context */ -#if defined(NAS_BUILT_IN_EPC) - emm_data_context_remove(&_emm_data, emm_ctx); -#else - free(_emm_data.ctx[ueid]); - _emm_data.ctx[ueid] = NULL; -#endif - /* - * Notify EMM that the attach procedure is aborted - */ - emm_sap_t emm_sap; - emm_sap.primitive = EMMREG_PROC_ABORT; - emm_sap.u.emm_reg.ueid = ueid; - emm_sap.u.emm_reg.ctx = emm_ctx; - rc = emm_sap_send(&emm_sap); - } - - LOG_FUNC_RETURN(rc); -} - -/**************************************************************************** - ** ** - ** Name: _emm_attach_reject() ** - ** ** - ** Description: Performs the attach procedure not accepted by the network.** - ** ** - ** 3GPP TS 24.301, section 5.5.1.2.5 ** - ** If the attach request cannot be accepted by the network, ** - ** the MME shall send an ATTACH REJECT message to the UE in- ** - ** including an appropriate EMM cause value. ** - ** ** - ** Inputs: args: UE context data ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -static int _emm_attach_reject(void *args) -{ - LOG_FUNC_IN; - - int rc = RETURNerror; - - emm_data_context_t *emm_ctx = (emm_data_context_t *)(args); - - if (emm_ctx) { - emm_sap_t emm_sap; - LOG_TRACE(WARNING, "EMM-PROC - EMM attach procedure not accepted " - "by the network (ueid="NAS_UE_ID_FMT", cause=%d)", - emm_ctx->ueid, emm_ctx->emm_cause); - /* - * Notify EMM-AS SAP that Attach Reject message has to be sent - * onto the network - */ - emm_sap.primitive = EMMAS_ESTABLISH_REJ; - emm_sap.u.emm_as.u.establish.ueid = emm_ctx->ueid; - emm_sap.u.emm_as.u.establish.UEid.guti = NULL; - - if (emm_ctx->emm_cause == EMM_CAUSE_SUCCESS) { - emm_ctx->emm_cause = EMM_CAUSE_ILLEGAL_UE; - } - - emm_sap.u.emm_as.u.establish.emm_cause = emm_ctx->emm_cause; - emm_sap.u.emm_as.u.establish.NASinfo = EMM_AS_NAS_INFO_ATTACH; - - if (emm_ctx->emm_cause != EMM_CAUSE_ESM_FAILURE) { - emm_sap.u.emm_as.u.establish.NASmsg.length = 0; - emm_sap.u.emm_as.u.establish.NASmsg.value = NULL; - } else if (emm_ctx->esm_msg.length > 0) { - emm_sap.u.emm_as.u.establish.NASmsg = emm_ctx->esm_msg; - } else { - LOG_TRACE(ERROR, "EMM-PROC - ESM message is missing"); - LOG_FUNC_RETURN(RETURNerror); - } - - /* Setup EPS NAS security data */ - emm_as_set_security_data(&emm_sap.u.emm_as.u.establish.sctx, - emm_ctx->security, FALSE, TRUE); - rc = emm_sap_send(&emm_sap); - - /* Release the UE context, even if the network failed to send the - * ATTACH REJECT message */ - if (emm_ctx->is_dynamic) { - rc = _emm_attach_release(emm_ctx); - } - } - - LOG_FUNC_RETURN(rc); -} - -/**************************************************************************** - ** ** - ** Name: _emm_attach_abort() ** - ** ** - ** Description: Aborts the attach procedure ** - ** ** - ** Inputs: args: Attach procedure data to be released ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: T3450 ** - ** ** - ***************************************************************************/ -static int _emm_attach_abort(void *args) -{ - int rc = RETURNerror; - emm_data_context_t *ctx = NULL; - attach_data_t *data; - - LOG_FUNC_IN; - - data = (attach_data_t *)(args); - - if (data) { - unsigned int ueid = data->ueid; - esm_sap_t esm_sap; - - LOG_TRACE(WARNING, "EMM-PROC - Abort the attach procedure (ueid="NAS_UE_ID_FMT")", - ueid); -#if defined(NAS_BUILT_IN_EPC) - ctx = emm_data_context_get(&_emm_data, ueid); -#else - ctx = _emm_data.ctx[ueid]; -#endif - if (ctx) { - /* Stop timer T3450 */ - if (ctx->T3450.id != NAS_TIMER_INACTIVE_ID) { - LOG_TRACE(INFO, "EMM-PROC - Stop timer T3450 (%d)", ctx->T3450.id); - ctx->T3450.id = nas_timer_stop(ctx->T3450.id); - MSC_LOG_EVENT(MSC_NAS_EMM_MME, "0 T3450 stopped UE "NAS_UE_ID_FMT" ", data->ueid); - } - } - - /* Release retransmission timer parameters */ - if (data->esm_msg.length > 0) { - free(data->esm_msg.value); - } - - free(data); - - - - /* - * Notify ESM that the network locally refused PDN connectivity - * to the UE - */ - esm_sap.primitive = ESM_PDN_CONNECTIVITY_REJ; - esm_sap.ueid = ueid; - esm_sap.ctx = ctx; - esm_sap.recv = NULL; - rc = esm_sap_send(&esm_sap); - - if (rc != RETURNerror) { - /* - * Notify EMM that EPS attach procedure failed - */ - emm_sap_t emm_sap; - emm_sap.primitive = EMMREG_ATTACH_REJ; - emm_sap.u.emm_reg.ueid = ueid; - emm_sap.u.emm_reg.ctx = ctx; - rc = emm_sap_send(&emm_sap); - - if (rc != RETURNerror) { - /* Release the UE context */ - rc = _emm_attach_release(ctx); - } - } - } - - LOG_FUNC_RETURN (rc); -} - -/* - * -------------------------------------------------------------------------- - * Functions that may initiate EMM common procedures - * -------------------------------------------------------------------------- - */ - -/**************************************************************************** - ** ** - ** Name: _emm_attach_identify() ** - ** ** - ** Description: Performs UE's identification. May initiates identifica- ** - ** tion, authentication and security mode control EMM common ** - ** procedures. ** - ** ** - ** Inputs: args: Identification argument parameters ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: _emm_data ** - ** ** - ***************************************************************************/ -static int _emm_attach_identify(void *args) -{ - int rc = RETURNerror; - emm_data_context_t *emm_ctx = (emm_data_context_t *)(args); - int guti_reallocation = FALSE; - - LOG_FUNC_IN; - - LOG_TRACE(INFO, "EMM-PROC - Identify incoming UE (ueid="NAS_UE_ID_FMT") using %s", - emm_ctx->ueid, (emm_ctx->imsi)? "IMSI" : (emm_ctx->guti)? "GUTI" : - (emm_ctx->imei)? "IMEI" : "none"); - - /* - * UE's identification - * ------------------- - */ - if (emm_ctx->imsi) { - /* The UE identifies itself using an IMSI */ -#if defined(NAS_BUILT_IN_EPC) - if (!emm_ctx->security) { - /* Ask upper layer to fetch new security context */ - nas_itti_auth_info_req(emm_ctx->ueid, emm_ctx->imsi, 1, NULL); - - rc = RETURNok; - } else -#endif - { - rc = mme_api_identify_imsi(emm_ctx->imsi, &emm_ctx->vector); - - if (rc != RETURNok) { - LOG_TRACE(WARNING, "EMM-PROC - " - "Failed to identify the UE using provided IMSI"); - emm_ctx->emm_cause = EMM_CAUSE_ILLEGAL_UE; - } - - guti_reallocation = TRUE; - } - } else if (emm_ctx->guti) { - /* The UE identifies itself using a GUTI */ - rc = mme_api_identify_guti(emm_ctx->guti, &emm_ctx->vector); - - if (rc != RETURNok) { - LOG_TRACE(WARNING, "EMM-PROC - Failed to identify the UE using " - "provided GUTI (tmsi=%u)", emm_ctx->guti->m_tmsi); - /* 3GPP TS 24.401, Figure 5.3.2.1-1, point 4 - * The UE was attempting to attach to the network using a GUTI - * that is not known by the network; the MME shall initiate an - * identification procedure to retrieve the IMSI from the UE. - */ - rc = emm_proc_identification(emm_ctx->ueid, - emm_ctx, - EMM_IDENT_TYPE_IMSI, - _emm_attach_identify, - _emm_attach_release, - _emm_attach_release); - - if (rc != RETURNok) { - /* Failed to initiate the identification procedure */ - LOG_TRACE(WARNING, "EMM-PROC - " - "Failed to initiate identification procedure"); - emm_ctx->emm_cause = EMM_CAUSE_ILLEGAL_UE; - /* Do not accept the UE to attach to the network */ - rc = _emm_attach_reject(emm_ctx); - } - - /* Relevant callback will be executed when identification - * procedure completes */ - LOG_FUNC_RETURN(rc); - } - } else if ( (emm_ctx->imei) && (emm_ctx->is_emergency) ) { - /* The UE is attempting to attach to the network for emergency - * services using an IMEI */ - rc = mme_api_identify_imei(emm_ctx->imei, &emm_ctx->vector); - - if (rc != RETURNok) { - LOG_TRACE(WARNING, "EMM-PROC - " - "Failed to identify the UE using provided IMEI"); - emm_ctx->emm_cause = EMM_CAUSE_IMEI_NOT_ACCEPTED; - } - } else { - LOG_TRACE(WARNING, "EMM-PROC - UE's identity is not available"); - emm_ctx->emm_cause = EMM_CAUSE_ILLEGAL_UE; - } - - /* - * GUTI reallocation - * ----------------- - */ - if ( (rc != RETURNerror) && guti_reallocation ) { - /* Release the old GUTI */ - if (emm_ctx->old_guti) { - free(emm_ctx->old_guti); - } - - /* Save the GUTI previously used by the UE to identify itself */ - emm_ctx->old_guti = emm_ctx->guti; - /* Allocate a new GUTI */ - emm_ctx->guti = (GUTI_t *)malloc(sizeof(GUTI_t)); - /* Request the MME to assign a GUTI to the UE */ - rc = mme_api_new_guti(emm_ctx->imsi, emm_ctx->guti, - &emm_ctx->tac, &emm_ctx->n_tacs); - - if (rc != RETURNok) { - LOG_TRACE(WARNING, "EMM-PROC - Failed to assign new GUTI"); - emm_ctx->emm_cause = EMM_CAUSE_ILLEGAL_UE; - } else { - LOG_TRACE(WARNING, "EMM-PROC - New GUTI assigned to the UE " - "(tmsi=%u)", emm_ctx->guti->m_tmsi); - /* Update the GUTI indicator as new */ - emm_ctx->guti_is_new = TRUE; - } - } - - /* - * UE's authentication - * ------------------- - */ - if (rc != RETURNerror) { - if (emm_ctx->security) { - /* A security context exists for the UE in the network; - * proceed with the attach procedure. - */ - rc = _emm_attach(emm_ctx); - } else if ( (emm_ctx->is_emergency) && - (_emm_data.conf.features & MME_API_UNAUTHENTICATED_IMSI) ) { - /* 3GPP TS 24.301, section 5.5.1.2.3 - * 3GPP TS 24.401, Figure 5.3.2.1-1, point 5a - * MME configured to support Emergency Attach for unauthenticated - * IMSIs may choose to skip the authentication procedure even if - * no EPS security context is available and proceed directly to the - * execution of the security mode control procedure. - */ - rc = _emm_attach_security(emm_ctx); - } - -#if !defined(NAS_BUILT_IN_EPC) - else { - /* 3GPP TS 24.401, Figure 5.3.2.1-1, point 5a - * No EMM context exists for the UE in the network; authentication - * and NAS security setup to activate integrity protection and NAS - * ciphering are mandatory. - */ - auth_vector_t *auth = &emm_ctx->vector; - const OctetString loc_rand = {AUTH_RAND_SIZE, (uint8_t *)auth->rand}; - const OctetString autn = {AUTH_AUTN_SIZE, (uint8_t *)auth->autn}; - rc = emm_proc_authentication(emm_ctx, emm_ctx->ueid, 0, // TODO: eksi != 0 - &loc_rand, &autn, - _emm_attach_security, - _emm_attach_release, - _emm_attach_release); - - if (rc != RETURNok) { - /* Failed to initiate the authentication procedure */ - LOG_TRACE(WARNING, "EMM-PROC - " - "Failed to initiate authentication procedure"); - emm_ctx->emm_cause = EMM_CAUSE_ILLEGAL_UE; - } - } - -#endif - } - - if (rc != RETURNok) { - /* Do not accept the UE to attach to the network */ - rc = _emm_attach_reject(emm_ctx); - } - - LOG_FUNC_RETURN (rc); -} - -/**************************************************************************** - ** ** - ** Name: _emm_attach_security() ** - ** ** - ** Description: Initiates security mode control EMM common procedure. ** - ** ** - ** Inputs: args: security argument parameters ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: _emm_data ** - ** ** - ***************************************************************************/ -#if defined(NAS_BUILT_IN_EPC) -int emm_attach_security(void *args) -{ - return _emm_attach_security(args); -} -#endif - -static int _emm_attach_security(void *args) -{ - LOG_FUNC_IN; - - int rc; - emm_data_context_t *emm_ctx = (emm_data_context_t *)(args); - - LOG_TRACE(INFO, "EMM-PROC - Setup NAS security (ueid="NAS_UE_ID_FMT")", emm_ctx->ueid); - - /* Create new NAS security context */ - if (emm_ctx->security == NULL) { - emm_ctx->security = - (emm_security_context_t *)malloc(sizeof(emm_security_context_t)); - } - - if (emm_ctx->security) { - memset(emm_ctx->security, 0, sizeof(emm_security_context_t)); - emm_ctx->security->type = EMM_KSI_NOT_AVAILABLE; - emm_ctx->security->selected_algorithms.encryption = NAS_SECURITY_ALGORITHMS_EEA0; - emm_ctx->security->selected_algorithms.integrity = NAS_SECURITY_ALGORITHMS_EIA0; - } else { - LOG_TRACE(WARNING, "EMM-PROC - Failed to create security context"); - emm_ctx->emm_cause = EMM_CAUSE_ILLEGAL_UE; - /* Do not accept the UE to attach to the network */ - rc = _emm_attach_reject(emm_ctx); - LOG_FUNC_RETURN(rc); - } - - /* Initialize the security mode control procedure */ - rc = emm_proc_security_mode_control(emm_ctx->ueid, 0, // TODO: eksi != 0 - emm_ctx->eea, emm_ctx->eia,emm_ctx->ucs2, - emm_ctx->uea, emm_ctx->uia, emm_ctx->gea, - emm_ctx->umts_present, emm_ctx->gprs_present, - _emm_attach, _emm_attach_release, - _emm_attach_release); - - if (rc != RETURNok) { - /* Failed to initiate the security mode control procedure */ - LOG_TRACE(WARNING, "EMM-PROC - " - "Failed to initiate security mode control procedure"); - emm_ctx->emm_cause = EMM_CAUSE_ILLEGAL_UE; - /* Do not accept the UE to attach to the network */ - rc = _emm_attach_reject(emm_ctx); - } - - LOG_FUNC_RETURN (rc); -} - -/* - * -------------------------------------------------------------------------- - * MME specific local functions - * -------------------------------------------------------------------------- - */ - -/**************************************************************************** - ** ** - ** Name: _emm_attach() ** - ** ** - ** Description: Performs the attach signalling procedure while a context ** - ** exists for the incoming UE in the network. ** - ** ** - ** 3GPP TS 24.301, section 5.5.1.2.4 ** - ** Upon receiving the ATTACH REQUEST message, the MME shall ** - ** send an ATTACH ACCEPT message to the UE and start timer ** - ** T3450. ** - ** ** - ** Inputs: args: attach argument parameters ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: _emm_data ** - ** ** - ***************************************************************************/ -static int _emm_attach(void *args) -{ - LOG_FUNC_IN; - - esm_sap_t esm_sap; - int rc; - - emm_data_context_t *emm_ctx = (emm_data_context_t *)(args); - - LOG_TRACE(INFO, "EMM-PROC - Attach UE (ueid="NAS_UE_ID_FMT")", emm_ctx->ueid); - - /* 3GPP TS 24.401, Figure 5.3.2.1-1, point 5a - * At this point, all NAS messages shall be protected by the NAS security - * functions (integrity and ciphering) indicated by the MME unless the UE - * is emergency attached and not successfully authenticated. - */ - - /* - * Notify ESM that PDN connectivity is requested - */ - esm_sap.primitive = ESM_PDN_CONNECTIVITY_REQ; - esm_sap.is_standalone = FALSE; - esm_sap.ueid = emm_ctx->ueid; - esm_sap.ctx = emm_ctx; - esm_sap.recv = &emm_ctx->esm_msg; - rc = esm_sap_send(&esm_sap); - - if ( (rc != RETURNerror) && (esm_sap.err == ESM_SAP_SUCCESS) ) { - /* - * The attach request is accepted by the network - */ - - /* Delete the stored UE radio capability information, if any */ - /* Store the UE network capability */ - /* Assign the TAI list the UE is registered to */ - - /* Allocate parameters of the retransmission timer callback */ - attach_data_t *data = (attach_data_t *)calloc(1,sizeof(attach_data_t)); - - if (data != NULL) { - /* Setup ongoing EMM procedure callback functions */ - rc = emm_proc_common_initialize(emm_ctx->ueid, NULL, NULL, NULL, - _emm_attach_abort, data); - - if (rc != RETURNok) { - LOG_TRACE(WARNING, - "Failed to initialize EMM callback functions"); - free(data); - LOG_FUNC_RETURN (RETURNerror); - } - - /* Set the UE identifier */ - data->ueid = emm_ctx->ueid; - /* Reset the retransmission counter */ - data->retransmission_count = 0; -#if defined(ORIGINAL_CODE) - /* Setup the ESM message container */ - data->esm_msg.value = (uint8_t *)malloc(esm_sap.send.length); - - if (data->esm_msg.value) { - data->esm_msg.length = esm_sap.send.length; - memcpy(data->esm_msg.value, esm_sap.send.value, - esm_sap.send.length); - } else { - data->esm_msg.length = 0; - } - - /* Send attach accept message to the UE */ - rc = _emm_attach_accept(emm_ctx, data); - - if (rc != RETURNerror) { - if (emm_ctx->guti_is_new && emm_ctx->old_guti) { - /* Implicit GUTI reallocation; - * Notify EMM that common procedure has been initiated - */ - emm_sap_t emm_sap; - emm_sap.primitive = EMMREG_COMMON_PROC_REQ; - emm_sap.u.emm_reg.ueid = data->ueid; - rc = emm_sap_send(&emm_sap); - } - } - -#else - rc = RETURNok; -#endif - } - } else if (esm_sap.err != ESM_SAP_DISCARDED) { - /* - * The attach procedure failed due to an ESM procedure failure - */ - emm_ctx->emm_cause = EMM_CAUSE_ESM_FAILURE; - - /* Setup the ESM message container to include PDN Connectivity Reject - * message within the Attach Reject message */ - if (emm_ctx->esm_msg.length > 0) { - free(emm_ctx->esm_msg.value); - } - - emm_ctx->esm_msg.value = (uint8_t *)malloc(esm_sap.send.length); - - if (emm_ctx->esm_msg.value) { - emm_ctx->esm_msg.length = esm_sap.send.length; - memcpy(emm_ctx->esm_msg.value, esm_sap.send.value, - esm_sap.send.length); - /* Send Attach Reject message */ - rc = _emm_attach_reject(emm_ctx); - } else { - emm_ctx->esm_msg.length = 0; - } - } else { - /* - * ESM procedure failed and, received message has been discarded or - * Status message has been returned; ignore ESM procedure failure - */ - rc = RETURNok; - } - - if (rc != RETURNok) { - /* The attach procedure failed */ - LOG_TRACE(WARNING, "EMM-PROC - Failed to respond to Attach Request"); - emm_ctx->emm_cause = EMM_CAUSE_PROTOCOL_ERROR; - /* Do not accept the UE to attach to the network */ - rc = _emm_attach_reject(emm_ctx); - } - - LOG_FUNC_RETURN (rc); -} - -int emm_cn_wrapper_attach_accept(emm_data_context_t *emm_ctx, void *data) -{ - return _emm_attach_accept(emm_ctx,(attach_data_t *)data); -} -/**************************************************************************** - ** ** - ** Name: _emm_attach_accept() ** - ** ** - ** Description: Sends ATTACH ACCEPT message and start timer T3450 ** - ** ** - ** Inputs: data: Attach accept retransmission data ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: T3450 ** - ** ** - ***************************************************************************/ -static int _emm_attach_accept(emm_data_context_t *emm_ctx, attach_data_t *data) -{ - LOG_FUNC_IN; - - emm_sap_t emm_sap; - int rc; - - // may be caused by timer not stopped when deleted context - if (emm_ctx) { - /* - * Notify EMM-AS SAP that Attach Accept message together with an Activate - * Default EPS Bearer Context Request message has to be sent to the UE - */ - - emm_sap.primitive = EMMAS_ESTABLISH_CNF; - emm_sap.u.emm_as.u.establish.ueid = emm_ctx->ueid; - - if (emm_ctx->guti_is_new && emm_ctx->old_guti) { - /* Implicit GUTI reallocation; - * include the new assigned GUTI in the Attach Accept message */ - LOG_TRACE(INFO,"EMM-PROC - Implicit GUTI reallocation, include the new assigned GUTI in the Attach Accept message"); - emm_sap.u.emm_as.u.establish.UEid.guti = emm_ctx->old_guti; - emm_sap.u.emm_as.u.establish.new_guti = emm_ctx->guti; - } else if (emm_ctx->guti_is_new && emm_ctx->guti) { - /* include the new assigned GUTI in the Attach Accept message */ - LOG_TRACE(INFO,"EMM-PROC - Include the new assigned GUTI in the Attach Accept message"); - emm_sap.u.emm_as.u.establish.UEid.guti = emm_ctx->guti; - emm_sap.u.emm_as.u.establish.new_guti = emm_ctx->guti; - } else { - emm_sap.u.emm_as.u.establish.UEid.guti = emm_ctx->guti; -#warning "TEST LG FORCE GUTI IE IN ATTACH ACCEPT" - emm_sap.u.emm_as.u.establish.new_guti = emm_ctx->guti; - //emm_sap.u.emm_as.u.establish.new_guti = NULL; - } - - emm_sap.u.emm_as.u.establish.n_tacs = emm_ctx->n_tacs; - emm_sap.u.emm_as.u.establish.tac = emm_ctx->tac; - emm_sap.u.emm_as.u.establish.NASinfo = EMM_AS_NAS_INFO_ATTACH; - /* Setup EPS NAS security data */ - emm_as_set_security_data(&emm_sap.u.emm_as.u.establish.sctx, - emm_ctx->security, FALSE, TRUE); - - LOG_TRACE(INFO,"EMM-PROC - encryption = 0x%X ", emm_sap.u.emm_as.u.establish.encryption); - LOG_TRACE(INFO,"EMM-PROC - integrity = 0x%X ", emm_sap.u.emm_as.u.establish.integrity); - emm_sap.u.emm_as.u.establish.encryption = emm_ctx->security->selected_algorithms.encryption; - emm_sap.u.emm_as.u.establish.integrity = emm_ctx->security->selected_algorithms.integrity; - LOG_TRACE(INFO,"EMM-PROC - encryption = 0x%X (0x%X)", - emm_sap.u.emm_as.u.establish.encryption, - emm_ctx->security->selected_algorithms.encryption); - LOG_TRACE(INFO,"EMM-PROC - integrity = 0x%X (0x%X)", - emm_sap.u.emm_as.u.establish.integrity, - emm_ctx->security->selected_algorithms.integrity); - - /* Get the activate default EPS bearer context request message to - * transfer within the ESM container of the attach accept message */ - emm_sap.u.emm_as.u.establish.NASmsg = data->esm_msg; - LOG_TRACE(INFO,"EMM-PROC - NASmsg src size = %d NASmsg dst size = %d ", - data->esm_msg.length, emm_sap.u.emm_as.u.establish.NASmsg.length); - - rc = emm_sap_send(&emm_sap); - - if (rc != RETURNerror) { - if (emm_ctx->T3450.id != NAS_TIMER_INACTIVE_ID) { - /* Re-start T3450 timer */ - emm_ctx->T3450.id = nas_timer_restart(emm_ctx->T3450.id); - MSC_LOG_EVENT(MSC_NAS_EMM_MME, "0 T3450 restarted UE "NAS_UE_ID_FMT"", data->ueid); - } else { - /* Start T3450 timer */ - emm_ctx->T3450.id = nas_timer_start(emm_ctx->T3450.sec, _emm_attach_t3450_handler, data); - MSC_LOG_EVENT(MSC_NAS_EMM_MME, "0 T3450 started UE "NAS_UE_ID_FMT" ", data->ueid); - } - - LOG_TRACE(INFO,"EMM-PROC - Timer T3450 (%d) expires in %ld seconds", - emm_ctx->T3450.id, emm_ctx->T3450.sec); - } - } else { - LOG_TRACE(WARNING,"EMM-PROC - emm_ctx NULL"); - } - LOG_FUNC_RETURN (rc); -} - -/**************************************************************************** - ** ** - ** Name: _emm_attach_have_changed() ** - ** ** - ** Description: Check whether the given attach parameters differs from ** - ** those previously stored when the attach procedure has ** - ** been initiated. ** - ** ** - ** Inputs: ctx: EMM context of the UE in the network ** - ** type: Type of the requested attach ** - ** ksi: Security ket sey identifier ** - ** guti: The GUTI provided by the UE ** - ** imsi: The IMSI provided by the UE ** - ** imei: The IMEI provided by the UE ** - ** eea: Supported EPS encryption algorithms ** - ** eia: Supported EPS integrity algorithms ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: TRUE if at least one of the parameters ** - ** differs; FALSE otherwise. ** - ** Others: None ** - ** ** - ***************************************************************************/ -static int _emm_attach_have_changed(const emm_data_context_t *ctx, - emm_proc_attach_type_t type, int ksi, - GUTI_t *guti, imsi_t *imsi, imei_t *imei, - int eea, int eia, int ucs2, int uea, int uia, int gea, - int umts_present, int gprs_present) -{ - LOG_FUNC_IN; - - /* Emergency bearer services indicator */ - if ( (type == EMM_ATTACH_TYPE_EMERGENCY) != ctx->is_emergency) { - LOG_FUNC_RETURN (TRUE); - } - - /* Security key set identifier */ - if (ksi != ctx->ksi) { - LOG_FUNC_RETURN (TRUE); - } - - /* Supported EPS encryption algorithms */ - if (eea != ctx->eea) { - LOG_FUNC_RETURN (TRUE); - } - - /* Supported EPS integrity algorithms */ - if (eia != ctx->eia) { - LOG_FUNC_RETURN (TRUE); - } - - if (umts_present != ctx->umts_present) { - LOG_FUNC_RETURN (TRUE); - } - - if (ctx->umts_present) { - if (ucs2 != ctx->ucs2) { - LOG_FUNC_RETURN (TRUE); - } - - /* Supported UMTS encryption algorithms */ - if (uea != ctx->uea) { - LOG_FUNC_RETURN (TRUE); - } - - /* Supported UMTS integrity algorithms */ - if (uia != ctx->uia) { - LOG_FUNC_RETURN (TRUE); - } - } - - if (gprs_present != ctx->gprs_present) { - LOG_FUNC_RETURN (TRUE); - } - - if (ctx->gprs_present) { - if (gea != ctx->gea) { - LOG_FUNC_RETURN (TRUE); - } - } - - /* The GUTI if provided by the UE */ - if ( (guti) && (ctx->guti == NULL) ) { - LOG_FUNC_RETURN (TRUE); - } - - if ( (guti == NULL) && (ctx->guti) ) { - LOG_FUNC_RETURN (TRUE); - } - - if ( (guti) && (ctx->guti) ) { - if (guti->m_tmsi != ctx->guti->m_tmsi) { - LOG_FUNC_RETURN (TRUE); - } - - if ( memcmp(&guti->gummei, &ctx->guti->gummei, sizeof(gummei_t)) != 0 ) { - LOG_FUNC_RETURN (TRUE); - } - } - - /* The IMSI if provided by the UE */ - if ( (imsi) && (ctx->imsi == NULL) ) { - LOG_FUNC_RETURN (TRUE); - } - - if ( (imsi == NULL) && (ctx->imsi) ) { - LOG_FUNC_RETURN (TRUE); - } - - if ( (imsi) && (ctx->imsi) ) { - if ( memcmp(imsi, ctx->imsi, sizeof(imsi_t)) != 0 ) { - LOG_FUNC_RETURN (TRUE); - } - } - - /* The IMEI if provided by the UE */ - if ( (imei) && (ctx->imei == NULL) ) { - LOG_FUNC_RETURN (TRUE); - } - - if ( (imei == NULL) && (ctx->imei) ) { - LOG_FUNC_RETURN (TRUE); - } - - if ( (imei) && (ctx->imei) ) { - if ( memcmp(imei, ctx->imei, sizeof(imei_t)) != 0 ) { - LOG_FUNC_RETURN (TRUE); - } - } - - LOG_FUNC_RETURN (FALSE); -} - -/**************************************************************************** - ** ** - ** Name: _emm_attach_update() ** - ** ** - ** Description: Update the EMM context with the given attach procedure ** - ** parameters. ** - ** ** - ** Inputs: ueid: UE lower layer identifier ** - ** type: Type of the requested attach ** - ** ksi: Security ket sey identifier ** - ** guti: The GUTI provided by the UE ** - ** imsi: The IMSI provided by the UE ** - ** imei: The IMEI provided by the UE ** - ** eea: Supported EPS encryption algorithms ** - ** eia: Supported EPS integrity algorithms ** - ** esm_msg_pP: ESM message contained with the attach re- ** - ** quest ** - ** Others: None ** - ** ** - ** Outputs: ctx: EMM context of the UE in the network ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -static int _emm_attach_update(emm_data_context_t *ctx, unsigned int ueid, - emm_proc_attach_type_t type, int ksi, - GUTI_t *guti, imsi_t *imsi, imei_t *imei, - int eea, int eia, int ucs2, int uea, int uia, int gea, - int umts_present, int gprs_present, - const OctetString *esm_msg_pP) -{ - int mnc_length; - LOG_FUNC_IN; - /* UE identifier */ - ctx->ueid = ueid; - /* Emergency bearer services indicator */ - ctx->is_emergency = (type == EMM_ATTACH_TYPE_EMERGENCY); - /* Security key set identifier */ - ctx->ksi = ksi; - /* Supported EPS encryption algorithms */ - ctx->eea = eea; - /* Supported EPS integrity algorithms */ - ctx->eia = eia; - ctx->ucs2 = ucs2; - ctx->uea = uea; - ctx->uia = uia; - ctx->gea = gea; - ctx->umts_present = umts_present; - ctx->gprs_present = gprs_present; - - /* The GUTI if provided by the UE */ - if (guti) { - LOG_TRACE(INFO, "EMM-PROC - GUTI NOT NULL"); - - if (ctx->guti == NULL) { - ctx->guti = (GUTI_t *)malloc(sizeof(GUTI_t)); - } - - if (ctx->guti != NULL) { - memcpy(ctx->guti, guti, sizeof(GUTI_t)); - } else { - LOG_FUNC_RETURN (RETURNerror); - } - } else { - if (ctx->guti == NULL) { - ctx->guti = (GUTI_t *)calloc(1, sizeof(GUTI_t)); - } - -#warning "LG: We should assign the GUTI accordingly to the visited plmn id" - - if ((ctx->guti != NULL) && (imsi)) { - ctx->tac = mme_config.gummei.plmn_tac[0]; - ctx->guti->gummei.MMEcode = mme_config.gummei.mmec[0]; - ctx->guti->gummei.MMEgid = mme_config.gummei.mme_gid[0]; - ctx->guti->m_tmsi = (uint32_t) ctx; - - mnc_length = mme_config_find_mnc_length( - imsi->u.num.digit1, - imsi->u.num.digit2, - imsi->u.num.digit3, - imsi->u.num.digit4, - imsi->u.num.digit5, - imsi->u.num.digit6); - - if ((mnc_length == 2) || (mnc_length == 3)) { - ctx->guti->gummei.plmn.MCCdigit1 = imsi->u.num.digit1; - ctx->guti->gummei.plmn.MCCdigit2 = imsi->u.num.digit2; - ctx->guti->gummei.plmn.MCCdigit3 = imsi->u.num.digit3; - - if (mnc_length == 2) { - ctx->guti->gummei.plmn.MNCdigit1 = imsi->u.num.digit4; - ctx->guti->gummei.plmn.MNCdigit2 = imsi->u.num.digit5; - ctx->guti->gummei.plmn.MNCdigit3 = 15; - LOG_TRACE(WARNING, "EMM-PROC - Assign GUTI from IMSI %01X%01X%01X.%01X%01X.%04X.%02X.%08X to emm_data_context", - ctx->guti->gummei.plmn.MCCdigit1, - ctx->guti->gummei.plmn.MCCdigit2, - ctx->guti->gummei.plmn.MCCdigit3, - ctx->guti->gummei.plmn.MNCdigit1, - ctx->guti->gummei.plmn.MNCdigit2, - ctx->guti->gummei.MMEgid, - ctx->guti->gummei.MMEcode, - ctx->guti->m_tmsi - ); - } else { - ctx->guti->gummei.plmn.MNCdigit1 = imsi->u.num.digit5; - ctx->guti->gummei.plmn.MNCdigit2 = imsi->u.num.digit6; - ctx->guti->gummei.plmn.MNCdigit3 = imsi->u.num.digit4; - LOG_TRACE(WARNING, "EMM-PROC - Assign GUTI from IMSI %01X%01X%01X.%01X%01X%01X.%04X.%02X.%08X to emm_data_context", - ctx->guti->gummei.plmn.MCCdigit1, - ctx->guti->gummei.plmn.MCCdigit2, - ctx->guti->gummei.plmn.MCCdigit3, - ctx->guti->gummei.plmn.MNCdigit1, - ctx->guti->gummei.plmn.MNCdigit2, - ctx->guti->gummei.plmn.MNCdigit3, - ctx->guti->gummei.MMEgid, - ctx->guti->gummei.MMEcode, - ctx->guti->m_tmsi - ); - } - - LOG_TRACE(WARNING, "EMM-PROC - Set ctx->guti_is_new to emm_data_context"); - ctx->guti_is_new = TRUE; - } else { - LOG_FUNC_RETURN (RETURNerror); - } - } else { - LOG_FUNC_RETURN (RETURNerror); - } - } - - /* The IMSI if provided by the UE */ - if (imsi) { - if (ctx->imsi == NULL) { - ctx->imsi = (imsi_t *)malloc(sizeof(imsi_t)); - } - - if (ctx->imsi != NULL) { - memcpy(ctx->imsi, imsi, sizeof(imsi_t)); - } else { - LOG_FUNC_RETURN (RETURNerror); - } - } - - /* The IMEI if provided by the UE */ - if (imei) { - if (ctx->imei == NULL) { - ctx->imei = (imei_t *)malloc(sizeof(imei_t)); - } - - if (ctx->imei != NULL) { - memcpy(ctx->imei, imei, sizeof(imei_t)); - } else { - LOG_FUNC_RETURN (RETURNerror); - } - } - - /* The ESM message contained within the attach request */ - if (esm_msg_pP->length > 0) { - if (ctx->esm_msg.value != NULL) { - free(ctx->esm_msg.value); - ctx->esm_msg.value = NULL; - ctx->esm_msg.length = 0; - } - - ctx->esm_msg.value = (uint8_t *)malloc(esm_msg_pP->length); - - if (ctx->esm_msg.value != NULL) { - memcpy((char *)ctx->esm_msg.value, - (char *)esm_msg_pP->value, esm_msg_pP->length); - - } else { - LOG_FUNC_RETURN (RETURNerror); - } - } - - ctx->esm_msg.length = esm_msg_pP->length; - /* Attachment indicator */ - ctx->is_attached = FALSE; - - LOG_FUNC_RETURN (RETURNok); -} diff --git a/openair-cn/NAS/MME/EMM/Authentication.c b/openair-cn/NAS/MME/EMM/Authentication.c deleted file mode 100644 index 19eb5c13a8..0000000000 --- a/openair-cn/NAS/MME/EMM/Authentication.c +++ /dev/null @@ -1,660 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source Authentication.c - -Version 0.1 - -Date 2013/03/04 - -Product NAS stack - -Subsystem EPS Mobility Management - -Author Frederic Maurel - -Description Defines the authentication EMM procedure executed by the - Non-Access Stratum. - - The purpose of the EPS authentication and key agreement (AKA) - procedure is to provide mutual authentication between the user - and the network and to agree on a key KASME. The procedure is - always initiated and controlled by the network. However, the - UE can reject the EPS authentication challenge sent by the - network. - - A partial native EPS security context is established in the - UE and the network when an EPS authentication is successfully - performed. The computed key material KASME is used as the - root for the EPS integrity protection and ciphering key - hierarchy. - -*****************************************************************************/ - -#include <stdlib.h> // malloc, free -#include <string.h> // memcpy, memcmp, memset -#include <arpa/inet.h> // htons - -#include "emm_proc.h" -#include "nas_log.h" -#include "nas_timer.h" -#include "emmData.h" -#include "emm_sap.h" -#include "emm_cause.h" - -# if defined(NAS_BUILT_IN_EPC) -# include "nas_itti_messaging.h" -# endif -#include "msc.h" - -/****************************************************************************/ -/**************** E X T E R N A L D E F I N I T I O N S ****************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************* L O C A L D E F I N I T I O N S *******************/ -/****************************************************************************/ - -/* - * -------------------------------------------------------------------------- - * Internal data handled by the authentication procedure in the UE - * -------------------------------------------------------------------------- - */ - -/* - * -------------------------------------------------------------------------- - * Internal data handled by the authentication procedure in the MME - * -------------------------------------------------------------------------- - */ -/* - * Timer handlers - */ -static void *_authentication_t3460_handler(void *); - -/* - * Function executed whenever the ongoing EMM procedure that initiated - * the authentication procedure is aborted or the maximum value of the - * retransmission timer counter is exceed - */ -static int _authentication_abort(void *); - -/* - * Internal data used for authentication procedure - */ -typedef struct { - unsigned int ueid; /* UE identifier */ -#define AUTHENTICATION_COUNTER_MAX 5 - unsigned int retransmission_count; /* Retransmission counter */ - int ksi; /* NAS key set identifier */ - OctetString rand; /* Random challenge number */ - OctetString autn; /* Authentication token */ - int notify_failure; /* Indicates whether the authentication - * procedure failure shall be notified - * to the ongoing EMM procedure */ -} authentication_data_t; - -static int _authentication_request(authentication_data_t *data); -static int _authentication_reject(unsigned int ueid); - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - - -/* - * -------------------------------------------------------------------------- - * Authentication procedure executed by the MME - * -------------------------------------------------------------------------- - */ -/**************************************************************************** - ** ** - ** Name: emm_proc_authentication() ** - ** ** - ** Description: Initiates authentication procedure to establish partial ** - ** native EPS security context in the UE and the MME. ** - ** ** - ** 3GPP TS 24.301, section 5.4.2.2 ** - ** The network initiates the authentication procedure by ** - ** sending an AUTHENTICATION REQUEST message to the UE and ** - ** starting the timer T3460. The AUTHENTICATION REQUEST mes- ** - ** sage contains the parameters necessary to calculate the ** - ** authentication response. ** - ** ** - ** Inputs: ueid: UE lower layer identifier ** - ** ksi: NAS key set identifier ** - ** rand: Random challenge number ** - ** autn: Authentication token ** - ** success: Callback function executed when the authen-** - ** tication procedure successfully completes ** - ** reject: Callback function executed when the authen-** - ** tication procedure fails or is rejected ** - ** failure: Callback function executed whener a lower ** - ** layer failure occured before the authenti- ** - ** cation procedure comnpletes ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int emm_proc_authentication(void *ctx, unsigned int ueid, int ksi, - const OctetString *_rand, const OctetString *autn, - emm_common_success_callback_t success, - emm_common_reject_callback_t reject, - emm_common_failure_callback_t failure) - -{ - int rc = RETURNerror; - authentication_data_t *data; - - LOG_FUNC_IN; - - LOG_TRACE(INFO, "EMM-PROC - Initiate authentication KSI = %d, ctx = %p", ksi, ctx); - - /* Allocate parameters of the retransmission timer callback */ - data = (authentication_data_t *)malloc(sizeof(authentication_data_t)); - - if (data != NULL) { - /* Setup ongoing EMM procedure callback functions */ - rc = emm_proc_common_initialize(ueid, success, reject, failure, - _authentication_abort, data); - - if (rc != RETURNok) { - LOG_TRACE(WARNING, "Failed to initialize EMM callback functions"); - LOG_FUNC_RETURN (RETURNerror); - } - - /* Set the UE identifier */ - data->ueid = ueid; - /* Reset the retransmission counter */ - data->retransmission_count = 0; - /* Set the key set identifier */ - data->ksi = ksi; - - /* Set the authentication random challenge number */ - if (_rand->length > 0) { - data->rand.value = (uint8_t *)malloc(_rand->length); - data->rand.length = 0; - - if (data->rand.value) { - memcpy(data->rand.value, _rand->value, _rand->length); - data->rand.length = _rand->length; - } - } - - /* Set the authentication token */ - if (autn->length > 0) { - data->autn.value = (uint8_t *)malloc(autn->length); - data->autn.length = 0; - - if (data->autn.value) { - memcpy(data->autn.value, autn->value, autn->length); - data->autn.length = autn->length; - } - } - - /* Set the failure notification indicator */ - data->notify_failure = FALSE; - /* Send authentication request message to the UE */ - rc = _authentication_request(data); - - if (rc != RETURNerror) { - /* - * Notify EMM that common procedure has been initiated - */ - - - MSC_LOG_TX_MESSAGE( - MSC_NAS_EMM_MME, - MSC_NAS_EMM_MME, - NULL,0, - "0 EMMREG_COMMON_PROC_REQ ue id "NAS_UE_ID_FMT" (authentication)", ueid); - - emm_sap_t emm_sap; - emm_sap.primitive = EMMREG_COMMON_PROC_REQ; - emm_sap.u.emm_reg.ueid = ueid; - emm_sap.u.emm_reg.ctx = ctx; - rc = emm_sap_send(&emm_sap); - } - } - - LOG_FUNC_RETURN (rc); -} - -/**************************************************************************** - ** ** - ** Name: emm_proc_authentication_complete() ** - ** ** - ** Description: Performs the authentication completion procedure executed ** - ** by the network. ** - ** ** - ** 3GPP TS 24.301, section 5.4.2.4 ** - ** Upon receiving the AUTHENTICATION RESPONSE message, the ** - ** MME shall stop timer T3460 and check the correctness of ** - ** the RES parameter. ** - ** ** - ** Inputs: ueid: UE lower layer identifier ** - ** emm_cause: Authentication failure EMM cause code ** - ** res: Authentication response parameter. or auts ** - ** in case of sync failure ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: _emm_data, T3460 ** - ** ** - ***************************************************************************/ -int emm_proc_authentication_complete(unsigned int ueid, int emm_cause, - const OctetString *res) -{ - int rc; - emm_sap_t emm_sap; - - LOG_FUNC_IN; - - LOG_TRACE(INFO, "EMM-PROC - Authentication complete (ueid="NAS_UE_ID_FMT", cause=%d)", - ueid, emm_cause); - - - /* Release retransmission timer paramaters */ - authentication_data_t *data = - (authentication_data_t *)(emm_proc_common_get_args(ueid)); - - if (data) { - if (data->rand.length > 0) { - free(data->rand.value); - } - - if (data->autn.length > 0) { - free(data->autn.value); - } - - free(data); - } - - /* Get the UE context */ - emm_data_context_t *emm_ctx = NULL; -#if defined(NAS_BUILT_IN_EPC) - if (ueid > 0) { - emm_ctx = emm_data_context_get(&_emm_data, ueid); - } -#else - if (ueid < EMM_DATA_NB_UE_MAX) { - emm_ctx = _emm_data.ctx[ueid]; - } -#endif - - if (emm_ctx) { - /* Stop timer T3460 */ - LOG_TRACE(INFO, "EMM-PROC - Stop timer T3460 (%d)", emm_ctx->T3460.id); - emm_ctx->T3460.id = nas_timer_stop(emm_ctx->T3460.id); - MSC_LOG_EVENT(MSC_NAS_EMM_MME, "0 T3460 stopped UE "NAS_UE_ID_FMT" ", data->ueid); - } - if (emm_cause == EMM_CAUSE_SUCCESS) { - /* Check the received RES parameter */ - if ( (emm_ctx == NULL) || - (memcmp(res->value, &emm_ctx->vector.xres, res->length) != 0) ) { - /* RES does not match the XRES parameter */ - LOG_TRACE(WARNING, "EMM-PROC - Failed to authentify the UE"); - emm_cause = EMM_CAUSE_ILLEGAL_UE; - } else { - LOG_TRACE(DEBUG, "EMM-PROC - Success to authentify the UE RESP XRES == XRES UE CONTEXT"); - } - } - - if (emm_cause != EMM_CAUSE_SUCCESS) { - switch (emm_cause) { - -#if defined(NAS_BUILT_IN_EPC) - - case EMM_CAUSE_SYNCH_FAILURE: - /* USIM has detected a mismatch in SQN. - * Ask for a new vector. - */ - MSC_LOG_EVENT( - MSC_NAS_EMM_MME, - "0 SQN SYNCH_FAILURE ue id "NAS_UE_ID_FMT" ", ueid); - - LOG_TRACE(DEBUG, "EMM-PROC - USIM has detected a mismatch in SQN Ask for a new vector"); - nas_itti_auth_info_req(ueid, emm_ctx->imsi, 0, res->value); - - rc = RETURNok; - LOG_FUNC_RETURN (rc); - break; -#endif - - default: - LOG_TRACE(DEBUG, "EMM-PROC - The MME received an authentication failure message or the RES does not match the XRES parameter computed by the network"); - /* The MME received an authentication failure message or the RES - * contained in the Authentication Response message received from - * the UE does not match the XRES parameter computed by the network */ - (void) _authentication_reject(ueid); - /* - * Notify EMM that the authentication procedure failed - */ - MSC_LOG_TX_MESSAGE( - MSC_NAS_EMM_MME, - MSC_NAS_EMM_MME, - NULL,0, - "0 EMMREG_COMMON_PROC_REJ ue id "NAS_UE_ID_FMT" ", ueid); - - - emm_sap.primitive = EMMREG_COMMON_PROC_REJ; - emm_sap.u.emm_reg.ueid = ueid; - emm_sap.u.emm_reg.ctx = emm_ctx; - break; - } - } else { - /* - * Notify EMM that the authentication procedure successfully completed - */ - MSC_LOG_TX_MESSAGE( - MSC_NAS_EMM_MME, - MSC_NAS_EMM_MME, - NULL,0, - "0 EMMREG_COMMON_PROC_CNF ue id "NAS_UE_ID_FMT" ", ueid); - - LOG_TRACE(DEBUG, "EMM-PROC - Notify EMM that the authentication procedure successfully completed"); - emm_sap.primitive = EMMREG_COMMON_PROC_CNF; - emm_sap.u.emm_reg.ueid = ueid; - emm_sap.u.emm_reg.ctx = emm_ctx; - emm_sap.u.emm_reg.u.common.is_attached = emm_ctx->is_attached; - } - - rc = emm_sap_send(&emm_sap); - - LOG_FUNC_RETURN (rc); -} - -/****************************************************************************/ -/********************* L O C A L F U N C T I O N S *********************/ -/****************************************************************************/ - - -/* - * -------------------------------------------------------------------------- - * Timer handlers - * -------------------------------------------------------------------------- - */ - -/**************************************************************************** - ** ** - ** Name: _authentication_t3460_handler() ** - ** ** - ** Description: T3460 timeout handler ** - ** Upon T3460 timer expiration, the authentication request ** - ** message is retransmitted and the timer restarted. When ** - ** retransmission counter is exceed, the MME shall abort the ** - ** authentication procedure and any ongoing EMM specific ** - ** procedure and release the NAS signalling connection. ** - ** ** - ** 3GPP TS 24.301, section 5.4.2.7, case b ** - ** ** - ** Inputs: args: handler parameters ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: None ** - ** Others: None ** - ** ** - ***************************************************************************/ -static void *_authentication_t3460_handler(void *args) -{ - LOG_FUNC_IN; - - int rc; - - authentication_data_t *data = (authentication_data_t *)(args); - - /* Increment the retransmission counter */ - data->retransmission_count += 1; - - LOG_TRACE(WARNING, "EMM-PROC - T3460 timer expired, retransmission " - "counter = %d", data->retransmission_count); - - if (data->retransmission_count < AUTHENTICATION_COUNTER_MAX) { - /* Send authentication request message to the UE */ - rc = _authentication_request(data); - } else { - unsigned int ueid = data->ueid; - /* Set the failure notification indicator */ - data->notify_failure = TRUE; - /* Abort the authentication procedure */ - rc = _authentication_abort(data); - - /* Release the NAS signalling connection */ - if (rc != RETURNerror) { - emm_sap_t emm_sap; - emm_sap.primitive = EMMAS_RELEASE_REQ; - emm_sap.u.emm_as.u.release.guti = NULL; - emm_sap.u.emm_as.u.release.ueid = ueid; - emm_sap.u.emm_as.u.release.cause = EMM_AS_CAUSE_AUTHENTICATION; - rc = emm_sap_send(&emm_sap); - } - } - - LOG_FUNC_RETURN (NULL); -} - -/* - * -------------------------------------------------------------------------- - * MME specific local functions - * -------------------------------------------------------------------------- - */ - -/**************************************************************************** - ** ** - ** Name: _authentication_request() ** - ** ** - ** Description: Sends AUTHENTICATION REQUEST message and start timer T3460** - ** ** - ** Inputs: args: handler parameters ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: T3460 ** - ** ** - ***************************************************************************/ -int _authentication_request(authentication_data_t *data) -{ - LOG_FUNC_IN; - - emm_sap_t emm_sap; - int rc; - struct emm_data_context_s *emm_ctx; - - /* - * Notify EMM-AS SAP that Authentication Request message has to be sent - * to the UE - */ - emm_sap.primitive = EMMAS_SECURITY_REQ; - emm_sap.u.emm_as.u.security.guti = NULL; - emm_sap.u.emm_as.u.security.ueid = data->ueid; - emm_sap.u.emm_as.u.security.msgType = EMM_AS_MSG_TYPE_AUTH; - emm_sap.u.emm_as.u.security.ksi = data->ksi; - emm_sap.u.emm_as.u.security.rand = &data->rand; - emm_sap.u.emm_as.u.security.autn = &data->autn; - - /* TODO: check for pointer validity */ -#if defined(NAS_BUILT_IN_EPC) - emm_ctx = emm_data_context_get(&_emm_data, data->ueid); -#else - emm_ctx = _emm_data.ctx[data->ueid]; -#endif - - /* Setup EPS NAS security data */ - emm_as_set_security_data(&emm_sap.u.emm_as.u.security.sctx, - emm_ctx->security, FALSE, TRUE); - - MSC_LOG_TX_MESSAGE( - MSC_NAS_EMM_MME, - MSC_NAS_EMM_MME, - NULL,0, - "0 EMMAS_SECURITY_REQ ue id "NAS_UE_ID_FMT" ", data->ueid); - - rc = emm_sap_send(&emm_sap); - - if (rc != RETURNerror) { - if (emm_ctx) { - if (emm_ctx->T3460.id != NAS_TIMER_INACTIVE_ID) { - /* Re-start T3460 timer */ - emm_ctx->T3460.id = nas_timer_restart(emm_ctx->T3460.id); - MSC_LOG_EVENT(MSC_NAS_EMM_MME, "0 T3460 restarted UE "NAS_UE_ID_FMT" ", data->ueid); - } else { - /* Start T3460 timer */ - emm_ctx->T3460.id = nas_timer_start(emm_ctx->T3460.sec, _authentication_t3460_handler, - data); - MSC_LOG_EVENT(MSC_NAS_EMM_MME, "0 T3460 started UE "NAS_UE_ID_FMT" ", data->ueid); - } - } - - LOG_TRACE(INFO,"EMM-PROC - Timer T3460 (%d) expires in %ld seconds", - emm_ctx->T3460.id, emm_ctx->T3460.sec); - } - - LOG_FUNC_RETURN (rc); -} - -/**************************************************************************** - ** ** - ** Name: _authentication_reject() ** - ** ** - ** Description: Sends AUTHENTICATION REJECT message ** - ** ** - ** Inputs: ueid: UE lower layer identifier ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -static int _authentication_reject(unsigned int ueid) -{ - LOG_FUNC_IN; - - emm_sap_t emm_sap; - int rc; - struct emm_data_context_s *emm_ctx; - - /* - * Notify EMM-AS SAP that Authentication Reject message has to be sent - * to the UE - */ - emm_sap.primitive = EMMAS_SECURITY_REJ; - emm_sap.u.emm_as.u.security.guti = NULL; - emm_sap.u.emm_as.u.security.ueid = ueid; - emm_sap.u.emm_as.u.security.msgType = EMM_AS_MSG_TYPE_AUTH; - -#if defined(NAS_BUILT_IN_EPC) - emm_ctx = emm_data_context_get(&_emm_data, ueid); -#else - emm_ctx = _emm_data.ctx[ueid]; -#endif - /* Setup EPS NAS security data */ - emm_as_set_security_data(&emm_sap.u.emm_as.u.security.sctx, - emm_ctx->security, FALSE, TRUE); - rc = emm_sap_send(&emm_sap); - - LOG_FUNC_RETURN (rc); -} - -/**************************************************************************** - ** ** - ** Name: _authentication_abort() ** - ** ** - ** Description: Aborts the authentication procedure currently in progress ** - ** ** - ** Inputs: args: Authentication data to be released ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: T3460 ** - ** ** - ***************************************************************************/ -static int _authentication_abort(void *args) -{ - LOG_FUNC_IN; - - int rc = RETURNerror; - struct emm_data_context_s *emm_ctx; - - authentication_data_t *data = (authentication_data_t *)(args); - - if (data) { - unsigned int ueid = data->ueid; - int notify_failure = data->notify_failure; - - LOG_TRACE(WARNING, "EMM-PROC - Abort authentication procedure " - "(ueid="NAS_UE_ID_FMT")", ueid); -#if defined(NAS_BUILT_IN_EPC) - emm_ctx = emm_data_context_get(&_emm_data, ueid); -#else - emm_ctx = _emm_data.ctx[ueid]; -#endif - if (emm_ctx) { - /* Stop timer T3460 */ - if (emm_ctx->T3460.id != NAS_TIMER_INACTIVE_ID) { - LOG_TRACE(INFO, "EMM-PROC - Stop timer T3460 (%d)", emm_ctx->T3460.id); - emm_ctx->T3460.id = nas_timer_stop(emm_ctx->T3460.id); - MSC_LOG_EVENT(MSC_NAS_EMM_MME, "0 T3460 stopped UE "NAS_UE_ID_FMT" ", data->ueid); - } - } - - /* Release retransmission timer paramaters */ - if (data->rand.length > 0) { - free(data->rand.value); - } - - if (data->autn.length > 0) { - free(data->autn.value); - } - - free(data); - - /* - * Notify EMM that the authentication procedure failed - */ - if (notify_failure) { - emm_sap_t emm_sap; - emm_sap.primitive = EMMREG_COMMON_PROC_REJ; - emm_sap.u.emm_reg.ueid = ueid; - rc = emm_sap_send(&emm_sap); - } else { - rc = RETURNok; - } - } - - LOG_FUNC_RETURN (rc); -} - - diff --git a/openair-cn/NAS/MME/EMM/COPYING b/openair-cn/NAS/MME/EMM/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair-cn/NAS/MME/EMM/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program 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. - - This program 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 this program. If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - <program> Copyright (C) <year> <name of author> - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<http://www.gnu.org/licenses/>. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<http://www.gnu.org/philosophy/why-not-lgpl.html>. diff --git a/openair-cn/NAS/MME/EMM/Detach.c b/openair-cn/NAS/MME/EMM/Detach.c deleted file mode 100644 index 1ba60e5b6d..0000000000 --- a/openair-cn/NAS/MME/EMM/Detach.c +++ /dev/null @@ -1,346 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source Detach.c - -Version 0.1 - -Date 2013/05/07 - -Product NAS stack - -Subsystem EPS Mobility Management - -Author Frederic Maurel - -Description Defines the detach related EMM procedure executed by the - Non-Access Stratum. - - The detach procedure is used by the UE to detach for EPS servi- - ces, to disconnect from the last PDN it is connected to; by the - network to inform the UE that it is detached for EPS services - or non-EPS services or both, to disconnect the UE from the last - PDN to which it is connected and to inform the UE to re-attach - to the network and re-establish all PDN connections. - -*****************************************************************************/ - -#include "emm_proc.h" -#include "nas_log.h" -#include "nas_timer.h" - -#include "emmData.h" - -#include "emm_sap.h" -#include "esm_sap.h" -#include "msc.h" - -#include <stdlib.h> // free - -/****************************************************************************/ -/**************** E X T E R N A L D E F I N I T I O N S ****************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************* L O C A L D E F I N I T I O N S *******************/ -/****************************************************************************/ - -/* String representation of the detach type */ -static const char *_emm_detach_type_str[] = { - "EPS", "IMSI", "EPS/IMSI", - "RE-ATTACH REQUIRED", "RE-ATTACH NOT REQUIRED", "RESERVED" -}; - -/* - * -------------------------------------------------------------------------- - * Internal data handled by the detach procedure in the UE - * -------------------------------------------------------------------------- - */ - - -/* - * -------------------------------------------------------------------------- - * Internal data handled by the detach procedure in the MME - * -------------------------------------------------------------------------- - */ - - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -/* - * -------------------------------------------------------------------------- - * Detach procedure executed by the UE - * -------------------------------------------------------------------------- - */ - -/* - * -------------------------------------------------------------------------- - * Detach procedure executed by the MME - * -------------------------------------------------------------------------- - */ -/**************************************************************************** - ** ** - ** Name: emm_proc_detach() ** - ** ** - ** Description: Initiate the detach procedure to inform the UE that it is ** - ** detached for EPS services, or to re-attach to the network ** - ** and re-establish all PDN connections. ** - ** ** - ** 3GPP TS 24.301, section 5.5.2.3.1 ** - ** In state EMM-REGISTERED the network initiates the detach ** - ** procedure by sending a DETACH REQUEST message to the UE, ** - ** starting timer T3422 and entering state EMM-DEREGISTERED- ** - ** INITIATED. ** - ** ** - ** Inputs: ueid: UE lower layer identifier ** - ** type: Type of the requested detach ** - ** Others: _emm_detach_type_str ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: T3422 ** - ** ** - ***************************************************************************/ -int emm_proc_detach(unsigned int ueid, emm_proc_detach_type_t type) -{ - LOG_FUNC_IN; - - int rc = RETURNerror; - - LOG_TRACE(INFO, "EMM-PROC - Initiate detach type = %s (%d)", - _emm_detach_type_str[type], type); - - /* TODO */ - - LOG_FUNC_RETURN(rc); -} - -/**************************************************************************** - ** ** - ** Name: emm_proc_detach_request() ** - ** ** - ** Description: Performs the UE initiated detach procedure for EPS servi- ** - ** ces only When the DETACH REQUEST message is received by ** - ** the network. ** - ** ** - ** 3GPP TS 24.301, section 5.5.2.2.2 ** - ** Upon receiving the DETACH REQUEST message the network ** - ** shall send a DETACH ACCEPT message to the UE and store ** - ** the current EPS security context, if the detach type IE ** - ** does not indicate "switch off". Otherwise, the procedure ** - ** is completed when the network receives the DETACH REQUEST ** - ** message. ** - ** The network shall deactivate the EPS bearer context(s) ** - ** for this UE locally without peer-to-peer signalling and ** - ** shall enter state EMM-DEREGISTERED. ** - ** ** - ** Inputs: ueid: UE lower layer identifier ** - ** type: Type of the requested detach ** - ** switch_off: Indicates whether the detach is required ** - ** because the UE is switched off or not ** - ** native_ksi: TRUE if the security context is of type ** - ** native ** - ** ksi: The NAS ket sey identifier ** - ** guti: The GUTI if provided by the UE ** - ** imsi: The IMSI if provided by the UE ** - ** imei: The IMEI if provided by the UE ** - ** Others: _emm_data ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int emm_proc_detach_request(unsigned int ueid, emm_proc_detach_type_t type, - int switch_off, int native_ksi, int ksi, - GUTI_t *guti, imsi_t *imsi, imei_t *imei) -{ - LOG_FUNC_IN; - - int rc; - emm_data_context_t *emm_ctx = NULL; - - LOG_TRACE(INFO, "EMM-PROC - Detach type = %s (%d) requested (ueid="NAS_UE_ID_FMT")", - _emm_detach_type_str[type], type, ueid); - - /* Get the UE context */ -#if defined(NAS_BUILT_IN_EPC) - - if (ueid > 0) { - emm_ctx = emm_data_context_get(&_emm_data, ueid); - } - -#else - - if (ueid < EMM_DATA_NB_UE_MAX) { - emm_ctx = _emm_data.ctx[ueid]; - } - -#endif - - if (emm_ctx == NULL) { - LOG_TRACE(WARNING, "No EMM context exists for the UE (ueid="NAS_UE_ID_FMT")", ueid); - LOG_FUNC_RETURN(RETURNok); - } - - if (switch_off) { - MSC_LOG_EVENT(MSC_NAS_EMM_MME, - "0 Removing UE context ue id "NAS_UE_ID_FMT" ", ueid); - /* The UE is switched off */ - if (emm_ctx->guti) { - free(emm_ctx->guti); - } - - if (emm_ctx->imsi) { - free(emm_ctx->imsi); - } - - if (emm_ctx->imei) { - free(emm_ctx->imei); - } - - if (emm_ctx->esm_msg.length > 0) { - free(emm_ctx->esm_msg.value); - } - - /* Release NAS security context */ - if (emm_ctx->security) { - emm_security_context_t *security = emm_ctx->security; - - if (security->kasme.value) { - free(security->kasme.value); - } - - if (security->knas_enc.value) { - free(security->knas_enc.value); - } - - if (security->knas_int.value) { - free(security->knas_int.value); - } - - free(emm_ctx->security); - } - /* Stop timer T3450 */ - if (emm_ctx->T3450.id != NAS_TIMER_INACTIVE_ID) { - LOG_TRACE(INFO, "EMM-PROC - Stop timer T3450 (%d)", emm_ctx->T3450.id); - emm_ctx->T3450.id = nas_timer_stop(emm_ctx->T3450.id); - MSC_LOG_EVENT(MSC_NAS_EMM_MME, "0 T3450 stopped UE "NAS_UE_ID_FMT" ", emm_ctx->ueid); - } - /* Stop timer T3460 */ - if (emm_ctx->T3460.id != NAS_TIMER_INACTIVE_ID) { - LOG_TRACE(INFO, "EMM-PROC - Stop timer T3460 (%d)", emm_ctx->T3460.id); - emm_ctx->T3460.id = nas_timer_stop(emm_ctx->T3460.id); - MSC_LOG_EVENT(MSC_NAS_EMM_MME, "0 T3460 stopped UE "NAS_UE_ID_FMT" ", emm_ctx->ueid); - } - /* Stop timer T3470 */ - if (emm_ctx->T3470.id != NAS_TIMER_INACTIVE_ID) { - LOG_TRACE(INFO, "EMM-PROC - Stop timer T3470 (%d)", emm_ctx->T3460.id); - emm_ctx->T3470.id = nas_timer_stop(emm_ctx->T3470.id); - MSC_LOG_EVENT(MSC_NAS_EMM_MME, "0 T3470 stopped UE "NAS_UE_ID_FMT" ", emm_ctx->ueid); - } - /* Release the EMM context */ -#if defined(NAS_BUILT_IN_EPC) - emm_data_context_remove(&_emm_data, emm_ctx); - free(emm_ctx); -#else - free(_emm_data.ctx[ueid]); - _emm_data.ctx[ueid] = NULL; -#endif - rc = RETURNok; - } else { - /* Normal detach without UE switch-off */ - emm_sap_t emm_sap; - emm_as_data_t *emm_as = &emm_sap.u.emm_as.u.data; - MSC_LOG_TX_MESSAGE( - MSC_NAS_EMM_MME, - MSC_NAS_EMM_MME, - NULL,0, - "0 EMM_AS_NAS_INFO_DETACH ue id "NAS_UE_ID_FMT" ", ueid); - - /* Setup NAS information message to transfer */ - emm_as->NASinfo = EMM_AS_NAS_INFO_DETACH; - emm_as->NASmsg.length = 0; - emm_as->NASmsg.value = NULL; - /* Set the UE identifier */ - emm_as->guti = NULL; - emm_as->ueid = ueid; - /* Setup EPS NAS security data */ - emm_as_set_security_data(&emm_as->sctx, emm_ctx->security, FALSE, TRUE); - /* - * Notify EMM-AS SAP that Detach Accept message has to - * be sent to the network - */ - emm_sap.primitive = EMMAS_DATA_REQ; - rc = emm_sap_send(&emm_sap); - } - - if (rc != RETURNerror) { - /* - * Notify ESM that all EPS bearer contexts allocated for this UE have - * to be locally deactivated - */ - MSC_LOG_TX_MESSAGE( - MSC_NAS_EMM_MME, - MSC_NAS_ESM_MME, - NULL,0, - "0 ESM_EPS_BEARER_CONTEXT_DEACTIVATE_REQ ue id "NAS_UE_ID_FMT" ", ueid); - esm_sap_t esm_sap; - esm_sap.primitive = ESM_EPS_BEARER_CONTEXT_DEACTIVATE_REQ; - esm_sap.ueid = ueid; - esm_sap.ctx = emm_ctx; - esm_sap.data.eps_bearer_context_deactivate.ebi = ESM_SAP_ALL_EBI; - rc = esm_sap_send(&esm_sap); - - if (rc != RETURNerror) { - emm_sap_t emm_sap; - /* - * Notify EMM that the UE has been implicitly detached - */ - MSC_LOG_TX_MESSAGE( - MSC_NAS_EMM_MME, - MSC_NAS_EMM_MME, - NULL,0, - "0 EMMREG_DETACH_REQ ue id "NAS_UE_ID_FMT" ", ueid); - emm_sap.primitive = EMMREG_DETACH_REQ; - emm_sap.u.emm_reg.ueid = ueid; - emm_sap.u.emm_reg.ctx = emm_ctx; - rc = emm_sap_send(&emm_sap); - } - } - - LOG_FUNC_RETURN(rc); -} - -/****************************************************************************/ -/********************* L O C A L F U N C T I O N S *********************/ -/****************************************************************************/ - diff --git a/openair-cn/NAS/MME/EMM/EmmCommon.c b/openair-cn/NAS/MME/EMM/EmmCommon.c deleted file mode 100644 index a30c7675d8..0000000000 --- a/openair-cn/NAS/MME/EMM/EmmCommon.c +++ /dev/null @@ -1,514 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source EmmCommon.h - -Version 0.1 - -Date 2013/04/19 - -Product NAS stack - -Subsystem EPS Mobility Management - -Author Frederic Maurel - -Description Defines callback functions executed within EMM common procedures - by the Non-Access Stratum running at the network side. - - Following EMM common procedures can always be initiated by the - network whilst a NAS signalling connection exists: - - GUTI reallocation - authentication - security mode control - identification - EMM information - -*****************************************************************************/ - - -#include "EmmCommon.h" - -#include "commonDef.h" -#include "nas_log.h" -#include "emmData.h" - -#include <stdlib.h> // malloc, free -#include <string.h> -#include <assert.h> - -#if defined(NAS_BUILT_IN_EPC) -# include "assertions.h" -#endif - -/****************************************************************************/ -/**************** E X T E R N A L D E F I N I T I O N S ****************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************* L O C A L D E F I N I T I O N S *******************/ -/****************************************************************************/ - -/* EMM procedure callback cleanup function */ -static void _emm_common_cleanup(unsigned int ueid); - -/* Ongoing EMM procedure callback functions */ -typedef struct emm_common_data_s { - unsigned int ueid; - int ref_count; - emm_common_success_callback_t success; - emm_common_reject_callback_t reject; - emm_common_failure_callback_t failure; - emm_common_abort_callback_t abort; - void *args; - -#if defined(NAS_BUILT_IN_EPC) - RB_ENTRY(emm_common_data_s) entries; -#endif -} emm_common_data_t; - -#if defined(NAS_BUILT_IN_EPC) -typedef struct emm_common_data_head_s { - RB_HEAD(emm_common_data_map, emm_common_data_s) emm_common_data_root; -} emm_common_data_head_t; - -emm_common_data_head_t emm_common_data_head = { RB_INITIALIZER() }; - -static inline -int emm_common_data_compare_ueid(struct emm_common_data_s *p1, - struct emm_common_data_s *p2); -struct emm_common_data_s *emm_common_data_context_get( - struct emm_common_data_head_s *root, unsigned int _ueid); - -RB_PROTOTYPE(emm_common_data_map, emm_common_data_s, entries, - emm_common_data_compare_ueid); - -/* Generate functions used for the MAP */ -RB_GENERATE(emm_common_data_map, emm_common_data_s, entries, - emm_common_data_compare_ueid); - -static inline -int emm_common_data_compare_ueid(struct emm_common_data_s *p1, - struct emm_common_data_s *p2) -{ - if (p1->ueid > p2->ueid) { - return 1; - } - - if (p1->ueid < p2->ueid) { - return -1; - } - - /* Matching reference -> return 0 */ - return 0; -} - -struct emm_common_data_s *emm_common_data_context_get( - struct emm_common_data_head_s *root, unsigned int _ueid) -{ - struct emm_common_data_s reference; - - DevAssert(root != NULL); - DevCheck(_ueid > 0, _ueid, 0, 0); - - memset(&reference, 0, sizeof(struct emm_common_data_s)); - reference.ueid = _ueid; - return RB_FIND(emm_common_data_map, &root->emm_common_data_root, &reference); -} -#else -static emm_common_data_t *_emm_common_data[EMM_DATA_NB_UE_MAX]; -#endif - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -/**************************************************************************** - ** ** - ** Name: emm_proc_common_initialize() ** - ** ** - ** Description: Initialize EMM procedure callback functions executed for ** - ** the UE with the given identifier ** - ** ** - ** Inputs: ueid: UE lower layer identifier ** - ** success: EMM procedure executed upon successful EMM ** - ** common procedure completion ** - ** reject: EMM procedure executed if the EMM common ** - ** procedure failed or is rejected ** - ** failure: EMM procedure executed upon transmission ** - ** failure reported by lower layer ** - ** abort: EMM common procedure executed when the on- ** - ** going EMM procedure is aborted ** - ** args: EMM common procedure argument parameters ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: _emm_common_data ** - ** ** - ***************************************************************************/ -int emm_proc_common_initialize(unsigned int ueid, - emm_common_success_callback_t _success, - emm_common_reject_callback_t _reject, - emm_common_failure_callback_t _failure, - emm_common_abort_callback_t _abort, - void *args) -{ - struct emm_common_data_s *emm_common_data_ctx = NULL; - LOG_FUNC_IN; - -#if defined(NAS_BUILT_IN_EPC) - assert(ueid > 0); - emm_common_data_ctx = emm_common_data_context_get(&emm_common_data_head, ueid); -#else - assert(ueid < EMM_DATA_NB_UE_MAX); -#endif - - if (emm_common_data_ctx == NULL) { - emm_common_data_ctx = (emm_common_data_t *)malloc(sizeof(emm_common_data_t)); - emm_common_data_ctx->ueid = ueid; -#if defined(NAS_BUILT_IN_EPC) - RB_INSERT(emm_common_data_map, &emm_common_data_head.emm_common_data_root, - emm_common_data_ctx); -#endif - - if (emm_common_data_ctx) { - emm_common_data_ctx->ref_count = 0; - } - } - - if (emm_common_data_ctx) { - emm_common_data_ctx->ref_count += 1; - emm_common_data_ctx->success = _success; - emm_common_data_ctx->reject = _reject; - emm_common_data_ctx->failure = _failure; - emm_common_data_ctx->abort = _abort; - emm_common_data_ctx->args = args; - LOG_FUNC_RETURN(RETURNok); - } - - LOG_FUNC_RETURN(RETURNerror); -} - -/**************************************************************************** - ** ** - ** Name: emm_proc_common_success() ** - ** ** - ** Description: The EMM common procedure initiated between the UE with ** - ** the specified identifier and the MME completed success- ** - ** fully. The network performs required actions related to ** - ** the ongoing EMM procedure. ** - ** ** - ** Inputs: ueid: UE lower layer identifier ** - ** Others: _emm_common_data, _emm_data ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int emm_proc_common_success(unsigned int ueid) -{ - emm_common_data_t *emm_common_data_ctx = NULL; - emm_common_success_callback_t emm_callback; - - int rc = RETURNerror; - - LOG_FUNC_IN; - -#if defined(NAS_BUILT_IN_EPC) - DevCheck(ueid > 0, ueid, 0, 0); - emm_common_data_ctx = emm_common_data_context_get(&emm_common_data_head, ueid); -#else - assert(ueid < EMM_DATA_NB_UE_MAX); - emm_common_data_ctx = _emm_common_data[ueid]; -#endif - - assert(emm_common_data_ctx != NULL); - - emm_callback = emm_common_data_ctx->success; - - if (emm_callback) { - struct emm_data_context_s *ctx = NULL; - -#if defined(NAS_BUILT_IN_EPC) - ctx = emm_data_context_get(&_emm_data, ueid); -#else - ctx = _emm_data.ctx[ueid]; -#endif - rc = (*emm_callback)(ctx); - } - - _emm_common_cleanup(ueid); - - LOG_FUNC_RETURN(rc); -} - -/**************************************************************************** - ** ** - ** Name: emm_proc_common_reject() ** - ** ** - ** Description: The EMM common procedure initiated between the UE with ** - ** the specified identifier and the MME failed or has been ** - ** rejected. The network performs required actions related ** - ** to the ongoing EMM procedure. ** - ** ** - ** Inputs: ueid: UE lower layer identifier ** - ** Others: _emm_common_data, _emm_data ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int emm_proc_common_reject(unsigned int ueid) -{ - emm_common_data_t *emm_common_data_ctx = NULL; - int rc = RETURNerror; - emm_common_reject_callback_t emm_callback; - - LOG_FUNC_IN; - -#if defined(NAS_BUILT_IN_EPC) - DevCheck(ueid > 0, ueid, 0, 0); - emm_common_data_ctx = emm_common_data_context_get(&emm_common_data_head, ueid); -#else - assert(ueid < EMM_DATA_NB_UE_MAX); - emm_common_data_ctx = _emm_common_data[ueid]; -#endif - - assert(emm_common_data_ctx != NULL); - - emm_callback = emm_common_data_ctx->reject; - - if (emm_callback) { - struct emm_data_context_s *ctx = NULL; - -#if defined(NAS_BUILT_IN_EPC) - ctx = emm_data_context_get(&_emm_data, ueid); -#else - ctx = _emm_data.ctx[ueid]; -#endif - rc = (*emm_callback)(ctx); - } - - _emm_common_cleanup(ueid); - - LOG_FUNC_RETURN(rc); -} - -/**************************************************************************** - ** ** - ** Name: emm_proc_common_failure() ** - ** ** - ** Description: The EMM common procedure has been initiated between the ** - ** UE with the specified identifier and the MME, and a lower ** - ** layer failure occurred before the EMM common procedure ** - ** being completed. The network performs required actions ** - ** related to the ongoing EMM procedure. ** - ** ** - ** Inputs: ueid: UE lower layer identifier ** - ** Others: _emm_common_data, _emm_data ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int emm_proc_common_failure(unsigned int ueid) -{ - emm_common_data_t *emm_common_data_ctx = NULL; - emm_common_failure_callback_t emm_callback; - - int rc = RETURNerror; - - LOG_FUNC_IN; - -#if defined(NAS_BUILT_IN_EPC) - DevCheck(ueid > 0, ueid, 0, 0); - emm_common_data_ctx = emm_common_data_context_get(&emm_common_data_head, ueid); -#else - assert(ueid < EMM_DATA_NB_UE_MAX); - emm_common_data_ctx = _emm_common_data[ueid]; -#endif - assert(emm_common_data_ctx != NULL); - - emm_callback = emm_common_data_ctx->failure; - - if (emm_callback) { - struct emm_data_context_s *ctx = NULL; - -#if defined(NAS_BUILT_IN_EPC) - ctx = emm_data_context_get(&_emm_data, ueid); -#else - ctx = _emm_data.ctx[ueid]; -#endif - rc = (*emm_callback)(ctx); - } - - _emm_common_cleanup(ueid); - - LOG_FUNC_RETURN(rc); -} - -/**************************************************************************** - ** ** - ** Name: emm_proc_common_abort() ** - ** ** - ** Description: The ongoing EMM procedure has been aborted. The network ** - ** performs required actions related to the EMM common pro- ** - ** cedure previously initiated between the UE with the spe- ** - ** cified identifier and the MME. ** - ** ** - ** Inputs: ueid: UE lower layer identifier ** - ** Others: _emm_common_data ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int emm_proc_common_abort(unsigned int ueid) -{ - emm_common_data_t *emm_common_data_ctx = NULL; - emm_common_failure_callback_t emm_callback; - - int rc = RETURNerror; - - LOG_FUNC_IN; - -#if defined(NAS_BUILT_IN_EPC) - DevCheck(ueid > 0, ueid, 0, 0); - emm_common_data_ctx = emm_common_data_context_get(&emm_common_data_head, ueid); -#else - assert(ueid < EMM_DATA_NB_UE_MAX); - emm_common_data_ctx = _emm_common_data[ueid]; -#endif - assert(emm_common_data_ctx != NULL); - - emm_callback = emm_common_data_ctx->abort; - - if (emm_callback) { - struct emm_data_context_s *ctx = NULL; - -#if defined(NAS_BUILT_IN_EPC) - ctx = emm_data_context_get(&_emm_data, ueid); -#else - ctx = _emm_data.ctx[ueid]; -#endif - rc = (*emm_callback)(ctx); - } - - _emm_common_cleanup(ueid); - - LOG_FUNC_RETURN(rc); -} - -/**************************************************************************** - ** ** - ** Name: emm_proc_common_get_args() ** - ** ** - ** Description: Returns pointer to the EMM common procedure argument pa- ** - ** rameters allocated for the UE with the given identifier. ** - ** ** - ** Inputs: ueid: UE lower layer identifier ** - ** Others: _emm_common_data ** - ** ** - ** Outputs: None ** - ** Return: pointer to the EMM common procedure argu- ** - ** ment parameters ** - ** Others: None ** - ** ** - ***************************************************************************/ -void *emm_proc_common_get_args(unsigned int ueid) -{ - emm_common_data_t *emm_common_data_ctx = NULL; - LOG_FUNC_IN; - -#if defined(NAS_BUILT_IN_EPC) - DevCheck(ueid > 0, ueid, 0, 0); - emm_common_data_ctx = emm_common_data_context_get(&emm_common_data_head, ueid); -#else - assert(ueid < EMM_DATA_NB_UE_MAX); - emm_common_data_ctx = _emm_common_data[ueid]; -#endif - assert(emm_common_data_ctx != NULL); - - LOG_FUNC_RETURN(emm_common_data_ctx->args); -} - -/****************************************************************************/ -/********************* L O C A L F U N C T I O N S *********************/ -/****************************************************************************/ - -/**************************************************************************** - ** ** - ** Name: emm_proc_common_cleanup() ** - ** ** - ** Description: Cleans EMM procedure callback functions upon completion ** - ** of an EMM common procedure previously initiated within an ** - ** EMM procedure currently in progress between the network ** - ** and the UE with the specified identifier. ** - ** ** - ** Inputs: ueid: UE lower layer identifier ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: None ** - ** Others: _emm_common_data ** - ** ** - ***************************************************************************/ -static void _emm_common_cleanup(unsigned int ueid) -{ - emm_common_data_t *emm_common_data_ctx = NULL; - -#if defined(NAS_BUILT_IN_EPC) - DevCheck(ueid > 0, ueid, 0, 0); - emm_common_data_ctx = emm_common_data_context_get(&emm_common_data_head, ueid); -#else - assert(ueid < EMM_DATA_NB_UE_MAX); - emm_common_data_ctx = _emm_common_data[ueid]; -#endif - - if (emm_common_data_ctx) { - emm_common_data_ctx->ref_count -= 1; - - if (emm_common_data_ctx->ref_count == 0) { - /* Release the callback functions */ -#if defined(NAS_BUILT_IN_EPC) - RB_REMOVE(emm_common_data_map, - &emm_common_data_head.emm_common_data_root, - emm_common_data_ctx); -#endif - free(emm_common_data_ctx); - emm_common_data_ctx = NULL; - } - } -} diff --git a/openair-cn/NAS/MME/EMM/EmmCommon.h b/openair-cn/NAS/MME/EMM/EmmCommon.h deleted file mode 100644 index f09e4954ea..0000000000 --- a/openair-cn/NAS/MME/EMM/EmmCommon.h +++ /dev/null @@ -1,109 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source EmmCommon.h - -Version 0.1 - -Date 2013/04/19 - -Product NAS stack - -Subsystem EPS Mobility Management - -Author Frederic Maurel - -Description Defines callback functions executed within EMM common procedures - by the Non-Access Stratum running at the network side. - - Following EMM common procedures can always be initiated by the - network whilst a NAS signalling connection exists: - - GUTI reallocation - authentication - security mode control - identification - EMM information - -*****************************************************************************/ -#ifndef __EMM_COMMON_H__ -#define __EMM_COMMON_H__ - -/****************************************************************************/ -/********************* G L O B A L C O N S T A N T S *******************/ -/****************************************************************************/ - -/****************************************************************************/ -/************************ G L O B A L T Y P E S ************************/ -/****************************************************************************/ - -/* - * Type of EMM procedure callback functions - * ---------------------------------------- - * EMM procedure to be executed under certain conditions, when an EMM common - * procedure has been initiated by the ongoing EMM procedure. - * - The EMM common procedure successfully completed - * - The EMM common procedure failed or is rejected - * - Lower layer failure occured before the EMM common procedure completion - */ -typedef int (*emm_common_success_callback_t)(void *); -typedef int (*emm_common_reject_callback_t) (void *); -typedef int (*emm_common_failure_callback_t)(void *); - -/* - * Type of EMM common procedure callback function - * ---------------------------------------------- - * EMM common procedure to be executed when the ongoing EMM procedure is - * aborted. - */ -typedef int (*emm_common_abort_callback_t)(void *); - -/****************************************************************************/ -/******************** G L O B A L V A R I A B L E S ********************/ -/****************************************************************************/ - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -int emm_proc_common_initialize(unsigned int ueid, - emm_common_success_callback_t success, - emm_common_reject_callback_t reject, - emm_common_failure_callback_t failure, - emm_common_abort_callback_t abort, - void *args); - -int emm_proc_common_success(unsigned int ueid); -int emm_proc_common_reject(unsigned int ueid); -int emm_proc_common_failure(unsigned int ueid); -int emm_proc_common_abort(unsigned int ueid); - -void *emm_proc_common_get_args(unsigned int ueid); - -#endif /* __EMM_COMMON_H__*/ diff --git a/openair-cn/NAS/MME/EMM/EmmStatusHdl.c b/openair-cn/NAS/MME/EMM/EmmStatusHdl.c deleted file mode 100644 index fec9f2314f..0000000000 --- a/openair-cn/NAS/MME/EMM/EmmStatusHdl.c +++ /dev/null @@ -1,165 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source Emmstatus.c - -Version 0.1 - -Date 2013/06/26 - -Product NAS stack - -Subsystem EPS Mobility Management - -Author Frederic Maurel - -Description Defines the EMM status procedure executed by the Non-Access - Stratum. - - The purpose of the sending of the EMM STATUS message is to - report at any time certain error conditions detected upon - receipt of EMM protocol data. The EMM STATUS message can be - sent by both the MME and the UE. - -*****************************************************************************/ - -#include "emm_proc.h" -#include "commonDef.h" -#include "nas_log.h" - -#include "emm_cause.h" -#include "emmData.h" - -#include "emm_sap.h" - -/****************************************************************************/ -/**************** E X T E R N A L D E F I N I T I O N S ****************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************* L O C A L D E F I N I T I O N S *******************/ -/****************************************************************************/ - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -/**************************************************************************** - ** ** - ** Name: emm_proc_status_ind() ** - ** ** - ** Description: Processes received EMM status message. ** - ** ** - ** 3GPP TS 24.301, section 5.7 ** - ** On receipt of an EMM STATUS message no state transition ** - ** and no specific action shall be taken. Local actions are ** - ** possible and are implementation dependent. ** - ** ** - ** Inputs: ueid: UE lower layer identifier ** - ** emm_cause: Received EMM cause code ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int emm_proc_status_ind(unsigned int ueid, int emm_cause) -{ - LOG_FUNC_IN; - - int rc; - - LOG_TRACE(INFO,"EMM-PROC - EMM status procedure requested (cause=%d)", - emm_cause); - - LOG_TRACE(DEBUG, "EMM-PROC - To be implemented"); - - /* TODO */ - rc = RETURNok; - - LOG_FUNC_RETURN (rc); -} - -/**************************************************************************** - ** ** - ** Name: emm_proc_status() ** - ** ** - ** Description: Initiates EMM status procedure. ** - ** ** - ** Inputs: ueid: UE lower layer identifier ** - ** emm_cause: EMM cause code to be reported ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int emm_proc_status(unsigned int ueid, int emm_cause) -{ - LOG_FUNC_IN; - - int rc; - emm_sap_t emm_sap; - - emm_security_context_t *sctx = NULL; - struct emm_data_context_s *ctx = NULL; - - LOG_TRACE(INFO,"EMM-PROC - EMM status procedure requested"); - - /* - * Notity EMM that EMM status indication has to be sent to lower layers - */ - emm_sap.primitive = EMMAS_STATUS_IND; - emm_sap.u.emm_as.u.status.emm_cause = emm_cause; - emm_sap.u.emm_as.u.status.ueid = ueid; - emm_sap.u.emm_as.u.status.guti = NULL; -# if defined(NAS_BUILT_IN_EPC) - ctx = emm_data_context_get(&_emm_data, ueid); -# else - ctx = _emm_data.ctx[ueid]; -# endif - - if (ctx) { - sctx = ctx->security; - } - - /* Setup EPS NAS security data */ - emm_as_set_security_data(&emm_sap.u.emm_as.u.status.sctx, sctx, - FALSE, TRUE); - - rc = emm_sap_send(&emm_sap); - - LOG_FUNC_RETURN (rc); -} - -/****************************************************************************/ -/********************* L O C A L F U N C T I O N S *********************/ -/****************************************************************************/ diff --git a/openair-cn/NAS/MME/EMM/Identification.c b/openair-cn/NAS/MME/EMM/Identification.c deleted file mode 100644 index a4e34f5be3..0000000000 --- a/openair-cn/NAS/MME/EMM/Identification.c +++ /dev/null @@ -1,538 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source Identification.c - -Version 0.1 - -Date 2013/04/09 - -Product NAS stack - -Subsystem EPS Mobility Management - -Author Frederic Maurel - -Description Defines the identification EMM procedure executed by the - Non-Access Stratum. - - The identification procedure is used by the network to request - a particular UE to provide specific identification parameters - (IMSI, IMEI). - -*****************************************************************************/ - -#include "emm_proc.h" -#include "nas_log.h" -#include "nas_timer.h" - -#include "emmData.h" - -#include "emm_sap.h" -#include "msc.h" - -#include <stdlib.h> // malloc, free -#include <string.h> // memcpy - -/****************************************************************************/ -/**************** E X T E R N A L D E F I N I T I O N S ****************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************* L O C A L D E F I N I T I O N S *******************/ -/****************************************************************************/ - -/* String representation of the requested identity type */ -static const char *_emm_identity_type_str[] = { - "NOT AVAILABLE", "IMSI", "IMEI", "IMEISV", "TMSI" -}; - - -/* - * -------------------------------------------------------------------------- - * Internal data handled by the identification procedure in the MME - * -------------------------------------------------------------------------- - */ -/* - * Timer handlers - */ -static void *_identification_t3470_handler(void *); - -/* - * Function executed whenever the ongoing EMM procedure that initiated - * the identification procedure is aborted or the maximum value of the - * retransmission timer counter is exceed - */ -static int _identification_abort(void *); - -/* - * Internal data used for identification procedure - */ -typedef struct { - unsigned int ueid; /* UE identifier */ -#define IDENTIFICATION_COUNTER_MAX 5 - unsigned int retransmission_count; /* Retransmission counter */ - emm_proc_identity_type_t type; /* Type of UE identity */ - int notify_failure; /* Indicates whether the identification - * procedure failure shall be notified - * to the ongoing EMM procedure */ -} identification_data_t; - -static int _identification_request(identification_data_t *data); - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - - -/* - * -------------------------------------------------------------------------- - * Identification procedure executed by the MME - * -------------------------------------------------------------------------- - */ -/******************************************************************** - ** ** - ** Name: emm_proc_identification() ** - ** ** - ** Description: Initiates an identification procedure. ** - ** ** - ** 3GPP TS 24.301, section 5.4.4.2 ** - ** The network initiates the identification procedure by ** - ** sending an IDENTITY REQUEST message to the UE and star- ** - ** ting the timer T3470. The IDENTITY REQUEST message speci- ** - ** fies the requested identification parameters in the Iden- ** - ** tity type information element. ** - ** ** - ** Inputs: ueid: UE lower layer identifier ** - ** type: Type of the requested identity ** - ** success: Callback function executed when the identi- ** - ** fication procedure successfully completes ** - ** reject: Callback function executed when the identi- ** - ** fication procedure fails or is rejected ** - ** failure: Callback function executed whener a lower ** - ** layer failure occured before the identifi- ** - ** cation procedure completes ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: _emm_data ** - ** ** - ********************************************************************/ -int emm_proc_identification(unsigned int ueid, - emm_data_context_t *emm_ctx, - emm_proc_identity_type_t type, - emm_common_success_callback_t success, - emm_common_reject_callback_t reject, - emm_common_failure_callback_t failure) -{ - LOG_FUNC_IN; - - int rc = RETURNerror; - - LOG_TRACE(INFO, "EMM-PROC - Initiate identification type = %s (%d), ctx = %p", - _emm_identity_type_str[type], type, emm_ctx); - - /* Allocate parameters of the retransmission timer callback */ - identification_data_t *data = - (identification_data_t *)malloc(sizeof(identification_data_t)); - - if (data != NULL) { - /* Setup ongoing EMM procedure callback functions */ - rc = emm_proc_common_initialize(ueid, success, reject, failure, - _identification_abort, data); - - if (rc != RETURNok) { - LOG_TRACE(WARNING, "Failed to initialize EMM callback functions"); - free(data); - LOG_FUNC_RETURN (RETURNerror); - } - - /* Set the UE identifier */ - data->ueid = ueid; - /* Reset the retransmission counter */ - data->retransmission_count = 0; - /* Set the type of the requested identity */ - data->type = type; - /* Set the failure notification indicator */ - data->notify_failure = FALSE; - /* Send identity request message to the UE */ - rc = _identification_request(data); - - if (rc != RETURNerror) { - /* - * Notify EMM that common procedure has been initiated - */ - MSC_LOG_TX_MESSAGE( - MSC_NAS_EMM_MME, - MSC_NAS_EMM_MME, - NULL,0, - "0 EMMREG_COMMON_PROC_REQ ue id "NAS_UE_ID_FMT" (identification)", ueid); - - emm_sap_t emm_sap; - emm_sap.primitive = EMMREG_COMMON_PROC_REQ; - emm_sap.u.emm_reg.ueid = ueid; - emm_sap.u.emm_reg.ctx = emm_ctx; - rc = emm_sap_send(&emm_sap); - } - } - - LOG_FUNC_RETURN (rc); -} - -/**************************************************************************** - ** ** - ** Name: emm_proc_identification_complete() ** - ** ** - ** Description: Performs the identification completion procedure executed ** - ** by the network. ** - ** ** - ** 3GPP TS 24.301, section 5.4.4.4 ** - ** Upon receiving the IDENTITY RESPONSE message, the MME ** - ** shall stop timer T3470. ** - ** ** - ** Inputs: ueid: UE lower layer identifier ** - ** imsi: The IMSI received from the UE ** - ** imei: The IMEI received from the UE ** - ** tmsi: The TMSI received from the UE ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: _emm_data, T3470 ** - ** ** - ***************************************************************************/ -int emm_proc_identification_complete(unsigned int ueid, const imsi_t *imsi, - const imei_t *imei, uint32_t *tmsi) -{ - int rc = RETURNerror; - emm_sap_t emm_sap; - - emm_data_context_t *emm_ctx = NULL; - - LOG_FUNC_IN; - - LOG_TRACE(INFO, "EMM-PROC - Identification complete (ueid="NAS_UE_ID_FMT")", ueid); - - /* Release retransmission timer paramaters */ - identification_data_t *data = - (identification_data_t *)(emm_proc_common_get_args(ueid)); - if (data) { - free(data); - } - - /* Get the UE context */ -#if defined(NAS_BUILT_IN_EPC) - if (ueid > 0) { - emm_ctx = emm_data_context_get(&_emm_data, ueid); - } -#else - if (ueid < EMM_DATA_NB_UE_MAX) { - emm_ctx = _emm_data.ctx[ueid]; - } -#endif - - if (emm_ctx) { - /* Stop timer T3470 */ - LOG_TRACE(INFO, "EMM-PROC - Stop timer T3470 (%d)", emm_ctx->T3470.id); - emm_ctx->T3470.id = nas_timer_stop(emm_ctx->T3470.id); - MSC_LOG_EVENT(MSC_NAS_EMM_MME, "0 T3470 stopped UE "NAS_UE_ID_FMT" ", ueid); - - if (imsi) { - /* Update the IMSI */ - if (emm_ctx->imsi == NULL) { - emm_ctx->imsi = (imsi_t *)malloc(sizeof(imsi_t)); - } - - if (emm_ctx->imsi) { - memcpy(emm_ctx->imsi, imsi, sizeof(imsi_t)); - } - } else if (imei) { - /* Update the IMEI */ - if (emm_ctx->imei == NULL) { - emm_ctx->imei = (imei_t *)malloc(sizeof(imei_t)); - } - - if (emm_ctx->imei) { - memcpy(emm_ctx->imei, imei, sizeof(imei_t)); - } - } else if (tmsi) { - /* Update the GUTI */ - if (emm_ctx->guti == NULL) { - emm_ctx->guti = (GUTI_t *)malloc(sizeof(GUTI_t)); - } - - if (emm_ctx->guti) { - memcpy(&emm_ctx->guti->gummei, - &_emm_data.conf.gummei, sizeof(gummei_t)); - emm_ctx->guti->m_tmsi = *tmsi; - } - } - - /* - * Notify EMM that the identification procedure successfully completed - */ - MSC_LOG_TX_MESSAGE( - MSC_NAS_EMM_MME, - MSC_NAS_EMM_MME, - NULL,0, - "0 EMMREG_COMMON_PROC_CNF ue id "NAS_UE_ID_FMT" ", ueid); - - emm_sap.primitive = EMMREG_COMMON_PROC_CNF; - emm_sap.u.emm_reg.ueid = ueid; - emm_sap.u.emm_reg.ctx = emm_ctx; - emm_sap.u.emm_reg.u.common.is_attached = emm_ctx->is_attached; - } else { - LOG_TRACE(ERROR, "EMM-PROC - No EMM context exists"); - /* - * Notify EMM that the identification procedure failed - */ - MSC_LOG_TX_MESSAGE( - MSC_NAS_EMM_MME, - MSC_NAS_EMM_MME, - NULL,0, - "0 EMMREG_COMMON_PROC_REJ ue id "NAS_UE_ID_FMT" ", ueid); - - emm_sap.primitive = EMMREG_COMMON_PROC_REJ; - emm_sap.u.emm_reg.ueid = ueid; - emm_sap.u.emm_reg.ctx = emm_ctx; - } - - rc = emm_sap_send(&emm_sap); - - LOG_FUNC_RETURN (rc); -} - - -/****************************************************************************/ -/********************* L O C A L F U N C T I O N S *********************/ -/****************************************************************************/ - -/* - * -------------------------------------------------------------------------- - * Timer handlers - * -------------------------------------------------------------------------- - */ - -/**************************************************************************** - ** ** - ** Name: _identification_t3470_handler() ** - ** ** - ** Description: T3470 timeout handler ** - ** Upon T3470 timer expiration, the identification request ** - ** message is retransmitted and the timer restarted. When ** - ** retransmission counter is exceed, the MME shall abort the ** - ** identification procedure and any ongoing EMM procedure. ** - ** ** - ** 3GPP TS 24.301, section 5.4.4.6, case b ** - ** ** - ** Inputs: args: handler parameters ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: None ** - ** Others: None ** - ** ** - ***************************************************************************/ -static void *_identification_t3470_handler(void *args) -{ - LOG_FUNC_IN; - - int rc; - - identification_data_t *data = (identification_data_t *)(args); - - /* Increment the retransmission counter */ - data->retransmission_count += 1; - - LOG_TRACE(WARNING, "EMM-PROC - T3470 timer expired, retransmission " - "counter = %d", data->retransmission_count); - - if (data->retransmission_count < IDENTIFICATION_COUNTER_MAX) { - /* Send identity request message to the UE */ - rc = _identification_request(data); - } else { - /* Set the failure notification indicator */ - data->notify_failure = TRUE; - /* Abort the identification procedure */ - rc = _identification_abort(data); - } - - LOG_FUNC_RETURN (NULL); -} - -/* - * -------------------------------------------------------------------------- - * MME specific local functions - * -------------------------------------------------------------------------- - */ - -/**************************************************************************** - ** ** - ** Name: _identification_request() ** - ** ** - ** Description: Sends IDENTITY REQUEST message and start timer T3470. ** - ** ** - ** Inputs: args: handler parameters ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: None ** - ** Others: T3470 ** - ** ** - ***************************************************************************/ -int _identification_request(identification_data_t *data) -{ - emm_sap_t emm_sap; - int rc; - - struct emm_data_context_s *emm_ctx = NULL; - - LOG_FUNC_IN; - - /* - * Notify EMM-AS SAP that Identity Request message has to be sent - * to the UE - */ - MSC_LOG_TX_MESSAGE( - MSC_NAS_EMM_MME, - MSC_NAS_EMM_MME, - NULL,0, - "0 EMMAS_SECURITY_REQ ue id "NAS_UE_ID_FMT" ", data->ueid); - - emm_sap.primitive = EMMAS_SECURITY_REQ; - emm_sap.u.emm_as.u.security.guti = NULL; - emm_sap.u.emm_as.u.security.ueid = data->ueid; - emm_sap.u.emm_as.u.security.msgType = EMM_AS_MSG_TYPE_IDENT; - emm_sap.u.emm_as.u.security.identType = data->type; - -#if defined(NAS_BUILT_IN_EPC) - if (data->ueid > 0) { - emm_ctx = emm_data_context_get(&_emm_data, data->ueid); - } -#else - if (data->ueid < EMM_DATA_NB_UE_MAX) { - emm_ctx = _emm_data.ctx[data->ueid]; - } -#endif - /* Setup EPS NAS security data */ - emm_as_set_security_data(&emm_sap.u.emm_as.u.security.sctx, - emm_ctx->security, FALSE, TRUE); - rc = emm_sap_send(&emm_sap); - - if (rc != RETURNerror) { - if (emm_ctx->T3470.id != NAS_TIMER_INACTIVE_ID) { - /* Re-start T3470 timer */ - emm_ctx->T3470.id = nas_timer_restart(emm_ctx->T3470.id); - MSC_LOG_EVENT(MSC_NAS_EMM_MME, "0 T3470 restarted UE "NAS_UE_ID_FMT" ", data->ueid); - } else { - /* Start T3470 timer */ - emm_ctx->T3470.id = nas_timer_start(emm_ctx->T3470.sec, _identification_t3470_handler, - data); - MSC_LOG_EVENT(MSC_NAS_EMM_MME, "0 T3470 started UE "NAS_UE_ID_FMT" ", data->ueid); - } - - LOG_TRACE(INFO,"EMM-PROC - Timer T3470 (%d) expires in %ld seconds", - emm_ctx->T3470.id, emm_ctx->T3470.sec); - } - - LOG_FUNC_RETURN (rc); -} - -/**************************************************************************** - ** ** - ** Name: _identification_abort() ** - ** ** - ** Description: Aborts the identification procedure currently in progress ** - ** ** - ** Inputs: args: Identification data to be released ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: None ** - ** Others: T3470 ** - ** ** - ***************************************************************************/ -static int _identification_abort(void *args) -{ - LOG_FUNC_IN; - - int rc = RETURNerror; - - identification_data_t *data = (identification_data_t *)(args); - - if (data) { - unsigned int ueid = data->ueid; - int notify_failure = data->notify_failure; - struct emm_data_context_s *emm_ctx = NULL; - /* Get the UE context */ - #if defined(NAS_BUILT_IN_EPC) - if (ueid > 0) { - emm_ctx = emm_data_context_get(&_emm_data, ueid); - } - #else - if (ueid < EMM_DATA_NB_UE_MAX) { - emm_ctx = _emm_data.ctx[ueid]; - } - #endif - LOG_TRACE(WARNING, "EMM-PROC - Abort identification procedure " - "(ueid="NAS_UE_ID_FMT")", ueid); - - /* Stop timer T3470 */ - if (emm_ctx->T3470.id != NAS_TIMER_INACTIVE_ID) { - LOG_TRACE(INFO, "EMM-PROC - Stop timer T3470 (%d)", emm_ctx->T3470.id); - emm_ctx->T3470.id = nas_timer_stop(emm_ctx->T3470.id); - MSC_LOG_EVENT(MSC_NAS_EMM_MME, "0 T3470 stopped UE "NAS_UE_ID_FMT" ", data->ueid); - } - - /* Release retransmission timer paramaters */ - free(data); - - /* - * Notify EMM that the identification procedure failed - */ - if (notify_failure) { - MSC_LOG_TX_MESSAGE( - MSC_NAS_EMM_MME, - MSC_NAS_EMM_MME, - NULL,0, - "0 EMMREG_COMMON_PROC_REJ ue id "NAS_UE_ID_FMT" ", ueid); - emm_sap_t emm_sap; - emm_sap.primitive = EMMREG_COMMON_PROC_REJ; - emm_sap.u.emm_reg.ueid = ueid; - rc = emm_sap_send(&emm_sap); - } else { - rc = RETURNok; - } - } - - LOG_FUNC_RETURN(rc); -} - - diff --git a/openair-cn/NAS/MME/EMM/IdleMode.c b/openair-cn/NAS/MME/EMM/IdleMode.c deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/openair-cn/NAS/MME/EMM/IdleMode.h b/openair-cn/NAS/MME/EMM/IdleMode.h deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/openair-cn/NAS/MME/EMM/LowerLayer.c b/openair-cn/NAS/MME/EMM/LowerLayer.c deleted file mode 100644 index 2012164975..0000000000 --- a/openair-cn/NAS/MME/EMM/LowerLayer.c +++ /dev/null @@ -1,384 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source LowerLayer.c - -Version 0.1 - -Date 2012/03/14 - -Product NAS stack - -Subsystem EPS Mobility Management - -Author Frederic Maurel - -Description Defines EMM procedures executed by the Non-Access Stratum - upon receiving notifications from lower layers so that data - transfer succeed or failed, or NAS signalling connection is - released, or ESM unit data has been received from under layer, - and to request ESM unit data transfer to under layer. - -*****************************************************************************/ - -#include "LowerLayer.h" -#include "commonDef.h" -#include "nas_log.h" - -#include "emmData.h" - -#include "emm_sap.h" -#include "esm_sap.h" -#include "nas_log.h" - -#include <string.h> // memset - -/****************************************************************************/ -/**************** E X T E R N A L D E F I N I T I O N S ****************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************* L O C A L D E F I N I T I O N S *******************/ -/****************************************************************************/ - - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -/* - * -------------------------------------------------------------------------- - * Lower layer notification handlers - * -------------------------------------------------------------------------- - */ - -/**************************************************************************** - ** ** - ** Name: lowerlayer_success() ** - ** ** - ** Description: Notify the EPS Mobility Management entity that data have ** - ** been successfully delivered to the network ** - ** ** - ** Inputs: ueid: UE lower layer identifier ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int lowerlayer_success(unsigned int ueid) -{ - LOG_FUNC_IN; - - emm_sap_t emm_sap; - int rc; - - emm_sap.primitive = EMMREG_LOWERLAYER_SUCCESS; - emm_sap.u.emm_reg.ueid = ueid; - emm_sap.u.emm_reg.ctx = NULL; - rc = emm_sap_send(&emm_sap); - - LOG_FUNC_RETURN (rc); -} - -/**************************************************************************** - ** ** - ** Name: lowerlayer_failure() ** - ** ** - ** Description: Notify the EPS Mobility Management entity that lower la- ** - ** yers failed to deliver data to the network ** - ** ** - ** Inputs: ueid: UE lower layer identifier ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int lowerlayer_failure(unsigned int ueid) -{ - LOG_FUNC_IN; - - emm_sap_t emm_sap; - int rc; - - emm_sap.primitive = EMMREG_LOWERLAYER_FAILURE; - emm_sap.u.emm_reg.ueid = ueid; -#if defined(NAS_BUILT_IN_EPC) - emm_data_context_t *emm_ctx = NULL; - if (ueid > 0) { - emm_ctx = emm_data_context_get(&_emm_data, ueid); - } - emm_sap.u.emm_reg.ctx = emm_ctx; -#else - emm_sap.u.emm_reg.ctx = NULL; -#endif - rc = emm_sap_send(&emm_sap); - - LOG_FUNC_RETURN (rc); -} - -/**************************************************************************** - ** ** - ** Name: lowerlayer_establish() ** - ** ** - ** Description: Update the EPS connection management status upon recei- ** - ** ving indication so that the NAS signalling connection is ** - ** established ** - ** ** - ** Inputs: None ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int lowerlayer_establish(void) -{ - LOG_FUNC_IN; - LOG_FUNC_RETURN (RETURNok); -} - -/**************************************************************************** - ** ** - ** Name: lowerlayer_release() ** - ** ** - ** Description: Notify the EPS Mobility Management entity that NAS signal-** - ** ling connection has been released ** - ** ** - ** Inputs: cause: Release cause ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int lowerlayer_release(int cause) -{ - LOG_FUNC_IN; - - emm_sap_t emm_sap; - int rc; - - emm_sap.primitive = EMMREG_LOWERLAYER_RELEASE; - emm_sap.u.emm_reg.ueid = 0; - emm_sap.u.emm_reg.ctx = NULL; - rc = emm_sap_send(&emm_sap); - - LOG_FUNC_RETURN (rc); -} - -/**************************************************************************** - ** ** - ** Name: lowerlayer_data_ind() ** - ** ** - ** Description: Notify the EPS Session Management entity that data have ** - ** been received from lower layers ** - ** ** - ** Inputs: ueid: UE lower layer identifier ** - ** data: Data transfered from lower layers ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int lowerlayer_data_ind(unsigned int ueid, const OctetString *data) -{ - esm_sap_t esm_sap; - int rc; - emm_data_context_t *emm_ctx = NULL; - - LOG_FUNC_IN; - -#if defined(NAS_BUILT_IN_EPC) - if (ueid > 0) { - emm_ctx = emm_data_context_get(&_emm_data, ueid); - } - -#endif - - esm_sap.primitive = ESM_UNITDATA_IND; - esm_sap.is_standalone = TRUE; - esm_sap.ueid = ueid; - esm_sap.ctx = emm_ctx; - esm_sap.recv = data; - rc = esm_sap_send(&esm_sap); - - LOG_FUNC_RETURN (rc); -} - -/**************************************************************************** - ** ** - ** Name: lowerlayer_data_req() ** - ** ** - ** Description: Notify the EPS Mobility Management entity that data have ** - ** to be transfered to lower layers ** - ** ** - ** Inputs: ueid: UE lower layer identifier ** - ** data: Data to be transfered to lower layers ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int lowerlayer_data_req(unsigned int ueid, const OctetString *data) -{ - LOG_FUNC_IN; - - int rc; - emm_sap_t emm_sap; - emm_security_context_t *sctx = NULL; - struct emm_data_context_s *ctx = NULL; - - emm_sap.primitive = EMMAS_DATA_REQ; - emm_sap.u.emm_as.u.data.guti = NULL; - emm_sap.u.emm_as.u.data.ueid = ueid; -# if defined(NAS_BUILT_IN_EPC) - - if (ueid > 0) { - ctx = emm_data_context_get(&_emm_data, ueid); - } - -# else - - if (ueid < EMM_DATA_NB_UE_MAX) { - ctx = _emm_data.ctx[ueid]; - } - -# endif - - if (ctx) { - sctx = ctx->security; - } - emm_sap.u.emm_as.u.data.NASinfo = 0; - emm_sap.u.emm_as.u.data.NASmsg.length = data->length; - emm_sap.u.emm_as.u.data.NASmsg.value = data->value; - /* Setup EPS NAS security data */ - emm_as_set_security_data(&emm_sap.u.emm_as.u.data.sctx, sctx, FALSE, TRUE); - rc = emm_sap_send(&emm_sap); - - LOG_FUNC_RETURN (rc); -} - -/* - * -------------------------------------------------------------------------- - * EMM procedure handlers - * -------------------------------------------------------------------------- - */ - -/**************************************************************************** - ** ** - ** Name: emm_as_set_security_data() ** - ** ** - ** Description: Setup security data according to the given EPS security ** - ** context when data transfer to lower layers is requested ** - ** ** - ** Inputs: args: EPS security context currently in use ** - ** is_new: Indicates whether a new security context ** - ** has just been taken into use ** - ** is_ciphered: Indicates whether the NAS message has to ** - ** be sent ciphered ** - ** Others: None ** - ** ** - ** Outputs: data: EPS NAS security data to be setup ** - ** Return: None ** - ** Others: None ** - ** ** - ***************************************************************************/ -void emm_as_set_security_data(emm_as_security_data_t *data, const void *args, - int is_new, int is_ciphered) -{ - LOG_FUNC_IN; - - const emm_security_context_t *context = (emm_security_context_t *)(args); - - memset(data, 0, sizeof(emm_as_security_data_t)); - - if ( context && (context->type != EMM_KSI_NOT_AVAILABLE) ) { - /* 3GPP TS 24.301, sections 5.4.3.3 and 5.4.3.4 - * Once a valid EPS security context exists and has been taken - * into use, UE and MME shall cipher and integrity protect all - * NAS signalling messages with the selected NAS ciphering and - * NAS integrity algorithms */ - LOG_TRACE(INFO, - "EPS security context exists is new %u KSI %u SQN %u count %u", - is_new, - context->eksi, - context->ul_count.seq_num, - *(uint32_t *)(&context->ul_count)); - LOG_TRACE(INFO, - "knas_int %s",dump_octet_string(&context->knas_int)); - LOG_TRACE(INFO, - "knas_enc %s",dump_octet_string(&context->knas_enc)); - LOG_TRACE(INFO, - "kasme %s",dump_octet_string(&context->kasme)); - - data->is_new = is_new; - data->ksi = context->eksi; - data->sqn = context->dl_count.seq_num; - // LG data->count = *(uint32_t *)(&context->ul_count); - data->count = 0x00000000 | (context->dl_count.overflow << 8 ) | context->dl_count.seq_num; - /* NAS integrity and cyphering keys may not be available if the - * current security context is a partial EPS security context - * and not a full native EPS security context */ - data->k_int = &context->knas_int; - - if (is_ciphered) { - /* 3GPP TS 24.301, sections 4.4.5 - * When the UE establishes a new NAS signalling connection, - * it shall send initial NAS messages integrity protected - * and unciphered */ - /* 3GPP TS 24.301, section 5.4.3.2 - * The MME shall send the SECURITY MODE COMMAND message integrity - * protected and unciphered */ - LOG_TRACE(WARNING, - "EPS security context exists knas_enc"); - data->k_enc = &context->knas_enc; - } - } else { - LOG_TRACE(WARNING, "EMM_AS_NO_KEY_AVAILABLE"); - /* No valid EPS security context exists */ - data->ksi = EMM_AS_NO_KEY_AVAILABLE; - } - - LOG_FUNC_OUT; -} - -/****************************************************************************/ -/********************* L O C A L F U N C T I O N S *********************/ -/****************************************************************************/ - diff --git a/openair-cn/NAS/MME/EMM/LowerLayer.h b/openair-cn/NAS/MME/EMM/LowerLayer.h deleted file mode 100644 index a0cef2582b..0000000000 --- a/openair-cn/NAS/MME/EMM/LowerLayer.h +++ /dev/null @@ -1,79 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source lowerlayer.h - -Version 0.1 - -Date 2013/06/19 - -Product NAS stack - -Subsystem EPS Mobility Management - -Author Frederic Maurel - -Description Defines EMM procedures executed by the Non-Access Stratum - upon receiving notifications from lower layers so that data - transfer succeed or failed, or NAS signalling connection is - released, or ESM unit data has been received from under layer, - and to request ESM unit data transfer to under layer. - -*****************************************************************************/ -#ifndef __LOWERLAYER_H__ -#define __LOWERLAYER_H__ - -#include "OctetString.h" - -/****************************************************************************/ -/********************* G L O B A L C O N S T A N T S *******************/ -/****************************************************************************/ - - -/****************************************************************************/ -/************************ G L O B A L T Y P E S ************************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************** G L O B A L V A R I A B L E S ********************/ -/****************************************************************************/ - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -int lowerlayer_success(unsigned int ueid); -int lowerlayer_failure(unsigned int ueid); -int lowerlayer_establish(void); -int lowerlayer_release(int cause); - -int lowerlayer_data_ind(unsigned int ueid, const OctetString *data); -int lowerlayer_data_req(unsigned int ueid, const OctetString *data); - -#endif /* __LOWERLAYER_H__*/ diff --git a/openair-cn/NAS/MME/EMM/Makefile b/openair-cn/NAS/MME/EMM/Makefile deleted file mode 100644 index ef85807e8f..0000000000 --- a/openair-cn/NAS/MME/EMM/Makefile +++ /dev/null @@ -1,72 +0,0 @@ -################################################################################ -# 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@eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ -ifndef PROJDIR -PROJDIR = $(PWD)/../.. -endif - -include $(PROJDIR)/Makerules -include $(PROJDIR)/Makefile.inc - -INCLUDES = -I. \ - -I$(INCDIR) \ - -I$(UTILDIR) \ - -I$(USIMAPIDIR) \ - -I$(MMEAPIDIR) \ - -I$(ESMDIR) \ - -I$(EMMSAPDIR) \ - -I$(ESMDIR) \ - -I$(ESMSAPDIR) \ - -I$(EMMMSGDIR) \ - -I$(IESDIR) \ - -I$(OPENAIRCN_DIR)/COMMON \ - -I$(OPENAIRCN_DIR)/SECU - - -all: $(OBJS) - @$(CD) $(EMMMSGDIR) && $(MAKE) - @$(CD) $(EMMSAPDIR) && $(MAKE) - -clean: - $(RM) $(OBJS) *.bak *~ - @$(CD) $(EMMSAPDIR) && $(MAKE) $@ - -veryclean: clean - @$(CD) $(EMMSAPDIR) && $(MAKE) $@ - @$(CD) $(EMMMSGDIR) && $(MAKE) $@ - $(RM) $(TARGET) - -%.o: %.c Makefile $(PROJDIR)/Makerules $(PROJDIR)/Makefile.inc - @echo Compiling $< - @$(CC) $(CFLAGS) -c $< -o $@ - -depend: - makedepend -- ${CFLAGS} -- ${SRCS} - -# DO NOT DELETE THIS LINE -- make depend depends on it. - diff --git a/openair-cn/NAS/MME/EMM/SAP/COPYING b/openair-cn/NAS/MME/EMM/SAP/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair-cn/NAS/MME/EMM/SAP/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program 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. - - This program 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 this program. If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - <program> Copyright (C) <year> <name of author> - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<http://www.gnu.org/licenses/>. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<http://www.gnu.org/philosophy/why-not-lgpl.html>. diff --git a/openair-cn/NAS/MME/EMM/SAP/EmmCommonProcedureInitiated.c b/openair-cn/NAS/MME/EMM/SAP/EmmCommonProcedureInitiated.c deleted file mode 100644 index 91fad0d62f..0000000000 --- a/openair-cn/NAS/MME/EMM/SAP/EmmCommonProcedureInitiated.c +++ /dev/null @@ -1,186 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** - -Source EmmCommonProcedureInitiated.c - -Version 0.1 - -Date 2012/10/03 - -Product NAS stack - -Subsystem EPS Mobility Management - -Author Frederic Maurel - -Description Implements the EPS Mobility Management procedures executed - when the EMM-SAP is in EMM-COMMON-PROCEDURE-INITIATED state. - - In EMM-COMMON-PROCEDURE-INITIATED state, the MME has started - a common EMM procedure and is waiting for a response from the - UE. - -*****************************************************************************/ - - -#include "emm_fsm.h" -#include "commonDef.h" -#include "nas_log.h" - -#include "EmmCommon.h" - -#include <assert.h> - -/****************************************************************************/ -/**************** E X T E R N A L D E F I N I T I O N S ****************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************* L O C A L D E F I N I T I O N S *******************/ -/****************************************************************************/ - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -/**************************************************************************** - ** ** - ** Name: EmmCommonProcedureInitiated() ** - ** ** - ** Description: Handles the behaviour of the MME while the EMM-SAP is in ** - ** EMM_COMMON_PROCEDURE_INITIATED state. ** - ** ** - ** 3GPP TS 24.301, section 5.1.3.4.2 ** - ** ** - ** Inputs: evt: The received EMM-SAP event ** - ** Others: emm_fsm_status ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: emm_fsm_status ** - ** ** - ***************************************************************************/ -int EmmCommonProcedureInitiated(const emm_reg_t *evt) -{ - int rc = RETURNerror; - - LOG_FUNC_IN; - - assert(emm_fsm_get_status(evt->ueid, - evt->ctx) == EMM_COMMON_PROCEDURE_INITIATED); - - switch (evt->primitive) { - case _EMMREG_PROC_ABORT: - /* - * The EMM procedure that initiated EMM common procedure aborted - */ - rc = emm_proc_common_abort(evt->ueid); - break; - - case _EMMREG_COMMON_PROC_CNF: - - /* - * An EMM common procedure successfully completed; - */ - if (evt->u.common.is_attached) { - rc = emm_fsm_set_status(evt->ueid, evt->ctx, EMM_REGISTERED); - } else { - rc = emm_fsm_set_status(evt->ueid, evt->ctx, EMM_DEREGISTERED); - } - - if (rc != RETURNerror) { - rc = emm_proc_common_success(evt->ueid); - } - - break; - - case _EMMREG_COMMON_PROC_REJ: - /* - * An EMM common procedure failed; - * enter state EMM-DEREGISTERED. - */ - rc = emm_fsm_set_status(evt->ueid, evt->ctx, EMM_DEREGISTERED); - - if (rc != RETURNerror) { - rc = emm_proc_common_reject(evt->ueid); - } - - break; - - case _EMMREG_ATTACH_CNF: - /* - * Attach procedure successful and default EPS bearer - * context activated; - * enter state EMM-REGISTERED. - */ - rc = emm_fsm_set_status(evt->ueid, evt->ctx, EMM_REGISTERED); - break; - - case _EMMREG_ATTACH_REJ: - /* - * Attach procedure failed; - * enter state EMM-DEREGISTERED. - */ - rc = emm_fsm_set_status(evt->ueid, evt->ctx, EMM_DEREGISTERED); - break; - - case _EMMREG_LOWERLAYER_SUCCESS: - /* - * Data successfully delivered to the network - */ - rc = RETURNok; - break; - - case _EMMREG_LOWERLAYER_FAILURE: - /* - * Transmission failure occurred before the EMM common - * procedure being completed - */ - rc = emm_proc_common_failure(evt->ueid); - - if (rc != RETURNerror) { - rc = emm_fsm_set_status(evt->ueid, evt->ctx, EMM_DEREGISTERED); - } - - break; - - default: - LOG_TRACE(ERROR, "EMM-FSM - Primitive is not valid (%d)", - evt->primitive); - break; - } - - LOG_FUNC_RETURN (rc); -} - -/****************************************************************************/ -/********************* L O C A L F U N C T I O N S *********************/ -/****************************************************************************/ - diff --git a/openair-cn/NAS/MME/EMM/SAP/EmmDeregistered.c b/openair-cn/NAS/MME/EMM/SAP/EmmDeregistered.c deleted file mode 100644 index 627986ba14..0000000000 --- a/openair-cn/NAS/MME/EMM/SAP/EmmDeregistered.c +++ /dev/null @@ -1,157 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** - -Source EmmDeregistered.c - -Version 0.1 - -Date 2012/10/03 - -Product NAS stack - -Subsystem EPS Mobility Management - -Author Frederic Maurel - -Description Implements the EPS Mobility Management procedures executed - when the EMM-SAP is in EMM-DEREGISTERED state. - - In EMM-DEREGISTERED state, no EMM context has been established - or the EMM context is marked as detached. - The UE shall start the attach or combined attach procedure to - establish an EMM context. - - The MME may answer to an attach or a combined attach procedure - initiated by the UE. It may also answer to a tracking area - updating procedure or combined tracking area updating procedure - initiated by a UE if the EMM context is marked as detached. - -*****************************************************************************/ - -#include "emm_fsm.h" -#include "commonDef.h" -#include "networkDef.h" -#include "nas_log.h" - -#include "emm_proc.h" - -#include <assert.h> - -/****************************************************************************/ -/**************** E X T E R N A L D E F I N I T I O N S ****************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************* L O C A L D E F I N I T I O N S *******************/ -/****************************************************************************/ - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -/**************************************************************************** - ** ** - ** Name: EmmDeregistered() ** - ** ** - ** Description: Handles the behaviour of the UE and the MME while the ** - ** EMM-SAP is in EMM-DEREGISTERED state. ** - ** ** - ** 3GPP TS 24.301, section 5.2.2.2 ** - ** ** - ** Inputs: evt: The received EMM-SAP event ** - ** Others: emm_fsm_status ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: emm_fsm_status ** - ** ** - ***************************************************************************/ -int EmmDeregistered(const emm_reg_t *evt) -{ - LOG_FUNC_IN; - - int rc = RETURNerror; - - assert(emm_fsm_get_status(evt->ueid, evt->ctx) == EMM_DEREGISTERED); - - switch (evt->primitive) { - - case _EMMREG_PROC_ABORT: - /* - * Ongoing EMM procedure aborted - */ - rc = RETURNok; - break; - - case _EMMREG_COMMON_PROC_REQ: - /* - * An EMM common procedure has been initiated; - * enter state EMM-COMMON-PROCEDURE-INITIATED. - */ - rc = emm_fsm_set_status(evt->ueid, evt->ctx, EMM_COMMON_PROCEDURE_INITIATED); - break; - - case _EMMREG_ATTACH_CNF: - /* - * Attach procedure successful and default EPS bearer - * context activated; - * enter state EMM-REGISTERED. - */ - rc = emm_fsm_set_status(evt->ueid, evt->ctx, EMM_REGISTERED); - break; - - case _EMMREG_LOWERLAYER_SUCCESS: - /* - * Data successfully delivered to the network - */ - rc = RETURNok; - break; - - case _EMMREG_LOWERLAYER_FAILURE: - /* - * Data failed to be delivered to the network - */ - rc = RETURNok; - break; - - default: - LOG_TRACE(ERROR, "EMM-FSM - Primitive is not valid (%d)", - evt->primitive); - break; - } - - - LOG_FUNC_RETURN (rc); -} - -/****************************************************************************/ -/********************* L O C A L F U N C T I O N S *********************/ -/****************************************************************************/ - diff --git a/openair-cn/NAS/MME/EMM/SAP/EmmDeregisteredAttachNeeded.c b/openair-cn/NAS/MME/EMM/SAP/EmmDeregisteredAttachNeeded.c deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/openair-cn/NAS/MME/EMM/SAP/EmmDeregisteredAttemptingToAttach.c b/openair-cn/NAS/MME/EMM/SAP/EmmDeregisteredAttemptingToAttach.c deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/openair-cn/NAS/MME/EMM/SAP/EmmDeregisteredInitiated.c b/openair-cn/NAS/MME/EMM/SAP/EmmDeregisteredInitiated.c deleted file mode 100644 index 74cb43fbb5..0000000000 --- a/openair-cn/NAS/MME/EMM/SAP/EmmDeregisteredInitiated.c +++ /dev/null @@ -1,110 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source EmmDeregisteredInitiated.c - -Version 0.1 - -Date 2012/10/03 - -Product NAS stack - -Subsystem EPS Mobility Management - -Author Frederic Maurel - -Description Implements the EPS Mobility Management procedures executed - when the EMM-SAP is in EMM-DEREGISTERED-INITIATED state. - - In EMM-DEREGISTERED-INITIATED state, the UE has requested - release of the EMM context by starting the detach or combined - detach procedure and is waiting for a response from the MME. - The MME has started a detach procedure and is waiting for a - response from the UE. - -*****************************************************************************/ - -#include "emm_fsm.h" -#include "commonDef.h" -#include "nas_log.h" - -#include "emm_proc.h" - -#include <assert.h> - -/****************************************************************************/ -/**************** E X T E R N A L D E F I N I T I O N S ****************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************* L O C A L D E F I N I T I O N S *******************/ -/****************************************************************************/ - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -/**************************************************************************** - ** ** - ** Name: EmmDeregisteredInitiated() ** - ** ** - ** Description: Handles the behaviour of the UE and the MME while the ** - ** EMM-SAP is in EMM-DEREGISTERED-INITIATED state. ** - ** ** - ** Inputs: evt: The received EMM-SAP event ** - ** Others: emm_fsm_status ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: emm_fsm_status ** - ** ** - ***************************************************************************/ -int EmmDeregisteredInitiated(const emm_reg_t *evt) -{ - LOG_FUNC_IN; - - int rc = RETURNerror; - - assert(emm_fsm_get_status(evt->ueid, evt->ctx) == EMM_DEREGISTERED_INITIATED); - - switch (evt->primitive) { - - default: - LOG_TRACE(ERROR, "EMM-FSM - Primitive is not valid (%d)", - evt->primitive); - break; - } - - LOG_FUNC_RETURN (rc); -} - -/****************************************************************************/ -/********************* L O C A L F U N C T I O N S *********************/ -/****************************************************************************/ - diff --git a/openair-cn/NAS/MME/EMM/SAP/EmmDeregisteredLimitedService.c b/openair-cn/NAS/MME/EMM/SAP/EmmDeregisteredLimitedService.c deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/openair-cn/NAS/MME/EMM/SAP/EmmDeregisteredNoCellAvailable.c b/openair-cn/NAS/MME/EMM/SAP/EmmDeregisteredNoCellAvailable.c deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/openair-cn/NAS/MME/EMM/SAP/EmmDeregisteredNoImsi.c b/openair-cn/NAS/MME/EMM/SAP/EmmDeregisteredNoImsi.c deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/openair-cn/NAS/MME/EMM/SAP/EmmDeregisteredNormalService.c b/openair-cn/NAS/MME/EMM/SAP/EmmDeregisteredNormalService.c deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/openair-cn/NAS/MME/EMM/SAP/EmmDeregisteredPlmnSearch.c b/openair-cn/NAS/MME/EMM/SAP/EmmDeregisteredPlmnSearch.c deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/openair-cn/NAS/MME/EMM/SAP/EmmNull.c b/openair-cn/NAS/MME/EMM/SAP/EmmNull.c deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/openair-cn/NAS/MME/EMM/SAP/EmmRegistered.c b/openair-cn/NAS/MME/EMM/SAP/EmmRegistered.c deleted file mode 100644 index 5c311dc8ee..0000000000 --- a/openair-cn/NAS/MME/EMM/SAP/EmmRegistered.c +++ /dev/null @@ -1,153 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source EmmRegistered.c - -Version 0.1 - -Date 2012/10/03 - -Product NAS stack - -Subsystem EPS Mobility Management - -Author Frederic Maurel - -Description Implements the EPS Mobility Management procedures executed - when the EMM-SAP is in EMM-REGISTERED state. - - In EMM-REGISTERED state, an EMM context has been established - and a default EPS bearer context has been activated in the UE - and the MME. - The UE may initiate sending and receiving user data and signal- - ling information and reply to paging. Additionally, tracking - area updating or combined tracking area updating procedure is - performed. - -*****************************************************************************/ - -#include "emm_fsm.h" -#include "commonDef.h" -#include "networkDef.h" -#include "nas_log.h" - -#include "emm_proc.h" - -#include <assert.h> - -/****************************************************************************/ -/**************** E X T E R N A L D E F I N I T I O N S ****************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************* L O C A L D E F I N I T I O N S *******************/ -/****************************************************************************/ - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -/**************************************************************************** - ** ** - ** Name: EmmRegistered() ** - ** ** - ** Description: Handles the behaviour of the UE and the MME while the ** - ** EMM-SAP is in EMM-REGISTERED state. ** - ** ** - ** Inputs: evt: The received EMM-SAP event ** - ** Others: emm_fsm_status ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: emm_fsm_status ** - ** ** - ***************************************************************************/ -int EmmRegistered(const emm_reg_t *evt) -{ - LOG_FUNC_IN; - - int rc = RETURNerror; - - assert(emm_fsm_get_status(evt->ueid, evt->ctx) == EMM_REGISTERED); - - switch (evt->primitive) { - - - - case _EMMREG_DETACH_REQ: - /* - * Network detach has been requested (implicit detach); - * enter state EMM-DEREGISTERED - */ - rc = emm_fsm_set_status(evt->ueid, evt->ctx, EMM_DEREGISTERED); - break; - - case _EMMREG_COMMON_PROC_REQ: - /* - * An EMM common procedure has been initiated; - * enter state EMM-COMMON-PROCEDURE-INITIATED. - */ - rc = emm_fsm_set_status(evt->ueid, evt->ctx, EMM_COMMON_PROCEDURE_INITIATED); - break; - - case _EMMREG_TAU_REJ: - /* - * TODO: Tracking Area Update has been rejected - */ - LOG_TRACE(ERROR, "EMM-FSM - Tracking Area Update procedure " - "is not implemented"); - break; - - case _EMMREG_LOWERLAYER_SUCCESS: - /* - * Data successfully delivered to the network - */ - rc = RETURNok; - break; - - case _EMMREG_LOWERLAYER_FAILURE: - /* - * Data failed to be delivered to the network - */ - rc = RETURNok; - break; - - default: - LOG_TRACE(ERROR, "EMM-FSM - Primitive is not valid (%d)", - evt->primitive); - break; - } - - LOG_FUNC_RETURN (rc); -} - -/****************************************************************************/ -/********************* L O C A L F U N C T I O N S *********************/ -/****************************************************************************/ - diff --git a/openair-cn/NAS/MME/EMM/SAP/EmmRegisteredAttemptingToUpdate.c b/openair-cn/NAS/MME/EMM/SAP/EmmRegisteredAttemptingToUpdate.c deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/openair-cn/NAS/MME/EMM/SAP/EmmRegisteredImsiDetachInitiated.c b/openair-cn/NAS/MME/EMM/SAP/EmmRegisteredImsiDetachInitiated.c deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/openair-cn/NAS/MME/EMM/SAP/EmmRegisteredInitiated.c b/openair-cn/NAS/MME/EMM/SAP/EmmRegisteredInitiated.c deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/openair-cn/NAS/MME/EMM/SAP/EmmRegisteredLimitedService.c b/openair-cn/NAS/MME/EMM/SAP/EmmRegisteredLimitedService.c deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/openair-cn/NAS/MME/EMM/SAP/EmmRegisteredNoCellAvailable.c b/openair-cn/NAS/MME/EMM/SAP/EmmRegisteredNoCellAvailable.c deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/openair-cn/NAS/MME/EMM/SAP/EmmRegisteredNormalService.c b/openair-cn/NAS/MME/EMM/SAP/EmmRegisteredNormalService.c deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/openair-cn/NAS/MME/EMM/SAP/EmmRegisteredPlmnSearch.c b/openair-cn/NAS/MME/EMM/SAP/EmmRegisteredPlmnSearch.c deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/openair-cn/NAS/MME/EMM/SAP/EmmRegisteredUpdateNeeded.c b/openair-cn/NAS/MME/EMM/SAP/EmmRegisteredUpdateNeeded.c deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/openair-cn/NAS/MME/EMM/SAP/EmmServiceRequestInitiated.c b/openair-cn/NAS/MME/EMM/SAP/EmmServiceRequestInitiated.c deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/openair-cn/NAS/MME/EMM/SAP/EmmTrackingAreaUpdatingInitiated.c b/openair-cn/NAS/MME/EMM/SAP/EmmTrackingAreaUpdatingInitiated.c deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/openair-cn/NAS/MME/EMM/SAP/Makefile b/openair-cn/NAS/MME/EMM/SAP/Makefile deleted file mode 100644 index 735d35bf8e..0000000000 --- a/openair-cn/NAS/MME/EMM/SAP/Makefile +++ /dev/null @@ -1,70 +0,0 @@ -################################################################################ -# 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@eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ -ifndef PROJDIR -PROJDIR = $(PWD)/../../.. -endif - -include $(PROJDIR)/Makerules -include $(PROJDIR)/Makefile.inc - -INCLUDES = -I. -I$(INCDIR) -I$(UTILDIR) -I$(IESDIR) -I$(MMEAPIDIR) \ - -I$(EMMDIR) -I$(EMMMSGDIR) -I$(ESMDIR) -I$(ESMMSGDIR) -I$(NETAPIDIR) - -TARGET = $(LIBEMMSAP) -TARGETS = $(TARGET).a $(TARGET).so - -all: $(TARGETS) - -%.o: %.c Makefile $(PROJDIR)/Makerules $(PROJDIR)/Makefile.inc - @echo Compiling $< - @$(CC) $(CFLAGS) -c $< -o $@ - -$(TARGET).a: $(OBJS) - @$(RM) $@ - @$(AR) $(ARFLAGS) $@ $(OBJS) - @echo Replacing $@ to $(LIBPROCESS) - @$(RM) $(LIBPROCESS)/$@ - @$(CP) $@ $(LIBPROCESS) - -$(TARGET).so: $(OBJS) - @$(LD) -G -o $@ $(OBJS) - @echo Replacing $@ to $(LIBPROCESS) - @$(RM) $(LIBPROCESS)/$@ - @$(CP) $@ $(LIBPROCESS) - -clean: - $(RM) $(OBJS) *.bak *~ - -veryclean: clean - $(RM) $(TARGETS) - -depend: - makedepend -- ${CFLAGS} -- ${SRCS} - -# DO NOT DELETE THIS LINE -- make depend depends on it. diff --git a/openair-cn/NAS/MME/EMM/SAP/emm_as.c b/openair-cn/NAS/MME/EMM/SAP/emm_as.c deleted file mode 100644 index 882c9e800e..0000000000 --- a/openair-cn/NAS/MME/EMM/SAP/emm_as.c +++ /dev/null @@ -1,1763 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** - -Source emm_as.c - -Version 0.1 - -Date 2012/10/16 - -Product NAS stack - -Subsystem EPS Mobility Management - -Author Frederic Maurel - -Description Defines the EMMAS Service Access Point that provides - services to the EPS Mobility Management for NAS message - transfer to/from the Access Stratum sublayer. - -*****************************************************************************/ - -#include "emm_as.h" -#include "emm_recv.h" -#include "emm_send.h" -#include "emmData.h" -#include "commonDef.h" -#include "nas_log.h" - -#include "TLVDecoder.h" -#include "as_message.h" -#include "nas_message.h" - -#include "emm_cause.h" -#include "LowerLayer.h" - -#include <string.h> // memset -#include <stdlib.h> // malloc, free - -#if defined(NAS_BUILT_IN_EPC) -# include "nas_itti_messaging.h" -#endif -#include "msc.h" - -/****************************************************************************/ -/**************** E X T E R N A L D E F I N I T I O N S ****************/ -/****************************************************************************/ - - -extern int emm_proc_status(unsigned int ueid, int emm_cause); - -/****************************************************************************/ -/******************* L O C A L D E F I N I T I O N S *******************/ -/****************************************************************************/ - -/* - * String representation of EMMAS-SAP primitives - */ -static const char *_emm_as_primitive_str[] = { - "EMMAS_SECURITY_REQ", - "EMMAS_SECURITY_IND", - "EMMAS_SECURITY_RES", - "EMMAS_SECURITY_REJ", - "EMMAS_ESTABLISH_REQ", - "EMMAS_ESTABLISH_CNF", - "EMMAS_ESTABLISH_REJ", - "EMMAS_RELEASE_REQ", - "EMMAS_RELEASE_IND", - "EMMAS_DATA_REQ", - "EMMAS_DATA_IND", - "EMMAS_PAGE_IND", - "EMMAS_STATUS_IND", - "EMMAS_CELL_INFO_REQ", - "EMMAS_CELL_INFO_RES", - "EMMAS_CELL_INFO_IND", -}; - -/* - * Functions executed to process EMM procedures upon receiving - * data from the network - */ -static int _emm_as_recv(unsigned int ueid, const char *msg, int len, - int *emm_cause); - - -static int _emm_as_establish_req(const emm_as_establish_t *msg, int *emm_cause); -static int _emm_as_cell_info_res(const emm_as_cell_info_t *msg); -static int _emm_as_cell_info_ind(const emm_as_cell_info_t *msg); -static int _emm_as_data_ind(const emm_as_data_t *msg, int *emm_cause); - -/* - * Functions executed to send data to the network when requested - * within EMM procedure processing - */ -static EMM_msg *_emm_as_set_header(nas_message_t *msg, - const emm_as_security_data_t *security); -static int -_emm_as_encode( - as_nas_info_t *info, - nas_message_t *msg, - int length, - emm_security_context_t *emm_security_context); - -static int _emm_as_encrypt( - as_nas_info_t *info, - const nas_message_security_header_t *header, - const char *buffer, - int length, - emm_security_context_t *emm_security_context); - -static int _emm_as_send(const emm_as_t *msg); - -static int _emm_as_security_req(const emm_as_security_t *, - dl_info_transfer_req_t *); -static int _emm_as_security_rej(const emm_as_security_t *, - dl_info_transfer_req_t *); -static int _emm_as_establish_cnf(const emm_as_establish_t *, - nas_establish_rsp_t *); -static int _emm_as_establish_rej(const emm_as_establish_t *, - nas_establish_rsp_t *); -static int _emm_as_page_ind(const emm_as_page_t *, paging_req_t *); - -static int _emm_as_cell_info_req(const emm_as_cell_info_t *, cell_info_req_t *); - -static int _emm_as_data_req(const emm_as_data_t *, ul_info_transfer_req_t *); -static int _emm_as_status_ind(const emm_as_status_t *, ul_info_transfer_req_t *); -static int _emm_as_release_req(const emm_as_release_t *, nas_release_req_t *); - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -/**************************************************************************** - ** ** - ** Name: emm_as_initialize() ** - ** ** - ** Description: Initializes the EMMAS Service Access Point ** - ** ** - ** Inputs: None ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: None ** - ** Others: NONE ** - ** ** - ***************************************************************************/ -void emm_as_initialize(void) -{ - LOG_FUNC_IN; - - /* TODO: Initialize the EMMAS-SAP */ - - LOG_FUNC_OUT; -} - -/**************************************************************************** - ** ** - ** Name: emm_as_send() ** - ** ** - ** Description: Processes the EMMAS Service Access Point primitive. ** - ** ** - ** Inputs: msg: The EMMAS-SAP primitive to process ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int emm_as_send(const emm_as_t *msg) -{ - LOG_FUNC_IN; - - int rc; - int emm_cause = EMM_CAUSE_SUCCESS; - emm_as_primitive_t primitive = msg->primitive; - - uint32_t ueid = 0; - - LOG_TRACE(INFO, "EMMAS-SAP - Received primitive %s (%d)", - _emm_as_primitive_str[primitive - _EMMAS_START - 1], primitive); - - switch (primitive) { - case _EMMAS_DATA_IND: - rc = _emm_as_data_ind(&msg->u.data, &emm_cause); - ueid = msg->u.data.ueid; - break; - - case _EMMAS_ESTABLISH_REQ: - rc = _emm_as_establish_req(&msg->u.establish, &emm_cause); - ueid = msg->u.establish.ueid; - break; - - case _EMMAS_CELL_INFO_RES: - rc = _emm_as_cell_info_res(&msg->u.cell_info); - break; - - case _EMMAS_CELL_INFO_IND: - rc = _emm_as_cell_info_ind(&msg->u.cell_info); - break; - - default: - /* Other primitives are forwarded to the Access Stratum */ - rc = _emm_as_send(msg); - - if (rc != RETURNok) { - LOG_TRACE(ERROR, "EMMAS-SAP - " - "Failed to process primitive %s (%d)", - _emm_as_primitive_str[primitive - _EMMAS_START - 1], - primitive); - LOG_FUNC_RETURN (RETURNerror); - } - - break; - } - - /* Handle decoding errors */ - if (emm_cause != EMM_CAUSE_SUCCESS) { - /* Ignore received message that is too short to contain a complete - * message type information element */ - if (rc == TLV_DECODE_BUFFER_TOO_SHORT) { - LOG_FUNC_RETURN (RETURNok); - } - /* Ignore received message that contains not supported protocol - * discriminator */ - else if (rc == TLV_DECODE_PROTOCOL_NOT_SUPPORTED) { - LOG_FUNC_RETURN (RETURNok); - } else if (rc == TLV_DECODE_WRONG_MESSAGE_TYPE) { - emm_cause = EMM_CAUSE_MESSAGE_TYPE_NOT_IMPLEMENTED; - } - - /* EMM message processing failed */ - LOG_TRACE(WARNING, "EMMAS-SAP - Received EMM message is not valid " - "(cause=%d)", emm_cause); - /* Return an EMM status message */ - rc = emm_proc_status(ueid, emm_cause); - } - - if (rc != RETURNok) { - LOG_TRACE(ERROR, "EMMAS-SAP - Failed to process primitive %s (%d)", - _emm_as_primitive_str[primitive - _EMMAS_START - 1], - primitive); - } - - LOG_FUNC_RETURN (rc); -} - -/****************************************************************************/ -/********************* L O C A L F U N C T I O N S *********************/ -/****************************************************************************/ - -/* - * -------------------------------------------------------------------------- - * Functions executed to process EMM procedures upon receiving data from the - * network - * -------------------------------------------------------------------------- - */ - -/**************************************************************************** - ** ** - ** Name: _emm_as_recv() ** - ** ** - ** Description: Decodes and processes the EPS Mobility Management message ** - ** received from the Access Stratum ** - ** ** - ** Inputs: ueid: UE lower layer identifier ** - ** msg: The EMM message to process ** - ** len: The length of the EMM message ** - ** Others: None ** - ** ** - ** Outputs: emm_cause: EMM cause code ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -static int _emm_as_recv(unsigned int ueid, const char *msg, int len, - int *emm_cause) -{ - LOG_FUNC_IN; - - int decoder_rc; - int rc = RETURNerror; - - LOG_TRACE(INFO, "EMMAS-SAP - Received EMM message (length=%d)", len); - - nas_message_t nas_msg; - memset(&nas_msg, 0 , sizeof(nas_message_t)); - - emm_security_context_t *security = NULL; /* Current EPS NAS security context */ -#if defined(NAS_BUILT_IN_EPC) - emm_data_context_t *emm_ctx = NULL; -#endif - -#if defined(NAS_BUILT_IN_EPC) - emm_ctx = emm_data_context_get(&_emm_data, ueid); - - if (emm_ctx) { - security = emm_ctx->security; - } - -#else - - if (ueid < EMM_DATA_NB_UE_MAX) { - emm_ctx = _emm_data.ctx[ueid]; - - if (emm_ctx) { - security = emm_ctx->security; - } - } - -#endif - - /* Decode the received message */ - decoder_rc = nas_message_decode(msg, &nas_msg, len, security); - - if (decoder_rc < 0) { - LOG_TRACE(WARNING, "EMMAS-SAP - Failed to decode NAS message " - "(err=%d)", decoder_rc); - *emm_cause = EMM_CAUSE_PROTOCOL_ERROR; - LOG_FUNC_RETURN (decoder_rc); - } - - /* Process NAS message */ - EMM_msg *emm_msg = &nas_msg.plain.emm; - - switch (emm_msg->header.message_type) { - case EMM_STATUS: - rc = emm_recv_status(ueid, &emm_msg->emm_status, emm_cause); - break; - - case ATTACH_REQUEST: - rc = emm_recv_attach_request( - ueid, - &emm_msg->attach_request, - emm_cause); - break; - - case IDENTITY_RESPONSE: - rc = emm_recv_identity_response( - ueid, - &emm_msg->identity_response, - emm_cause); - break; - - case AUTHENTICATION_RESPONSE: - rc = emm_recv_authentication_response( - ueid, - &emm_msg->authentication_response, - emm_cause); - break; - - case AUTHENTICATION_FAILURE: - rc = emm_recv_authentication_failure( - ueid, - &emm_msg->authentication_failure, - emm_cause); - break; - - case SECURITY_MODE_COMPLETE: - rc = emm_recv_security_mode_complete( - ueid, - &emm_msg->security_mode_complete, - emm_cause); - break; - - case SECURITY_MODE_REJECT: - rc = emm_recv_security_mode_reject(ueid, - &emm_msg->security_mode_reject, - emm_cause); - break; - - case ATTACH_COMPLETE: - rc = emm_recv_attach_complete(ueid, &emm_msg->attach_complete, - emm_cause); - break; - - case TRACKING_AREA_UPDATE_COMPLETE: - case GUTI_REALLOCATION_COMPLETE: - case UPLINK_NAS_TRANSPORT: - /* TODO */ - break; - - case DETACH_REQUEST: - rc = emm_recv_detach_request(ueid, &emm_msg->detach_request, - emm_cause); - break; - - default: - LOG_TRACE(WARNING, "EMMAS-SAP - EMM message 0x%x is not valid", - emm_msg->header.message_type); - *emm_cause = EMM_CAUSE_MESSAGE_TYPE_NOT_COMPATIBLE; - break; - } - - LOG_FUNC_RETURN (rc); -} - -/**************************************************************************** - ** ** - ** Name: _emm_as_data_ind() ** - ** ** - ** Description: Processes the EMMAS-SAP data transfer indication ** - ** primitive ** - ** ** - ** EMMAS-SAP - AS->EMM: DATA_IND - Data transfer procedure ** - ** ** - ** Inputs: msg: The EMMAS-SAP primitive to process ** - ** Others: None ** - ** ** - ** Outputs: emm_cause: EMM cause code ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -static int _emm_as_data_ind(const emm_as_data_t *msg, int *emm_cause) -{ - LOG_FUNC_IN; - - int rc = RETURNerror; - - LOG_TRACE(INFO, "EMMAS-SAP - Received AS data transfer indication " - "(ueid="NAS_UE_ID_FMT", delivered=%s, length=%d)", msg->ueid, - (msg->delivered)? "TRUE" : "FALSE", msg->NASmsg.length); - - if (msg->delivered) { - if (msg->NASmsg.length > 0) { - /* Process the received NAS message */ - char *plain_msg = (char *)malloc(msg->NASmsg.length); - - if (plain_msg) { - nas_message_security_header_t header; - emm_security_context_t *security = NULL; /* Current EPS NAS security context */ - - memset(&header, 0, sizeof(header)); - /* Decrypt the received security protected message */ - emm_data_context_t *emm_ctx = NULL; -#if defined(NAS_BUILT_IN_EPC) - - if (msg->ueid > 0) { - emm_ctx = emm_data_context_get(&_emm_data, msg->ueid); - - if (emm_ctx) { - security = emm_ctx->security; - } - } - -#else - - if (msg->ueid < EMM_DATA_NB_UE_MAX) { - emm_ctx = _emm_data.ctx[msg->ueid]; - - if (emm_ctx) { - security = emm_ctx->security; - } - } - -#endif - int bytes = nas_message_decrypt((char *)(msg->NASmsg.value), - plain_msg, - &header, - msg->NASmsg.length, - security - ); - - if (bytes < 0) { - /* Failed to decrypt the message */ - *emm_cause = EMM_CAUSE_PROTOCOL_ERROR; - LOG_FUNC_RETURN (bytes); - } else if (header.protocol_discriminator == - EPS_MOBILITY_MANAGEMENT_MESSAGE) { - /* Process EMM data */ - rc = _emm_as_recv(msg->ueid, plain_msg, bytes, emm_cause); - } else if (header.protocol_discriminator == - EPS_SESSION_MANAGEMENT_MESSAGE) { - const OctetString data = {bytes, (uint8_t *)plain_msg}; - /* Foward ESM data to EPS session management */ - rc = lowerlayer_data_ind(msg->ueid, &data); - } - - free(plain_msg); - } - } else { - /* Process successfull lower layer transfer indication */ - rc = lowerlayer_success(msg->ueid); - } - } else { - /* Process lower layer transmission failure of NAS message */ - rc = lowerlayer_failure(msg->ueid); - } - - LOG_FUNC_RETURN (rc); -} - -/**************************************************************************** - ** ** - ** Name: _emm_as_establish_req() ** - ** ** - ** Description: Processes the EMMAS-SAP connection establish request ** - ** primitive ** - ** ** - ** EMMAS-SAP - AS->EMM: ESTABLISH_REQ - NAS signalling connection ** - ** The AS notifies the NAS that establishment of the signal- ** - ** ling connection has been requested to tranfer initial NAS ** - ** message from the UE. ** - ** ** - ** Inputs: msg: The EMMAS-SAP primitive to process ** - ** Others: None ** - ** ** - ** Outputs: emm_cause: EMM cause code ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -static int _emm_as_establish_req(const emm_as_establish_t *msg, int *emm_cause) -{ - LOG_FUNC_IN; - - struct emm_data_context_s *emm_ctx = NULL; - emm_security_context_t *emm_security_context = NULL; - int decoder_rc; - int rc = RETURNerror; - - LOG_TRACE(INFO, "EMMAS-SAP - Received AS connection establish request"); - - nas_message_t nas_msg; - memset(&nas_msg, 0 , sizeof(nas_message_t)); - -#if defined(NAS_BUILT_IN_EPC) - emm_ctx = emm_data_context_get(&_emm_data, msg->ueid); -#else - - if (msg->ueid < EMM_DATA_NB_UE_MAX) { - emm_ctx = _emm_data.ctx[msg->ueid]; - } - -#endif - - if (emm_ctx) { - emm_security_context = emm_ctx->security; - } - - /* Decode initial NAS message */ - decoder_rc = nas_message_decode( - (char *)(msg->NASmsg.value), - &nas_msg, - msg->NASmsg.length, - emm_security_context); - - if (decoder_rc < TLV_DECODE_FATAL_ERROR) { - *emm_cause = EMM_CAUSE_PROTOCOL_ERROR; - LOG_FUNC_RETURN (decoder_rc); - } else if (decoder_rc == TLV_DECODE_UNEXPECTED_IEI) { - *emm_cause = EMM_CAUSE_IE_NOT_IMPLEMENTED; - } else if (decoder_rc < 0) { - *emm_cause = EMM_CAUSE_PROTOCOL_ERROR; - } - - /* Process initial NAS message */ - EMM_msg *emm_msg = &nas_msg.plain.emm; - - switch (emm_msg->header.message_type) { - case ATTACH_REQUEST: - rc = emm_recv_attach_request( - msg->ueid, - &emm_msg->attach_request, - emm_cause); - break; - - case DETACH_REQUEST: - rc = RETURNok; /* TODO */ - break; - - case TRACKING_AREA_UPDATE_REQUEST: - rc = emm_recv_tracking_area_update_request( - msg->ueid, - &emm_msg->tracking_area_update_request, - emm_cause); - break; - - case SERVICE_REQUEST: - rc = RETURNok; /* TODO */ - break; - - case EXTENDED_SERVICE_REQUEST: - rc = RETURNok; /* TODO */ - break; - - default: - LOG_TRACE(WARNING, "EMMAS-SAP - Initial NAS message 0x%x is " - "not valid", emm_msg->header.message_type); - *emm_cause = EMM_CAUSE_MESSAGE_TYPE_NOT_COMPATIBLE; - break; - } - - LOG_FUNC_RETURN (rc); -} - -/**************************************************************************** - ** ** - ** Name: _emm_as_cell_info_res() ** - ** ** - ** Description: Processes the EMMAS-SAP cell information response ** - ** primitive ** - ** ** - ** EMMAS-SAP - AS->EMM: CELL_INFO_RES - PLMN and cell selection procedure ** - ** The NAS received a response to cell selection request pre- ** - ** viously sent to the Access-Startum. If a suitable cell is ** - ** found to serve the selected PLMN with associated Radio Ac- ** - ** cess Technologies, this cell is selected to camp on. ** - ** ** - ** Inputs: msg: The EMMAS-SAP primitive to process ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -static int _emm_as_cell_info_res(const emm_as_cell_info_t *msg) -{ - LOG_FUNC_IN; - - int rc = RETURNok; - - LOG_TRACE(INFO, "EMMAS-SAP - Received AS cell information response"); - - - - LOG_FUNC_RETURN (rc); -} - -/**************************************************************************** - ** ** - ** Name: _emm_as_cell_info_ind() ** - ** ** - ** Description: Processes the EMMAS-SAP cell information indication ** - ** primitive ** - ** ** - ** EMMAS-SAP - AS->EMM: CELL_INFO_IND - PLMN and cell selection procedure ** - ** ** - ** Inputs: msg: The EMMAS-SAP primitive to process ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -static int _emm_as_cell_info_ind(const emm_as_cell_info_t *msg) -{ - LOG_FUNC_IN; - - int rc = RETURNok; - - LOG_TRACE(INFO, "EMMAS-SAP - Received AS cell information indication"); - - /* TODO */ - - LOG_FUNC_RETURN (rc); -} - -/* - * -------------------------------------------------------------------------- - * Functions executed to send data to the network when requested within EMM - * procedure processing - * -------------------------------------------------------------------------- - */ - -/**************************************************************************** - ** ** - ** Name: _emm_as_set_header() ** - ** ** - ** Description: Setup the security header of the given NAS message ** - ** ** - ** Inputs: security: The NAS security data to use ** - ** Others: None ** - ** ** - ** Outputs: msg: The NAS message ** - ** Return: Pointer to the plain NAS message to be se- ** - ** curity protected if setting of the securi- ** - ** ty header succeed; ** - ** NULL pointer otherwise ** - ** Others: None ** - ** ** - ***************************************************************************/ -static EMM_msg *_emm_as_set_header(nas_message_t *msg, - const emm_as_security_data_t *security) -{ - LOG_FUNC_IN; - - msg->header.protocol_discriminator = EPS_MOBILITY_MANAGEMENT_MESSAGE; - - if ( security && (security->ksi != EMM_AS_NO_KEY_AVAILABLE) ) { - /* A valid EPS security context exists */ - if (security->is_new) { - /* New EPS security context is taken into use */ - if (security->k_int) { - if (security->k_enc) { - /* NAS integrity and cyphering keys are available */ - msg->header.security_header_type = - SECURITY_HEADER_TYPE_INTEGRITY_PROTECTED_CYPHERED_NEW; - } else { - /* NAS integrity key only is available */ - msg->header.security_header_type = - SECURITY_HEADER_TYPE_INTEGRITY_PROTECTED_NEW; - } - - LOG_FUNC_RETURN (&msg->security_protected.plain.emm); - } - } else if (security->k_int) { - if (security->k_enc) { - /* NAS integrity and cyphering keys are available */ - msg->header.security_header_type = - SECURITY_HEADER_TYPE_INTEGRITY_PROTECTED_CYPHERED; - } else { - /* NAS integrity key only is available */ - msg->header.security_header_type = - SECURITY_HEADER_TYPE_INTEGRITY_PROTECTED; - } - - LOG_FUNC_RETURN (&msg->security_protected.plain.emm); - } else { - /* No valid EPS security context exists */ - msg->header.security_header_type = SECURITY_HEADER_TYPE_NOT_PROTECTED; - LOG_FUNC_RETURN (&msg->plain.emm); - } - } else { - /* No valid EPS security context exists */ - msg->header.security_header_type = SECURITY_HEADER_TYPE_NOT_PROTECTED; - LOG_FUNC_RETURN (&msg->plain.emm); - } - - /* A valid EPS security context exists but NAS integrity key - * is not available */ - LOG_FUNC_RETURN (NULL); -} - -/**************************************************************************** - ** ** - ** Name: _emm_as_encode() ** - ** ** - ** Description: Encodes NAS message into NAS information container ** - ** ** - ** Inputs: msg: The NAS message to encode ** - ** length: The maximum length of the NAS message ** - ** Others: None ** - ** ** - ** Outputs: info: The NAS information container ** - ** msg: The NAS message to encode ** - ** Return: The number of bytes successfully encoded ** - ** Others: None ** - ** ** - ***************************************************************************/ -static int -_emm_as_encode( - as_nas_info_t *info, - nas_message_t *msg, - int length, - emm_security_context_t *emm_security_context) -{ - LOG_FUNC_IN; - - int bytes = 0; - - if (msg->header.security_header_type != SECURITY_HEADER_TYPE_NOT_PROTECTED) { - emm_msg_header_t *header = &msg->security_protected.plain.emm.header; - /* Expand size of protected NAS message */ - length += NAS_MESSAGE_SECURITY_HEADER_SIZE; - /* Set header of plain NAS message */ - header->protocol_discriminator = EPS_MOBILITY_MANAGEMENT_MESSAGE; - header->security_header_type = SECURITY_HEADER_TYPE_NOT_PROTECTED; - } - - /* Allocate memory to the NAS information container */ - info->data = (Byte_t *)malloc(length * sizeof(Byte_t)); - - if (info->data != NULL) { - /* Encode the NAS message */ - bytes = nas_message_encode( - (char *)(info->data), - msg, - length, - emm_security_context); - - if (bytes > 0) { - info->length = bytes; - } else { - free(info->data); - info->length = 0; - info->data = NULL; - } - } - - LOG_FUNC_RETURN (bytes); -} - -/**************************************************************************** - ** ** - ** Name: _emm_as_encrypt() ** - ** ** - ** Description: Encryts NAS message into NAS information container ** - ** ** - ** Inputs: header: The Security header in used ** - ** msg: The NAS message to encrypt ** - ** length: The maximum length of the NAS message ** - ** Others: None ** - ** ** - ** Outputs: info: The NAS information container ** - ** Return: The number of bytes successfully encrypted ** - ** Others: None ** - ** ** - ***************************************************************************/ -static int -_emm_as_encrypt( - as_nas_info_t *info, - const nas_message_security_header_t *header, - const char *msg, - int length, - emm_security_context_t *emm_security_context) -{ - LOG_FUNC_IN; - - int bytes = 0; - - if (header->security_header_type != SECURITY_HEADER_TYPE_NOT_PROTECTED) { - /* Expand size of protected NAS message */ - length += NAS_MESSAGE_SECURITY_HEADER_SIZE; - } - - /* Allocate memory to the NAS information container */ - info->data = (Byte_t *)malloc(length * sizeof(Byte_t)); - - if (info->data != NULL) { - /* Encrypt the NAS information message */ - bytes = nas_message_encrypt( - msg, - (char *)(info->data), - header, - length, - emm_security_context); - - if (bytes > 0) { - info->length = bytes; - } else { - free(info->data); - info->length = 0; - info->data = NULL; - } - } - - LOG_FUNC_RETURN (bytes); -} - -/**************************************************************************** - ** ** - ** Name: _emm_as_send() ** - ** ** - ** Description: Builds NAS message according to the given EMMAS Service ** - ** Access Point primitive and sends it to the Access Stratum ** - ** sublayer ** - ** ** - ** Inputs: msg: The EMMAS-SAP primitive to be sent ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -static int _emm_as_send(const emm_as_t *msg) -{ - LOG_FUNC_IN; - - as_message_t as_msg; - memset(&as_msg, 0 , sizeof(as_message_t)); - - switch (msg->primitive) { - case _EMMAS_DATA_REQ: - as_msg.msgID = _emm_as_data_req( - &msg->u.data, - &as_msg.msg.ul_info_transfer_req); - break; - - case _EMMAS_STATUS_IND: - as_msg.msgID = _emm_as_status_ind( - &msg->u.status, - &as_msg.msg.ul_info_transfer_req); - break; - - case _EMMAS_RELEASE_REQ: - as_msg.msgID = _emm_as_release_req( - &msg->u.release, - &as_msg.msg.nas_release_req); - break; - - case _EMMAS_SECURITY_REQ: - as_msg.msgID = _emm_as_security_req( - &msg->u.security, - &as_msg.msg.dl_info_transfer_req); - break; - - case _EMMAS_SECURITY_REJ: - as_msg.msgID = _emm_as_security_rej( - &msg->u.security, - &as_msg.msg.dl_info_transfer_req); - break; - - case _EMMAS_ESTABLISH_CNF: - as_msg.msgID = _emm_as_establish_cnf( - &msg->u.establish, - &as_msg.msg.nas_establish_rsp); - break; - - case _EMMAS_ESTABLISH_REJ: - as_msg.msgID = _emm_as_establish_rej( - &msg->u.establish, - &as_msg.msg.nas_establish_rsp); - break; - - case _EMMAS_PAGE_IND: - as_msg.msgID = _emm_as_page_ind(&msg->u.page, - &as_msg.msg.paging_req); - break; - - - case _EMMAS_CELL_INFO_REQ: - as_msg.msgID = _emm_as_cell_info_req(&msg->u.cell_info, - &as_msg.msg.cell_info_req); - /* - * TODO: NAS may provide a list of equivalent PLMNs, if available, - * that AS shall use for cell selection and cell reselection. - */ - break; - - default: - as_msg.msgID = 0; - break; - } - - /* Send the message to the Access Stratum or S1AP in case of MME */ - if (as_msg.msgID > 0) { -#if defined(NAS_BUILT_IN_EPC) - LOG_TRACE(DEBUG, "EMMAS-SAP - " - "Sending msg with id 0x%x, primitive %s (%d) to S1AP layer for transmission", - as_msg.msgID, - _emm_as_primitive_str[msg->primitive - _EMMAS_START - 1], - msg->primitive); - - switch (as_msg.msgID) { - case AS_DL_INFO_TRANSFER_REQ: { - nas_itti_dl_data_req( - as_msg.msg.dl_info_transfer_req.UEid, - as_msg.msg.dl_info_transfer_req.nasMsg.data, - as_msg.msg.dl_info_transfer_req.nasMsg.length); - LOG_FUNC_RETURN (RETURNok); - } - break; - - case AS_NAS_ESTABLISH_RSP: - case AS_NAS_ESTABLISH_CNF: { - if (as_msg.msg.nas_establish_rsp.errCode != AS_SUCCESS) { - nas_itti_dl_data_req( - as_msg.msg.nas_establish_rsp.UEid, - as_msg.msg.nas_establish_rsp.nasMsg.data, - as_msg.msg.nas_establish_rsp.nasMsg.length); - LOG_FUNC_RETURN (RETURNok); - } else { - LOG_TRACE(DEBUG, "EMMAS-SAP - " - "Sending nas_itti_establish_cnf to S1AP UE ID 0x%x" - " selected_encryption_algorithm 0x%04X", - " selected_integrity_algorithm 0x%04X", - as_msg.msg.nas_establish_rsp.UEid, - as_msg.msg.nas_establish_rsp.selected_encryption_algorithm, - as_msg.msg.nas_establish_rsp.selected_integrity_algorithm); - /* Handle success case */ - nas_itti_establish_cnf( - as_msg.msg.nas_establish_rsp.UEid, - as_msg.msg.nas_establish_rsp.errCode, - as_msg.msg.nas_establish_rsp.nasMsg.data, - as_msg.msg.nas_establish_rsp.nasMsg.length, - as_msg.msg.nas_establish_rsp.selected_encryption_algorithm, - as_msg.msg.nas_establish_rsp.selected_integrity_algorithm); - LOG_FUNC_RETURN (RETURNok); - } - } - break; - - default: - break; - } - -#endif - } - - LOG_FUNC_RETURN (RETURNerror); -} - -/**************************************************************************** - ** ** - ** Name: _emm_as_data_req() ** - ** ** - ** Description: Processes the EMMAS-SAP data transfer request ** - ** primitive ** - ** ** - ** EMMAS-SAP - EMM->AS: DATA_REQ - Data transfer procedure ** - ** ** - ** Inputs: msg: The EMMAS-SAP primitive to process ** - ** Others: None ** - ** ** - ** Outputs: as_msg: The message to send to the AS ** - ** Return: The identifier of the AS message ** - ** Others: None ** - ** ** - ***************************************************************************/ -static int _emm_as_data_req(const emm_as_data_t *msg, - ul_info_transfer_req_t *as_msg) -{ - LOG_FUNC_IN; - - int size = 0; - int is_encoded = FALSE; - - LOG_TRACE(INFO, "EMMAS-SAP - Send AS data transfer request"); - - nas_message_t nas_msg; - memset(&nas_msg, 0 , sizeof(nas_message_t)); - - /* Setup the AS message */ - if (msg->guti) { - as_msg->s_tmsi.MMEcode = msg->guti->gummei.MMEcode; - as_msg->s_tmsi.m_tmsi = msg->guti->m_tmsi; - } else { - as_msg->UEid = msg->ueid; - } - - /* Setup the NAS security header */ - EMM_msg *emm_msg = _emm_as_set_header(&nas_msg, &msg->sctx); - - /* Setup the NAS information message */ - if (emm_msg != NULL) switch (msg->NASinfo) { - - case EMM_AS_NAS_DATA_DETACH: - size = emm_send_detach_accept(msg, &emm_msg->detach_accept); - break; - - default: - /* Send other NAS messages as already encoded ESM messages */ - size = msg->NASmsg.length; - is_encoded = TRUE; - break; - } - - if (size > 0) { - int bytes; - emm_security_context_t *emm_security_context = NULL; - struct emm_data_context_s *emm_ctx = NULL; -#if defined(NAS_BUILT_IN_EPC) - emm_ctx = emm_data_context_get(&_emm_data, msg->ueid); -#else - - if (msg->ueid < EMM_DATA_NB_UE_MAX) { - emm_ctx = _emm_data.ctx[msg->ueid]; - } - -#endif - - if (emm_ctx) { - emm_security_context = emm_ctx->security; - } - - - - if (emm_security_context) { - nas_msg.header.sequence_number = emm_security_context->dl_count.seq_num; - LOG_TRACE(DEBUG, - "Set nas_msg.header.sequence_number -> %u", - nas_msg.header.sequence_number); - } - - if (!is_encoded) { - /* Encode the NAS information message */ - bytes = _emm_as_encode(&as_msg->nasMsg, - &nas_msg, - size, - emm_security_context); - } else { - /* Encrypt the NAS information message */ - bytes = _emm_as_encrypt(&as_msg->nasMsg, - &nas_msg.header, - (char *)(msg->NASmsg.value), - size, - emm_security_context); - } - - if (bytes > 0) { - LOG_FUNC_RETURN (AS_DL_INFO_TRANSFER_REQ); - } - } - - LOG_FUNC_RETURN (0); -} - -/**************************************************************************** - ** ** - ** Name: _emm_as_status_ind() ** - ** ** - ** Description: Processes the EMMAS-SAP status indication primitive ** - ** ** - ** EMMAS-SAP - EMM->AS: STATUS_IND - EMM status report procedure ** - ** ** - ** Inputs: msg: The EMMAS-SAP primitive to process ** - ** Others: None ** - ** ** - ** Outputs: as_msg: The message to send to the AS ** - ** Return: The identifier of the AS message ** - ** Others: None ** - ** ** - ***************************************************************************/ -static int _emm_as_status_ind(const emm_as_status_t *msg, - ul_info_transfer_req_t *as_msg) -{ - LOG_FUNC_IN; - - int size = 0; - - LOG_TRACE(INFO, "EMMAS-SAP - Send AS status indication (cause=%d)", - msg->emm_cause); - - nas_message_t nas_msg; - memset(&nas_msg, 0 , sizeof(nas_message_t)); - - /* Setup the AS message */ - if (msg->guti) { - as_msg->s_tmsi.MMEcode = msg->guti->gummei.MMEcode; - as_msg->s_tmsi.m_tmsi = msg->guti->m_tmsi; - } else { - as_msg->UEid = msg->ueid; - } - - /* Setup the NAS security header */ - EMM_msg *emm_msg = _emm_as_set_header(&nas_msg, &msg->sctx); - - /* Setup the NAS information message */ - if (emm_msg != NULL) { - size = emm_send_status(msg, &emm_msg->emm_status); - } - - if (size > 0) { - emm_security_context_t *emm_security_context = NULL; - struct emm_data_context_s *emm_ctx = NULL; -#if defined(NAS_BUILT_IN_EPC) - emm_ctx = emm_data_context_get(&_emm_data, msg->ueid); -#else - - if (msg->ueid < EMM_DATA_NB_UE_MAX) { - emm_ctx = _emm_data.ctx[msg->ueid]; - } - -#endif - - if (emm_ctx) { - emm_security_context = emm_ctx->security; - } - - if (emm_security_context) { - nas_msg.header.sequence_number = emm_security_context->dl_count.seq_num; - LOG_TRACE(DEBUG, - "Set nas_msg.header.sequence_number -> %u", - nas_msg.header.sequence_number); - } - - /* Encode the NAS information message */ - int bytes = _emm_as_encode( - &as_msg->nasMsg, - &nas_msg, - size, - emm_security_context); - - if (bytes > 0) { - LOG_FUNC_RETURN (AS_DL_INFO_TRANSFER_REQ); - } - } - - LOG_FUNC_RETURN (0); -} - -/**************************************************************************** - ** ** - ** Name: _emm_as_release_req() ** - ** ** - ** Description: Processes the EMMAS-SAP connection release request ** - ** primitive ** - ** ** - ** EMMAS-SAP - EMM->AS: RELEASE_REQ - NAS signalling release procedure ** - ** ** - ** Inputs: msg: The EMMAS-SAP primitive to process ** - ** Others: None ** - ** ** - ** Outputs: as_msg: The message to send to the AS ** - ** Return: The identifier of the AS message ** - ** Others: None ** - ** ** - ***************************************************************************/ -static int _emm_as_release_req(const emm_as_release_t *msg, - nas_release_req_t *as_msg) -{ - LOG_FUNC_IN; - - LOG_TRACE(INFO, "EMMAS-SAP - Send AS release request"); - - /* Setup the AS message */ - if (msg->guti) { - as_msg->s_tmsi.MMEcode = msg->guti->gummei.MMEcode; - as_msg->s_tmsi.m_tmsi = msg->guti->m_tmsi; - } else { - as_msg->UEid = msg->ueid; - } - - if (msg->cause == EMM_AS_CAUSE_AUTHENTICATION) { - as_msg->cause = AS_AUTHENTICATION_FAILURE; - } else if (msg->cause == EMM_AS_CAUSE_DETACH) { - as_msg->cause = AS_DETACH; - } - - LOG_FUNC_RETURN (AS_NAS_RELEASE_REQ); -} - - -/**************************************************************************** - ** ** - ** Name: _emm_as_security_req() ** - ** ** - ** Description: Processes the EMMAS-SAP security request primitive ** - ** ** - ** EMMAS-SAP - EMM->AS: SECURITY_REQ - Security mode control procedure ** - ** ** - ** Inputs: msg: The EMMAS-SAP primitive to process ** - ** Others: None ** - ** ** - ** Outputs: as_msg: The message to send to the AS ** - ** Return: The identifier of the AS message ** - ** Others: None ** - ** ** - ***************************************************************************/ -static int _emm_as_security_req(const emm_as_security_t *msg, - dl_info_transfer_req_t *as_msg) -{ - LOG_FUNC_IN; - - int size = 0; - - LOG_TRACE(INFO, "EMMAS-SAP - Send AS security request"); - - nas_message_t nas_msg; - memset(&nas_msg, 0 , sizeof(nas_message_t)); - - /* Setup the AS message */ - if (msg->guti) { - as_msg->s_tmsi.MMEcode = msg->guti->gummei.MMEcode; - as_msg->s_tmsi.m_tmsi = msg->guti->m_tmsi; - } else { - as_msg->UEid = msg->ueid; - } - - /* Setup the NAS security header */ - EMM_msg *emm_msg = _emm_as_set_header(&nas_msg, &msg->sctx); - - /* Setup the NAS security message */ - if (emm_msg != NULL) switch (msg->msgType) { - case EMM_AS_MSG_TYPE_IDENT: - if (msg->guti) { - MSC_LOG_EVENT(MSC_NAS_EMM_MME, "0 send IDENTITY_REQUEST to s_TMSI %u.%u ", as_msg->s_tmsi.MMEcode, as_msg->s_tmsi.m_tmsi); - } else { - MSC_LOG_EVENT(MSC_NAS_EMM_MME, "0 send IDENTITY_REQUEST to ue id "NAS_UE_ID_FMT" ", as_msg->UEid); - } - size = emm_send_identity_request(msg, - &emm_msg->identity_request); - break; - - case EMM_AS_MSG_TYPE_AUTH: - if (msg->guti) { - MSC_LOG_EVENT(MSC_NAS_EMM_MME, "0 send AUTHENTICATION_REQUEST to s_TMSI %u.%u ", as_msg->s_tmsi.MMEcode, as_msg->s_tmsi.m_tmsi); - } else { - MSC_LOG_EVENT(MSC_NAS_EMM_MME, "0 send AUTHENTICATION_REQUEST to ue id "NAS_UE_ID_FMT" ", as_msg->UEid); - } - size = emm_send_authentication_request(msg, - &emm_msg->authentication_request); - break; - - case EMM_AS_MSG_TYPE_SMC: - if (msg->guti) { - MSC_LOG_EVENT(MSC_NAS_EMM_MME, "0 send SECURITY_MODE_COMMAND to s_TMSI %u.%u ", as_msg->s_tmsi.MMEcode, as_msg->s_tmsi.m_tmsi); - } else { - MSC_LOG_EVENT(MSC_NAS_EMM_MME, "0 send SECURITY_MODE_COMMAND to ue id "NAS_UE_ID_FMT" ", as_msg->UEid); - } - size = emm_send_security_mode_command(msg, - &emm_msg->security_mode_command); - break; - - default: - LOG_TRACE(WARNING, "EMMAS-SAP - Type of NAS security " - "message 0x%.2x is not valid", msg->msgType); - } - - if (size > 0) { - struct emm_data_context_s *emm_ctx = NULL; - emm_security_context_t *emm_security_context = NULL; -#if defined(NAS_BUILT_IN_EPC) - emm_ctx = emm_data_context_get(&_emm_data, msg->ueid); -#else - - if (msg->ueid < EMM_DATA_NB_UE_MAX) { - emm_ctx = _emm_data.ctx[msg->ueid]; - } - -#endif - - if (emm_ctx) { - emm_security_context = emm_ctx->security; - - if (emm_security_context) { - nas_msg.header.sequence_number = emm_security_context->dl_count.seq_num; - LOG_TRACE(DEBUG, - "Set nas_msg.header.sequence_number -> %u", - nas_msg.header.sequence_number); - } - } - - /* Encode the NAS security message */ - int bytes = _emm_as_encode( - &as_msg->nasMsg, - &nas_msg, - size, - emm_security_context); - - if (bytes > 0) { - LOG_FUNC_RETURN (AS_DL_INFO_TRANSFER_REQ); - } - } - - LOG_FUNC_RETURN (0); -} - -/**************************************************************************** - ** ** - ** Name: _emm_as_security_rej() ** - ** ** - ** Description: Processes the EMMAS-SAP security reject primitive ** - ** ** - ** EMMAS-SAP - EMM->AS: SECURITY_REJ - Security mode control procedure ** - ** ** - ** Inputs: msg: The EMMAS-SAP primitive to process ** - ** Others: None ** - ** ** - ** Outputs: as_msg: The message to send to the AS ** - ** Return: The identifier of the AS message ** - ** Others: None ** - ** ** - ***************************************************************************/ -static int _emm_as_security_rej(const emm_as_security_t *msg, - dl_info_transfer_req_t *as_msg) -{ - LOG_FUNC_IN; - - int size = 0; - - LOG_TRACE(INFO, "EMMAS-SAP - Send AS security reject"); - - nas_message_t nas_msg; - memset(&nas_msg, 0 , sizeof(nas_message_t)); - - /* Setup the AS message */ - if (msg->guti) { - as_msg->s_tmsi.MMEcode = msg->guti->gummei.MMEcode; - as_msg->s_tmsi.m_tmsi = msg->guti->m_tmsi; - } else { - as_msg->UEid = msg->ueid; - } - - /* Setup the NAS security header */ - EMM_msg *emm_msg = _emm_as_set_header(&nas_msg, &msg->sctx); - - /* Setup the NAS security message */ - if (emm_msg != NULL) switch (msg->msgType) { - case EMM_AS_MSG_TYPE_AUTH: - if (msg->guti) { - MSC_LOG_EVENT(MSC_NAS_EMM_MME, "0 send AUTHENTICATION_REJECT to s_TMSI %u.%u ", as_msg->s_tmsi.MMEcode, as_msg->s_tmsi.m_tmsi); - } else { - MSC_LOG_EVENT(MSC_NAS_EMM_MME, "0 send AUTHENTICATION_REJECT to ue id "NAS_UE_ID_FMT" ", as_msg->UEid); - } - size = emm_send_authentication_reject( - &emm_msg->authentication_reject); - break; - - default: - LOG_TRACE(WARNING, "EMMAS-SAP - Type of NAS security " - "message 0x%.2x is not valid", msg->msgType); - } - - if (size > 0) { - struct emm_data_context_s *emm_ctx = NULL; - emm_security_context_t *emm_security_context = NULL; -#if defined(NAS_BUILT_IN_EPC) - emm_ctx = emm_data_context_get(&_emm_data, msg->ueid); -#else - - if (msg->ueid < EMM_DATA_NB_UE_MAX) { - emm_ctx = _emm_data.ctx[msg->ueid]; - } - -#endif - - if (emm_ctx) { - emm_security_context = emm_ctx->security; - if (emm_security_context) { - nas_msg.header.sequence_number = emm_security_context->dl_count.seq_num; - LOG_TRACE(DEBUG, - "Set nas_msg.header.sequence_number -> %u", - nas_msg.header.sequence_number); - } else { - LOG_TRACE(DEBUG, - "No security context, not set nas_msg.header.sequence_number -> %u", - nas_msg.header.sequence_number); - } - } - - /* Encode the NAS security message */ - int bytes = _emm_as_encode( - &as_msg->nasMsg, - &nas_msg, - size, - emm_security_context); - - if (bytes > 0) { - LOG_FUNC_RETURN (AS_DL_INFO_TRANSFER_REQ); - } - } - - LOG_FUNC_RETURN (0); -} - -/**************************************************************************** - ** ** - ** Name: _emm_as_establish_cnf() ** - ** ** - ** Description: Processes the EMMAS-SAP connection establish confirm ** - ** primitive ** - ** ** - ** EMMAS-SAP - EMM->AS: ESTABLISH_CNF - NAS signalling connection ** - ** ** - ** Inputs: msg: The EMMAS-SAP primitive to process ** - ** Others: None ** - ** ** - ** Outputs: as_msg: The message to send to the AS ** - ** Return: The identifier of the AS message ** - ** Others: None ** - ** ** - ***************************************************************************/ -static int _emm_as_establish_cnf(const emm_as_establish_t *msg, - nas_establish_rsp_t *as_msg) -{ - EMM_msg *emm_msg; - int size = 0; - - LOG_FUNC_IN; - - LOG_TRACE(INFO, "EMMAS-SAP - Send AS connection establish confirmation"); - - nas_message_t nas_msg; - memset(&nas_msg, 0 , sizeof(nas_message_t)); - - /* Setup the AS message */ - as_msg->UEid = msg->ueid; - - if (msg->UEid.guti == NULL) { - LOG_TRACE(WARNING, "EMMAS-SAP - GUTI is NULL..."); - LOG_FUNC_RETURN (0); - } - - as_msg->s_tmsi.MMEcode = msg->UEid.guti->gummei.MMEcode; - as_msg->s_tmsi.m_tmsi = msg->UEid.guti->m_tmsi; - - /* Setup the NAS security header */ - emm_msg = _emm_as_set_header(&nas_msg, &msg->sctx); - - /* Setup the initial NAS information message */ - if (emm_msg != NULL) switch (msg->NASinfo) { - case EMM_AS_NAS_INFO_ATTACH: - LOG_TRACE(WARNING, - "EMMAS-SAP - emm_as_establish.nasMSG.length=%d", - msg->NASmsg.length); - - MSC_LOG_EVENT(MSC_NAS_EMM_MME, "0 send ATTACH_ACCEPT to s_TMSI %u.%u ", as_msg->s_tmsi.MMEcode, as_msg->s_tmsi.m_tmsi); - - size = emm_send_attach_accept(msg, &emm_msg->attach_accept); - break; - - default: - LOG_TRACE(WARNING, "EMMAS-SAP - Type of initial NAS " - "message 0x%.2x is not valid", msg->NASinfo); - break; - } - - if (size > 0) { - struct emm_data_context_s *emm_ctx = NULL; - emm_security_context_t *emm_security_context = NULL; -#if defined(NAS_BUILT_IN_EPC) - emm_ctx = emm_data_context_get(&_emm_data, msg->ueid); -#else - - if (msg->ueid < EMM_DATA_NB_UE_MAX) { - emm_ctx = _emm_data.ctx[msg->ueid]; - } - -#endif - - if (emm_ctx) { - emm_security_context = emm_ctx->security; - - if (emm_security_context) { - as_msg->nas_ul_count = 0x00000000 | - (emm_security_context->ul_count.overflow << 8) | - emm_security_context->ul_count.seq_num; - LOG_TRACE(DEBUG, "EMMAS-SAP - NAS UL COUNT %8x", - as_msg->nas_ul_count); - } - - nas_msg.header.sequence_number = emm_security_context->dl_count.seq_num; - LOG_TRACE(DEBUG, - "Set nas_msg.header.sequence_number -> %u", - nas_msg.header.sequence_number); - - as_msg->selected_encryption_algorithm = htons(0x8000 >> emm_security_context->selected_algorithms.encryption); - as_msg->selected_integrity_algorithm = htons(0x8000 >> emm_security_context->selected_algorithms.integrity); - - LOG_TRACE(DEBUG, - "Set nas_msg.selected_encryption_algorithm -> NBO: 0x%04X (%u)", - as_msg->selected_encryption_algorithm, - emm_security_context->selected_algorithms.encryption); - LOG_TRACE(DEBUG, - "Set nas_msg.selected_integrity_algorithm -> NBO: 0x%04X (%u)", - as_msg->selected_integrity_algorithm, - emm_security_context->selected_algorithms.integrity); - - } - - /* Encode the initial NAS information message */ - int bytes = _emm_as_encode( - &as_msg->nasMsg, - &nas_msg, - size, - emm_security_context); - - if (bytes > 0) { - as_msg->errCode = AS_SUCCESS; - LOG_FUNC_RETURN (AS_NAS_ESTABLISH_CNF); - } - } - - LOG_TRACE(WARNING, "EMMAS-SAP - Size <= 0"); - LOG_FUNC_RETURN (0); -} - -/**************************************************************************** - ** ** - ** Name: _emm_as_establish_rej() ** - ** ** - ** Description: Processes the EMMAS-SAP connection establish reject ** - ** primitive ** - ** ** - ** EMMAS-SAP - EMM->AS: ESTABLISH_REJ - NAS signalling connection ** - ** ** - ** Inputs: msg: The EMMAS-SAP primitive to process ** - ** Others: None ** - ** ** - ** Outputs: as_msg: The message to send to the AS ** - ** Return: The identifier of the AS message ** - ** Others: None ** - ** ** - ***************************************************************************/ -static int _emm_as_establish_rej(const emm_as_establish_t *msg, - nas_establish_rsp_t *as_msg) -{ - EMM_msg *emm_msg; - int size = 0; - nas_message_t nas_msg; - - LOG_FUNC_IN; - - LOG_TRACE(INFO, "EMMAS-SAP - Send AS connection establish reject"); - - memset(&nas_msg, 0 , sizeof(nas_message_t)); - - /* Setup the AS message */ - if (msg->UEid.guti) { - as_msg->s_tmsi.MMEcode = msg->UEid.guti->gummei.MMEcode; - as_msg->s_tmsi.m_tmsi = msg->UEid.guti->m_tmsi; - } else { - as_msg->UEid = msg->ueid; - } - - /* Setup the NAS security header */ - emm_msg = _emm_as_set_header(&nas_msg, &msg->sctx); - - /* Setup the NAS information message */ - if (emm_msg != NULL) switch (msg->NASinfo) { - case EMM_AS_NAS_INFO_ATTACH: - if (msg->UEid.guti) { - MSC_LOG_EVENT(MSC_NAS_EMM_MME, "0 send ATTACH_REJECT to s_TMSI %u.%u ", as_msg->s_tmsi.MMEcode, as_msg->s_tmsi.m_tmsi); - } else { - MSC_LOG_EVENT(MSC_NAS_EMM_MME, "0 send ATTACH_REJECT to ue id "NAS_UE_ID_FMT" ", as_msg->UEid); - } - size = emm_send_attach_reject(msg, &emm_msg->attach_reject); - break; - - case EMM_AS_NAS_INFO_TAU: - if (msg->UEid.guti) { - MSC_LOG_EVENT(MSC_NAS_EMM_MME, "0 send TRACKING_AREA_UPDATE_REJECT to s_TMSI %u.%u ", as_msg->s_tmsi.MMEcode, as_msg->s_tmsi.m_tmsi); - } else { - MSC_LOG_EVENT(MSC_NAS_EMM_MME, "0 send TRACKING_AREA_UPDATE_REJECT to ue id "NAS_UE_ID_FMT" ", as_msg->UEid); - } - size = emm_send_tracking_area_update_reject(msg, - &emm_msg->tracking_area_update_reject); - break; - - default: - LOG_TRACE(WARNING, "EMMAS-SAP - Type of initial NAS " - "message 0x%.2x is not valid", msg->NASinfo); - break; - } - - if (size > 0) { - struct emm_data_context_s *emm_ctx = NULL; - emm_security_context_t *emm_security_context = NULL; -#if defined(NAS_BUILT_IN_EPC) - emm_ctx = emm_data_context_get(&_emm_data, msg->ueid); -#else - - if (msg->ueid < EMM_DATA_NB_UE_MAX) { - emm_ctx = _emm_data.ctx[msg->ueid]; - } - -#endif - - if (emm_ctx) { - emm_security_context = emm_ctx->security; - - if (emm_security_context) { - nas_msg.header.sequence_number = emm_security_context->dl_count.seq_num; - LOG_TRACE(DEBUG, - "Set nas_msg.header.sequence_number -> %u", - nas_msg.header.sequence_number); - } - } - - /* Encode the initial NAS information message */ - int bytes = _emm_as_encode( - &as_msg->nasMsg, - &nas_msg, - size, - emm_security_context); - - if (bytes > 0) { - as_msg->errCode = AS_TERMINATED_NAS; - LOG_FUNC_RETURN (AS_NAS_ESTABLISH_RSP); - } - } - - LOG_FUNC_RETURN (0); -} - -/**************************************************************************** - ** ** - ** Name: _emm_as_page_ind() ** - ** ** - ** Description: Processes the EMMAS-SAP paging data indication primitive ** - ** ** - ** EMMAS-SAP - EMM->AS: PAGE_IND - Paging data procedure ** - ** ** - ** Inputs: msg: The EMMAS-SAP primitive to process ** - ** Others: None ** - ** ** - ** Outputs: as_msg: The message to send to the AS ** - ** Return: The identifier of the AS message ** - ** Others: None ** - ** ** - ***************************************************************************/ -static int _emm_as_page_ind(const emm_as_page_t *msg, paging_req_t *as_msg) -{ - LOG_FUNC_IN; - - int bytes = 0; - - LOG_TRACE(INFO, "EMMAS-SAP - Send AS data paging indication"); - - /* TODO */ - - if (bytes > 0) { - LOG_FUNC_RETURN (AS_PAGING_IND); - } - - LOG_FUNC_RETURN (0); -} - - -/**************************************************************************** - ** ** - ** Name: _emm_as_cell_info_req() ** - ** ** - ** Description: Processes the EMMAS-SAP cell information request ** - ** primitive ** - ** ** - ** EMMAS-SAP - EMM->AS: CELL_INFO_REQ - PLMN and cell selection procedure ** - ** The NAS requests the AS to select a cell belonging to the ** - ** selected PLMN with associated Radio Access Technologies. ** - ** ** - ** Inputs: msg: The EMMAS-SAP primitive to process ** - ** Others: None ** - ** ** - ** Outputs: as_msg: The message to send to the AS ** - ** Return: The identifier of the AS message ** - ** Others: None ** - ** ** - ***************************************************************************/ -static int _emm_as_cell_info_req(const emm_as_cell_info_t *msg, - cell_info_req_t *as_msg) -{ - LOG_FUNC_IN; - - LOG_TRACE(INFO, "EMMAS-SAP - Send AS cell information request"); - - as_msg->plmnID = msg->plmnIDs.plmn[0]; - as_msg->rat = msg->rat; - - LOG_FUNC_RETURN (AS_CELL_INFO_REQ); -} - diff --git a/openair-cn/NAS/MME/EMM/SAP/emm_as.h b/openair-cn/NAS/MME/EMM/SAP/emm_as.h deleted file mode 100644 index ca4fc449b7..0000000000 --- a/openair-cn/NAS/MME/EMM/SAP/emm_as.h +++ /dev/null @@ -1,72 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source emm_as.h - -Version 0.1 - -Date 2012/10/16 - -Product NAS stack - -Subsystem EPS Mobility Management - -Author Frederic Maurel - -Description Defines the EMMAS Service Access Point that provides - services to the EPS Mobility Management for NAS message - transfer to/from the Access Stratum sublayer. - -*****************************************************************************/ -#ifndef __EMM_AS_H__ -#define __EMM_AS_H__ - -#include "emm_asDef.h" - -/****************************************************************************/ -/********************* G L O B A L C O N S T A N T S *******************/ -/****************************************************************************/ - -/****************************************************************************/ -/************************ G L O B A L T Y P E S ************************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************** G L O B A L V A R I A B L E S ********************/ -/****************************************************************************/ - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -void emm_as_initialize(void); - -int emm_as_send(const emm_as_t *msg); - -#endif /* __EMM_AS_H__*/ diff --git a/openair-cn/NAS/MME/EMM/SAP/emm_asDef.h b/openair-cn/NAS/MME/EMM/SAP/emm_asDef.h deleted file mode 100644 index fbd2a6b38e..0000000000 --- a/openair-cn/NAS/MME/EMM/SAP/emm_asDef.h +++ /dev/null @@ -1,276 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** - -Source emm_asDef.h - -Version 0.1 - -Date 2012/10/16 - -Product NAS stack - -Subsystem EPS Mobility Management - -Author Frederic Maurel - -Description Defines the EMM primitives available at the EMMAS Service - Access Point to transfer NAS messages to/from the Access - Stratum sublayer. - -*****************************************************************************/ -#ifndef __EMM_ASDEF_H__ -#define __EMM_ASDEF_H__ - -#include "commonDef.h" -#include "OctetString.h" - -/****************************************************************************/ -/********************* G L O B A L C O N S T A N T S *******************/ -/****************************************************************************/ - -/* - * EMMAS-SAP primitives - */ -typedef enum emm_as_primitive_u { - _EMMAS_START = 200, - _EMMAS_SECURITY_REQ, /* EMM->AS: Security request */ - _EMMAS_SECURITY_IND, /* AS->EMM: Security indication */ - _EMMAS_SECURITY_RES, /* EMM->AS: Security response */ - _EMMAS_SECURITY_REJ, /* EMM->AS: Security reject */ - _EMMAS_ESTABLISH_REQ, /* EMM->AS: Connection establish request */ - _EMMAS_ESTABLISH_CNF, /* AS->EMM: Connection establish confirm */ - _EMMAS_ESTABLISH_REJ, /* AS->EMM: Connection establish reject */ - _EMMAS_RELEASE_REQ, /* EMM->AS: Connection release request */ - _EMMAS_RELEASE_IND, /* AS->EMM: Connection release indication */ - _EMMAS_DATA_REQ, /* EMM->AS: Data transfer request */ - _EMMAS_DATA_IND, /* AS->EMM: Data transfer indication */ - _EMMAS_PAGE_IND, /* AS->EMM: Paging data indication */ - _EMMAS_STATUS_IND, /* AS->EMM: Status indication */ - _EMMAS_CELL_INFO_REQ, /* EMM->AS: Cell information request */ - _EMMAS_CELL_INFO_RES, /* AS->EMM: Cell information response */ - _EMMAS_CELL_INFO_IND, /* AS->EMM: Cell information indication */ - _EMMAS_END -} emm_as_primitive_t; - -/* Data used to setup EPS NAS security */ -typedef struct emm_as_security_data_s { - uint8_t is_new; /* New security data indicator */ -#define EMM_AS_NO_KEY_AVAILABLE 0xff - uint8_t ksi; /* NAS key set identifier */ - uint8_t sqn; /* Sequence number */ - uint32_t count; /* NAS counter */ - const OctetString *k_enc; /* NAS cyphering key */ - const OctetString *k_int; /* NAS integrity key */ -} emm_as_security_data_t; - -/****************************************************************************/ -/************************ G L O B A L T Y P E S ************************/ -/****************************************************************************/ - -/* - * EMMAS primitive for security - * ---------------------------- - */ -typedef struct emm_as_security_s { - uint32_t ueid; /* UE lower layer identifier */ - const GUTI_t *guti; /* GUTI temporary mobile identity */ - emm_as_security_data_t sctx;/* EPS NAS security context */ - int emm_cause; /* EMM failure cause code */ - /* - * Identity request/response - */ - uint8_t identType; /* Type of requested UE's identity */ - const imsi_t *imsi; /* The requested IMSI of the UE */ - const imei_t *imei; /* The requested IMEI of the UE */ - uint32_t tmsi; /* The requested TMSI of the UE */ - /* - * Authentication request/response - */ - uint8_t ksi; /* NAS key set identifier */ - const OctetString *rand; /* Random challenge number */ - const OctetString *autn; /* Authentication token */ - const OctetString *res; /* Authentication response */ - const OctetString *auts; /* Synchronisation failure */ - /* - * Security Mode Command - */ - uint8_t eea; /* Replayed EPS encryption algorithms */ - uint8_t eia; /* Replayed EPS integrity algorithms */ - uint8_t uea; /* Replayed UMTS encryption algorithms */ - uint8_t ucs2; - uint8_t uia; /* Replayed UMTS integrity algorithms */ - uint8_t gea; /* Replayed GPRS encryption algorithms */ - uint8_t umts_present; - uint8_t gprs_present; - - // Added by LG - uint8_t selected_eea; /* Selected EPS encryption algorithms */ - uint8_t selected_eia; /* Selected EPS integrity algorithms */ - -#define EMM_AS_MSG_TYPE_IDENT 0x01 /* Identification message */ -#define EMM_AS_MSG_TYPE_AUTH 0x02 /* Authentication message */ -#define EMM_AS_MSG_TYPE_SMC 0x03 /* Security Mode Command */ - uint8_t msgType; /* Type of NAS security message to transfer */ -} emm_as_security_t; - -/* - * EMMAS primitive for connection establishment - * -------------------------------------------- - */ -typedef struct emm_as_EPS_identity_s { - const GUTI_t *guti; /* The GUTI, if valid */ - const tai_t *tai; /* The last visited registered Tracking - * Area Identity, if available */ - const imsi_t *imsi; /* IMSI in case of "AttachWithImsi" */ - const imei_t *imei; /* UE's IMEI for emergency bearer services */ -} emm_as_EPS_identity_t; - -typedef struct emm_as_establish_s { - uint32_t ueid; /* UE lower layer identifier */ - emm_as_EPS_identity_t UEid; /* UE's EPS mobile identity */ - emm_as_security_data_t sctx;/* EPS NAS security context */ - int switch_off; /* TRUE if the UE is switched off */ - uint8_t type; /* Network attach/detach type */ - uint8_t RRCcause; /* Connection establishment cause */ - uint8_t RRCtype; /* Associated call type */ - const plmn_t *plmnID; /* Identifier of the selected PLMN */ - uint8_t ksi; /* NAS key set identifier */ - uint8_t encryption:4; /* Ciphering algorithm */ - uint8_t integrity:4; /* Integrity protection algorithm */ - int emm_cause; /* EMM failure cause code */ - const GUTI_t *new_guti; /* New GUTI, if re-allocated */ - int n_tacs; /* Number of concecutive tracking areas - * the UE is registered to */ - tac_t tac; /* Code of the first tracking area the UE - * is registered to */ -#define EMM_AS_NAS_INFO_ATTACH 0x01 /* Attach request */ -#define EMM_AS_NAS_INFO_DETACH 0x02 /* Detach request */ -#define EMM_AS_NAS_INFO_TAU 0x03 /* Tracking Area Update request */ -#define EMM_AS_NAS_INFO_SR 0x04 /* Service Request */ -#define EMM_AS_NAS_INFO_EXTSR 0x05 /* Extended Service Request */ - uint8_t NASinfo; /* Type of initial NAS information to transfer */ - OctetString NASmsg; /* NAS message to be transfered within - * initial NAS information message */ -} emm_as_establish_t; - -/* - * EMMAS primitive for connection release - * -------------------------------------- - */ -typedef struct emm_as_release_s { - uint32_t ueid; /* UE lower layer identifier */ - const GUTI_t *guti; /* GUTI temporary mobile identity */ -#define EMM_AS_CAUSE_AUTHENTICATION 0x01 /* Authentication failure */ -#define EMM_AS_CAUSE_DETACH 0x02 /* Detach requested */ - uint8_t cause; /* Release cause */ -} emm_as_release_t; - -/* - * EMMAS primitive for data transfer - * --------------------------------- - */ -typedef struct emm_as_data_s { - uint32_t ueid; /* UE lower layer identifier */ - const GUTI_t *guti; /* GUTI temporary mobile identity */ - emm_as_security_data_t sctx;/* EPS NAS security context */ - int switch_off; /* TRUE if the UE is switched off */ - uint8_t type; /* Network detach type */ - uint8_t delivered; /* Data message delivery indicator */ -#define EMM_AS_NAS_DATA_ATTACH 0x01 /* Attach complete */ -#define EMM_AS_NAS_DATA_DETACH 0x02 /* Detach request */ - uint8_t NASinfo; /* Type of NAS information to transfer */ - OctetString NASmsg; /* NAS message to be transfered */ -} emm_as_data_t; - -/* - * EMMAS primitive for paging - * -------------------------- - */ -typedef struct emm_as_page_s {} emm_as_page_t; - -/* - * EMMAS primitive for status indication - * ------------------------------------- - */ -typedef struct emm_as_status_s { - uint32_t ueid; /* UE lower layer identifier */ - const GUTI_t *guti; /* GUTI temporary mobile identity */ - emm_as_security_data_t sctx;/* EPS NAS security context */ - int emm_cause; /* EMM failure cause code */ -} emm_as_status_t; - -/* - * EMMAS primitive for cell information - * ------------------------------------ - */ -typedef struct emm_as_cell_info_s { - uint8_t found; /* Indicates whether a suitable cell is found */ -#define EMM_AS_PLMN_LIST_SIZE 6 - PLMN_LIST_T(EMM_AS_PLMN_LIST_SIZE) plmnIDs; - /* List of identifiers of available PLMNs */ - Byte_t rat; /* Bitmap of Radio Access Technologies */ - tac_t tac; /* Tracking Area Code */ - ci_t cellID; /* cell identity */ -} emm_as_cell_info_t; - -/* - * -------------------------------- - * Structure of EMMAS-SAP primitive - * -------------------------------- - */ -typedef struct emm_as_s { - emm_as_primitive_t primitive; - union { - emm_as_security_t security; - emm_as_establish_t establish; - emm_as_release_t release; - emm_as_data_t data; - emm_as_page_t page; - emm_as_status_t status; - emm_as_cell_info_t cell_info; - } u; -} emm_as_t; - -/****************************************************************************/ -/******************** G L O B A L V A R I A B L E S ********************/ -/****************************************************************************/ - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -/* - * Defined in LowerLayer.c - * Setup security data according to the given EPS security context - */ -void emm_as_set_security_data(emm_as_security_data_t *data, const void *context, - int is_new, int is_ciphered); - -#endif /* __EMM_ASDEF_H__*/ diff --git a/openair-cn/NAS/MME/EMM/SAP/emm_cn.c b/openair-cn/NAS/MME/EMM/SAP/emm_cn.c deleted file mode 100644 index 603e849c14..0000000000 --- a/openair-cn/NAS/MME/EMM/SAP/emm_cn.c +++ /dev/null @@ -1,468 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** - -Source emm_cn.c - -Version 0.1 - -Date 2013/12/05 - -Product NAS stack - -Subsystem EPS Core Network - -Author Sebastien Roux, Lionel GAUTHIER - -Description - -*****************************************************************************/ - -#include <string.h> - -#if defined(NAS_BUILT_IN_EPC) - -#include "nas_log.h" -#include "commonDef.h" - -#include "emm_cn.h" -#include "emm_sap.h" -#include "emm_proc.h" -#include "emm_cause.h" - -#include "esm_send.h" // LG -#include "esm_proc.h" // LG -#include "esm_cause.h" // LG -#include "assertions.h"// LG -#include "emmData.h" // LG -#include "esm_sap.h" // LG -#include "EmmCommon.h" // LG -extern int emm_cn_wrapper_attach_accept(emm_data_context_t *emm_ctx, void *data); - -/* - * Internal data used for attach procedure - */ -typedef struct { - unsigned int ueid; /* UE identifier */ -#define ATTACH_COUNTER_MAX 5 - unsigned int retransmission_count; /* Retransmission counter */ - OctetString esm_msg; /* ESM message to be sent within - * the Attach Accept message */ -} attach_data_t; - -/* - * String representation of EMMCN-SAP primitives - */ -static const char *_emm_cn_primitive_str[] = { - "EMM_CN_AUTHENTICATION_PARAM_RES", - "EMM_CN_AUTHENTICATION_PARAM_FAIL", - "EMM_CN_DEREGISTER_UE", - "EMM_CN_PDN_CONNECTIVITY_RES", - "EMM_CN_PDN_CONNECTIVITY_FAIL", -}; - -#define EMM_CN_SAP_BUFFER_SIZE 4096 -static char _emm_cn_sap_buffer[EMM_CN_SAP_BUFFER_SIZE]; - -static int _emm_cn_authentication_res(const emm_cn_auth_res_t *msg) -{ - emm_data_context_t *emm_ctx = NULL; - int rc = RETURNerror; - OctetString loc_rand; - OctetString autn; - - /* We received security vector from HSS. Try to setup security with UE */ - - LOG_FUNC_IN; - - emm_ctx = emm_data_context_get(&_emm_data, msg->ue_id); - - if (emm_ctx == NULL) { - LOG_TRACE(ERROR, "EMM-PROC - " - "Failed to find UE associated to id "NAS_UE_ID_FMT"...", msg->ue_id); - LOG_FUNC_RETURN (rc); - } - - /* Copy provided vector to user context */ - memcpy(emm_ctx->vector.kasme, msg->vector.kasme, AUTH_KASME_SIZE); - memcpy(emm_ctx->vector.autn, msg->vector.autn, AUTH_AUTN_SIZE); - memcpy(emm_ctx->vector.rand, msg->vector.rand, AUTH_RAND_SIZE); - memcpy(emm_ctx->vector.xres, msg->vector.xres.data, msg->vector.xres.size); - - LOG_TRACE(INFO, "EMM-PROC - Received RAND ..: "RAND_FORMAT"\n", - RAND_DISPLAY(msg->vector.rand)); - LOG_TRACE(INFO, "EMM-PROC - Received AUTN ..: "AUTN_FORMAT"\n", - AUTN_DISPLAY(msg->vector.autn)); - LOG_TRACE(INFO, "EMM-PROC - Received KASME .: "KASME_FORMAT" "KASME_FORMAT"\n", - KASME_DISPLAY_1(msg->vector.kasme), - KASME_DISPLAY_2(msg->vector.kasme)); - - loc_rand.value = emm_ctx->vector.rand; - loc_rand.length = AUTH_RAND_SIZE; - - autn.value = emm_ctx->vector.autn; - autn.length = AUTH_AUTN_SIZE; - - emm_ctx->vector.xres_size = msg->vector.xres.size; - - /* 3GPP TS 24.401, Figure 5.3.2.1-1, point 5a - * No EMM context exists for the UE in the network; authentication - * and NAS security setup to activate integrity protection and NAS - * ciphering are mandatory. - */ - rc = emm_proc_authentication(emm_ctx, - emm_ctx->ueid, - 0, // TODO: eksi != 0 - &loc_rand, - &autn, - emm_attach_security, - NULL, - NULL); - - if (rc != RETURNok) { - /* Failed to initiate the authentication procedure */ - LOG_TRACE(WARNING, "EMM-PROC - " - "Failed to initiate authentication procedure"); - emm_ctx->emm_cause = EMM_CAUSE_ILLEGAL_UE; - } - - LOG_FUNC_RETURN (rc); -} - -static int _emm_cn_authentication_fail(const emm_cn_auth_fail_t *msg) -{ - int rc = RETURNerror; - - LOG_FUNC_IN; - - rc = emm_proc_attach_reject(msg->ue_id, msg->cause); - - LOG_FUNC_RETURN (rc); -} - -static int _emm_cn_deregister_ue(const uint32_t ue_id) -{ - int rc = RETURNok; - - LOG_FUNC_IN; - LOG_TRACE(WARNING, "EMM-PROC - " - "TODO deregister UE "NAS_UE_ID_FMT", following procedure is a test", ue_id); - emm_proc_detach_request(ue_id, EMM_DETACH_TYPE_EPS /* ??? emm_proc_detach_type_t*/, - 1 /*switch_off*/, 0 /*native_ksi*/, 0 /*ksi*/, - NULL /*guti*/, NULL /*imsi*/, NULL /*imei*/); - LOG_FUNC_RETURN (rc); -} - -static int _emm_cn_pdn_connectivity_res(const emm_cn_pdn_res_t *msg_pP) -{ - int rc = RETURNok; - struct emm_data_context_s *emm_ctx_p = NULL; - esm_proc_pdn_type_t esm_pdn_type = ESM_PDN_TYPE_IPV4; - esm_proc_data_t *esm_proc_data_p = NULL; - ESM_msg esm_msg; - EpsQualityOfService qos; - ProtocolConfigurationOptions pco; - unsigned int pco_in_index = 0; - signed int length_in_pco = 0; - uint16_t pi_or_ci = 0; // protocol identifier or container identifier; - uint8_t length_pi_or_ci = 0; - - OctetString rsp = { 0, NULL}; - int is_standalone = 0; // warning hardcoded - int triggered_by_ue = 1; // warning hardcoded - attach_data_t *data_p = NULL; - int esm_cause = ESM_CAUSE_SUCCESS; - int pid = 0; - unsigned int new_ebi = 0; - - - LOG_FUNC_IN; - emm_ctx_p = emm_data_context_get(&_emm_data, msg_pP->ue_id); - - if (emm_ctx_p == NULL) { - LOG_TRACE(ERROR, "EMMCN-SAP - " - "Failed to find UE associated to id "NAS_UE_ID_FMT"...", msg_pP->ue_id); - LOG_FUNC_RETURN (rc); - } - - memset(&esm_msg, 0 , sizeof(ESM_msg)); - - switch (msg_pP->pdn_type) { - case IPv4: - LOG_TRACE(INFO, "EMM - esm_pdn_type = ESM_PDN_TYPE_IPV4"); - esm_pdn_type = ESM_PDN_TYPE_IPV4; - break; - - case IPv6: - LOG_TRACE(INFO, "EMM - esm_pdn_type = ESM_PDN_TYPE_IPV6"); - esm_pdn_type = ESM_PDN_TYPE_IPV6; - break; - - case IPv4_AND_v6: - LOG_TRACE(INFO, "EMM - esm_pdn_type = ESM_PDN_TYPE_IPV4V6"); - esm_pdn_type = ESM_PDN_TYPE_IPV4V6; - break; - - default: - LOG_TRACE(INFO, "EMM - esm_pdn_type = ESM_PDN_TYPE_IPV4 (forced to default)"); - esm_pdn_type = ESM_PDN_TYPE_IPV4; - } - - LOG_TRACE(INFO, "EMM - qci = %u ", msg_pP->qci); - LOG_TRACE(INFO, "EMM - qos.qci = %u ", msg_pP->qos.qci); - LOG_TRACE(INFO, "EMM - qos.mbrUL = %u ", msg_pP->qos.mbrUL); - LOG_TRACE(INFO, "EMM - qos.mbrDL = %u ", msg_pP->qos.mbrDL); - LOG_TRACE(INFO, "EMM - qos.gbrUL = %u ", msg_pP->qos.gbrUL); - LOG_TRACE(INFO, "EMM - qos.gbrDL = %u ", msg_pP->qos.gbrDL); - qos.bitRatesPresent = 0; - qos.bitRatesExtPresent = 0; -#warning "Some work to do here about qos" - qos.qci = msg_pP->qci; - qos.bitRates.maxBitRateForUL = 0;//msg_pP->qos.mbrUL; - qos.bitRates.maxBitRateForDL = 0;//msg_pP->qos.mbrDL; - qos.bitRates.guarBitRateForUL = 0;//msg_pP->qos.gbrUL; - qos.bitRates.guarBitRateForDL = 0;//msg_pP->qos.gbrDL; - - qos.bitRatesExt.maxBitRateForUL = 0; - qos.bitRatesExt.maxBitRateForDL = 0; - qos.bitRatesExt.guarBitRateForUL = 0; - qos.bitRatesExt.guarBitRateForDL = 0; - - //-------------------------------------------------------------------------- - // PCO processing - //-------------------------------------------------------------------------- - memset(&pco, 0, sizeof(ProtocolConfigurationOptions)); - length_in_pco = msg_pP->pco.byte[1]; - if ((length_in_pco+1+1) != msg_pP->pco.length) { - LOG_TRACE(WARNING, "PCO: mismatch in lengths length_pco+1+1 %u != msg_pP->pco.length %u\n", - length_in_pco+1+1, msg_pP->pco.length); - } - pco.configurationprotol = msg_pP->pco.byte[2] & 0x07; - - for (int i = 0; i < msg_pP->pco.length; i++) { - LOG_TRACE(WARNING, "EMMCN_PDN_CONNECTIVITY_RES.pco.byte[%u] = 0x%x", i, msg_pP->pco.byte[i]); - } - - - if ((length_in_pco > 0) && (msg_pP->pco.byte[2] & 0x80)) { - pco_in_index = PCO_MIN_LENGTH; - while (length_in_pco >= 3) { - pi_or_ci = (((uint16_t)msg_pP->pco.byte[pco_in_index]) << 8) | (uint16_t)msg_pP->pco.byte[pco_in_index+1]; - pco_in_index += 2; - length_pi_or_ci = msg_pP->pco.byte[pco_in_index++]; - pco.protocolid[pco.num_protocol_id_or_container_id] = pi_or_ci; - pco.lengthofprotocolid[pco.num_protocol_id_or_container_id] = length_pi_or_ci; - pco.protocolidcontents[pco.num_protocol_id_or_container_id].value = malloc(length_pi_or_ci); - pco.protocolidcontents[pco.num_protocol_id_or_container_id].length = length_pi_or_ci; - memcpy(pco.protocolidcontents[pco.num_protocol_id_or_container_id].value, - &msg_pP->pco.byte[pco_in_index], - length_pi_or_ci); - - LOG_TRACE(WARNING, "PCO: Found pi_or_ci 0x%x length %u content %s\n", - pi_or_ci, length_pi_or_ci, dump_octet_string(&pco.protocolidcontents[pco.num_protocol_id_or_container_id])); - pco.num_protocol_id_or_container_id++; - pco_in_index += length_pi_or_ci; - - length_in_pco = length_in_pco - (length_pi_or_ci + 2 + 1); - } // while (length_in_pco >= 3) { - } // if ((length_in_pco > 0) && (msg_pP->pco.byte[2] & 0x80)) { - /*************************************************************************/ - /* CODE THAT WAS IN esm_recv.c/esm_recv_pdn_connectivity_request() */ - /*************************************************************************/ - /* Execute the PDN connectivity procedure requested by the UE */ - pid = esm_proc_pdn_connectivity_request( - emm_ctx_p, - msg_pP->pti, - msg_pP->request_type, - &msg_pP->apn, - esm_pdn_type, - &msg_pP->pdn_addr, - NULL, - &esm_cause); - LOG_TRACE(INFO, "EMM - APN = %s ", (char *)(msg_pP->apn.value)); - - if (pid != RETURNerror) { - /* Create local default EPS bearer context */ - rc = esm_proc_default_eps_bearer_context( - emm_ctx_p, - pid, - &new_ebi, - &msg_pP->qos, - &esm_cause); - - if (rc != RETURNerror) { - esm_cause = ESM_CAUSE_SUCCESS; - } - } else { - LOG_FUNC_RETURN (rc); - } - - /**************************************************************************/ - /* END OF CODE THAT WAS IN esm_recv.c/esm_recv_pdn_connectivity_request() */ - /**************************************************************************/ - LOG_TRACE(INFO, "EMM - APN = %s ", (char *)(msg_pP->apn.value)); - - - /*************************************************************************/ - /* CODE THAT WAS IN esm_sap.c/_esm_sap_recv() */ - /*************************************************************************/ - /* Return default EPS bearer context request message */ - rc = esm_send_activate_default_eps_bearer_context_request( - msg_pP->pti, - new_ebi, //msg_pP->ebi, - &esm_msg.activate_default_eps_bearer_context_request, - &msg_pP->apn, - &pco, - esm_pdn_type, - &msg_pP->pdn_addr, - &qos, - ESM_CAUSE_SUCCESS); - - - if (rc != RETURNerror) { - /* Encode the returned ESM response message */ - int size = esm_msg_encode(&esm_msg, (uint8_t *)_emm_cn_sap_buffer, - EMM_CN_SAP_BUFFER_SIZE); - LOG_TRACE(INFO, "ESM encoded MSG size %d ", size); - - if (size > 0) { - rsp.length = size; - rsp.value = (uint8_t *)(_emm_cn_sap_buffer); - } - - /* Complete the relevant ESM procedure */ - rc = esm_proc_default_eps_bearer_context_request( - is_standalone, - emm_ctx_p, - new_ebi, //0, //ESM_EBI_UNASSIGNED, //msg->ebi, - &rsp, - triggered_by_ue); - - if (rc != RETURNok) { - /* Return indication that ESM procedure failed */ - LOG_FUNC_RETURN (rc); - } - } else { - LOG_TRACE(INFO, "ESM send activate_default_eps_bearer_context_request failed"); - } - - /*************************************************************************/ - /* END OF CODE THAT WAS IN esm_sap.c/_esm_sap_recv() */ - /*************************************************************************/ - - LOG_TRACE(INFO, "EMM - APN = %s ", (char *)(msg_pP->apn.value)); - data_p = (attach_data_t *)emm_proc_common_get_args(msg_pP->ue_id); - - /* Setup the ESM message container */ - data_p->esm_msg.value = (uint8_t *)malloc(rsp.length); - - if (data_p->esm_msg.value) { - data_p->esm_msg.length = rsp.length; - LOG_TRACE(INFO, "EMM - copy ESM MSG %d bytes", data_p->esm_msg.length); - memcpy(data_p->esm_msg.value, - rsp.value, - rsp.length); - } else { - data_p->esm_msg.length = 0; - } - - /* Send attach accept message to the UE */ - rc = emm_cn_wrapper_attach_accept(emm_ctx_p, data_p); - - if (rc != RETURNerror) { - if (emm_ctx_p->guti_is_new && emm_ctx_p->old_guti) { - /* Implicit GUTI reallocation; - * Notify EMM that common procedure has been initiated - */ - emm_sap_t emm_sap; - emm_sap.primitive = EMMREG_COMMON_PROC_REQ; - emm_sap.u.emm_reg.ueid = msg_pP->ue_id; - rc = emm_sap_send(&emm_sap); - } - } - - LOG_TRACE(INFO, "EMM - APN = %s ", (char *)(msg_pP->apn.value)); - LOG_FUNC_RETURN (rc); -} - -static int _emm_cn_pdn_connectivity_fail(const emm_cn_pdn_fail_t *msg) -{ - int rc = RETURNok; - - LOG_FUNC_IN; - - LOG_FUNC_RETURN (rc); -} - -int emm_cn_send(const emm_cn_t *msg) -{ - int rc = RETURNerror; - emm_cn_primitive_t primitive = msg->primitive; - - LOG_FUNC_IN; - - LOG_TRACE(INFO, "EMMCN-SAP - Received primitive %s (%d)", - _emm_cn_primitive_str[primitive - _EMMCN_START - 1], primitive); - - switch (primitive) { - case _EMMCN_AUTHENTICATION_PARAM_RES: - rc = _emm_cn_authentication_res(msg->u.auth_res); - break; - - case _EMMCN_AUTHENTICATION_PARAM_FAIL: - rc = _emm_cn_authentication_fail(msg->u.auth_fail); - break; - - case EMMCN_DEREGISTER_UE: - rc = _emm_cn_deregister_ue(msg->u.deregister.UEid); - break; - - case EMMCN_PDN_CONNECTIVITY_RES: - rc = _emm_cn_pdn_connectivity_res(msg->u.emm_cn_pdn_res); - break; - - case EMMCN_PDN_CONNECTIVITY_FAIL: - rc = _emm_cn_pdn_connectivity_fail(msg->u.emm_cn_pdn_fail); - break; - - default: - /* Other primitives are forwarded to the Access Stratum */ - rc = RETURNerror; - break; - } - - if (rc != RETURNok) { - LOG_TRACE(ERROR, "EMMCN-SAP - Failed to process primitive %s (%d)", - _emm_cn_primitive_str[primitive - _EMMCN_START - 1], - primitive); - } - - LOG_FUNC_RETURN (rc); -} -#endif diff --git a/openair-cn/NAS/MME/EMM/SAP/emm_cn.h b/openair-cn/NAS/MME/EMM/SAP/emm_cn.h deleted file mode 100644 index cb4e687b62..0000000000 --- a/openair-cn/NAS/MME/EMM/SAP/emm_cn.h +++ /dev/null @@ -1,56 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** - -Source emm_cn.h - -Version 0.1 - -Date 2013/12/05 - -Product NAS stack - -Subsystem EPS Core Network - -Author Sebastien Roux, Lionel GAUTHIER - -Description - -*****************************************************************************/ - -#include "emm_cnDef.h" - -#ifndef _EMM_CN_H_ -#define _EMM_CN_H_ - -#if defined(NAS_BUILT_IN_EPC) -int emm_cn_send(const emm_cn_t *msg); -#endif - -#endif /* _EMM_CN_H_ */ diff --git a/openair-cn/NAS/MME/EMM/SAP/emm_cnDef.h b/openair-cn/NAS/MME/EMM/SAP/emm_cnDef.h deleted file mode 100644 index 738871e5eb..0000000000 --- a/openair-cn/NAS/MME/EMM/SAP/emm_cnDef.h +++ /dev/null @@ -1,88 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** - -Source emm_cnDef.h - -Version 0.1 - -Date 2013/12/05 - -Product NAS stack - -Subsystem EPS Core Network - -Author Sebastien Roux, Lionel GAUTHIER - -Description - -*****************************************************************************/ - -#if defined(NAS_BUILT_IN_EPC) -#include "intertask_interface.h" -#endif - -#ifndef __EMM_CNDEF_H__ -#define __EMM_CNDEF_H__ - -typedef enum emmcn_primitive_s { - _EMMCN_START = 400, -#if defined(NAS_BUILT_IN_EPC) - _EMMCN_AUTHENTICATION_PARAM_RES, - _EMMCN_AUTHENTICATION_PARAM_FAIL, - _EMMCN_DEREGISTER_UE, - _EMMCN_PDN_CONNECTIVITY_RES, // LG - _EMMCN_PDN_CONNECTIVITY_FAIL,// LG -#endif - _EMMCN_END -} emm_cn_primitive_t; - -#if defined(NAS_BUILT_IN_EPC) -typedef nas_auth_param_rsp_t emm_cn_auth_res_t; -typedef nas_auth_param_fail_t emm_cn_auth_fail_t; -typedef nas_pdn_connectivity_rsp_t emm_cn_pdn_res_t; -typedef nas_pdn_connectivity_fail_t emm_cn_pdn_fail_t; - -typedef struct emm_cn_deregister_ue_s { - uint32_t UEid; -} emm_cn_deregister_ue_t; - -typedef struct emm_mme_ul_s { - emm_cn_primitive_t primitive; - union { - emm_cn_auth_res_t *auth_res; - emm_cn_auth_fail_t *auth_fail; - emm_cn_deregister_ue_t deregister; - emm_cn_pdn_res_t *emm_cn_pdn_res; - emm_cn_pdn_fail_t *emm_cn_pdn_fail; - } u; -} emm_cn_t; -#endif - -#endif /* __EMM_CNDEF_H__ */ diff --git a/openair-cn/NAS/MME/EMM/SAP/emm_esm.c b/openair-cn/NAS/MME/EMM/SAP/emm_esm.c deleted file mode 100644 index 2a7af5c780..0000000000 --- a/openair-cn/NAS/MME/EMM/SAP/emm_esm.c +++ /dev/null @@ -1,147 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source emm_esm.c - -Version 0.1 - -Date 2012/10/16 - -Product NAS stack - -Subsystem EPS Mobility Management - -Author Frederic Maurel - -Description Defines the EMMESM Service Access Point that provides - interlayer services to the EPS Session Management sublayer - for service registration and activate/deactivate PDN - connections. - -*****************************************************************************/ - -#include "emm_esm.h" -#include "commonDef.h" -#include "nas_log.h" - -#include "LowerLayer.h" - - -/****************************************************************************/ -/**************** E X T E R N A L D E F I N I T I O N S ****************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************* L O C A L D E F I N I T I O N S *******************/ -/****************************************************************************/ - -/* - * String representation of EMMESM-SAP primitives - */ -static const char *_emm_esm_primitive_str[] = { - "EMMESM_RELEASE_IND", - "EMMESM_UNITDATA_REQ", - "EMMESM_UNITDATA_IND", -}; - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -/**************************************************************************** - ** ** - ** Name: emm_esm_initialize() ** - ** ** - ** Description: Initializes the EMMESM Service Access Point ** - ** ** - ** Inputs: None ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: None ** - ** Others: NONE ** - ** ** - ***************************************************************************/ -void emm_esm_initialize(void) -{ - LOG_FUNC_IN; - - /* TODO: Initialize the EMMESM-SAP */ - - LOG_FUNC_OUT; -} - -/**************************************************************************** - ** ** - ** Name: emm_esm_send() ** - ** ** - ** Description: Processes the EMMESM Service Access Point primitive ** - ** ** - ** Inputs: msg: The EMMESM-SAP primitive to process ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int emm_esm_send(const emm_esm_t *msg) -{ - LOG_FUNC_IN; - - int rc = RETURNerror; - emm_esm_primitive_t primitive = msg->primitive; - - LOG_TRACE(INFO, "EMMESM-SAP - Received primitive %s (%d)", - _emm_esm_primitive_str[primitive - _EMMESM_START - 1], primitive); - - switch (primitive) { - - case _EMMESM_UNITDATA_REQ: - /* ESM requests EMM to transfer ESM data unit to lower layer */ - rc = lowerlayer_data_req(msg->ueid, &msg->u.data.msg); - break; - - default: - break; - - } - - if (rc != RETURNok) { - LOG_TRACE(WARNING, "EMMESM-SAP - Failed to process primitive %s (%d)", - _emm_esm_primitive_str[primitive - _EMMESM_START - 1], - primitive); - } - - LOG_FUNC_RETURN (rc); -} - -/****************************************************************************/ -/********************* L O C A L F U N C T I O N S *********************/ -/****************************************************************************/ diff --git a/openair-cn/NAS/MME/EMM/SAP/emm_esm.h b/openair-cn/NAS/MME/EMM/SAP/emm_esm.h deleted file mode 100644 index 6967b97ca1..0000000000 --- a/openair-cn/NAS/MME/EMM/SAP/emm_esm.h +++ /dev/null @@ -1,73 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** - -Source emm_esm.h - -Version 0.1 - -Date 2012/10/16 - -Product NAS stack - -Subsystem EPS Mobility Management - -Author Frederic Maurel - -Description Defines the EMMESM Service Access Point that provides - interlayer services to the EPS Session Management sublayer - for service registration and activate/deactivate PDP context. - -*****************************************************************************/ -#ifndef __EMM_ESM_H__ -#define __EMM_ESM_H__ - -#include "emm_esmDef.h" - -/****************************************************************************/ -/********************* G L O B A L C O N S T A N T S *******************/ -/****************************************************************************/ - -/****************************************************************************/ -/************************ G L O B A L T Y P E S ************************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************** G L O B A L V A R I A B L E S ********************/ -/****************************************************************************/ - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -void emm_esm_initialize(void); - -int emm_esm_send(const emm_esm_t *msg); - -#endif /* __EMM_ESM_H__*/ diff --git a/openair-cn/NAS/MME/EMM/SAP/emm_esmDef.h b/openair-cn/NAS/MME/EMM/SAP/emm_esmDef.h deleted file mode 100644 index 3fbc035bdf..0000000000 --- a/openair-cn/NAS/MME/EMM/SAP/emm_esmDef.h +++ /dev/null @@ -1,116 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source emm_esmDef.h - -Version 0.1 - -Date 2012/10/16 - -Product NAS stack - -Subsystem EPS Mobility Management - -Author Frederic Maurel - -Description Defines the EMMESM Service Access Point that provides - interlayer services to the EPS Session Management sublayer - for service registration and activate/deactivate PDN - connections. - -*****************************************************************************/ -#ifndef __EMM_ESMDEF_H__ -#define __EMM_ESMDEF_H__ - -#include "OctetString.h" -#include "emmData.h" - -/****************************************************************************/ -/********************* G L O B A L C O N S T A N T S *******************/ -/****************************************************************************/ - -/* - * EMMESM-SAP primitives - */ -typedef enum { - _EMMESM_START = 100, - _EMMESM_RELEASE_IND, - _EMMESM_UNITDATA_REQ, - _EMMESM_UNITDATA_IND, - _EMMESM_END -} emm_esm_primitive_t; - -/****************************************************************************/ -/************************ G L O B A L T Y P E S ************************/ -/****************************************************************************/ - -/* - * EMMESM primitive for connection establishment - * --------------------------------------------- - */ -typedef struct { - int is_emergency; /* Indicates whether the PDN connection is established - * for emergency bearer services only */ - int is_attached; /* Indicates whether the UE remains attached to the - * network */ -} emm_esm_establish_t; - -/* - * EMMESM primitive for data transfer - * ---------------------------------- - */ -typedef struct { - OctetString msg; /* ESM message to be transfered */ -} emm_esm_data_t; - -/* - * --------------------------------- - * Structure of EMMESM-SAP primitive - * --------------------------------- - */ -typedef struct { - emm_esm_primitive_t primitive; - unsigned int ueid; - emm_data_context_t *ctx; - union { - emm_esm_establish_t establish; - emm_esm_data_t data; - } u; - /* TODO: complete emm_esm_t structure definition */ -} emm_esm_t; - -/****************************************************************************/ -/******************** G L O B A L V A R I A B L E S ********************/ -/****************************************************************************/ - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -#endif /* __EMM_ESMDEF_H__*/ diff --git a/openair-cn/NAS/MME/EMM/SAP/emm_fsm.c b/openair-cn/NAS/MME/EMM/SAP/emm_fsm.c deleted file mode 100644 index bbbace861b..0000000000 --- a/openair-cn/NAS/MME/EMM/SAP/emm_fsm.c +++ /dev/null @@ -1,328 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** - -Source emm_fsm.c - -Version 0.1 - -Date 2012/10/03 - -Product NAS stack - -Subsystem EPS Mobility Management - -Author Frederic Maurel - -Description Defines the EPS Mobility Management procedures executed at - the EMMREG Service Access Point. - -*****************************************************************************/ - -#include "emm_fsm.h" -#include "commonDef.h" -#include "nas_log.h" - -#include "mme_api.h" -#include "emmData.h" - -#if defined(NAS_BUILT_IN_EPC) -# include "assertions.h" -#endif -# include "msc.h" - -/****************************************************************************/ -/**************** E X T E R N A L D E F I N I T I O N S ****************/ -/****************************************************************************/ - - -#define EMM_FSM_NB_UE_MAX (MME_API_NB_UE_MAX + 1) - -/****************************************************************************/ -/******************* L O C A L D E F I N I T I O N S *******************/ -/****************************************************************************/ - -/* - * ----------------------------------------------------------------------------- - * Data used for trace logging - * ----------------------------------------------------------------------------- - */ - -/* String representation of EMM events */ -static const char *_emm_fsm_event_str[] = { - "COMMON_PROC_REQ", - "COMMON_PROC_CNF", - "COMMON_PROC_REJ", - "PROC_ABORT", - "ATTACH_CNF", - "ATTACH_REJ", - "DETACH_INIT", - "DETACH_REQ", - "DETACH_FAILED", - "DETACH_CNF", - "TAU_REQ", - "TAU_CNF", - "TAU_REJ", - "SERVICE_REQ", - "SERVICE_CNF", - "SERVICE_REJ", - "LOWERLAYER_SUCCESS", - "LOWERLAYER_FAILURE", - "LOWERLAYER_RELEASE", -}; - -/* String representation of EMM status */ -static const char *_emm_fsm_status_str[EMM_STATE_MAX] = { - "INVALID", - "DEREGISTERED", - "REGISTERED", - "DEREGISTERED-INITIATED", - "COMMON-PROCEDURE-INITIATED", -}; - -/* - * ----------------------------------------------------------------------------- - * EPS Mobility Management state machine handlers - * ----------------------------------------------------------------------------- - */ - -/* Type of the EPS Mobility Management state machine handler */ -typedef int(*emm_fsm_handler_t)(const emm_reg_t *); - -int EmmDeregistered(const emm_reg_t *); -int EmmRegistered(const emm_reg_t *); -int EmmDeregisteredInitiated(const emm_reg_t *); -int EmmCommonProcedureInitiated(const emm_reg_t *); - -/* EMM state machine handlers */ -static const emm_fsm_handler_t _emm_fsm_handlers[EMM_STATE_MAX] = { - NULL, - EmmDeregistered, - EmmRegistered, - EmmDeregisteredInitiated, - EmmCommonProcedureInitiated, -}; - -/* - * ----------------------------------------------------------------------------- - * Current EPS Mobility Management status - * ----------------------------------------------------------------------------- - */ - -#if !defined(NAS_BUILT_IN_EPC) -emm_fsm_state_t _emm_fsm_status[EMM_FSM_NB_UE_MAX]; -#endif - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -/**************************************************************************** - ** ** - ** Name: emm_fsm_initialize() ** - ** ** - ** Description: Initializes the EMM state machine ** - ** ** - ** Inputs: None ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: None ** - ** Others: _emm_fsm_status ** - ** ** - ***************************************************************************/ -void emm_fsm_initialize(void) -{ - int ueid; - LOG_FUNC_IN; - - -#if !defined(NAS_BUILT_IN_EPC) - - for (ueid = 0; ueid < EMM_FSM_NB_UE_MAX; ueid++) { - _emm_fsm_status[ueid] = EMM_DEREGISTERED; - } - -#endif - - LOG_FUNC_OUT; -} - -/**************************************************************************** - ** ** - ** Name: emm_fsm_set_status() ** - ** ** - ** Description: Set the EPS Mobility Management status to the given state ** - ** ** - ** Inputs: ueid: Lower layers UE identifier ** - ** status: The new EMM status ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: _emm_fsm_status ** - ** ** - ***************************************************************************/ -int emm_fsm_set_status( - unsigned int ueid, - void *ctx, - emm_fsm_state_t status) -{ - LOG_FUNC_IN; - -#if defined(NAS_BUILT_IN_EPC) - emm_data_context_t *emm_ctx = (emm_data_context_t *)ctx; - - DevAssert(emm_ctx != NULL); - - if ((status < EMM_STATE_MAX) && (ueid > 0)) { - - if (status != emm_ctx->_emm_fsm_status) { - LOG_TRACE(INFO, "EMM-FSM - Status changed: %s ===> %s", - _emm_fsm_status_str[emm_ctx->_emm_fsm_status], - _emm_fsm_status_str[status]); - MSC_LOG_EVENT(MSC_NAS_EMM_MME, "0 EMM state %s ", _emm_fsm_status_str[status]); - emm_ctx->_emm_fsm_status = status; - } - - LOG_FUNC_RETURN (RETURNok); - } - -#else - - if ( (status < EMM_STATE_MAX) && (ueid < EMM_FSM_NB_UE_MAX) ) { - if (status != _emm_fsm_status[ueid]) { - LOG_TRACE(INFO, "EMM-FSM - Status changed: %s ===> %s", - _emm_fsm_status_str[_emm_fsm_status[ueid]], - _emm_fsm_status_str[status]); - - _emm_fsm_status[ueid] = status; - } - - LOG_FUNC_RETURN (RETURNok); - } - -#endif - - LOG_FUNC_RETURN (RETURNerror); -} - -/**************************************************************************** - ** ** - ** Name: emm_fsm_get_status() ** - ** ** - ** Description: Get the current value of the EPS Mobility Management ** - ** status ** - ** ** - ** Inputs: ueid: Lower layers UE identifier ** - ** Others: _emm_fsm_status ** - ** ** - ** Outputs: None ** - ** Return: The current value of the EMM status ** - ** Others: None ** - ** ** - ***************************************************************************/ -emm_fsm_state_t emm_fsm_get_status(unsigned int ueid, void *ctx) -{ -# if defined(NAS_BUILT_IN_EPC) - emm_data_context_t *emm_ctx = (emm_data_context_t *)ctx; - if (emm_ctx == NULL) { - LOG_TRACE(INFO, "EMM-FSM - try again get context ueid "NAS_UE_ID_FMT" ", - ueid); - emm_ctx = emm_data_context_get(&_emm_data, ueid); - } - if (emm_ctx != NULL) { - return emm_ctx->_emm_fsm_status; - } - -# else - - if (ueid < EMM_FSM_NB_UE_MAX) { - return (_emm_fsm_status[ueid]); - } -#endif - return EMM_STATE_MAX; -} - -/**************************************************************************** - ** ** - ** Name: emm_fsm_process() ** - ** ** - ** Description: Executes the EMM state machine ** - ** ** - ** Inputs: evt: The EMMREG-SAP event to process ** - ** Others: _emm_fsm_status ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int emm_fsm_process(const emm_reg_t *evt) -{ - int rc; - emm_fsm_state_t status; - emm_reg_primitive_t primitive; - - LOG_FUNC_IN; - - primitive = evt->primitive; - -# if defined(NAS_BUILT_IN_EPC) - emm_data_context_t *emm_ctx = (emm_data_context_t *)evt->ctx; - DevAssert(emm_ctx != NULL); - - status = emm_fsm_get_status(0, emm_ctx); -# else - - if (evt->ueid >= EMM_FSM_NB_UE_MAX) { - LOG_FUNC_RETURN (RETURNerror); - } - - status = _emm_fsm_status[evt->ueid]; -# endif - - LOG_TRACE(INFO, "EMM-FSM - Received event %s (%d) in state %s", - _emm_fsm_event_str[primitive - _EMMREG_START - 1], primitive, - _emm_fsm_status_str[status]); - -#if defined(NAS_BUILT_IN_EPC) - DevAssert(status != EMM_INVALID); -#endif - - /* Execute the EMM state machine */ - rc = (_emm_fsm_handlers[status])(evt); - - LOG_FUNC_RETURN (rc); -} - -/****************************************************************************/ -/********************* L O C A L F U N C T I O N S *********************/ -/****************************************************************************/ - diff --git a/openair-cn/NAS/MME/EMM/SAP/emm_fsm.h b/openair-cn/NAS/MME/EMM/SAP/emm_fsm.h deleted file mode 100644 index 15ca989cc5..0000000000 --- a/openair-cn/NAS/MME/EMM/SAP/emm_fsm.h +++ /dev/null @@ -1,91 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** - -Source emm_fsm.h - -Version 0.1 - -Date 2012/10/03 - -Product NAS stack - -Subsystem EPS Mobility Management - -Author Frederic Maurel - -Description Defines the EPS Mobility Management procedures executed at - the EMMREG Service Access Point. - -*****************************************************************************/ -#ifndef __EMM_FSM_H__ -#define __EMM_FSM_H__ - -#include "emm_regDef.h" - -/****************************************************************************/ -/********************* G L O B A L C O N S T A N T S *******************/ -/****************************************************************************/ - -/****************************************************************************/ -/************************ G L O B A L T Y P E S ************************/ -/****************************************************************************/ - -/* - * States of the EPS Mobility Management sublayer - * ---------------------------------------------- - * The EMM protocol of the UE and the network is described by means of two - * different state machines. - */ -typedef enum { - EMM_INVALID, - EMM_DEREGISTERED, - EMM_REGISTERED, - EMM_DEREGISTERED_INITIATED, - EMM_COMMON_PROCEDURE_INITIATED, - EMM_STATE_MAX -} emm_fsm_state_t; - -/****************************************************************************/ -/******************** G L O B A L V A R I A B L E S ********************/ -/****************************************************************************/ - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -void emm_fsm_initialize(void); - -//LG 2015-03-13 struct emm_data_context_t; -int emm_fsm_set_status(unsigned int ueid, void *ctx, emm_fsm_state_t status); -emm_fsm_state_t emm_fsm_get_status(unsigned int ueid, void *ctx); - -int emm_fsm_process(const emm_reg_t *evt); - -#endif /* __EMM_FSM_H__*/ diff --git a/openair-cn/NAS/MME/EMM/SAP/emm_recv.c b/openair-cn/NAS/MME/EMM/SAP/emm_recv.c deleted file mode 100644 index 2f0d944679..0000000000 --- a/openair-cn/NAS/MME/EMM/SAP/emm_recv.c +++ /dev/null @@ -1,748 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** - -Source emm_recv.c - -Version 0.1 - -Date 2013/01/30 - -Product NAS stack - -Subsystem EPS Mobility Management - -Author Frederic Maurel - -Description Defines functions executed at the EMMAS Service Access - Point upon receiving EPS Mobility Management messages - from the Access Stratum sublayer. - -*****************************************************************************/ - -#include "emm_recv.h" -#include "commonDef.h" -#include "nas_log.h" - -#include "emm_msgDef.h" -#include "emm_cause.h" -#include "emm_proc.h" - -#include <string.h> // memcpy - -/****************************************************************************/ -/**************** E X T E R N A L D E F I N I T I O N S ****************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************* L O C A L D E F I N I T I O N S *******************/ -/****************************************************************************/ - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -/****************************************************************************/ -/********************* L O C A L F U N C T I O N S *********************/ -/****************************************************************************/ - -/* - * -------------------------------------------------------------------------- - * Functions executed by both the UE and the MME upon receiving EMM messages - * -------------------------------------------------------------------------- - */ -/**************************************************************************** - ** ** - ** Name: emm_recv_status() ** - ** ** - ** Description: Processes EMM status message ** - ** ** - ** Inputs: ueid: UE lower layer identifier ** - ** msg: The received EMM message ** - ** Others: None ** - ** ** - ** Outputs: emm_cause: EMM cause code ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int emm_recv_status(unsigned int ueid, emm_status_msg *msg, int *emm_cause) -{ - LOG_FUNC_IN; - - int rc; - - LOG_TRACE(INFO, "EMMAS-SAP - Received EMM Status message (cause=%d)", - msg->emmcause); - - /* - * Message checking - */ - *emm_cause = EMM_CAUSE_SUCCESS; - /* - * Message processing - */ - rc = emm_proc_status_ind(ueid, msg->emmcause); - - LOG_FUNC_RETURN (rc); -} - -/* - * -------------------------------------------------------------------------- - * Functions executed by the MME upon receiving EMM message from the UE - * -------------------------------------------------------------------------- - */ -/**************************************************************************** - ** ** - ** Name: emm_recv_attach_request() ** - ** ** - ** Description: Processes Attach Request message ** - ** ** - ** Inputs: ueid: UE lower layer identifier ** - ** msg: The received EMM message ** - ** Others: None ** - ** ** - ** Outputs: emm_cause: EMM cause code ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int emm_recv_attach_request(unsigned int ueid, const attach_request_msg *msg, - int *emm_cause) -{ - int rc; - uint8_t gea = 0; - emm_proc_attach_type_t type; - - LOG_FUNC_IN; - - LOG_TRACE(INFO, "EMMAS-SAP - Received Attach Request message"); - - /* - * Message checking - */ -#if !defined(UPDATE_RELEASE_9) - - /* SR: In releases 9 and beyond the mandatory ie (old GUTI) has been removed */ - if ( (msg->oldgutiorimsi.guti.typeofidentity == EPS_MOBILE_IDENTITY_GUTI) && - !(msg->presencemask & ATTACH_REQUEST_OLD_GUTI_TYPE_PRESENT) ) { - /* The Old GUTI type IE shall be included if the type of identity - * in the EPS mobile identity IE is set to "GUTI" */ - *emm_cause = EMM_CAUSE_INVALID_MANDATORY_INFO; - LOG_TRACE(WARNING, "EMMAS-SAP - [%08x] - Received GUTI identity without " - "old GUTI IEI", ueid); - } else -#endif /* !defined(UPDATE_RELEASE_9) */ - if (msg->uenetworkcapability.spare != 0b000) { - /* Spare bits shall be coded as zero */ - *emm_cause = EMM_CAUSE_PROTOCOL_ERROR; - LOG_TRACE(WARNING, "EMMAS-SAP - [%08x] - Non zero spare bits is suspicious", - ueid); - } - - /* Handle message checking error */ - if (*emm_cause != EMM_CAUSE_SUCCESS) { - /* 3GPP TS 24.301, section 5.5.1.2.7, case b - * Perform protocol error abnormal case on the network side */ - rc = emm_proc_attach_reject(ueid, *emm_cause); - *emm_cause = EMM_CAUSE_SUCCESS; - LOG_FUNC_RETURN (rc); - } - - /* - * Message processing - */ - /* Get the EPS attach type */ - if (msg->epsattachtype == EPS_ATTACH_TYPE_EPS) { - type = EMM_ATTACH_TYPE_EPS; - } else if (msg->epsattachtype == EPS_ATTACH_TYPE_IMSI) { - type = EMM_ATTACH_TYPE_IMSI; - } else if (msg->epsattachtype == EPS_ATTACH_TYPE_EMERGENCY) { - type = EMM_ATTACH_TYPE_EMERGENCY; - } else if (msg->epsattachtype == EPS_ATTACH_TYPE_RESERVED) { - type = EMM_ATTACH_TYPE_RESERVED; - } else { - /* All other values shall be interpreted as "EPS attach" */ - type = EMM_ATTACH_TYPE_EPS; - } - - /* Get the EPS mobile identity */ - GUTI_t guti, *p_guti = NULL; - imsi_t imsi, *p_imsi = NULL; - imei_t imei, *p_imei = NULL; - - if (msg->oldgutiorimsi.guti.typeofidentity == EPS_MOBILE_IDENTITY_GUTI) { - /* Get the GUTI */ - p_guti = &guti; - guti.gummei.plmn.MCCdigit1 = msg->oldgutiorimsi.guti.mccdigit1; - guti.gummei.plmn.MCCdigit2 = msg->oldgutiorimsi.guti.mccdigit2; - guti.gummei.plmn.MCCdigit3 = msg->oldgutiorimsi.guti.mccdigit3; - guti.gummei.plmn.MNCdigit1 = msg->oldgutiorimsi.guti.mncdigit1; - guti.gummei.plmn.MNCdigit2 = msg->oldgutiorimsi.guti.mncdigit2; - guti.gummei.plmn.MNCdigit3 = msg->oldgutiorimsi.guti.mncdigit3; - guti.gummei.MMEgid = msg->oldgutiorimsi.guti.mmegroupid; - guti.gummei.MMEcode = msg->oldgutiorimsi.guti.mmecode; - guti.m_tmsi = msg->oldgutiorimsi.guti.mtmsi; - } else if (msg->oldgutiorimsi.imsi.typeofidentity == EPS_MOBILE_IDENTITY_IMSI) { - /* Get the IMSI */ - p_imsi = &imsi; - imsi.u.num.digit1 = msg->oldgutiorimsi.imsi.digit1; - imsi.u.num.digit2 = msg->oldgutiorimsi.imsi.digit2; - imsi.u.num.digit3 = msg->oldgutiorimsi.imsi.digit3; - imsi.u.num.digit4 = msg->oldgutiorimsi.imsi.digit4; - imsi.u.num.digit5 = msg->oldgutiorimsi.imsi.digit5; - imsi.u.num.digit6 = msg->oldgutiorimsi.imsi.digit6; - imsi.u.num.digit7 = msg->oldgutiorimsi.imsi.digit7; - imsi.u.num.digit8 = msg->oldgutiorimsi.imsi.digit8; - imsi.u.num.digit9 = msg->oldgutiorimsi.imsi.digit9; - imsi.u.num.digit10 = msg->oldgutiorimsi.imsi.digit10; - imsi.u.num.digit11 = msg->oldgutiorimsi.imsi.digit11; - imsi.u.num.digit12 = msg->oldgutiorimsi.imsi.digit12; - imsi.u.num.digit13 = msg->oldgutiorimsi.imsi.digit13; - imsi.u.num.digit14 = msg->oldgutiorimsi.imsi.digit14; - imsi.u.num.digit15 = msg->oldgutiorimsi.imsi.digit15; - imsi.u.num.parity = msg->oldgutiorimsi.imsi.oddeven; - } else if (msg->oldgutiorimsi.imei.typeofidentity == EPS_MOBILE_IDENTITY_IMEI) { - /* Get the IMEI */ - p_imei = &imei; - imei.u.num.digit1 = msg->oldgutiorimsi.imei.digit1; - imei.u.num.digit2 = msg->oldgutiorimsi.imei.digit2; - imei.u.num.digit3 = msg->oldgutiorimsi.imei.digit3; - imei.u.num.digit4 = msg->oldgutiorimsi.imei.digit4; - imei.u.num.digit5 = msg->oldgutiorimsi.imei.digit5; - imei.u.num.digit6 = msg->oldgutiorimsi.imei.digit6; - imei.u.num.digit7 = msg->oldgutiorimsi.imei.digit7; - imei.u.num.digit8 = msg->oldgutiorimsi.imei.digit8; - imei.u.num.digit9 = msg->oldgutiorimsi.imei.digit9; - imei.u.num.digit10 = msg->oldgutiorimsi.imei.digit10; - imei.u.num.digit11 = msg->oldgutiorimsi.imei.digit11; - imei.u.num.digit12 = msg->oldgutiorimsi.imei.digit12; - imei.u.num.digit13 = msg->oldgutiorimsi.imei.digit13; - imei.u.num.digit14 = msg->oldgutiorimsi.imei.digit14; - imei.u.num.digit15 = msg->oldgutiorimsi.imei.digit15; - imei.u.num.parity = msg->oldgutiorimsi.imei.oddeven; - } - - /* TODO: Get the UE network capabilities */ - - /* Get the Last visited registered TAI */ - tai_t tai, *p_tai = NULL; - - if (msg->presencemask & ATTACH_REQUEST_LAST_VISITED_REGISTERED_TAI_PRESENT) { - p_tai = &tai; - tai.plmn.MCCdigit1 = msg->lastvisitedregisteredtai.mccdigit1; - tai.plmn.MCCdigit2 = msg->lastvisitedregisteredtai.mccdigit2; - tai.plmn.MCCdigit3 = msg->lastvisitedregisteredtai.mccdigit3; - tai.plmn.MNCdigit1 = msg->lastvisitedregisteredtai.mncdigit1; - tai.plmn.MNCdigit2 = msg->lastvisitedregisteredtai.mncdigit2; - tai.plmn.MNCdigit3 = msg->lastvisitedregisteredtai.mncdigit3; - tai.tac = msg->lastvisitedregisteredtai.tac; - } - - /* Execute the requested UE attach procedure */ -#warning " TODO gea to be review" - - if (msg->msnetworkcapability.msnetworkcapabilityvalue.length > 0) { - gea = (msg->msnetworkcapability.msnetworkcapabilityvalue.value[0] & 0x80) >> 1; - - if ((gea) && (msg->msnetworkcapability.msnetworkcapabilityvalue.length >= 2)) { - gea |= ((msg->msnetworkcapability.msnetworkcapabilityvalue.value[1] & 0x60) >> 1); - } - } - - rc = emm_proc_attach_request(ueid, type, - msg->naskeysetidentifier.tsc != NAS_KEY_SET_IDENTIFIER_MAPPED, - msg->naskeysetidentifier.naskeysetidentifier, - msg->oldgutitype != GUTI_MAPPED, p_guti, p_imsi, p_imei, p_tai, - msg->uenetworkcapability.eea, - msg->uenetworkcapability.eia, - msg->uenetworkcapability.ucs2, - msg->uenetworkcapability.uea, - msg->uenetworkcapability.uia, - gea, - msg->uenetworkcapability.umts_present, - msg->uenetworkcapability.gprs_present, - &msg->esmmessagecontainer.esmmessagecontainercontents); - - LOG_FUNC_RETURN (rc); -} - -/**************************************************************************** - ** ** - ** Name: emm_recv_attach_complete() ** - ** ** - ** Description: Processes Attach Complete message ** - ** ** - ** Inputs: ueid: UE lower layer identifier ** - ** msg: The received EMM message ** - ** Others: None ** - ** ** - ** Outputs: emm_cause: EMM cause code ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int emm_recv_attach_complete(unsigned int ueid, const attach_complete_msg *msg, - int *emm_cause) -{ - LOG_FUNC_IN; - - int rc; - - LOG_TRACE(INFO, "EMMAS-SAP - Received Attach Complete message"); - - /* Execute the attach procedure completion */ - rc = emm_proc_attach_complete(ueid, - &msg->esmmessagecontainer.esmmessagecontainercontents); - - LOG_FUNC_RETURN (rc); -} - -/**************************************************************************** - ** ** - ** Name: emm_recv_detach_request() ** - ** ** - ** Description: Processes Detach Request message ** - ** ** - ** Inputs: ueid: UE lower layer identifier ** - ** msg: The received EMM message ** - ** Others: None ** - ** ** - ** Outputs: emm_cause: EMM cause code ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int emm_recv_detach_request(unsigned int ueid, const detach_request_msg *msg, - int *emm_cause) -{ - LOG_FUNC_IN; - - int rc; - - LOG_TRACE(INFO, "EMMAS-SAP - Received Detach Request message"); - - /* - * Message processing - */ - /* Get the detach type */ - emm_proc_detach_type_t type; - - if (msg->detachtype.typeofdetach == DETACH_TYPE_EPS) { - type = EMM_DETACH_TYPE_EPS; - } else if (msg->detachtype.typeofdetach == DETACH_TYPE_IMSI) { - type = EMM_DETACH_TYPE_IMSI; - } else if (msg->detachtype.typeofdetach == DETACH_TYPE_EPS_IMSI) { - type = EMM_DETACH_TYPE_EPS_IMSI; - } else if (msg->detachtype.typeofdetach == DETACH_TYPE_RESERVED_1) { - type = EMM_DETACH_TYPE_RESERVED; - } else if (msg->detachtype.typeofdetach == DETACH_TYPE_RESERVED_2) { - type = EMM_DETACH_TYPE_RESERVED; - } else { - /* All other values are interpreted as "combined EPS/IMSI detach" */ - type = DETACH_TYPE_EPS_IMSI; - } - - /* Get the EPS mobile identity */ - GUTI_t guti, *p_guti = NULL; - imsi_t imsi, *p_imsi = NULL; - imei_t imei, *p_imei = NULL; - - if (msg->gutiorimsi.guti.typeofidentity == EPS_MOBILE_IDENTITY_GUTI) { - /* Get the GUTI */ - p_guti = &guti; - guti.gummei.plmn.MCCdigit1 = msg->gutiorimsi.guti.mccdigit1; - guti.gummei.plmn.MCCdigit2 = msg->gutiorimsi.guti.mccdigit2; - guti.gummei.plmn.MCCdigit3 = msg->gutiorimsi.guti.mccdigit3; - guti.gummei.plmn.MNCdigit1 = msg->gutiorimsi.guti.mncdigit1; - guti.gummei.plmn.MNCdigit2 = msg->gutiorimsi.guti.mncdigit2; - guti.gummei.plmn.MNCdigit3 = msg->gutiorimsi.guti.mncdigit3; - guti.gummei.MMEgid = msg->gutiorimsi.guti.mmegroupid; - guti.gummei.MMEcode = msg->gutiorimsi.guti.mmecode; - guti.m_tmsi = msg->gutiorimsi.guti.mtmsi; - } else if (msg->gutiorimsi.imsi.typeofidentity == EPS_MOBILE_IDENTITY_IMSI) { - /* Get the IMSI */ - p_imsi = &imsi; - imsi.u.num.digit1 = msg->gutiorimsi.imsi.digit1; - imsi.u.num.digit2 = msg->gutiorimsi.imsi.digit2; - imsi.u.num.digit3 = msg->gutiorimsi.imsi.digit3; - imsi.u.num.digit4 = msg->gutiorimsi.imsi.digit4; - imsi.u.num.digit5 = msg->gutiorimsi.imsi.digit5; - imsi.u.num.digit6 = msg->gutiorimsi.imsi.digit6; - imsi.u.num.digit7 = msg->gutiorimsi.imsi.digit7; - imsi.u.num.digit8 = msg->gutiorimsi.imsi.digit8; - imsi.u.num.digit9 = msg->gutiorimsi.imsi.digit9; - imsi.u.num.digit10 = msg->gutiorimsi.imsi.digit10; - imsi.u.num.digit11 = msg->gutiorimsi.imsi.digit11; - imsi.u.num.digit12 = msg->gutiorimsi.imsi.digit12; - imsi.u.num.digit13 = msg->gutiorimsi.imsi.digit13; - imsi.u.num.digit14 = msg->gutiorimsi.imsi.digit14; - imsi.u.num.digit15 = msg->gutiorimsi.imsi.digit15; - imsi.u.num.parity = msg->gutiorimsi.imsi.oddeven; - } else if (msg->gutiorimsi.imei.typeofidentity == EPS_MOBILE_IDENTITY_IMEI) { - /* Get the IMEI */ - p_imei = &imei; - imei.u.num.digit1 = msg->gutiorimsi.imei.digit1; - imei.u.num.digit2 = msg->gutiorimsi.imei.digit2; - imei.u.num.digit3 = msg->gutiorimsi.imei.digit3; - imei.u.num.digit4 = msg->gutiorimsi.imei.digit4; - imei.u.num.digit5 = msg->gutiorimsi.imei.digit5; - imei.u.num.digit6 = msg->gutiorimsi.imei.digit6; - imei.u.num.digit7 = msg->gutiorimsi.imei.digit7; - imei.u.num.digit8 = msg->gutiorimsi.imei.digit8; - imei.u.num.digit9 = msg->gutiorimsi.imei.digit9; - imei.u.num.digit10 = msg->gutiorimsi.imei.digit10; - imei.u.num.digit11 = msg->gutiorimsi.imei.digit11; - imei.u.num.digit12 = msg->gutiorimsi.imei.digit12; - imei.u.num.digit13 = msg->gutiorimsi.imei.digit13; - imei.u.num.digit14 = msg->gutiorimsi.imei.digit14; - imei.u.num.digit15 = msg->gutiorimsi.imei.digit15; - imei.u.num.parity = msg->gutiorimsi.imei.oddeven; - } - - /* Execute the UE initiated detach procedure completion by the network */ - rc = emm_proc_detach_request(ueid, type, - msg->detachtype.switchoff != DETACH_TYPE_NORMAL_DETACH, - msg->naskeysetidentifier.tsc != NAS_KEY_SET_IDENTIFIER_MAPPED, - msg->naskeysetidentifier.naskeysetidentifier, - p_guti, p_imsi, p_imei); - - LOG_FUNC_RETURN (rc); -} - -/**************************************************************************** - ** ** - ** Name: emm_recv_tracking_area_update_request() ** - ** ** - ** Description: Processes Tracking Area Update Request message ** - ** ** - ** Inputs: ueid: UE lower layer identifier ** - ** msg: The received EMM message ** - ** Others: None ** - ** ** - ** Outputs: emm_cause: EMM cause code ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int emm_recv_tracking_area_update_request(unsigned int ueid, - const tracking_area_update_request_msg *msg, - int *emm_cause) -{ - int rc = RETURNok; - - LOG_FUNC_IN; - - LOG_TRACE(INFO, "EMMAS-SAP - Received Tracking Area Update Request message"); - - /* LW: Not completely implemented; send a Received Tracking Area Update Reject to induce a Attach Request from UE! */ - rc = emm_proc_tracking_area_update_reject(ueid, EMM_CAUSE_IMPLICITLY_DETACHED); - - LOG_FUNC_RETURN (rc); -} - -/**************************************************************************** - ** ** - ** Name: emm_recv_identity_response() ** - ** ** - ** Description: Processes Identity Response message ** - ** ** - ** Inputs: ueid: UE lower layer identifier ** - ** msg: The received EMM message ** - ** Others: None ** - ** ** - ** Outputs: emm_cause: EMM cause code ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int emm_recv_identity_response(unsigned int ueid, identity_response_msg *msg, - int *emm_cause) -{ - LOG_FUNC_IN; - - int rc = RETURNok; - - LOG_TRACE(INFO, "EMMAS-SAP - Received Identity Response message"); - - /* - * Message processing - */ - /* Get the mobile identity */ - imsi_t imsi, *p_imsi = NULL; - imei_t imei, *p_imei = NULL; - struct tmsi_struct_t { - uint8_t digit1:4; - uint8_t digit2:4; - uint8_t digit3:4; - uint8_t digit4:4; - uint8_t digit5:4; - uint8_t digit6:4; - uint8_t digit7:4; - uint8_t digit8:4; - } tmsi, *p_tmsi = NULL; - - if (msg->mobileidentity.imsi.typeofidentity == MOBILE_IDENTITY_IMSI) { - /* Get the IMSI */ - p_imsi = &imsi; - imsi.u.num.digit1 = msg->mobileidentity.imsi.digit1; - imsi.u.num.digit2 = msg->mobileidentity.imsi.digit2; - imsi.u.num.digit3 = msg->mobileidentity.imsi.digit3; - imsi.u.num.digit4 = msg->mobileidentity.imsi.digit4; - imsi.u.num.digit5 = msg->mobileidentity.imsi.digit5; - imsi.u.num.digit6 = msg->mobileidentity.imsi.digit6; - imsi.u.num.digit7 = msg->mobileidentity.imsi.digit7; - imsi.u.num.digit8 = msg->mobileidentity.imsi.digit8; - imsi.u.num.digit9 = msg->mobileidentity.imsi.digit9; - imsi.u.num.digit10 = msg->mobileidentity.imsi.digit10; - imsi.u.num.digit11 = msg->mobileidentity.imsi.digit11; - imsi.u.num.digit12 = msg->mobileidentity.imsi.digit12; - imsi.u.num.digit13 = msg->mobileidentity.imsi.digit13; - imsi.u.num.digit14 = msg->mobileidentity.imsi.digit14; - imsi.u.num.digit15 = msg->mobileidentity.imsi.digit15; - imsi.u.num.parity = msg->mobileidentity.imsi.oddeven; - } else if ((msg->mobileidentity.imei.typeofidentity == MOBILE_IDENTITY_IMEI) || - (msg->mobileidentity.imeisv.typeofidentity==MOBILE_IDENTITY_IMEISV)) { - /* Get the IMEI */ - p_imei = &imei; - imei.u.num.digit1 = msg->mobileidentity.imei.digit1; - imei.u.num.digit2 = msg->mobileidentity.imei.digit2; - imei.u.num.digit3 = msg->mobileidentity.imei.digit3; - imei.u.num.digit4 = msg->mobileidentity.imei.digit4; - imei.u.num.digit5 = msg->mobileidentity.imei.digit5; - imei.u.num.digit6 = msg->mobileidentity.imei.digit6; - imei.u.num.digit7 = msg->mobileidentity.imei.digit7; - imei.u.num.digit8 = msg->mobileidentity.imei.digit8; - imei.u.num.digit9 = msg->mobileidentity.imei.digit9; - imei.u.num.digit10 = msg->mobileidentity.imei.digit10; - imei.u.num.digit11 = msg->mobileidentity.imei.digit11; - imei.u.num.digit12 = msg->mobileidentity.imei.digit12; - imei.u.num.digit13 = msg->mobileidentity.imei.digit13; - imei.u.num.digit14 = msg->mobileidentity.imei.digit14; - imei.u.num.digit15 = msg->mobileidentity.imei.digit15; - imei.u.num.parity = msg->mobileidentity.imei.oddeven; - } else if (msg->mobileidentity.tmsi.typeofidentity == MOBILE_IDENTITY_TMSI) { - /* Get the TMSI */ - p_tmsi = &tmsi; - tmsi.digit1 = msg->mobileidentity.tmsi.digit2; - tmsi.digit2 = msg->mobileidentity.tmsi.digit3; - tmsi.digit3 = msg->mobileidentity.tmsi.digit4; - tmsi.digit4 = msg->mobileidentity.tmsi.digit5; - tmsi.digit5 = msg->mobileidentity.tmsi.digit6; - tmsi.digit6 = msg->mobileidentity.tmsi.digit7; - tmsi.digit7 = msg->mobileidentity.tmsi.digit8; - tmsi.digit8 = msg->mobileidentity.tmsi.digit9; - } - - /* Execute the identification completion procedure */ - rc = emm_proc_identification_complete(ueid, p_imsi, p_imei, - (uint32_t *)(p_tmsi)); - LOG_FUNC_RETURN (rc); -} - -/**************************************************************************** - ** ** - ** Name: emm_recv_authentication_response() ** - ** ** - ** Description: Processes Authentication Response message ** - ** ** - ** Inputs: ueid: UE lower layer identifier ** - ** msg: The received EMM message ** - ** Others: None ** - ** ** - ** Outputs: emm_cause: EMM cause code ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int emm_recv_authentication_response(unsigned int ueid, - authentication_response_msg *msg, - int *emm_cause) -{ - LOG_FUNC_IN; - - int rc = RETURNok; - - LOG_TRACE(INFO, "EMMAS-SAP - Received Authentication Response message"); - - /* - * Message checking - */ - if (msg->authenticationresponseparameter.res.length == 0) { - /* RES parameter shall not be null */ - *emm_cause = EMM_CAUSE_INVALID_MANDATORY_INFO; - } - - /* Handle message checking error */ - if (*emm_cause != EMM_CAUSE_SUCCESS) { - LOG_FUNC_RETURN (RETURNerror); - } - - /* - * Message processing - */ - /* Execute the authentication completion procedure */ - rc = emm_proc_authentication_complete(ueid, EMM_CAUSE_SUCCESS, - &msg->authenticationresponseparameter.res); - LOG_FUNC_RETURN (rc); -} - -/**************************************************************************** - ** ** - ** Name: emm_recv_authentication_failure() ** - ** ** - ** Description: Processes Authentication Failure message ** - ** ** - ** Inputs: ueid: UE lower layer identifier ** - ** msg: The received EMM message ** - ** Others: None ** - ** ** - ** Outputs: emm_cause: EMM cause code ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int emm_recv_authentication_failure(unsigned int ueid, - authentication_failure_msg *msg, - int *emm_cause) -{ - LOG_FUNC_IN; - - int rc = RETURNok; - - LOG_TRACE(INFO, "EMMAS-SAP - Received Authentication Failure message"); - - /* - * Message checking - */ - if (msg->emmcause == EMM_CAUSE_SUCCESS) { - *emm_cause = EMM_CAUSE_INVALID_MANDATORY_INFO; - } else if ( (msg->emmcause == EMM_CAUSE_SYNCH_FAILURE) && - !(msg->presencemask & - AUTHENTICATION_FAILURE_AUTHENTICATION_FAILURE_PARAMETER_PRESENT) ) { - /* AUTS parameter shall be present in case of "synch failure" */ - *emm_cause = EMM_CAUSE_INVALID_MANDATORY_INFO; - } - - /* Handle message checking error */ - if (*emm_cause != EMM_CAUSE_SUCCESS) { - LOG_FUNC_RETURN (RETURNerror); - } - - /* - * Message processing - */ - /* Execute the authentication completion procedure */ - rc = emm_proc_authentication_complete(ueid, msg->emmcause, - &msg->authenticationfailureparameter.auts); - LOG_FUNC_RETURN (rc); -} - -/**************************************************************************** - ** ** - ** Name: emm_recv_security_mode_complete() ** - ** ** - ** Description: Processes Security Mode Complete message ** - ** ** - ** Inputs: ueid: UE lower layer identifier ** - ** msg: The received EMM message ** - ** Others: None ** - ** ** - ** Outputs: emm_cause: EMM cause code ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int -emm_recv_security_mode_complete( - unsigned int ueid, - security_mode_complete_msg *msg, - int *emm_cause) -{ - LOG_FUNC_IN; - - int rc = RETURNok; - - LOG_TRACE(INFO, "EMMAS-SAP - Received Security Mode Complete message"); - - /* - * Message processing - */ - /* Execute the NAS security mode control completion procedure */ - rc = emm_proc_security_mode_complete(ueid); - - LOG_FUNC_RETURN (rc); -} - -/**************************************************************************** - ** ** - ** Name: emm_recv_security_mode_reject() ** - ** ** - ** Description: Processes Security Mode Reject message ** - ** ** - ** Inputs: ueid: UE lower layer identifier ** - ** msg: The received EMM message ** - ** Others: None ** - ** ** - ** Outputs: emm_cause: EMM cause code ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int emm_recv_security_mode_reject(unsigned int ueid, - security_mode_reject_msg *msg, - int *emm_cause) -{ - LOG_FUNC_IN; - - int rc = RETURNok; - - LOG_TRACE(INFO, "EMMAS-SAP - Received Security Mode Reject message " - "(cause=%d)", msg->emmcause); - - /* - * Message checking - */ - if (msg->emmcause == EMM_CAUSE_SUCCESS) { - *emm_cause = EMM_CAUSE_INVALID_MANDATORY_INFO; - } - - /* Handle message checking error */ - if (*emm_cause != EMM_CAUSE_SUCCESS) { - LOG_FUNC_RETURN (RETURNerror); - } - - /* - * Message processing - */ - /* Execute the NAS security mode commend not accepted by the UE */ - rc = emm_proc_security_mode_reject(ueid); - - LOG_FUNC_RETURN (rc); -} diff --git a/openair-cn/NAS/MME/EMM/SAP/emm_recv.h b/openair-cn/NAS/MME/EMM/SAP/emm_recv.h deleted file mode 100644 index 6b59722c54..0000000000 --- a/openair-cn/NAS/MME/EMM/SAP/emm_recv.h +++ /dev/null @@ -1,129 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** - -Source emm_recv.h - -Version 0.1 - -Date 2013/01/30 - -Product NAS stack - -Subsystem EPS Mobility Management - -Author Frederic Maurel - -Description Defines functions executed at the EMMAS Service Access - Point upon receiving EPS Mobility Management messages - from the Access Stratum sublayer. - -*****************************************************************************/ -#ifndef __EMM_RECV_H__ -#define __EMM_RECV_H__ - -#include "EmmStatus.h" - -#include "DetachRequest.h" -#include "DetachAccept.h" - - -#include "AttachRequest.h" -#include "AttachComplete.h" -#include "TrackingAreaUpdateRequest.h" -#include "TrackingAreaUpdateComplete.h" -#include "ServiceRequest.h" -#include "ExtendedServiceRequest.h" -#include "GutiReallocationComplete.h" -#include "AuthenticationResponse.h" -#include "AuthenticationFailure.h" -#include "IdentityResponse.h" -#include "NASSecurityModeComplete.h" -#include "SecurityModeReject.h" -#include "UplinkNasTransport.h" - -/****************************************************************************/ -/********************* G L O B A L C O N S T A N T S *******************/ -/****************************************************************************/ - -/****************************************************************************/ -/************************ G L O B A L T Y P E S ************************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************** G L O B A L V A R I A B L E S ********************/ -/****************************************************************************/ - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -/* - * -------------------------------------------------------------------------- - * Functions executed by both the UE and the MME upon receiving EMM messages - * -------------------------------------------------------------------------- - */ -int emm_recv_status(unsigned int ueid, emm_status_msg *msg, int *emm_cause); - -/* - * -------------------------------------------------------------------------- - * Functions executed by the UE upon receiving EMM message from the network - * -------------------------------------------------------------------------- - */ - - -/* - * -------------------------------------------------------------------------- - * Functions executed by the MME upon receiving EMM message from the UE - * -------------------------------------------------------------------------- - */ -int emm_recv_attach_request(unsigned int ueid, const attach_request_msg *msg, - int *emm_cause); -int emm_recv_attach_complete(unsigned int ueid, const attach_complete_msg *msg, - int *emm_cause); - -int emm_recv_detach_request(unsigned int ueid, const detach_request_msg *msg, - int *emm_cause); - -int emm_recv_tracking_area_update_request(unsigned int ueid, - const tracking_area_update_request_msg *msg, - int *emm_cause); - -int emm_recv_identity_response(unsigned int ueid, identity_response_msg *msg, - int *emm_cause); -int emm_recv_authentication_response(unsigned int ueid, - authentication_response_msg *msg, int *emm_cause); -int emm_recv_authentication_failure(unsigned int ueid, - authentication_failure_msg *msg, int *emm_cause); -int emm_recv_security_mode_complete(unsigned int ueid, - security_mode_complete_msg *msg, int *emm_cause); -int emm_recv_security_mode_reject(unsigned int ueid, - security_mode_reject_msg *msg, int *emm_cause); - -#endif /* __EMM_RECV_H__*/ diff --git a/openair-cn/NAS/MME/EMM/SAP/emm_reg.c b/openair-cn/NAS/MME/EMM/SAP/emm_reg.c deleted file mode 100644 index ca19566cb9..0000000000 --- a/openair-cn/NAS/MME/EMM/SAP/emm_reg.c +++ /dev/null @@ -1,126 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** - -Source emm_reg.c - -Version 0.1 - -Date 2012/10/16 - -Product NAS stack - -Subsystem EPS Mobility Management - -Author Frederic Maurel - -Description Defines the EMMREG Service Access Point that provides - registration services for location updating and attach/detach - procedures. - -*****************************************************************************/ - -#include "emm_reg.h" -#include "commonDef.h" -#include "nas_log.h" - -#include "emm_fsm.h" - -#include <assert.h> - -/****************************************************************************/ -/**************** E X T E R N A L D E F I N I T I O N S ****************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************* L O C A L D E F I N I T I O N S *******************/ -/****************************************************************************/ - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -/**************************************************************************** - ** ** - ** Name: emm_reg_initialize() ** - ** ** - ** Description: Initializes the EMMREG Service Access Point ** - ** ** - ** Inputs: None ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: None ** - ** Others: NONE ** - ** ** - ***************************************************************************/ -void emm_reg_initialize(void) -{ - LOG_FUNC_IN; - - /* Initialize the EMM state machine */ - emm_fsm_initialize(); - - LOG_FUNC_OUT; -} - -/**************************************************************************** - ** ** - ** Name: emm_reg_send() ** - ** ** - ** Description: Processes the EMMREG Service Access Point primitive ** - ** ** - ** Inputs: msg: The EMMREG-SAP primitive to process ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int emm_reg_send(const emm_reg_t *msg) -{ - LOG_FUNC_IN; - - int rc; - - /* Check the EMM-SAP primitive */ - emm_reg_primitive_t primitive = msg->primitive; - assert( (primitive > _EMMREG_START) && (primitive < _EMMREG_END)); - - /* Execute the EMM procedure */ - rc = emm_fsm_process(msg); - - LOG_FUNC_RETURN (rc); -} - -/****************************************************************************/ -/********************* L O C A L F U N C T I O N S *********************/ -/****************************************************************************/ - diff --git a/openair-cn/NAS/MME/EMM/SAP/emm_reg.h b/openair-cn/NAS/MME/EMM/SAP/emm_reg.h deleted file mode 100644 index 62d333395c..0000000000 --- a/openair-cn/NAS/MME/EMM/SAP/emm_reg.h +++ /dev/null @@ -1,73 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** - -Source emm_reg.h - -Version 0.1 - -Date 2012/10/16 - -Product NAS stack - -Subsystem EPS Mobility Management - -Author Frederic Maurel - -Description Defines the EMMREG Service Access Point that provides - registration services for location updating and attach/detach - procedures. - -*****************************************************************************/ -#ifndef __EMM_REG_H__ -#define __EMM_REG_H__ - -#include "emm_regDef.h" - -/****************************************************************************/ -/********************* G L O B A L C O N S T A N T S *******************/ -/****************************************************************************/ - -/****************************************************************************/ -/************************ G L O B A L T Y P E S ************************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************** G L O B A L V A R I A B L E S ********************/ -/****************************************************************************/ - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -void emm_reg_initialize(void); - -int emm_reg_send(const emm_reg_t *msg); - -#endif /* __EMM_REG_H__*/ diff --git a/openair-cn/NAS/MME/EMM/SAP/emm_regDef.h b/openair-cn/NAS/MME/EMM/SAP/emm_regDef.h deleted file mode 100644 index 801e107fe1..0000000000 --- a/openair-cn/NAS/MME/EMM/SAP/emm_regDef.h +++ /dev/null @@ -1,138 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** - -Source emm_regDef.h - -Version 0.1 - -Date 2012/10/16 - -Product NAS stack - -Subsystem EPS Mobility Management - -Author Frederic Maurel - -Description Defines the EMMREG Service Access Point that provides - registration services for location updating and attach/detach - procedures. - -*****************************************************************************/ -#ifndef __EMM_REGDEF_H__ -#define __EMM_REGDEF_H__ - -#include "commonDef.h" - -/****************************************************************************/ -/********************* G L O B A L C O N S T A N T S *******************/ -/****************************************************************************/ - -/* - * EMMREG-SAP primitives - */ -typedef enum { - _EMMREG_START = 0, - _EMMREG_COMMON_PROC_REQ, /* EMM common procedure requested */ - _EMMREG_COMMON_PROC_CNF, /* EMM common procedure successful */ - _EMMREG_COMMON_PROC_REJ, /* EMM common procedure failed */ - _EMMREG_PROC_ABORT, /* EMM procedure aborted */ - _EMMREG_ATTACH_CNF, /* EPS network attach accepted */ - _EMMREG_ATTACH_REJ, /* EPS network attach rejected */ - _EMMREG_DETACH_INIT, /* Network detach initiated */ - _EMMREG_DETACH_REQ, /* Network detach requested */ - _EMMREG_DETACH_FAILED, /* Network detach attempt failed */ - _EMMREG_DETACH_CNF, /* Network detach accepted */ - _EMMREG_TAU_REQ, - _EMMREG_TAU_CNF, - _EMMREG_TAU_REJ, - _EMMREG_SERVICE_REQ, - _EMMREG_SERVICE_CNF, - _EMMREG_SERVICE_REJ, - _EMMREG_LOWERLAYER_SUCCESS, /* Data successfully delivered */ - _EMMREG_LOWERLAYER_FAILURE, /* Lower layer failure indication */ - _EMMREG_LOWERLAYER_RELEASE, /* NAS signalling connection released */ - _EMMREG_END -} emm_reg_primitive_t; - -/****************************************************************************/ -/************************ G L O B A L T Y P E S ************************/ -/****************************************************************************/ - - -/* - * EMMREG primitive for attach procedure - * ------------------------------------- - */ -typedef struct { - int is_emergency; /* TRUE if the UE was attempting to register to - * the network for emergency services only */ -} emm_reg_attach_t; - -/* - * EMMREG primitive for detach procedure - * ------------------------------------- - */ -typedef struct { - int switch_off; /* TRUE if the UE is switched off */ - int type; /* Network detach type */ -} emm_reg_detach_t; - -/* - * EMMREG primitive for EMM common procedures - * ------------------------------------------ - */ -typedef struct { - int is_attached; /* UE context attach indicator */ -} emm_reg_common_t; - -/* - * Structure of EMMREG-SAP primitive - */ -typedef struct { - emm_reg_primitive_t primitive; - unsigned int ueid; - void *ctx; - - union { - emm_reg_attach_t attach; - emm_reg_detach_t detach; - emm_reg_common_t common; - } u; -} emm_reg_t; - -/****************************************************************************/ -/******************** G L O B A L V A R I A B L E S ********************/ -/****************************************************************************/ - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -#endif /* __EMM_REGDEF_H__*/ diff --git a/openair-cn/NAS/MME/EMM/SAP/emm_sap.c b/openair-cn/NAS/MME/EMM/SAP/emm_sap.c deleted file mode 100644 index b1aa086864..0000000000 --- a/openair-cn/NAS/MME/EMM/SAP/emm_sap.c +++ /dev/null @@ -1,154 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source emm_sap.c - -Version 0.1 - -Date 2012/10/01 - -Product NAS stack - -Subsystem EPS Mobility Management - -Author Frederic Maurel - -Description Defines the EMM Service Access Points at which the EPS - Mobility Management sublayer provides procedures for the - control of security and mobility when the User Equipment - is using the Evolved UTRA Network. - -*****************************************************************************/ - -#include "emm_sap.h" -#include "commonDef.h" -#include "nas_log.h" - -#include "emm_reg.h" -#include "emm_esm.h" -#include "emm_as.h" -#include "emm_cn.h" - -/****************************************************************************/ -/**************** E X T E R N A L D E F I N I T I O N S ****************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************* L O C A L D E F I N I T I O N S *******************/ -/****************************************************************************/ - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -/**************************************************************************** - ** ** - ** Name: emm_sap_initialize() ** - ** ** - ** Description: Initializes the EMM Service Access Points ** - ** ** - ** Inputs: None ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: None ** - ** Others: NONE ** - ** ** - ***************************************************************************/ -void emm_sap_initialize(void) -{ - LOG_FUNC_IN; - - emm_reg_initialize(); - emm_esm_initialize(); - emm_as_initialize(); - - LOG_FUNC_OUT; -} - -/**************************************************************************** - ** ** - ** Name: emm_sap_send() ** - ** ** - ** Description: Processes the EMM Service Access Point primitive ** - ** ** - ** Inputs: msg: The EMM-SAP primitive to process ** - ** Others: None ** - ** ** - ** Outputs: msg: The EMM-SAP primitive to process ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int emm_sap_send(emm_sap_t *msg) -{ - int rc = RETURNerror; - - emm_primitive_t primitive = msg->primitive; - - LOG_FUNC_IN; - - /* Check the EMM-SAP primitive */ - if ( (primitive > (emm_primitive_t)EMMREG_PRIMITIVE_MIN) && - (primitive < (emm_primitive_t)EMMREG_PRIMITIVE_MAX) ) { - /* Forward to the EMMREG-SAP */ - msg->u.emm_reg.primitive = primitive; - rc = emm_reg_send(&msg->u.emm_reg); - } else if ( (primitive > (emm_primitive_t)EMMESM_PRIMITIVE_MIN) && - (primitive < (emm_primitive_t)EMMESM_PRIMITIVE_MAX) ) { - /* Forward to the EMMESM-SAP */ - msg->u.emm_esm.primitive = primitive; - rc = emm_esm_send(&msg->u.emm_esm); - } else if ( (primitive > (emm_primitive_t)EMMAS_PRIMITIVE_MIN) && - (primitive < (emm_primitive_t)EMMAS_PRIMITIVE_MAX) ) { - /* Forward to the EMMAS-SAP */ - msg->u.emm_as.primitive = primitive; - rc = emm_as_send(&msg->u.emm_as); - } - -#if defined(NAS_BUILT_IN_EPC) - else if ( (primitive > (emm_primitive_t)EMMCN_PRIMITIVE_MIN) && - (primitive < (emm_primitive_t)EMMCN_PRIMITIVE_MAX) ) { - /* Forward to the EMMCN-SAP */ - msg->u.emm_cn.primitive = primitive; - rc = emm_cn_send(&msg->u.emm_cn); - } - -#endif - else { - LOG_TRACE(WARNING, "EMM-SAP - Out of range primitive (%d)", primitive); - } - - LOG_FUNC_RETURN (rc); -} - -/****************************************************************************/ -/********************* L O C A L F U N C T I O N S *********************/ -/****************************************************************************/ - diff --git a/openair-cn/NAS/MME/EMM/SAP/emm_sap.h b/openair-cn/NAS/MME/EMM/SAP/emm_sap.h deleted file mode 100644 index 7cee702e60..0000000000 --- a/openair-cn/NAS/MME/EMM/SAP/emm_sap.h +++ /dev/null @@ -1,171 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** - -Source emm_sap.h - -Version 0.1 - -Date 2012/10/01 - -Product NAS stack - -Subsystem EPS Mobility Management - -Author Frederic Maurel - -Description Defines the EMM Service Access Points at which the EPS - Mobility Management sublayer provides procedures for the - control of security and mobility when the User Equipment - is using the Evolved UTRA Network. - -*****************************************************************************/ -#ifndef __EMM_SAP_H__ -#define __EMM_SAP_H__ - -#include "emmData.h" -#include "emm_regDef.h" -#include "emm_esmDef.h" -#include "emm_asDef.h" -#include "emm_cnDef.h" - -/****************************************************************************/ -/********************* G L O B A L C O N S T A N T S *******************/ -/****************************************************************************/ - -/* - * EPS Mobility Management primitives - * ---------------------------------- - * EMMREG-SAP provides registration services for location updating and - * attach/detach procedures; - * EMMESM-SAP provides interlayer services to the EPS Session Management - * sublayer for service registration and activate/deactivate PDP context; - * EMMAS-SAP provides services to the Access Stratum sublayer for NAS message - * transfer; - */ -typedef enum { - /* EMMREG-SAP */ - EMMREG_COMMON_PROC_REQ = _EMMREG_COMMON_PROC_REQ, - EMMREG_COMMON_PROC_CNF = _EMMREG_COMMON_PROC_CNF, - EMMREG_COMMON_PROC_REJ = _EMMREG_COMMON_PROC_REJ, - EMMREG_PROC_ABORT = _EMMREG_PROC_ABORT, - EMMREG_ATTACH_CNF = _EMMREG_ATTACH_CNF, - EMMREG_ATTACH_REJ = _EMMREG_ATTACH_REJ, - EMMREG_DETACH_INIT = _EMMREG_DETACH_INIT, - EMMREG_DETACH_REQ = _EMMREG_DETACH_REQ, - EMMREG_DETACH_FAILED = _EMMREG_DETACH_FAILED, - EMMREG_DETACH_CNF = _EMMREG_DETACH_CNF, - EMMREG_TAU_REQ = _EMMREG_TAU_REQ, - EMMREG_TAU_CNF = _EMMREG_TAU_CNF, - EMMREG_TAU_REJ = _EMMREG_TAU_REJ, - EMMREG_SERVICE_REQ = _EMMREG_SERVICE_REQ, - EMMREG_SERVICE_CNF = _EMMREG_SERVICE_CNF, - EMMREG_SERVICE_REJ = _EMMREG_SERVICE_REJ, - EMMREG_LOWERLAYER_SUCCESS = _EMMREG_LOWERLAYER_SUCCESS, - EMMREG_LOWERLAYER_FAILURE = _EMMREG_LOWERLAYER_FAILURE, - EMMREG_LOWERLAYER_RELEASE = _EMMREG_LOWERLAYER_RELEASE, - /* EMMESM-SAP */ - EMMESM_RELEASE_IND = _EMMESM_RELEASE_IND, - EMMESM_UNITDATA_REQ = _EMMESM_UNITDATA_REQ, - EMMESM_UNITDATA_IND = _EMMESM_UNITDATA_IND, - /* EMMAS-SAP */ - EMMAS_SECURITY_REQ = _EMMAS_SECURITY_REQ, - EMMAS_SECURITY_IND = _EMMAS_SECURITY_IND, - EMMAS_SECURITY_RES = _EMMAS_SECURITY_RES, - EMMAS_SECURITY_REJ = _EMMAS_SECURITY_REJ, - EMMAS_ESTABLISH_REQ = _EMMAS_ESTABLISH_REQ, - EMMAS_ESTABLISH_CNF = _EMMAS_ESTABLISH_CNF, - EMMAS_ESTABLISH_REJ = _EMMAS_ESTABLISH_REJ, - EMMAS_RELEASE_REQ = _EMMAS_RELEASE_REQ, - EMMAS_RELEASE_IND = _EMMAS_RELEASE_IND, - EMMAS_DATA_REQ = _EMMAS_DATA_REQ, - EMMAS_DATA_IND = _EMMAS_DATA_IND, - EMMAS_PAGE_IND = _EMMAS_PAGE_IND, - EMMAS_STATUS_IND = _EMMAS_STATUS_IND, - EMMAS_CELL_INFO_REQ = _EMMAS_CELL_INFO_REQ, - EMMAS_CELL_INFO_RES = _EMMAS_CELL_INFO_RES, - EMMAS_CELL_INFO_IND = _EMMAS_CELL_INFO_IND, - -#ifdef NAS_BUILT_IN_EPC - EMMCN_AUTHENTICATION_PARAM_RES = _EMMCN_AUTHENTICATION_PARAM_RES, - EMMCN_AUTHENTICATION_PARAM_FAIL = _EMMCN_AUTHENTICATION_PARAM_FAIL, - EMMCN_DEREGISTER_UE = _EMMCN_DEREGISTER_UE, - EMMCN_PDN_CONNECTIVITY_RES = _EMMCN_PDN_CONNECTIVITY_RES, - EMMCN_PDN_CONNECTIVITY_FAIL = _EMMCN_PDN_CONNECTIVITY_FAIL -#endif -} emm_primitive_t; - -/* - * Minimal identifier for EMM-SAP primitives - */ -#define EMMREG_PRIMITIVE_MIN _EMMREG_START -#define EMMESM_PRIMITIVE_MIN _EMMESM_START -#define EMMAS_PRIMITIVE_MIN _EMMAS_START -#define EMMCN_PRIMITIVE_MIN _EMMCN_START - -/* - * Maximal identifier for EMM-SAP primitives - */ -#define EMMREG_PRIMITIVE_MAX _EMMREG_END -#define EMMESM_PRIMITIVE_MAX _EMMESM_END -#define EMMAS_PRIMITIVE_MAX _EMMAS_END -#define EMMCN_PRIMITIVE_MAX _EMMCN_END - -/****************************************************************************/ -/************************ G L O B A L T Y P E S ************************/ -/****************************************************************************/ - -/* - * Structure of EPS Mobility Management primitive - */ -typedef struct emm_sap_s { - emm_primitive_t primitive; - union { - emm_reg_t emm_reg; /* EMMREG-SAP primitives */ - emm_esm_t emm_esm; /* EMMESM-SAP primitives */ - emm_as_t emm_as; /* EMMAS-SAP primitives */ -#if defined(NAS_BUILT_IN_EPC) - emm_cn_t emm_cn; /* EMMCN-SAP primitives */ -#endif - } u; -} emm_sap_t; - -/****************************************************************************/ -/******************** G L O B A L V A R I A B L E S ********************/ -/****************************************************************************/ - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -void emm_sap_initialize(void); - -int emm_sap_send(emm_sap_t *msg); - -#endif /* __EMM_SAP_H__*/ diff --git a/openair-cn/NAS/MME/EMM/SAP/emm_send.c b/openair-cn/NAS/MME/EMM/SAP/emm_send.c deleted file mode 100644 index 3dac6eb7e0..0000000000 --- a/openair-cn/NAS/MME/EMM/SAP/emm_send.c +++ /dev/null @@ -1,509 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** - -Source emm_send.c - -Version 0.1 - -Date 2013/01/30 - -Product NAS stack - -Subsystem EPS Mobility Management - -Author Frederic Maurel - -Description Defines functions executed at the EMMAS Service Access - Point to send EPS Mobility Management messages to the - Access Stratum sublayer. - -*****************************************************************************/ - -#include "emm_send.h" -#include "commonDef.h" -#include "nas_log.h" - -#include "emm_msgDef.h" -#include "emm_proc.h" - -#include <string.h> // strlen - -/****************************************************************************/ -/**************** E X T E R N A L D E F I N I T I O N S ****************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************* L O C A L D E F I N I T I O N S *******************/ -/****************************************************************************/ - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -/* - * -------------------------------------------------------------------------- - * Functions executed by both the UE and the MME to send EMM messages - * -------------------------------------------------------------------------- - */ -/**************************************************************************** - ** ** - ** Name: emm_send_status() ** - ** ** - ** Description: Builds EMM status message ** - ** ** - ** The EMM status message is sent by the UE or the network ** - ** at any time to report certain error conditions. ** - ** ** - ** Inputs: emm_cause: EMM cause code ** - ** Others: None ** - ** ** - ** Outputs: emm_msg: The EMM message to be sent ** - ** Return: The size of the EMM message ** - ** Others: None ** - ** ** - ***************************************************************************/ -int emm_send_status(const emm_as_status_t *msg, emm_status_msg *emm_msg) -{ - LOG_FUNC_IN; - - int size = EMM_HEADER_MAXIMUM_LENGTH; - - LOG_TRACE(WARNING, "EMMAS-SAP - Send EMM Status message (cause=%d)", - msg->emm_cause); - - /* Mandatory - Message type */ - emm_msg->messagetype = EMM_STATUS; - - /* Mandatory - EMM cause */ - size += EMM_CAUSE_MAXIMUM_LENGTH; - emm_msg->emmcause = msg->emm_cause; - - LOG_FUNC_RETURN (size); -} - -/**************************************************************************** - ** ** - ** Name: emm_send_detach_accept() ** - ** ** - ** Description: Builds Detach Accept message ** - ** ** - ** The Detach Accept message is sent by the UE or the net- ** - ** work to indicate that the detach procedure has been com- ** - ** pleted. ** - ** ** - ** Inputs: msg: The EMMAS-SAP primitive to process ** - ** Others: None ** - ** ** - ** Outputs: emm_msg: The EMM message to be sent ** - ** Return: The size of the EMM message ** - ** Others: None ** - ** ** - ***************************************************************************/ -int emm_send_detach_accept(const emm_as_data_t *msg, - detach_accept_msg *emm_msg) -{ - LOG_FUNC_IN; - - int size = EMM_HEADER_MAXIMUM_LENGTH; - - LOG_TRACE(INFO, "EMMAS-SAP - Send Detach Accept message"); - - /* Mandatory - Message type */ - emm_msg->messagetype = DETACH_ACCEPT; - - LOG_FUNC_RETURN (size); -} - - -/* - * -------------------------------------------------------------------------- - * Functions executed by the MME to send EMM messages to the UE - * -------------------------------------------------------------------------- - */ -/**************************************************************************** - ** ** - ** Name: emm_send_attach_accept() ** - ** ** - ** Description: Builds Attach Accept message ** - ** ** - ** The Attach Accept message is sent by the network to the ** - ** UE to indicate that the corresponding attach request has ** - ** been accepted. ** - ** ** - ** Inputs: msg: The EMMAS-SAP primitive to process ** - ** Others: None ** - ** ** - ** Outputs: emm_msg: The EMM message to be sent ** - ** Return: The size of the EMM message ** - ** Others: None ** - ** ** - ***************************************************************************/ -int emm_send_attach_accept(const emm_as_establish_t *msg, - attach_accept_msg *emm_msg) -{ - LOG_FUNC_IN; - - int size = EMM_HEADER_MAXIMUM_LENGTH; - - LOG_TRACE(INFO, "EMMAS-SAP - Send Attach Accept message"); - LOG_TRACE(INFO, "EMMAS-SAP - size = EMM_HEADER_MAXIMUM_LENGTH(%d)", - size); - - /* Mandatory - Message type */ - emm_msg->messagetype = ATTACH_ACCEPT; - - /* Mandatory - EPS attach result */ - size += EPS_ATTACH_RESULT_MAXIMUM_LENGTH; - emm_msg->epsattachresult = EPS_ATTACH_RESULT_EPS; - - /* Mandatory - T3412 value */ - size += GPRS_TIMER_MAXIMUM_LENGTH; - emm_msg->t3412value.unit = GPRS_TIMER_UNIT_0S; - LOG_TRACE(INFO, "EMMAS-SAP - size += GPRS_TIMER_MAXIMUM_LENGTH(%d) (%d)", - GPRS_TIMER_MAXIMUM_LENGTH, size); - - /* Mandatory - Tracking area identity list */ - size += TRACKING_AREA_IDENTITY_LIST_MINIMUM_LENGTH; - emm_msg->tailist.typeoflist = - TRACKING_AREA_IDENTITY_LIST_ONE_PLMN_CONSECUTIVE_TACS; - emm_msg->tailist.numberofelements = msg->n_tacs; - emm_msg->tailist.mccdigit1 = msg->UEid.guti->gummei.plmn.MCCdigit1; - emm_msg->tailist.mccdigit2 = msg->UEid.guti->gummei.plmn.MCCdigit2; - emm_msg->tailist.mccdigit3 = msg->UEid.guti->gummei.plmn.MCCdigit3; - emm_msg->tailist.mncdigit1 = msg->UEid.guti->gummei.plmn.MNCdigit1; - emm_msg->tailist.mncdigit2 = msg->UEid.guti->gummei.plmn.MNCdigit2; - emm_msg->tailist.mncdigit3 = msg->UEid.guti->gummei.plmn.MNCdigit3; - emm_msg->tailist.tac = msg->tac; - LOG_TRACE(INFO, - "EMMAS-SAP - size += "\ - "TRACKING_AREA_IDENTITY_LIST_MINIMUM_LENGTH(%d) (%d)", - TRACKING_AREA_IDENTITY_LIST_MINIMUM_LENGTH, - size); - - /* Mandatory - ESM message container */ - size += ESM_MESSAGE_CONTAINER_MINIMUM_LENGTH + msg->NASmsg.length; - emm_msg->esmmessagecontainer.esmmessagecontainercontents = msg->NASmsg; - LOG_TRACE(INFO, - "EMMAS-SAP - size += "\ - "ESM_MESSAGE_CONTAINER_MINIMUM_LENGTH(%d) (%d)", - ESM_MESSAGE_CONTAINER_MINIMUM_LENGTH, - size); - - /* Optional - GUTI */ - if (msg->new_guti) { - size += EPS_MOBILE_IDENTITY_MAXIMUM_LENGTH; - emm_msg->presencemask |= ATTACH_ACCEPT_GUTI_PRESENT; - emm_msg->guti.guti.typeofidentity = EPS_MOBILE_IDENTITY_GUTI; - emm_msg->guti.guti.oddeven = EPS_MOBILE_IDENTITY_EVEN; - emm_msg->guti.guti.mmegroupid = msg->new_guti->gummei.MMEgid; - emm_msg->guti.guti.mmecode = msg->new_guti->gummei.MMEcode; - emm_msg->guti.guti.mtmsi = msg->new_guti->m_tmsi; - emm_msg->guti.guti.mccdigit1 = msg->new_guti->gummei.plmn.MCCdigit1; - emm_msg->guti.guti.mccdigit2 = msg->new_guti->gummei.plmn.MCCdigit2; - emm_msg->guti.guti.mccdigit3 = msg->new_guti->gummei.plmn.MCCdigit3; - emm_msg->guti.guti.mncdigit1 = msg->new_guti->gummei.plmn.MNCdigit1; - emm_msg->guti.guti.mncdigit2 = msg->new_guti->gummei.plmn.MNCdigit2; - emm_msg->guti.guti.mncdigit3 = msg->new_guti->gummei.plmn.MNCdigit3; - LOG_TRACE(INFO, - "EMMAS-SAP - size += "\ - "EPS_MOBILE_IDENTITY_MAXIMUM_LENGTH(%d) (%d)", - EPS_MOBILE_IDENTITY_MAXIMUM_LENGTH, - size); - } - - LOG_FUNC_RETURN (size); -} - -/**************************************************************************** - ** ** - ** Name: emm_send_attach_reject() ** - ** ** - ** Description: Builds Attach Reject message ** - ** ** - ** The Attach Reject message is sent by the network to the ** - ** UE to indicate that the corresponding attach request has ** - ** been rejected. ** - ** ** - ** Inputs: msg: The EMMAS-SAP primitive to process ** - ** Others: None ** - ** ** - ** Outputs: emm_msg: The EMM message to be sent ** - ** Return: The size of the EMM message ** - ** Others: None ** - ** ** - ***************************************************************************/ -int emm_send_attach_reject(const emm_as_establish_t *msg, - attach_reject_msg *emm_msg) -{ - LOG_FUNC_IN; - - int size = EMM_HEADER_MAXIMUM_LENGTH; - - LOG_TRACE(INFO, "EMMAS-SAP - Send Attach Reject message (cause=%d)", - msg->emm_cause); - - /* Mandatory - Message type */ - emm_msg->messagetype = ATTACH_REJECT; - - /* Mandatory - EMM cause */ - size += EMM_CAUSE_MAXIMUM_LENGTH; - emm_msg->emmcause = msg->emm_cause; - - /* Optional - ESM message container */ - if (msg->NASmsg.length > 0) { - size += ESM_MESSAGE_CONTAINER_MINIMUM_LENGTH + msg->NASmsg.length; - emm_msg->presencemask |= ATTACH_REJECT_ESM_MESSAGE_CONTAINER_PRESENT; - emm_msg->esmmessagecontainer.esmmessagecontainercontents = msg->NASmsg; - } - - LOG_FUNC_RETURN (size); -} - -/**************************************************************************** - ** ** - ** Name: emm_send_tracking_area_update_reject() ** - ** ** - ** Description: Builds Tracking Area Update Reject message ** - ** ** - ** The Tracking Area Update Reject message is sent by the ** - ** network to the UE to indicate that the corresponding ** - ** tracking area update has been rejected. ** - ** ** - ** Inputs: msg: The EMMAS-SAP primitive to process ** - ** Others: None ** - ** ** - ** Outputs: emm_msg: The EMM message to be sent ** - ** Return: The size of the EMM message ** - ** Others: None ** - ** ** - ***************************************************************************/ -int emm_send_tracking_area_update_reject(const emm_as_establish_t *msg, - tracking_area_update_reject_msg *emm_msg) -{ - LOG_FUNC_IN; - - int size = EMM_HEADER_MAXIMUM_LENGTH; - - LOG_TRACE(INFO, "EMMAS-SAP - Send Tracking Area Update Reject message (cause=%d)", - msg->emm_cause); - - /* Mandatory - Message type */ - emm_msg->messagetype = TRACKING_AREA_UPDATE_REJECT; - - /* Mandatory - EMM cause */ - size += EMM_CAUSE_MAXIMUM_LENGTH; - emm_msg->emmcause = msg->emm_cause; - - LOG_FUNC_RETURN (size); -} - -/**************************************************************************** - ** ** - ** Name: emm_send_identity_request() ** - ** ** - ** Description: Builds Identity Request message ** - ** ** - ** The Identity Request message is sent by the network to ** - ** the UE to request the UE to provide the specified identi- ** - ** ty. ** - ** ** - ** Inputs: msg: The EMMAS-SAP primitive to process ** - ** Others: None ** - ** ** - ** Outputs: emm_msg: The EMM message to be sent ** - ** Return: The size of the EMM message ** - ** Others: None ** - ** ** - ***************************************************************************/ -int emm_send_identity_request(const emm_as_security_t *msg, - identity_request_msg *emm_msg) -{ - LOG_FUNC_IN; - - int size = EMM_HEADER_MAXIMUM_LENGTH; - - LOG_TRACE(INFO, "EMMAS-SAP - Send Identity Request message"); - - /* Mandatory - Message type */ - emm_msg->messagetype = IDENTITY_REQUEST; - - /* Mandatory - Identity type 2 */ - size += IDENTITY_TYPE_2_MAXIMUM_LENGTH; - - if (msg->identType == EMM_IDENT_TYPE_IMSI) { - emm_msg->identitytype = IDENTITY_TYPE_2_IMSI; - } else if (msg->identType == EMM_IDENT_TYPE_TMSI) { - emm_msg->identitytype = IDENTITY_TYPE_2_TMSI; - } else if (msg->identType == EMM_IDENT_TYPE_IMEI) { - emm_msg->identitytype = IDENTITY_TYPE_2_IMEI; - } else { - /* All other values are interpreted as "IMSI" */ - emm_msg->identitytype = IDENTITY_TYPE_2_IMSI; - } - - LOG_FUNC_RETURN (size); -} - -/**************************************************************************** - ** ** - ** Name: emm_send_authentication_request() ** - ** ** - ** Description: Builds Authentication Request message ** - ** ** - ** The Authentication Request message is sent by the network ** - ** to the UE to initiate authentication of the UE identity. ** - ** ** - ** Inputs: msg: The EMMAS-SAP primitive to process ** - ** Others: None ** - ** ** - ** Outputs: emm_msg: The EMM message to be sent ** - ** Return: The size of the EMM message ** - ** Others: None ** - ** ** - ***************************************************************************/ -int emm_send_authentication_request(const emm_as_security_t *msg, - authentication_request_msg *emm_msg) -{ - LOG_FUNC_IN; - - int size = EMM_HEADER_MAXIMUM_LENGTH; - - LOG_TRACE(INFO, "EMMAS-SAP - Send Authentication Request message"); - - /* Mandatory - Message type */ - emm_msg->messagetype = AUTHENTICATION_REQUEST; - - /* Mandatory - NAS key set identifier */ - size += NAS_KEY_SET_IDENTIFIER_MAXIMUM_LENGTH; - emm_msg->naskeysetidentifierasme.tsc = NAS_KEY_SET_IDENTIFIER_NATIVE; - emm_msg->naskeysetidentifierasme.naskeysetidentifier = msg->ksi; - - /* Mandatory - Authentication parameter RAND */ - size += AUTHENTICATION_PARAMETER_RAND_MAXIMUM_LENGTH; - emm_msg->authenticationparameterrand.rand = *msg->rand; - - /* Mandatory - Authentication parameter AUTN */ - size += AUTHENTICATION_PARAMETER_AUTN_MAXIMUM_LENGTH; - emm_msg->authenticationparameterautn.autn = *msg->autn; - - LOG_FUNC_RETURN (size); -} - -/**************************************************************************** - ** ** - ** Name: emm_send_authentication_reject() ** - ** ** - ** Description: Builds Authentication Reject message ** - ** ** - ** The Authentication Reject message is sent by the network ** - ** to the UE to indicate that the authentication procedure ** - ** has failed and that the UE shall abort all activities. ** - ** ** - ** Inputs: None ** - ** Others: None ** - ** ** - ** Outputs: emm_msg: The EMM message to be sent ** - ** Return: The size of the EMM message ** - ** Others: None ** - ** ** - ***************************************************************************/ -int emm_send_authentication_reject(authentication_reject_msg *emm_msg) -{ - LOG_FUNC_IN; - - int size = EMM_HEADER_MAXIMUM_LENGTH; - - LOG_TRACE(INFO, "EMMAS-SAP - Send Authentication Reject message"); - - /* Mandatory - Message type */ - emm_msg->messagetype = AUTHENTICATION_REJECT; - - LOG_FUNC_RETURN (size); -} - -/**************************************************************************** - ** ** - ** Name: emm_send_security_mode_command() ** - ** ** - ** Description: Builds Security Mode Command message ** - ** ** - ** The Security Mode Command message is sent by the network ** - ** to the UE to establish NAS signalling security. ** - ** ** - ** Inputs: msg: The EMMAS-SAP primitive to process ** - ** Others: None ** - ** ** - ** Outputs: emm_msg: The EMM message to be sent ** - ** Return: The size of the EMM message ** - ** Others: None ** - ** ** - ***************************************************************************/ -int emm_send_security_mode_command(const emm_as_security_t *msg, - security_mode_command_msg *emm_msg) -{ - LOG_FUNC_IN; - - int size = EMM_HEADER_MAXIMUM_LENGTH; - - LOG_TRACE(INFO, "EMMAS-SAP - Send Security Mode Command message"); - - /* Mandatory - Message type */ - emm_msg->messagetype = SECURITY_MODE_COMMAND; - - /* Selected NAS security algorithms */ - size += NAS_SECURITY_ALGORITHMS_MAXIMUM_LENGTH; - emm_msg->selectednassecurityalgorithms.typeofcipheringalgorithm = - msg->selected_eea; - emm_msg->selectednassecurityalgorithms.typeofintegrityalgorithm = - msg->selected_eia; - - /* NAS key set identifier */ - size += NAS_KEY_SET_IDENTIFIER_MAXIMUM_LENGTH; - emm_msg->naskeysetidentifier.tsc = NAS_KEY_SET_IDENTIFIER_NATIVE; - emm_msg->naskeysetidentifier.naskeysetidentifier = msg->ksi; - - /* Replayed UE security capabilities */ - size += UE_SECURITY_CAPABILITY_MAXIMUM_LENGTH; - emm_msg->replayeduesecuritycapabilities.eea = msg->eea; - emm_msg->replayeduesecuritycapabilities.eia = msg->eia; - emm_msg->replayeduesecuritycapabilities.umts_present = msg->umts_present; - emm_msg->replayeduesecuritycapabilities.gprs_present = msg->gprs_present; - - emm_msg->replayeduesecuritycapabilities.uea = msg->uea; - emm_msg->replayeduesecuritycapabilities.uia = msg->uia; - emm_msg->replayeduesecuritycapabilities.gea = msg->gea; - - LOG_FUNC_RETURN (size); -} - - -/****************************************************************************/ -/********************* L O C A L F U N C T I O N S *********************/ -/****************************************************************************/ diff --git a/openair-cn/NAS/MME/EMM/SAP/emm_send.h b/openair-cn/NAS/MME/EMM/SAP/emm_send.h deleted file mode 100644 index 16c9c5f9d5..0000000000 --- a/openair-cn/NAS/MME/EMM/SAP/emm_send.h +++ /dev/null @@ -1,122 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** - -Source emm_send.h - -Version 0.1 - -Date 2013/01/30 - -Product NAS stack - -Subsystem EPS Mobility Management - -Author Frederic Maurel - -Description Defines functions executed at the EMMAS Service Access - Point to send EPS Mobility Management messages to the - Access Stratum sublayer. - -*****************************************************************************/ -#ifndef __EMM_SEND_H__ -#define __EMM_SEND_H__ - -#include "EmmStatus.h" - -#include "DetachRequest.h" -#include "DetachAccept.h" - -#include "AttachAccept.h" -#include "AttachReject.h" -#include "TrackingAreaUpdateAccept.h" -#include "TrackingAreaUpdateReject.h" -#include "ServiceReject.h" -#include "GutiReallocationCommand.h" -#include "AuthenticationRequest.h" -#include "AuthenticationReject.h" -#include "IdentityRequest.h" -#include "NASSecurityModeCommand.h" -#include "EmmInformation.h" -#include "DownlinkNasTransport.h" -#include "CsServiceNotification.h" - -#include "emm_asDef.h" - -/****************************************************************************/ -/********************* G L O B A L C O N S T A N T S *******************/ -/****************************************************************************/ - -/****************************************************************************/ -/************************ G L O B A L T Y P E S ************************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************** G L O B A L V A R I A B L E S ********************/ -/****************************************************************************/ - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -/* - * -------------------------------------------------------------------------- - * Functions executed by both the UE and the MME to send EMM messages - * -------------------------------------------------------------------------- - */ -int emm_send_status(const emm_as_status_t *, emm_status_msg *); - -int emm_send_detach_accept(const emm_as_data_t *, detach_accept_msg *); - -/* - * -------------------------------------------------------------------------- - * Functions executed by the UE to send EMM messages to the network - * -------------------------------------------------------------------------- - */ - - -/* - * -------------------------------------------------------------------------- - * Functions executed by the MME to send EMM messages to the UE - * -------------------------------------------------------------------------- - */ -int emm_send_attach_accept(const emm_as_establish_t *, attach_accept_msg *); -int emm_send_attach_reject(const emm_as_establish_t *, attach_reject_msg *); - -int emm_send_tracking_area_update_reject(const emm_as_establish_t *msg, - tracking_area_update_reject_msg *emm_msg); - -int emm_send_identity_request(const emm_as_security_t *, identity_request_msg *); -int emm_send_authentication_request(const emm_as_security_t *, - authentication_request_msg *); -int emm_send_authentication_reject(authentication_reject_msg *); -int emm_send_security_mode_command(const emm_as_security_t *, - security_mode_command_msg *); - -#endif /* __EMM_SEND_H__*/ diff --git a/openair-cn/NAS/MME/EMM/SecurityModeControl.c b/openair-cn/NAS/MME/EMM/SecurityModeControl.c deleted file mode 100644 index bd04316ee2..0000000000 --- a/openair-cn/NAS/MME/EMM/SecurityModeControl.c +++ /dev/null @@ -1,804 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source SecurityModeControl.c - -Version 0.1 - -Date 2013/04/22 - -Product NAS stack - -Subsystem Template body file - -Author Frederic Maurel - -Description Defines the security mode control EMM procedure executed by the - Non-Access Stratum. - - The purpose of the NAS security mode control procedure is to - take an EPS security context into use, and initialise and start - NAS signalling security between the UE and the MME with the - corresponding EPS NAS keys and EPS security algorithms. - - Furthermore, the network may also initiate a SECURITY MODE COM- - MAND in order to change the NAS security algorithms for a cur- - rent EPS security context already in use. - -*****************************************************************************/ - -#include <stdlib.h> // malloc, free -#include <string.h> // memcpy -#include <inttypes.h> - -#include "emm_proc.h" -#include "nas_log.h" -#include "nas_timer.h" - -#include "emmData.h" - -#include "emm_sap.h" -#include "emm_cause.h" - -#include "UeSecurityCapability.h" - -#if defined(ENABLE_ITTI) -# include "assertions.h" -#endif -#include "secu_defs.h" -#include "msc.h" - -/****************************************************************************/ -/**************** E X T E R N A L D E F I N I T I O N S ****************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************* L O C A L D E F I N I T I O N S *******************/ -/****************************************************************************/ - -/* - * -------------------------------------------------------------------------- - * Internal data handled by the security mode control procedure in the UE - * -------------------------------------------------------------------------- - */ - -/* - * -------------------------------------------------------------------------- - * Internal data handled by the security mode control procedure in the MME - * -------------------------------------------------------------------------- - */ -/* - * Timer handlers - */ -static void *_security_t3460_handler(void *); - -/* - * Function executed whenever the ongoing EMM procedure that initiated - * the security mode control procedure is aborted or the maximum value of the - * retransmission timer counter is exceed - */ -static int _security_abort(void *); -static int _security_select_algorithms( - const int ue_eiaP, - const int ue_eeaP, - int * const mme_eiaP, - int * const mme_eeaP); -/* - * Internal data used for security mode control procedure - */ -typedef struct { - unsigned int ueid; /* UE identifier */ -#define SECURITY_COUNTER_MAX 5 - unsigned int retransmission_count; /* Retransmission counter */ - int ksi; /* NAS key set identifier */ - int eea; /* Replayed EPS encryption algorithms */ - int eia; /* Replayed EPS integrity algorithms */ - int ucs2; /* Replayed Alphabet */ - int uea; /* Replayed UMTS encryption algorithms */ - int uia; /* Replayed UMTS integrity algorithms */ - int gea; /* Replayed G encryption algorithms */ - int umts_present:1; - int gprs_present:1; - int selected_eea; /* Selected EPS encryption algorithms */ - int selected_eia; /* Selected EPS integrity algorithms */ - int notify_failure; /* Indicates whether the security mode control - * procedure failure shall be notified to the - * ongoing EMM procedure */ -} security_data_t; - -static int _security_request(security_data_t *data, int is_new); - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - - -/* - * -------------------------------------------------------------------------- - * Security mode control procedure executed by the MME - * -------------------------------------------------------------------------- - */ - - -/**************************************************************************** - ** ** - ** Name: emm_proc_security_mode_control() ** - ** ** - ** Description: Initiates the security mode control procedure. ** - ** ** - ** 3GPP TS 24.301, section 5.4.3.2 ** - ** The MME initiates the NAS security mode control procedure ** - ** by sending a SECURITY MODE COMMAND message to the UE and ** - ** starting timer T3460. The message shall be sent unciphe- ** - ** red but shall be integrity protected using the NAS inte- ** - ** grity key based on KASME. ** - ** ** - ** Inputs: ueid: UE lower layer identifier ** - ** ksi: NAS key set identifier ** - ** eea: Replayed EPS encryption algorithms ** - ** eia: Replayed EPS integrity algorithms ** - ** success: Callback function executed when the secu- ** - ** rity mode control procedure successfully ** - ** completes ** - ** reject: Callback function executed when the secu- ** - ** rity mode control procedure fails or is ** - ** rejected ** - ** failure: Callback function executed whener a lower ** - ** layer failure occured before the security ** - ** mode control procedure comnpletes ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int emm_proc_security_mode_control(unsigned int ueid, int ksi, - int eea, int eia,int ucs2, int uea, int uia, int gea, int umts_present, int gprs_present, - emm_common_success_callback_t success, - emm_common_reject_callback_t reject, - emm_common_failure_callback_t failure) -{ - int rc = RETURNerror; - int security_context_is_new = FALSE; - int mme_eea = NAS_SECURITY_ALGORITHMS_EEA0; - int mme_eia = NAS_SECURITY_ALGORITHMS_EIA0; - /* Get the UE context */ - emm_data_context_t *emm_ctx = NULL; - - LOG_FUNC_IN; - - LOG_TRACE(INFO, "EMM-PROC - Initiate security mode control procedure " - "KSI = %d EEA = %d EIA = %d", - ksi, eea, eia); - -#if defined(NAS_BUILT_IN_EPC) - - if (ueid > 0) { - emm_ctx = emm_data_context_get(&_emm_data, ueid); - } - -#else - - if (ueid < EMM_DATA_NB_UE_MAX) { - emm_ctx = _emm_data.ctx[ueid]; - } - -#endif - - if (emm_ctx && emm_ctx->security) { - if (emm_ctx->security->type == EMM_KSI_NOT_AVAILABLE) { - /* The security mode control procedure is initiated to take into use - * the EPS security context created after a successful execution of - * the EPS authentication procedure */ - emm_ctx->security->type = EMM_KSI_NATIVE; - emm_ctx->security->eksi = ksi; - emm_ctx->security->dl_count.overflow = 0; - emm_ctx->security->dl_count.seq_num = 0; - - /* TODO !!! Compute Kasme, and NAS cyphering and integrity keys */ - // LG: Kasme should have been received from authentication - // information request (S6A) - // Kasme is located in emm_ctx->vector.kasme - FREE_OCTET_STRING(emm_ctx->security->kasme); - - emm_ctx->security->kasme.value = malloc(32); - memcpy(emm_ctx->security->kasme.value, - emm_ctx->vector.kasme, - 32); - emm_ctx->security->kasme.length = 32; - - rc = _security_select_algorithms( - eia, - eea, - &mme_eia, - &mme_eea); - - emm_ctx->security->selected_algorithms.encryption = mme_eea; - emm_ctx->security->selected_algorithms.integrity = mme_eia; - - if (rc == RETURNerror) { - LOG_TRACE(WARNING, - "EMM-PROC - Failed to select security algorithms"); - LOG_FUNC_RETURN (RETURNerror); - } - - if ( ! emm_ctx->security->knas_int.value) { - emm_ctx->security->knas_int.value = malloc(AUTH_KNAS_INT_SIZE); - } else { - LOG_TRACE(ERROR, - " TODO realloc emm_ctx->security->knas_int OctetString"); - LOG_FUNC_RETURN (RETURNerror); - } - - emm_ctx->security->knas_int.length = AUTH_KNAS_INT_SIZE; - derive_key_nas( - NAS_INT_ALG, - emm_ctx->security->selected_algorithms.integrity, - emm_ctx->vector.kasme, - emm_ctx->security->knas_int.value); - - if ( ! emm_ctx->security->knas_enc.value) { - emm_ctx->security->knas_enc.value = malloc(AUTH_KNAS_ENC_SIZE); - } else { - LOG_TRACE(ERROR, - " TODO realloc emm_ctx->security->knas_enc OctetString"); - LOG_FUNC_RETURN (RETURNerror); - } - - emm_ctx->security->knas_enc.length = AUTH_KNAS_ENC_SIZE; - derive_key_nas( - NAS_ENC_ALG, - emm_ctx->security->selected_algorithms.encryption, - emm_ctx->vector.kasme, - emm_ctx->security->knas_enc.value); - - /* Set new security context indicator */ - security_context_is_new = TRUE; - } - } else { - LOG_TRACE(WARNING, "EMM-PROC - No EPS security context exists"); - LOG_FUNC_RETURN (RETURNerror); - } - - /* Allocate parameters of the retransmission timer callback */ - security_data_t *data = - (security_data_t *)malloc(sizeof(security_data_t)); - - if (data != NULL) { - /* Setup ongoing EMM procedure callback functions */ - rc = emm_proc_common_initialize(ueid, success, reject, failure, - _security_abort, data); - - if (rc != RETURNok) { - LOG_TRACE(WARNING, "Failed to initialize EMM callback functions"); - free(data); - LOG_FUNC_RETURN (RETURNerror); - } - - /* Set the UE identifier */ - data->ueid = ueid; - /* Reset the retransmission counter */ - data->retransmission_count = 0; - /* Set the key set identifier */ - data->ksi = ksi; - /* Set the EPS encryption algorithms to be replayed to the UE */ - data->eea = eea; - /* Set the EPS integrity algorithms to be replayed to the UE */ - data->eia = eia; - data->ucs2 = ucs2; - /* Set the UMTS encryption algorithms to be replayed to the UE */ - data->uea = uea; - /* Set the UMTS integrity algorithms to be replayed to the UE */ - data->uia = uia; - /* Set the GPRS integrity algorithms to be replayed to the UE */ - data->gea = gea; - data->umts_present = umts_present; - data->gprs_present = gprs_present; - /* Set the EPS encryption algorithms selected to the UE */ - data->selected_eea = emm_ctx->security->selected_algorithms.encryption; - /* Set the EPS integrity algorithms selected to the UE */ - data->selected_eia = emm_ctx->security->selected_algorithms.integrity; - /* Set the failure notification indicator */ - data->notify_failure = FALSE; - /* Send security mode command message to the UE */ - rc = _security_request(data, security_context_is_new); - - if (rc != RETURNerror) { - /* - * Notify EMM that common procedure has been initiated - */ - MSC_LOG_TX_MESSAGE( - MSC_NAS_EMM_MME, - MSC_NAS_EMM_MME, - NULL,0, - "0 EMMREG_COMMON_PROC_REQ ue id "NAS_UE_ID_FMT" (security mode control)", ueid); - emm_sap_t emm_sap; - emm_sap.primitive = EMMREG_COMMON_PROC_REQ; - emm_sap.u.emm_reg.ueid = ueid; - emm_sap.u.emm_reg.ctx = emm_ctx; - rc = emm_sap_send(&emm_sap); - } - } - - LOG_FUNC_RETURN (rc); -} - -/**************************************************************************** - ** ** - ** Name: emm_proc_security_mode_complete() ** - ** ** - ** Description: Performs the security mode control completion procedure ** - ** executed by the network. ** - ** ** - ** 3GPP TS 24.301, section 5.4.3.4 ** - ** Upon receiving the SECURITY MODE COMPLETE message, the ** - ** MME shall stop timer T3460. ** - ** From this time onward the MME shall integrity protect and ** - ** encipher all signalling messages with the selected NAS ** - ** integrity and ciphering algorithms. ** - ** ** - ** Inputs: ueid: UE lower layer identifier ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int emm_proc_security_mode_complete(unsigned int ueid) -{ - emm_data_context_t *emm_ctx = NULL; - - int rc = RETURNerror; - emm_sap_t emm_sap; - - LOG_FUNC_IN; - - LOG_TRACE(INFO, "EMM-PROC - Security mode complete (ueid="NAS_UE_ID_FMT")", ueid); - - - /* Get the UE context */ -#if defined(NAS_BUILT_IN_EPC) - if (ueid > 0) { - emm_ctx = emm_data_context_get(&_emm_data, ueid); - } -#else - if (ueid < EMM_DATA_NB_UE_MAX) { - emm_ctx = _emm_data.ctx[ueid]; - } -#endif - - if (emm_ctx) { - /* Stop timer T3460 */ - LOG_TRACE(INFO, "EMM-PROC - Stop timer T3460 (%d)", emm_ctx->T3460.id); - emm_ctx->T3460.id = nas_timer_stop(emm_ctx->T3460.id); - MSC_LOG_EVENT(MSC_NAS_EMM_MME, "0 T3460 stopped UE "NAS_UE_ID_FMT" ", ueid); - } - /* Release retransmission timer paramaters */ - security_data_t *data = (security_data_t *)(emm_proc_common_get_args(ueid)); - - if (data) { - free(data); - } - - if (emm_ctx && emm_ctx->security) { - /* - * Notify EMM that the authentication procedure successfully completed - */ - MSC_LOG_TX_MESSAGE( - MSC_NAS_EMM_MME, - MSC_NAS_EMM_MME, - NULL,0, - "0 EMMREG_COMMON_PROC_CNF ue id "NAS_UE_ID_FMT" (security mode complete)", ueid); - emm_sap.primitive = EMMREG_COMMON_PROC_CNF; - emm_sap.u.emm_reg.ueid = ueid; - emm_sap.u.emm_reg.ctx = emm_ctx; - emm_sap.u.emm_reg.u.common.is_attached = emm_ctx->is_attached; - } else { - LOG_TRACE(ERROR, "EMM-PROC - No EPS security context exists"); - /* - * Notify EMM that the authentication procedure failed - */ - MSC_LOG_TX_MESSAGE( - MSC_NAS_EMM_MME, - MSC_NAS_EMM_MME, - NULL,0, - "0 EMMREG_COMMON_PROC_REJ ue id "NAS_UE_ID_FMT" (security mode complete)", ueid); - emm_sap.primitive = EMMREG_COMMON_PROC_REJ; - emm_sap.u.emm_reg.ueid = ueid; - emm_sap.u.emm_reg.ctx = emm_ctx; - } - - rc = emm_sap_send(&emm_sap); - - LOG_FUNC_RETURN (rc); -} - -/**************************************************************************** - ** ** - ** Name: emm_proc_security_mode_reject() ** - ** ** - ** Description: Performs the security mode control not accepted by the UE ** - ** ** - ** 3GPP TS 24.301, section 5.4.3.5 ** - ** Upon receiving the SECURITY MODE REJECT message, the MME ** - ** shall stop timer T3460 and abort the ongoing procedure ** - ** that triggered the initiation of the NAS security mode ** - ** control procedure. ** - ** The MME shall apply the EPS security context in use befo- ** - ** re the initiation of the security mode control procedure, ** - ** if any, to protect any subsequent messages. ** - ** ** - ** ** - ** Inputs: ueid: UE lower layer identifier ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int emm_proc_security_mode_reject(unsigned int ueid) -{ - emm_data_context_t *emm_ctx = NULL; - int rc = RETURNerror; - - LOG_FUNC_IN; - - LOG_TRACE(WARNING, "EMM-PROC - Security mode command not accepted by the UE" - "(ueid="NAS_UE_ID_FMT")", ueid); - - - - /* Get the UE context */ -#if defined(NAS_BUILT_IN_EPC) - if (ueid > 0) { - emm_ctx = emm_data_context_get(&_emm_data, ueid); - DevAssert(emm_ctx != NULL); - } -#else - if (ueid < EMM_DATA_NB_UE_MAX) { - emm_ctx = _emm_data.ctx[ueid]; - } -#endif - if (emm_ctx) { - /* Stop timer T3460 */ - LOG_TRACE(INFO, "EMM-PROC - Stop timer T3460 (%d)", emm_ctx->T3460.id); - emm_ctx->T3460.id = nas_timer_stop(emm_ctx->T3460.id); - MSC_LOG_EVENT(MSC_NAS_EMM_MME, "0 T3460 stopped UE "NAS_UE_ID_FMT" ", ueid); - } - /* Release retransmission timer paramaters */ - security_data_t *data = (security_data_t *)(emm_proc_common_get_args(ueid)); - if (data) { - free(data); - } - - /* Set the key set identifier to its previous value */ - if (emm_ctx && emm_ctx->security) { - /* XXX - Usually, the MME should be able to maintain a current and - * a non-current EPS security context simultaneously as the UE do. - * This implementation choose to have only one security context by UE - * in the MME, thus security mode control procedure is only performed - * to take into use the first EPS security context created after a - * successful execution of the EPS authentication procedure */ - emm_ctx->security->type = EMM_KSI_NOT_AVAILABLE; - } - - /* - * Notify EMM that the authentication procedure failed - */ - MSC_LOG_TX_MESSAGE( - MSC_NAS_EMM_MME, - MSC_NAS_EMM_MME, - NULL,0, - "0 EMMREG_COMMON_PROC_REJ ue id "NAS_UE_ID_FMT" (security mode reject)", ueid); - emm_sap_t emm_sap; - emm_sap.primitive = EMMREG_COMMON_PROC_REJ; - emm_sap.u.emm_reg.ueid = ueid; - emm_sap.u.emm_reg.ctx = emm_ctx; - rc = emm_sap_send(&emm_sap); - - LOG_FUNC_RETURN (rc); -} - -/****************************************************************************/ -/********************* L O C A L F U N C T I O N S *********************/ -/****************************************************************************/ - - - -/* - * -------------------------------------------------------------------------- - * Timer handlers - * -------------------------------------------------------------------------- - */ - -/**************************************************************************** - ** ** - ** Name: _security_t3460_handler() ** - ** ** - ** Description: T3460 timeout handler ** - ** Upon T3460 timer expiration, the security mode command ** - ** message is retransmitted and the timer restarted. When ** - ** retransmission counter is exceed, the MME shall abort the ** - ** security mode control procedure. ** - ** ** - ** 3GPP TS 24.301, section 5.4.3.7, case b ** - ** ** - ** Inputs: args: handler parameters ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: None ** - ** Others: None ** - ** ** - ***************************************************************************/ -static void *_security_t3460_handler(void *args) -{ - LOG_FUNC_IN; - - int rc; - - security_data_t *data = (security_data_t *)(args); - - /* Increment the retransmission counter */ - data->retransmission_count += 1; - - LOG_TRACE(WARNING, "EMM-PROC - T3460 timer expired, retransmission " - "counter = %d", data->retransmission_count); - - if (data->retransmission_count < SECURITY_COUNTER_MAX) { - /* Send security mode command message to the UE */ - rc = _security_request(data, FALSE); - } else { - /* Set the failure notification indicator */ - data->notify_failure = TRUE; - /* Abort the security mode control procedure */ - rc = _security_abort(data); - } - - LOG_FUNC_RETURN (NULL); -} - -/* - * -------------------------------------------------------------------------- - * MME specific local functions - * -------------------------------------------------------------------------- - */ - -/**************************************************************************** - ** ** - ** Name: _security_request() ** - ** ** - ** Description: Sends SECURITY MODE COMMAND message and start timer T3460 ** - ** ** - ** Inputs: data: Security mode control internal data ** - ** is_new: Indicates whether a new security context ** - ** has just been taken into use ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: T3460 ** - ** ** - ***************************************************************************/ -int _security_request(security_data_t *data, int is_new) -{ - struct emm_data_context_s *emm_ctx = NULL; - - emm_sap_t emm_sap; - int rc; - - LOG_FUNC_IN; - - /* - * Notify EMM-AS SAP that Security Mode Command message has to be sent - * to the UE - */ - emm_sap.primitive = EMMAS_SECURITY_REQ; - emm_sap.u.emm_as.u.security.guti = NULL; - emm_sap.u.emm_as.u.security.ueid = data->ueid; - emm_sap.u.emm_as.u.security.msgType = EMM_AS_MSG_TYPE_SMC; - emm_sap.u.emm_as.u.security.ksi = data->ksi; - emm_sap.u.emm_as.u.security.eea = data->eea; - emm_sap.u.emm_as.u.security.eia = data->eia; - emm_sap.u.emm_as.u.security.ucs2 = data->ucs2; - emm_sap.u.emm_as.u.security.uea = data->uea; - emm_sap.u.emm_as.u.security.uia = data->uia; - emm_sap.u.emm_as.u.security.gea = data->gea; - emm_sap.u.emm_as.u.security.umts_present = data->umts_present; - emm_sap.u.emm_as.u.security.gprs_present = data->gprs_present; - emm_sap.u.emm_as.u.security.selected_eea = data->selected_eea; - emm_sap.u.emm_as.u.security.selected_eia = data->selected_eia; - -#if defined(NAS_BUILT_IN_EPC) - if (data->ueid > 0) { - emm_ctx = emm_data_context_get(&_emm_data, data->ueid); - } -#else - if (data->ueid < EMM_DATA_NB_UE_MAX) { - emm_ctx = _emm_data.ctx[data->ueid]; - } -#endif - - /* Setup EPS NAS security data */ - emm_as_set_security_data(&emm_sap.u.emm_as.u.security.sctx, - emm_ctx->security, is_new, FALSE); - MSC_LOG_TX_MESSAGE( - MSC_NAS_EMM_MME, - MSC_NAS_EMM_MME, - NULL,0, - "0 EMMAS_SECURITY_REQ ue id "NAS_UE_ID_FMT" ", data->ueid); - rc = emm_sap_send(&emm_sap); - - if (rc != RETURNerror) { - if (emm_ctx->T3460.id != NAS_TIMER_INACTIVE_ID) { - /* Re-start T3460 timer */ - emm_ctx->T3460.id = nas_timer_restart(emm_ctx->T3460.id); - MSC_LOG_EVENT(MSC_NAS_EMM_MME, "0 T3460 restarted UE "NAS_UE_ID_FMT" ", data->ueid); - } else { - /* Start T3460 timer */ - emm_ctx->T3460.id = nas_timer_start(emm_ctx->T3460.sec, _security_t3460_handler, data); - MSC_LOG_EVENT(MSC_NAS_EMM_MME, "0 T3460 started UE "NAS_UE_ID_FMT" ", data->ueid); - } - LOG_TRACE(INFO,"EMM-PROC - Timer T3460 (%d) expires in %ld seconds", - emm_ctx->T3460.id, emm_ctx->T3460.sec); - } - LOG_FUNC_RETURN (rc); -} - -/**************************************************************************** - ** ** - ** Name: _security_abort() ** - ** ** - ** Description: Aborts the security mode control procedure currently in ** - ** progress ** - ** ** - ** Inputs: args: Security mode control data to be released ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: T3460 ** - ** ** - ***************************************************************************/ -static int _security_abort(void *args) -{ - LOG_FUNC_IN; - - struct emm_data_context_s *emm_ctx = NULL; - int rc = RETURNerror; - - security_data_t *data = (security_data_t *)(args); - - if (data) { - unsigned int ueid = data->ueid; - int notify_failure = data->notify_failure; - - LOG_TRACE(WARNING, "EMM-PROC - Abort security mode control procedure " - "(ueid="NAS_UE_ID_FMT")", ueid); -#if defined(NAS_BUILT_IN_EPC) - if (data->ueid > 0) { - emm_ctx = emm_data_context_get(&_emm_data, data->ueid); - } -#else - if (data->ueid < EMM_DATA_NB_UE_MAX) { - emm_ctx = _emm_data.ctx[data->ueid]; - } -#endif - /* Stop timer T3460 */ - if (emm_ctx->T3460.id != NAS_TIMER_INACTIVE_ID) { - LOG_TRACE(INFO, "EMM-PROC - Stop timer T3460 (%d)", emm_ctx->T3460.id); - emm_ctx->T3460.id = nas_timer_stop(emm_ctx->T3460.id); - MSC_LOG_EVENT(MSC_NAS_EMM_MME, "0 T3460 stopped UE "NAS_UE_ID_FMT" ", ueid); - } - - /* Release retransmission timer paramaters */ - free(data); - - /* - * Notify EMM that the security mode control procedure failed - */ - if (notify_failure) { - MSC_LOG_TX_MESSAGE( - MSC_NAS_EMM_MME, - MSC_NAS_EMM_MME, - NULL,0, - "0 EMMREG_COMMON_PROC_REJ ue id "NAS_UE_ID_FMT" (security abort)", data->ueid); - emm_sap_t emm_sap; - emm_sap.primitive = EMMREG_COMMON_PROC_REJ; - emm_sap.u.emm_reg.ueid = ueid; - rc = emm_sap_send(&emm_sap); - } else { - rc = RETURNok; - } - } - - LOG_FUNC_RETURN (rc); -} - - -/**************************************************************************** - ** ** - ** Name: _security_select_algorithms() ** - ** ** - ** Description: Select int and enc algorithms based on UE capabilities and** - ** MME capabilities and MME preferences ** - ** ** - ** Inputs: ue_eia: integrity algorithms supported by UE ** - ** ue_eea: ciphering algorithms supported by UE ** - ** ** - ** Outputs: mme_eia: integrity algorithms supported by MME ** - ** mme_eea: ciphering algorithms supported by MME ** - ** ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -static int _security_select_algorithms( - const int ue_eiaP, - const int ue_eeaP, - int * const mme_eiaP, - int * const mme_eeaP) -{ - LOG_FUNC_IN; - - int rc = RETURNerror; - int preference_index; - - *mme_eiaP = NAS_SECURITY_ALGORITHMS_EIA0; - *mme_eeaP = NAS_SECURITY_ALGORITHMS_EEA0; - - for (preference_index = 0; preference_index < 8; preference_index++) { - if (ue_eiaP & (0x80 >> _emm_data.conf.prefered_integrity_algorithm[preference_index])) { - LOG_TRACE(DEBUG, - "Selected NAS_SECURITY_ALGORITHMS_EIA%d (choice num %d)", - _emm_data.conf.prefered_integrity_algorithm[preference_index], - preference_index); - *mme_eiaP = _emm_data.conf.prefered_integrity_algorithm[preference_index]; - break; - } - } - - for (preference_index = 0; preference_index < 8; preference_index++) { - if (ue_eeaP & (0x80 >> _emm_data.conf.prefered_ciphering_algorithm[preference_index])) { - LOG_TRACE(DEBUG, - "Selected NAS_SECURITY_ALGORITHMS_EEA%d (choice num %d)", - _emm_data.conf.prefered_ciphering_algorithm[preference_index], - preference_index); - *mme_eeaP = _emm_data.conf.prefered_ciphering_algorithm[preference_index]; - break; - } - } - - LOG_FUNC_RETURN (RETURNok); -} - - diff --git a/openair-cn/NAS/MME/EMM/ServiceRequestHdl.c b/openair-cn/NAS/MME/EMM/ServiceRequestHdl.c deleted file mode 100644 index 1655b22d71..0000000000 --- a/openair-cn/NAS/MME/EMM/ServiceRequestHdl.c +++ /dev/null @@ -1,93 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source ServiceRequest.c - -Version 0.1 - -Date 2013/05/07 - -Product NAS stack - -Subsystem EPS Mobility Management - -Author Frederic Maurel - -Description Defines the service request EMM procedure executed by the - Non-Access Stratum. - - The purpose of the service request procedure is to transfer - the EMM mode from EMM-IDLE to EMM-CONNECTED mode and establish - the radio and S1 bearers when uplink user data or signalling - is to be sent. - - This procedure is used when the network has downlink signalling - pending, the UE has uplink signalling pending, the UE or the - network has user data pending and the UE is in EMM-IDLE mode. - -*****************************************************************************/ - -#include "emm_proc.h" -#include "nas_log.h" -#include "nas_timer.h" - -#include "emmData.h" - -#include "emm_sap.h" - -/****************************************************************************/ -/**************** E X T E R N A L D E F I N I T I O N S ****************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************* L O C A L D E F I N I T I O N S *******************/ -/****************************************************************************/ - -/* - * -------------------------------------------------------------------------- - * Internal data handled by the service request procedure in the UE - * -------------------------------------------------------------------------- - */ - -/* - * -------------------------------------------------------------------------- - * Internal data handled by the service request procedure in the MME - * -------------------------------------------------------------------------- - */ - - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -/****************************************************************************/ -/********************* L O C A L F U N C T I O N S *********************/ -/****************************************************************************/ - - diff --git a/openair-cn/NAS/MME/EMM/TrackingAreaUpdate.c b/openair-cn/NAS/MME/EMM/TrackingAreaUpdate.c deleted file mode 100644 index 09ae70da85..0000000000 --- a/openair-cn/NAS/MME/EMM/TrackingAreaUpdate.c +++ /dev/null @@ -1,188 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source TrackingAreaUpdate.c - -Version 0.1 - -Date 2013/05/07 - -Product NAS stack - -Subsystem EPS Mobility Management - -Author Frederic Maurel - -Description Defines the tracking area update EMM procedure executed by the - Non-Access Stratum. - - The tracking area updating procedure is always initiated by the - UE and is used to update the registration of the actual tracking - area of a UE in the network, to periodically notify the availa- - bility of the UE to the network, for MME load balancing, to up- - date certain UE specific parameters in the network. - -*****************************************************************************/ - -#include "emm_proc.h" -#include "nas_log.h" -#include "nas_timer.h" - -#include "emmData.h" - -#include "emm_sap.h" -#include "emm_cause.h" - -#include <string.h> // memcmp, memcpy - -/****************************************************************************/ -/**************** E X T E R N A L D E F I N I T I O N S ****************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************* L O C A L D E F I N I T I O N S *******************/ -/****************************************************************************/ - -/* - * -------------------------------------------------------------------------- - * Internal data handled by the tracking area update procedure in the MME - * -------------------------------------------------------------------------- - */ -static int _emm_tracking_area_update_reject(void *args); - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -/**************************************************************************** - ** ** - ** Name: emm_proc_tracking_area_update_reject() ** - ** ** - ** Description: ** - ** ** - ** Inputs: ueid: UE lower layer identifier ** - ** emm_cause: EMM cause code to be reported ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: _emm_data ** - ** ** - ***************************************************************************/ -int emm_proc_tracking_area_update_reject(unsigned int ueid, int emm_cause) -{ - LOG_FUNC_IN; - - int rc; - - /* Create temporary UE context */ - emm_data_context_t ue_ctx; - memset(&ue_ctx, 0 , sizeof(emm_data_context_t)); - ue_ctx.is_dynamic = FALSE; - ue_ctx.ueid = ueid; - - /* Update the EMM cause code */ -#if defined(NAS_BUILT_IN_EPC) - - if (ueid > 0) -#else - if (ueid < EMM_DATA_NB_UE_MAX) -#endif - { - ue_ctx.emm_cause = emm_cause; - } else { - ue_ctx.emm_cause = EMM_CAUSE_ILLEGAL_UE; - } - - /* Do not accept attach request with protocol error */ - rc = _emm_tracking_area_update_reject(&ue_ctx); - - LOG_FUNC_RETURN(rc); -} - -/****************************************************************************/ -/********************* L O C A L F U N C T I O N S *********************/ -/****************************************************************************/ - - - -/**************************************************************************** - ** ** - ** Name: _emm_tracking_area_update_reject() ** - ** ** - ** Description: Performs the tracking area update procedure not accepted ** - ** by the network. ** - ** ** - ** Inputs: args: UE context data ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -static int _emm_tracking_area_update_reject(void *args) -{ - LOG_FUNC_IN; - - int rc = RETURNerror; - - emm_data_context_t *emm_ctx = (emm_data_context_t *)(args); - - if (emm_ctx) { - emm_sap_t emm_sap; - LOG_TRACE(WARNING, "EMM-PROC - EMM tracking area update procedure not accepted " - "by the network (ueid="NAS_UE_ID_FMT", cause=%d)", - emm_ctx->ueid, emm_ctx->emm_cause); - /* - * Notify EMM-AS SAP that Tracking Area Update Reject message has to be sent - * onto the network - */ - emm_sap.primitive = EMMAS_ESTABLISH_REJ; - emm_sap.u.emm_as.u.establish.ueid = emm_ctx->ueid; - emm_sap.u.emm_as.u.establish.UEid.guti = NULL; - - if (emm_ctx->emm_cause == EMM_CAUSE_SUCCESS) { - emm_ctx->emm_cause = EMM_CAUSE_ILLEGAL_UE; - } - - emm_sap.u.emm_as.u.establish.emm_cause = emm_ctx->emm_cause; - emm_sap.u.emm_as.u.establish.NASinfo = EMM_AS_NAS_INFO_TAU; - emm_sap.u.emm_as.u.establish.NASmsg.length = 0; - emm_sap.u.emm_as.u.establish.NASmsg.value = NULL; - - /* Setup EPS NAS security data */ - emm_as_set_security_data(&emm_sap.u.emm_as.u.establish.sctx, - emm_ctx->security, FALSE, TRUE); - rc = emm_sap_send(&emm_sap); - } - - LOG_FUNC_RETURN(rc); -} - diff --git a/openair-cn/NAS/MME/EMM/emmData.h b/openair-cn/NAS/MME/EMM/emmData.h deleted file mode 100644 index e17214badb..0000000000 --- a/openair-cn/NAS/MME/EMM/emmData.h +++ /dev/null @@ -1,285 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source emmData.h - -Version 0.1 - -Date 2012/10/18 - -Product NAS stack - -Subsystem EPS Mobility Management - -Author Frederic Maurel - -Description Defines internal private data handled by EPS Mobility - Management sublayer. - -*****************************************************************************/ -#ifndef __EMMDATA_H__ -#define __EMMDATA_H__ - -#include "commonDef.h" -#include "networkDef.h" -#include "securityDef.h" - -#include "OctetString.h" -#include "nas_timer.h" - -#include "esmData.h" - -#include "emm_fsm.h" -#include "mme_api.h" -# if defined(NAS_BUILT_IN_EPC) -# include "tree.h" -# endif - -/****************************************************************************/ -/********************* G L O B A L C O N S T A N T S *******************/ -/****************************************************************************/ - - -/* Checks Mobile Country Code equality */ -#define MCCS_ARE_EQUAL(n1, n2) (((n1).MCCdigit1 == (n2).MCCdigit1) && \ - ((n1).MCCdigit2 == (n2).MCCdigit2) && \ - ((n1).MCCdigit3 == (n2).MCCdigit3)) - -/* Checks Mobile Network Code equality */ -#define MNCS_ARE_EQUAL(n1, n2) (((n1).MNCdigit1 == (n2).MNCdigit1) && \ - ((n1).MNCdigit2 == (n2).MNCdigit2) && \ - ((n1).MNCdigit3 == (n2).MNCdigit3)) - -/* Checks PLMNs equality */ -#define PLMNS_ARE_EQUAL(p1, p2) ((MCCS_ARE_EQUAL((p1),(p2))) && \ - (MNCS_ARE_EQUAL((p1),(p2)))) - -/* Checks TAIs equality */ -#define TAIS_ARE_EQUAL(t1, t2) ((PLMNS_ARE_EQUAL((t1).plmn,(t2).plmn)) && \ - ((t1).tac == (t2).tac)) - -/****************************************************************************/ -/************************ G L O B A L T Y P E S ************************/ -/****************************************************************************/ - -/* - * -------------------------------------------------------------------------- - * EPS NAS security context handled by EPS Mobility Management sublayer in - * the UE and in the MME - * -------------------------------------------------------------------------- - */ -/* Type of security context */ -typedef enum { - EMM_KSI_NOT_AVAILABLE = 0, - EMM_KSI_NATIVE, - EMM_KSI_MAPPED -} emm_ksi_t; - -/* EPS NAS security context structure */ -typedef struct emm_security_context_s { - emm_ksi_t type; /* Type of security context */ - int eksi; /* NAS key set identifier for E-UTRAN */ - OctetString kasme; /* ASME security key (native context) */ - //OctetString ksgsn; /* SGSN security key (mapped context) */ - OctetString knas_enc; /* NAS cyphering key */ - OctetString knas_int; /* NAS integrity key */ - struct count_s{ - uint32_t spare:8; - uint32_t overflow:16; - uint32_t seq_num:8; - } dl_count, ul_count; /* Downlink and uplink count parameters */ - struct { - uint8_t eps_encryption; /* algorithm used for ciphering */ - uint8_t eps_integrity; /* algorithm used for integrity protection */ - uint8_t umts_encryption; /* algorithm used for ciphering */ - uint8_t umts_integrity; /* algorithm used for integrity protection */ - uint8_t gprs_encryption; /* algorithm used for ciphering */ - uint8_t umts_present:1; - uint8_t gprs_present:1; - } capability; /* UE network capability */ - struct { - uint8_t encryption:4; /* algorithm used for ciphering */ - uint8_t integrity:4; /* algorithm used for integrity protection */ - } selected_algorithms; /* MME selected algorithms */ -} emm_security_context_t; - -/* - * -------------------------------------------------------------------------- - * EMM internal data handled by EPS Mobility Management sublayer in the UE - * -------------------------------------------------------------------------- - */ - -/* - * -------------------------------------------------------------------------- - * EMM internal data handled by EPS Mobility Management sublayer in the MME - * -------------------------------------------------------------------------- - */ -/* - * Structure of the EMM context established by the network for a particular UE - * --------------------------------------------------------------------------- - */ -typedef struct emm_data_context_s { -#if defined(NAS_BUILT_IN_EPC) - RB_ENTRY(emm_data_context_s) entries; -#endif - - unsigned int ueid; /* UE identifier */ - int is_dynamic; /* Dynamically allocated context indicator */ - int is_attached; /* Attachment indicator */ - int is_emergency;/* Emergency bearer services indicator */ - - imsi_t *imsi; /* The IMSI provided by the UE or the MME */ - imei_t *imei; /* The IMEI provided by the UE */ - int guti_is_new; /* New GUTI indicator */ - GUTI_t *guti; /* The GUTI assigned to the UE */ - GUTI_t *old_guti; /* The old GUTI */ - int n_tacs; /* Number of consecutive tracking areas the UE is - * registered to */ - tac_t tac; /* Code of the first tracking area the UE is - * registered to */ - - int ksi; /* Security key set identifier provided by the UE */ - int eea; /* EPS encryption algorithms supported by the UE */ - int eia; /* EPS integrity algorithms supported by the UE */ - int ucs2; /* UCS2 Alphabet*/ - int uea; /* UMTS encryption algorithms supported by the UE */ - int uia; /* UMTS integrity algorithms supported by the UE */ - int gea; /* GPRS encryption algorithms supported by the UE */ - int umts_present; /* For encoding ue network capabilities (variable size)*/ - int gprs_present; /* For encoding ue network capabilities (variable size)*/ - - auth_vector_t vector;/* EPS authentication vector */ - emm_security_context_t *security; /* Current EPS NAS security context */ - OctetString esm_msg; /* ESM message contained within the initial request*/ - int emm_cause; /* EMM failure cause code */ - - emm_fsm_state_t _emm_fsm_status; - - struct nas_timer_t T3450; /* EMM message retransmission timer */ - struct nas_timer_t T3460; /* Authentication timer */ - struct nas_timer_t T3470; /* Identification timer */ - - esm_data_context_t esm_data_ctx; -} emm_data_context_t; - -/* - * Structure of the EMM data - * ------------------------- - */ -typedef struct emm_data_s { - /* - * MME configuration - * ----------------- - */ - mme_api_emm_config_t conf; - /* - * EMM contexts - * ------------ - */ -# if defined(NAS_BUILT_IN_EPC) - /* Use a tree for ue data context within MME */ - RB_HEAD(emm_data_context_map, emm_data_context_s) ctx_map; -# else -# define EMM_DATA_NB_UE_MAX (MME_API_NB_UE_MAX + 1) - emm_data_context_t *ctx [EMM_DATA_NB_UE_MAX]; -# endif -} emm_data_t; - -struct emm_data_context_s *emm_data_context_get( - emm_data_t *_emm_data, unsigned int _ueid); - -struct emm_data_context_s *emm_data_context_remove( - emm_data_t *_emm_data, struct emm_data_context_s *elm); - -void emm_data_context_add(emm_data_t *emm_data, struct emm_data_context_s *elm); -void emm_data_context_dump(struct emm_data_context_s *elm_pP); - -void emm_data_context_dump_all(void); - - -/****************************************************************************/ -/******************** G L O B A L V A R I A B L E S ********************/ -/****************************************************************************/ - -/* - * -------------------------------------------------------------------------- - * EPS mobility management data (used within EMM only) - * -------------------------------------------------------------------------- - */ -emm_data_t _emm_data; - - -/* - * -------------------------------------------------------------------------- - * EPS mobility management timers – Network side - * -------------------------------------------------------------------------- - */ -#define T3450_DEFAULT_VALUE 6 /* 6 seconds */ -#define T3460_DEFAULT_VALUE 6 /* 6 seconds */ -#define T3470_DEFAULT_VALUE 6 /* 6 seconds */ - -/* - * mobile reachable timer - * ---------------------- - * The network supervises the periodic tracking area updating procedure - * of the UE by means of the mobile reachable timer. - * If the UE is not attached for emergency bearer services, the mobile - * reachable timer is 4 minutes greater than T3412. - * If the UE is attached for emergency bearer services, the MME shall - * set the mobile reachable timer with a value equal to T3412. When - * the mobile reachable timer expires, the MME shall locally detach the UE. - * - * The mobile reachable timer shall be reset and started, when the MME - * releases the NAS signalling connection for the UE. The mobile reachable - * timer shall be stopped when a NAS signalling connection is established - * for the UE. - */ - -/* - * implicit detach timer - * --------------------- - * If ISR is activated, the default value of the implicit detach timer is - * 4 minutes greater than T3423. - * If the implicit detach timer expires before the UE contacts the network, - * the network shall implicitly detach the UE. - * If the MME includes timer T3346 in the TRACKING AREA UPDATE REJECT message - * or the SERVICE REJECT message and T3346 is greater than T3412, the MME - * sets the mobile reachable timer and the implicit detach timer such that - * the sum of the timer values is greater than T3346. - * - * Upon expiry of the mobile reachable timer the network shall start the - * implicit detach timer. The implicit detach timer shall be stopped when - * a NAS signalling connection is established for the UE. - */ - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -#endif /* __EMMDATA_H__*/ diff --git a/openair-cn/NAS/MME/EMM/emm_data_ctx.c b/openair-cn/NAS/MME/EMM/emm_data_ctx.c deleted file mode 100644 index 4030e08e95..0000000000 --- a/openair-cn/NAS/MME/EMM/emm_data_ctx.c +++ /dev/null @@ -1,185 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -#include <stdlib.h> -#include <string.h> - -#if defined(NAS_BUILT_IN_EPC) -#include "assertions.h" -#include "tree.h" -#include "emmData.h" -#include "nas_log.h" -#include "security_types.h" - -static inline -int emm_data_ctxt_compare_ueid(struct emm_data_context_s *p1, - struct emm_data_context_s *p2); - -RB_PROTOTYPE(emm_data_context_map, emm_data_context_s, entries, - emm_data_ctxt_compare_ueid); - -/* Generate functions used for the MAP */ -RB_GENERATE(emm_data_context_map, emm_data_context_s, entries, - emm_data_ctxt_compare_ueid); - -static inline -int emm_data_ctxt_compare_ueid(struct emm_data_context_s *p1, - struct emm_data_context_s *p2) -{ - if (p1->ueid > p2->ueid) { - return 1; - } - - if (p1->ueid < p2->ueid) { - return -1; - } - - /* Matching reference -> return 0 */ - return 0; -} - -struct emm_data_context_s *emm_data_context_get( - emm_data_t *emm_data, unsigned int _ueid) -{ - struct emm_data_context_s reference; - - DevAssert(emm_data != NULL); - DevCheck(_ueid > 0, _ueid, 0, 0); - - memset(&reference, 0, sizeof(struct emm_data_context_s)); - reference.ueid = _ueid; - return RB_FIND(emm_data_context_map, &emm_data->ctx_map, &reference); -} - -struct emm_data_context_s *emm_data_context_remove( - emm_data_t *emm_data, struct emm_data_context_s *elm) -{ - LOG_TRACE(INFO, "EMM-CTX - Remove in context %p UE id "NAS_UE_ID_FMT" ", elm, elm->ueid); - return RB_REMOVE(emm_data_context_map, &emm_data->ctx_map, elm); -} - -void emm_data_context_add(emm_data_t *emm_data, struct emm_data_context_s *elm) -{ - LOG_TRACE(INFO, "EMM-CTX - Add in context %p UE id "NAS_UE_ID_FMT" ", elm, elm->ueid); - RB_INSERT(emm_data_context_map, &emm_data->ctx_map, elm); -} - -void emm_data_context_dump(struct emm_data_context_s *elm_pP) -{ - if (elm_pP != NULL) { - char imsi_str[16]; - char guti_str[22]; - int k, size, remaining_size; - char key_string[KASME_LENGTH_OCTETS*2]; - LOG_TRACE(INFO, "EMM-CTX: ue id: "NAS_UE_ID_FMT" (UE identifier)", elm_pP->ueid); - LOG_TRACE(INFO, " is_dynamic: %u (Dynamically allocated context indicator)", elm_pP->is_dynamic); - LOG_TRACE(INFO, " is_attached: %u (Attachment indicator)", elm_pP->is_attached); - LOG_TRACE(INFO, " is_emergency: %u (Emergency bearer services indicator)", elm_pP->is_emergency); - NAS_IMSI2STR(elm_pP->imsi, imsi_str, 16); - LOG_TRACE(INFO, " imsi: %s (The IMSI provided by the UE or the MME)", imsi_str); - LOG_TRACE(INFO, " imei: TODO (The IMEI provided by the UE)"); - LOG_TRACE(INFO, " guti_is_new: %u (New GUTI indicator)", elm_pP->guti_is_new); - GUTI2STR(elm_pP->guti, guti_str, 22); - LOG_TRACE(INFO, " guti: %s (The GUTI assigned to the UE)", guti_str); - GUTI2STR(elm_pP->old_guti, guti_str, 22); - LOG_TRACE(INFO, " old_guti: %s (The old GUTI)", guti_str); - LOG_TRACE(INFO, " n_tacs: %u (Number of consecutive tracking areas the UE is registered to)", elm_pP->n_tacs); - LOG_TRACE(INFO, " tac: 0x%04x (Code of the first tracking area the UE is registered to)", elm_pP->n_tacs); - LOG_TRACE(INFO, " ksi: %u (Security key set identifier provided by the UE)", elm_pP->ksi); - - LOG_TRACE(INFO, " auth_vector: (EPS authentication vector)"); - LOG_TRACE(INFO, " kasme: "KASME_FORMAT""KASME_FORMAT, KASME_DISPLAY_1(elm_pP->vector.kasme), KASME_DISPLAY_2(elm_pP->vector.kasme)); - LOG_TRACE(INFO, " rand: "RAND_FORMAT, RAND_DISPLAY(elm_pP->vector.rand)); - LOG_TRACE(INFO, " autn: "AUTN_FORMAT, AUTN_DISPLAY(elm_pP->vector.autn)); - for (k = 0; k < XRES_LENGTH_MAX; k++) {sprintf(&key_string[k * 3], "%02x,", elm_pP->vector.xres[k]);} - key_string[k * 3 - 1] = '\0'; - LOG_TRACE(INFO, " xres: %s\n", key_string); - - if (elm_pP->security != NULL) { - LOG_TRACE(INFO, " security context: (Current EPS NAS security context)"); - LOG_TRACE(INFO, " type: %s (Type of security context)", - (elm_pP->security->type == EMM_KSI_NOT_AVAILABLE)?"KSI_NOT_AVAILABLE":(elm_pP->security->type == EMM_KSI_NATIVE)?"KSI_NATIVE":"KSI_MAPPED"); - LOG_TRACE(INFO, " eksi: %u (NAS key set identifier for E-UTRAN)", elm_pP->security->eksi); - - if (elm_pP->security->kasme.length > 0) { - size = 0; - size = 0;remaining_size=KASME_LENGTH_OCTETS*2; - for (k = 0; k < elm_pP->security->kasme.length; k++) { - size +=snprintf(&key_string[size], remaining_size, "0x%x ", elm_pP->security->kasme.value[k]); - remaining_size -= size; - } - } else { - size +=snprintf(&key_string[0], remaining_size, "None"); - } - LOG_TRACE(INFO, " kasme: %s (ASME security key (native context))", key_string); - if (elm_pP->security->knas_enc.length > 0) { - size = 0; - size = 0;remaining_size=KASME_LENGTH_OCTETS*2; - for (k = 0; k < elm_pP->security->knas_enc.length; k++) { - size +=snprintf(&key_string[size], remaining_size, "0x%x ", elm_pP->security->knas_enc.value[k]); - remaining_size -= size; - } - } else { - size +=snprintf(&key_string[0], remaining_size, "None"); - } - LOG_TRACE(INFO, " knas_enc: %s (NAS cyphering key)", key_string); - if (elm_pP->security->knas_int.length > 0) { - size = 0;remaining_size=KASME_LENGTH_OCTETS*2; - for (k = 0; k < elm_pP->security->knas_int.length; k++) { - size +=snprintf(&key_string[size], remaining_size, "0x%x ", elm_pP->security->knas_int.value[k]); - remaining_size -= size; - } - } else { - size +=snprintf(&key_string[0], remaining_size, "None"); - } - LOG_TRACE(INFO, " knas_int: %s (NAS integrity key)", key_string); - LOG_TRACE(INFO, " dl_count.overflow: %u ", elm_pP->security->dl_count.overflow); - LOG_TRACE(INFO, " dl_count.seq_num: %u ", elm_pP->security->dl_count.seq_num); - LOG_TRACE(INFO, " ul_count.overflow: %u ", elm_pP->security->ul_count.overflow); - LOG_TRACE(INFO, " ul_count.seq_num: %u ", elm_pP->security->ul_count.seq_num); - LOG_TRACE(INFO, " TODO capability"); - LOG_TRACE(INFO, " selected_algorithms.encryption: %x ", elm_pP->security->selected_algorithms.encryption); - LOG_TRACE(INFO, " selected_algorithms.integrity: %x ", elm_pP->security->selected_algorithms.integrity); - } else { - LOG_TRACE(INFO, " No security context"); - } - LOG_TRACE(INFO, " _emm_fsm_status %u ", elm_pP->_emm_fsm_status); - LOG_TRACE(INFO, " TODO esm_data_ctx"); - } -} - -void emm_data_context_dump_all(void) -{ - struct emm_data_context_s *elm_p = NULL; - LOG_TRACE(INFO, "EMM-CTX - Dump all contexts:"); - RB_FOREACH(elm_p, emm_data_context_map,&_emm_data.ctx_map) { - emm_data_context_dump(elm_p); - } -} -#endif diff --git a/openair-cn/NAS/MME/EMM/emm_main.c b/openair-cn/NAS/MME/EMM/emm_main.c deleted file mode 100644 index c90a7836f5..0000000000 --- a/openair-cn/NAS/MME/EMM/emm_main.c +++ /dev/null @@ -1,138 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source emm_main.c - -Version 0.1 - -Date 2012/10/10 - -Product NAS stack - -Subsystem EPS Mobility Management - -Author Frederic Maurel - -Description Defines the EPS Mobility Management procedure call manager, - the main entry point for elementary EMM processing. - -*****************************************************************************/ - -#include "emm_main.h" -#include "nas_log.h" -#include "emmData.h" - - -#if defined(NAS_BUILT_IN_EPC) -# include "mme_config.h" -#endif - -/****************************************************************************/ -/**************** E X T E R N A L D E F I N I T I O N S ****************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************* L O C A L D E F I N I T I O N S *******************/ -/****************************************************************************/ - - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - - -/**************************************************************************** - ** ** - ** Name: emm_main_initialize() ** - ** ** - ** Description: Initializes EMM internal data ** - ** ** - ** Inputs: None ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: None ** - ** Others: _emm_data ** - ** ** - ***************************************************************************/ -#if defined(NAS_BUILT_IN_EPC) -void emm_main_initialize(mme_config_t *mme_config_p) -#else -void emm_main_initialize(void) -#endif -{ - LOG_FUNC_IN; - - /* Retreive MME supported configuration data */ -#if defined(NAS_BUILT_IN_EPC) - - if (mme_api_get_emm_config(&_emm_data.conf, mme_config_p) != RETURNok) -#else - if (mme_api_get_emm_config(&_emm_data.conf) != RETURNok) -#endif - { - LOG_TRACE(ERROR, "EMM-MAIN - Failed to get MME configuration data"); - } - -#if defined(NAS_BUILT_IN_EPC) - RB_INIT(&_emm_data.ctx_map); -#endif - - LOG_FUNC_OUT; -} - -/**************************************************************************** - ** ** - ** Name: emm_main_cleanup() ** - ** ** - ** Description: Performs the EPS Mobility Management clean up procedure ** - ** ** - ** Inputs: None ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: None ** - ** Others: None ** - ** ** - ***************************************************************************/ -void emm_main_cleanup(void) -{ - LOG_FUNC_IN; - - - LOG_FUNC_OUT; -} - - - -/****************************************************************************/ -/********************* L O C A L F U N C T I O N S *********************/ -/****************************************************************************/ - - diff --git a/openair-cn/NAS/MME/EMM/emm_main.h b/openair-cn/NAS/MME/EMM/emm_main.h deleted file mode 100644 index ac3772a24f..0000000000 --- a/openair-cn/NAS/MME/EMM/emm_main.h +++ /dev/null @@ -1,82 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source emm_main.h - -Version 0.1 - -Date 2012/10/10 - -Product NAS stack - -Subsystem EPS Mobility Management - -Author Frederic Maurel - -Description Defines the EPS Mobility Management procedure call manager, - the main entry point for elementary EMM processing. - -*****************************************************************************/ -#ifndef __EMM_MAIN_H__ -#define __EMM_MAIN_H__ - -#if defined(NAS_BUILT_IN_EPC) -# include "mme_config.h" -#endif - -#include "commonDef.h" -#include "networkDef.h" - -/****************************************************************************/ -/********************* G L O B A L C O N S T A N T S *******************/ -/****************************************************************************/ - -/****************************************************************************/ -/************************ G L O B A L T Y P E S ************************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************** G L O B A L V A R I A B L E S ********************/ -/****************************************************************************/ - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - - -# if defined(NAS_BUILT_IN_EPC) -void emm_main_initialize(mme_config_t *mme_config_p); -# else -void emm_main_initialize(void); -# endif -void emm_main_cleanup(void); - - - -#endif /* __EMM_MAIN_H__*/ diff --git a/openair-cn/NAS/MME/EMM/emm_proc.h b/openair-cn/NAS/MME/EMM/emm_proc.h deleted file mode 100644 index d7892a03b1..0000000000 --- a/openair-cn/NAS/MME/EMM/emm_proc.h +++ /dev/null @@ -1,199 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source emm_proc.h - -Version 0.1 - -Date 2012/10/16 - -Product NAS stack - -Subsystem EPS Mobility Management - -Author Frederic Maurel - -Description Defines the EPS Mobility Management procedures executed at - the EMM Service Access Points. - -*****************************************************************************/ -#ifndef __EMM_PROC_H__ -#define __EMM_PROC_H__ - -#include "commonDef.h" -#include "OctetString.h" - -#include "EmmCommon.h" -#include "emmData.h" - - -/****************************************************************************/ -/********************* G L O B A L C O N S T A N T S *******************/ -/****************************************************************************/ - -/* Type of network attachment */ -typedef enum { - EMM_ATTACH_TYPE_EPS = 0, - EMM_ATTACH_TYPE_IMSI, - EMM_ATTACH_TYPE_EMERGENCY, - EMM_ATTACH_TYPE_RESERVED, -} emm_proc_attach_type_t; - -/* Type of network detach */ -typedef enum { - EMM_DETACH_TYPE_EPS = 0, - EMM_DETACH_TYPE_IMSI, - EMM_DETACH_TYPE_EPS_IMSI, - EMM_DETACH_TYPE_REATTACH, - EMM_DETACH_TYPE_NOT_REATTACH, - EMM_DETACH_TYPE_RESERVED, -} emm_proc_detach_type_t; - -/* Type of requested identity */ -typedef enum { - EMM_IDENT_TYPE_NOT_AVAILABLE = 0, - EMM_IDENT_TYPE_IMSI, - EMM_IDENT_TYPE_IMEI, - EMM_IDENT_TYPE_IMEISV, - EMM_IDENT_TYPE_TMSI -} emm_proc_identity_type_t; - -/****************************************************************************/ -/************************ G L O B A L T Y P E S ************************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************** G L O B A L V A R I A B L E S ********************/ -/****************************************************************************/ - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -/* - *--------------------------------------------------------------------------- - * EMM status procedure - *--------------------------------------------------------------------------- - */ -int emm_proc_status_ind(unsigned int ueid, int emm_cause); -int emm_proc_status(unsigned int ueid, int emm_cause); - -/* - *--------------------------------------------------------------------------- - * Lower layer procedure - *--------------------------------------------------------------------------- - */ - - -/* - *--------------------------------------------------------------------------- - * UE's Idle mode procedure - *--------------------------------------------------------------------------- - */ - - -/* - * -------------------------------------------------------------------------- - * Attach procedure - * -------------------------------------------------------------------------- - */ - - -int emm_proc_attach_request(unsigned int ueid, emm_proc_attach_type_t type, - int native_ksi, int ksi, int native_guti, GUTI_t *guti, imsi_t *imsi, - imei_t *imei, tai_t *tai, int eea, int eia, int ucs2, int uea, int uia, int gea, - int umts_present, int gprs_present, const OctetString *esm_msg); -int emm_proc_attach_reject(unsigned int ueid, int emm_cause); -int emm_proc_attach_complete(unsigned int ueid, const OctetString *esm_msg); -int emm_proc_tracking_area_update_reject(unsigned int ueid, int emm_cause); - -/* - * -------------------------------------------------------------------------- - * Detach procedure - * -------------------------------------------------------------------------- - */ - -int emm_proc_detach(unsigned int ueid, emm_proc_detach_type_t type); -int emm_proc_detach_request(unsigned int ueid, emm_proc_detach_type_t type, - int switch_off, int native_ksi, int ksi, GUTI_t *guti, imsi_t *imsi, - imei_t *imei); - -/* - * -------------------------------------------------------------------------- - * Identification procedure - * -------------------------------------------------------------------------- - */ -int emm_proc_identification(unsigned int ueid, - emm_data_context_t *emm_ctx, - emm_proc_identity_type_t type, - emm_common_success_callback_t success, - emm_common_reject_callback_t reject, - emm_common_failure_callback_t failure); -int emm_proc_identification_complete(unsigned int ueid, const imsi_t *imsi, - const imei_t *imei, uint32_t *tmsi); - -/* - * -------------------------------------------------------------------------- - * Authentication procedure - * -------------------------------------------------------------------------- - */ - -int emm_proc_authentication(void *ctx, unsigned int ueid, int ksi, - const OctetString *_rand, const OctetString *autn, - emm_common_success_callback_t success, - emm_common_reject_callback_t reject, - emm_common_failure_callback_t failure); -int emm_proc_authentication_complete(unsigned int ueid, int emm_cause, - const OctetString *res); - -int emm_attach_security(void *args); - -/* - * -------------------------------------------------------------------------- - * Security mode control procedure - * -------------------------------------------------------------------------- - */ - -int emm_proc_security_mode_control(unsigned int ueid, int ksi, - int eea, int eia,int ucs2, int uea, int uia, int gea, - int umts_present, int gprs_present, - emm_common_success_callback_t success, - emm_common_reject_callback_t reject, - emm_common_failure_callback_t failure); -int emm_proc_security_mode_complete(unsigned int ueid); -int emm_proc_security_mode_reject(unsigned int ueid); - -/* - *--------------------------------------------------------------------------- - * Network indication handlers - *--------------------------------------------------------------------------- - */ - - -#endif /* __EMM_PROC_H__*/ diff --git a/openair-cn/NAS/MME/ESM/COPYING b/openair-cn/NAS/MME/ESM/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair-cn/NAS/MME/ESM/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program 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. - - This program 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 this program. If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - <program> Copyright (C) <year> <name of author> - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<http://www.gnu.org/licenses/>. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<http://www.gnu.org/philosophy/why-not-lgpl.html>. diff --git a/openair-cn/NAS/MME/ESM/DedicatedEpsBearerContextActivation.c b/openair-cn/NAS/MME/ESM/DedicatedEpsBearerContextActivation.c deleted file mode 100644 index 813b29770d..0000000000 --- a/openair-cn/NAS/MME/ESM/DedicatedEpsBearerContextActivation.c +++ /dev/null @@ -1,442 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source DedicatedEpsBearerContextActivation.c - -Version 0.1 - -Date 2013/07/16 - -Product NAS stack - -Subsystem EPS Session Management - -Author Frederic Maurel - -Description Defines the dedicated EPS bearer context activation ESM - procedure executed by the Non-Access Stratum. - - The purpose of the dedicated EPS bearer context activation - procedure is to establish an EPS bearer context with specific - QoS and TFT between the UE and the EPC. - - The procedure is initiated by the network, but may be requested - by the UE by means of the UE requested bearer resource alloca- - tion procedure or the UE requested bearer resource modification - procedure. - It can be part of the attach procedure or be initiated together - with the default EPS bearer context activation procedure when - the UE initiated stand-alone PDN connectivity procedure. - -*****************************************************************************/ - -#include "esm_proc.h" -#include "commonDef.h" -#include "nas_log.h" - -#include "esm_cause.h" -#include "esm_ebr.h" -#include "esm_ebr_context.h" - -#include "emm_sap.h" - -/****************************************************************************/ -/**************** E X T E R N A L D E F I N I T I O N S ****************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************* L O C A L D E F I N I T I O N S *******************/ -/****************************************************************************/ - -/* - * -------------------------------------------------------------------------- - * Internal data handled by the dedicated EPS bearer context activation - * procedure in the MME - * -------------------------------------------------------------------------- - */ -/* - * Timer handlers - */ -static void *_dedicated_eps_bearer_activate_t3485_handler(void *); - -/* Maximum value of the activate dedicated EPS bearer context request - * retransmission counter */ -#define DEDICATED_EPS_BEARER_ACTIVATE_COUNTER_MAX 5 - -static int _dedicated_eps_bearer_activate(emm_data_context_t *ctx, int ebi, - const OctetString *msg); - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -/* - * -------------------------------------------------------------------------- - * Dedicated EPS bearer context activation procedure executed by the MME - * -------------------------------------------------------------------------- - */ -/**************************************************************************** - ** ** - ** Name: esm_proc_dedicated_eps_bearer_context() ** - ** ** - ** Description: Allocates resources required for activation of a dedica- ** - ** ted EPS bearer context. ** - ** ** - ** Inputs: ueid: UE local identifier ** - ** pid: PDN connection identifier ** - ** esm_qos: EPS bearer level QoS parameters ** - ** tft: Traffic flow template parameters ** - ** Others: None ** - ** ** - ** Outputs: ebi: EPS bearer identity assigned to the new ** - ** dedicated bearer context ** - ** default_ebi: EPS bearer identity of the associated de- ** - ** fault EPS bearer context ** - ** esm_cause: Cause code returned upon ESM procedure ** - ** failure ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int esm_proc_dedicated_eps_bearer_context(emm_data_context_t *ctx, int pid, - unsigned int *ebi, - unsigned int *default_ebi, - const esm_proc_qos_t *qos, - const esm_proc_tft_t *tft, - int *esm_cause) -{ - LOG_FUNC_IN; - - LOG_TRACE(INFO, "ESM-PROC - Dedicated EPS bearer context activation " - "(ueid="NAS_UE_ID_FMT", pid=%d)", ctx->ueid, pid); - - /* Assign new EPS bearer context */ - *ebi = esm_ebr_assign(ctx, ESM_EBI_UNASSIGNED); - - if (*ebi != ESM_EBI_UNASSIGNED) { - /* Create dedicated EPS bearer context */ - *default_ebi = esm_ebr_context_create(ctx, pid, *ebi, FALSE, qos, tft); - - if (*default_ebi == ESM_EBI_UNASSIGNED) { - /* No resource available */ - LOG_TRACE(WARNING, "ESM-PROC - Failed to create dedicated EPS " - "bearer context (ebi=%d)", *ebi); - *esm_cause = ESM_CAUSE_INSUFFICIENT_RESOURCES; - LOG_FUNC_RETURN (RETURNerror); - } - - LOG_FUNC_RETURN (RETURNok); - } - - LOG_TRACE(WARNING, "ESM-PROC - Failed to assign new EPS bearer context"); - *esm_cause = ESM_CAUSE_INSUFFICIENT_RESOURCES; - LOG_FUNC_RETURN (RETURNerror); -} - -/**************************************************************************** - ** ** - ** Name: esm_proc_dedicated_eps_bearer_context_request() ** - ** ** - ** Description: Initiates the dedicated EPS bearer context activation pro-** - ** cedure ** - ** ** - ** 3GPP TS 24.301, section 6.4.2.2 ** - ** The MME initiates the dedicated EPS bearer context activa-** - ** tion procedure by sending an ACTIVATE DEDICATED EPS BEA- ** - ** RER CONTEXT REQUEST message, starting timer T3485 and en- ** - ** tering state BEARER CONTEXT ACTIVE PENDING. ** - ** ** - ** Inputs: is_standalone: Not used (always TRUE) ** - ** ueid: UE lower layer identifier ** - ** ebi: EPS bearer identity ** - ** msg: Encoded ESM message to be sent ** - ** ue_triggered: TRUE if the EPS bearer context procedure ** - ** was triggered by the UE ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int esm_proc_dedicated_eps_bearer_context_request(int is_standalone, - emm_data_context_t *ctx, int ebi, - OctetString *msg, int ue_triggered) -{ - LOG_FUNC_IN; - - int rc = RETURNok; - - LOG_TRACE(INFO,"ESM-PROC - Initiate dedicated EPS bearer context " - "activation (ueid="NAS_UE_ID_FMT", ebi=%d)", ctx->ueid, ebi); - - /* Send activate dedicated EPS bearer context request message and - * start timer T3485 */ - rc = _dedicated_eps_bearer_activate(ctx, ebi, msg); - - if (rc != RETURNerror) { - /* Set the EPS bearer context state to ACTIVE PENDING */ - rc = esm_ebr_set_status(ctx, ebi, ESM_EBR_ACTIVE_PENDING, ue_triggered); - - if (rc != RETURNok) { - /* The EPS bearer context was already in ACTIVE PENDING state */ - LOG_TRACE(WARNING, "ESM-PROC - EBI %d was already ACTIVE PENDING", - ebi); - } - } - - LOG_FUNC_RETURN (rc); -} - -/**************************************************************************** - ** ** - ** Name: esm_proc_dedicated_eps_bearer_context_accept() ** - ** ** - ** Description: Performs dedicated EPS bearer context activation procedu- ** - ** re accepted by the UE. ** - ** ** - ** 3GPP TS 24.301, section 6.4.2.3 ** - ** Upon receipt of the ACTIVATE DEDICATED EPS BEARER CONTEXT ** - ** ACCEPT message, the MME shall stop the timer T3485 and ** - ** enter the state BEARER CONTEXT ACTIVE. ** - ** ** - ** Inputs: ueid: UE local identifier ** - ** ebi: EPS bearer identity ** - ** Others: None ** - ** ** - ** Outputs: esm_cause: Cause code returned upon ESM procedure ** - ** failure ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int esm_proc_dedicated_eps_bearer_context_accept(emm_data_context_t *ctx, int ebi, - int *esm_cause) -{ - LOG_FUNC_IN; - - int rc; - - LOG_TRACE(INFO, "ESM-PROC - Dedicated EPS bearer context activation " - "accepted by the UE (ueid="NAS_UE_ID_FMT", ebi=%d)", ctx->ueid, ebi); - - /* Stop T3485 timer */ - rc = esm_ebr_stop_timer(ctx, ebi); - - if (rc != RETURNerror) { - /* Set the EPS bearer context state to ACTIVE */ - rc = esm_ebr_set_status(ctx, ebi, ESM_EBR_ACTIVE, FALSE); - - if (rc != RETURNok) { - /* The EPS bearer context was already in ACTIVE state */ - LOG_TRACE(WARNING, "ESM-PROC - EBI %d was already ACTIVE", ebi); - *esm_cause = ESM_CAUSE_PROTOCOL_ERROR; - } - } - - LOG_FUNC_RETURN (rc); -} - -/**************************************************************************** - ** ** - ** Name: esm_proc_dedicated_eps_bearer_context_reject() ** - ** ** - ** Description: Performs dedicated EPS bearer context activation procedu- ** - ** re not accepted by the UE. ** - ** ** - ** 3GPP TS 24.301, section 6.4.2.4 ** - ** Upon receipt of the ACTIVATE DEDICATED EPS BEARER CONTEXT ** - ** REJECT message, the MME shall stop the timer T3485, enter ** - ** the state BEARER CONTEXT INACTIVE and abort the dedicated ** - ** EPS bearer context activation procedure. ** - ** The MME also requests the lower layer to release the ra- ** - ** dio resources that were established during the dedicated ** - ** EPS bearer context activation. ** - ** ** - ** Inputs: ueid: UE local identifier ** - ** ebi: EPS bearer identity ** - ** Others: None ** - ** ** - ** Outputs: esm_cause: Cause code returned upon ESM procedure ** - ** failure ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int esm_proc_dedicated_eps_bearer_context_reject(emm_data_context_t *ctx, int ebi, - int *esm_cause) -{ - int rc; - - LOG_FUNC_IN; - - LOG_TRACE(WARNING, "ESM-PROC - Dedicated EPS bearer context activation " - "not accepted by the UE (ueid="NAS_UE_ID_FMT", ebi=%d)", ctx->ueid, ebi); - - /* Stop T3485 timer if running */ - rc = esm_ebr_stop_timer(ctx, ebi); - - if (rc != RETURNerror) { - int pid, bid; - /* Release the dedicated EPS bearer context and enter state INACTIVE */ - rc = esm_proc_eps_bearer_context_deactivate(ctx, TRUE, ebi, - &pid, &bid, NULL); - - if (rc != RETURNok) { - /* Failed to release the dedicated EPS bearer context */ - *esm_cause = ESM_CAUSE_PROTOCOL_ERROR; - } - } - - LOG_FUNC_RETURN (rc); -} - - -/****************************************************************************/ -/********************* L O C A L F U N C T I O N S *********************/ -/****************************************************************************/ - -/* - * -------------------------------------------------------------------------- - * Timer handlers - * -------------------------------------------------------------------------- - */ -/**************************************************************************** - ** ** - ** Name: _dedicated_eps_bearer_activate_t3485_handler() ** - ** ** - ** Description: T3485 timeout handler ** - ** ** - ** 3GPP TS 24.301, section 6.4.2.6, case a ** - ** On the first expiry of the timer T3485, the MME shall re- ** - ** send the ACTIVATE DEDICATED EPS BEARER CONTEXT REQUEST ** - ** and shall reset and restart timer T3485. This retransmis- ** - ** sion is repeated four times, i.e. on the fifth expiry of ** - ** timer T3485, the MME shall abort the procedure, release ** - ** any resources allocated for this activation and enter the ** - ** state BEARER CONTEXT INACTIVE. ** - ** ** - ** Inputs: args: handler parameters ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: None ** - ** Others: None ** - ** ** - ***************************************************************************/ -static void *_dedicated_eps_bearer_activate_t3485_handler(void *args) -{ - LOG_FUNC_IN; - - int rc; - - /* Get retransmission timer parameters data */ - esm_ebr_timer_data_t *data = (esm_ebr_timer_data_t *)(args); - - /* Increment the retransmission counter */ - data->count += 1; - - LOG_TRACE(WARNING, "ESM-PROC - T3485 timer expired (ueid="NAS_UE_ID_FMT", ebi=%d), " - "retransmission counter = %d", - data->ueid, data->ebi, data->count); - - if (data->count < DEDICATED_EPS_BEARER_ACTIVATE_COUNTER_MAX) { - /* Re-send activate dedicated EPS bearer context request message - * to the UE */ - rc = _dedicated_eps_bearer_activate(data->ctx, data->ebi, &data->msg); - } else { - /* - * The maximum number of activate dedicated EPS bearer context request - * message retransmission has exceed - */ - int pid, bid; - /* Release the dedicated EPS bearer context and enter state INACTIVE */ - rc = esm_proc_eps_bearer_context_deactivate(data->ctx, TRUE, - data->ebi, &pid, &bid, - NULL); - - if (rc != RETURNerror) { - /* Stop timer T3485 */ - rc = esm_ebr_stop_timer(data->ctx, data->ebi); - } - } - - LOG_FUNC_RETURN (NULL); -} - -/* - * -------------------------------------------------------------------------- - * MME specific local functions - * -------------------------------------------------------------------------- - */ - -/**************************************************************************** - ** ** - ** Name: _dedicated_eps_bearer_activate() ** - ** ** - ** Description: Sends ACTIVATE DEDICATED EPS BEREAR CONTEXT REQUEST mes- ** - ** sage and starts timer T3485 ** - ** ** - ** Inputs: ueid: UE local identifier ** - ** ebi: EPS bearer identity ** - ** msg: Encoded ESM message to be sent ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: T3485 ** - ** ** - ***************************************************************************/ -static int _dedicated_eps_bearer_activate(emm_data_context_t *ctx, int ebi, - const OctetString *msg) -{ - LOG_FUNC_IN; - - emm_sap_t emm_sap; - int rc; - - /* - * Notify EMM that an activate dedicated EPS bearer context request - * message has to be sent to the UE - */ - emm_esm_data_t *emm_esm = &emm_sap.u.emm_esm.u.data; - emm_sap.primitive = EMMESM_UNITDATA_REQ; - emm_sap.u.emm_esm.ueid = ctx->ueid; - emm_sap.u.emm_esm.ctx = ctx; - emm_esm->msg = *msg; - rc = emm_sap_send(&emm_sap); - - if (rc != RETURNerror) { - /* Start T3485 retransmission timer */ - rc = esm_ebr_start_timer(ctx, ebi, msg, T3485_DEFAULT_VALUE, - _dedicated_eps_bearer_activate_t3485_handler); - } - - LOG_FUNC_RETURN (rc); -} diff --git a/openair-cn/NAS/MME/ESM/DefaultEpsBearerContextActivation.c b/openair-cn/NAS/MME/ESM/DefaultEpsBearerContextActivation.c deleted file mode 100644 index 831fc3327d..0000000000 --- a/openair-cn/NAS/MME/ESM/DefaultEpsBearerContextActivation.c +++ /dev/null @@ -1,497 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source DefaultEpsBearerContextActivation.c - -Version 0.1 - -Date 2013/01/28 - -Product NAS stack - -Subsystem EPS Session Management - -Author Frederic Maurel - -Description Defines the default EPS bearer context activation ESM - procedure executed by the Non-Access Stratum. - - The purpose of the default bearer context activation procedure - is to establish a default EPS bearer context between the UE - and the EPC. - - The procedure is initiated by the network as a response to - the PDN CONNECTIVITY REQUEST message received from the UE. - It can be part of the attach procedure. - -*****************************************************************************/ - -#include "esm_proc.h" -#include "commonDef.h" -#include "nas_log.h" - -#include "esm_cause.h" -#include "esm_ebr.h" -#include "esm_ebr_context.h" - -#include "emm_sap.h" - -/****************************************************************************/ -/**************** E X T E R N A L D E F I N I T I O N S ****************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************* L O C A L D E F I N I T I O N S *******************/ -/****************************************************************************/ - - -/* - * -------------------------------------------------------------------------- - * Internal data handled by the default EPS bearer context activation - * procedure in the MME - * -------------------------------------------------------------------------- - */ -/* - * Timer handlers - */ -static void *_default_eps_bearer_activate_t3485_handler(void *); - -/* Maximum value of the activate default EPS bearer context request - * retransmission counter */ -#define DEFAULT_EPS_BEARER_ACTIVATE_COUNTER_MAX 5 - -static int _default_eps_bearer_activate(emm_data_context_t *ctx, int ebi, - const OctetString *msg); - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -/* - * -------------------------------------------------------------------------- - * Default EPS bearer context activation procedure executed by the MME - * -------------------------------------------------------------------------- - */ -/**************************************************************************** - ** ** - ** Name: esm_proc_default_eps_bearer_context() ** - ** ** - ** Description: Allocates resources required for activation of a default ** - ** EPS bearer context. ** - ** ** - ** Inputs: ueid: UE local identifier ** - ** pid: PDN connection identifier ** - ** qos: EPS bearer level QoS parameters ** - ** Others: None ** - ** ** - ** Outputs: ebi: EPS bearer identity assigned to the de- ** - ** fault EPS bearer context ** - ** esm_cause: Cause code returned upon ESM procedure ** - ** failure ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int esm_proc_default_eps_bearer_context(emm_data_context_t *ctx, int pid, - unsigned int *ebi, - const esm_proc_qos_t *qos, - int *esm_cause) -{ - LOG_FUNC_IN; - - LOG_TRACE(INFO, "ESM-PROC - Default EPS bearer context activation " - "(ueid="NAS_UE_ID_FMT", pid=%d, GBR UL %u GBR DL %u, MBR UL %u MBR DL %u QCI %u)", - ctx->ueid, - pid, - qos->gbrUL, - qos->gbrDL, - qos->mbrUL, - qos->mbrDL, - qos->qci); - - /* Assign new EPS bearer context */ - *ebi = esm_ebr_assign(ctx, ESM_EBI_UNASSIGNED); - - if (*ebi != ESM_EBI_UNASSIGNED) { - /* Create default EPS bearer context */ - *ebi = esm_ebr_context_create(ctx, pid, *ebi, TRUE, qos, NULL); - - if (*ebi == ESM_EBI_UNASSIGNED) { - /* No resource available */ - LOG_TRACE(WARNING, "ESM-PROC - Failed to create new default EPS " - "bearer context (ebi=%d)", *ebi); - *esm_cause = ESM_CAUSE_INSUFFICIENT_RESOURCES; - LOG_FUNC_RETURN (RETURNerror); - } - - LOG_FUNC_RETURN (RETURNok); - } - - LOG_TRACE(WARNING, "ESM-PROC - Failed to assign new EPS bearer context"); - *esm_cause = ESM_CAUSE_INSUFFICIENT_RESOURCES; - LOG_FUNC_RETURN (RETURNerror); -} - -/**************************************************************************** - ** ** - ** Name: esm_proc_default_eps_bearer_context_request() ** - ** ** - ** Description: Initiates the default EPS bearer context activation pro- ** - ** cedure ** - ** ** - ** 3GPP TS 24.301, section 6.4.1.2 ** - ** The MME initiates the default EPS bearer context activa- ** - ** tion procedure by sending an ACTIVATE DEFAULT EPS BEARER ** - ** CONTEXT REQUEST message, starting timer T3485 and ente- ** - ** ring state BEARER CONTEXT ACTIVE PENDING. ** - ** ** - ** Inputs: is_standalone: Indicate whether the default bearer is ** - ** activated as part of the attach procedure ** - ** or as the response to a stand-alone PDN ** - ** CONNECTIVITY REQUEST message ** - ** ueid: UE lower layer identifier ** - ** ebi: EPS bearer identity ** - ** msg: Encoded ESM message to be sent ** - ** ue_triggered: TRUE if the EPS bearer context procedure ** - ** was triggered by the UE ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int esm_proc_default_eps_bearer_context_request(int is_standalone, - emm_data_context_t *ctx, int ebi, - OctetString *msg, int ue_triggered) -{ - int rc = RETURNok; - - LOG_FUNC_IN; - - - if (is_standalone) { - /* Send activate default EPS bearer context request message and - * start timer T3485 */ - LOG_TRACE(INFO,"ESM-PROC - Initiate standalone default EPS bearer context activation " - "(ueid="NAS_UE_ID_FMT", ebi=%d)", ctx->ueid, ebi); - rc = _default_eps_bearer_activate(ctx, ebi, msg); - } else { - LOG_TRACE(INFO,"ESM-PROC - Initiate non standalone default EPS bearer context activation " - "(ueid="NAS_UE_ID_FMT", ebi=%d)", ctx->ueid, ebi); - } - - if (rc != RETURNerror) { - /* Set the EPS bearer context state to ACTIVE PENDING */ - rc = esm_ebr_set_status(ctx, ebi, ESM_EBR_ACTIVE_PENDING, ue_triggered); - - if (rc != RETURNok) { - /* The EPS bearer context was already in ACTIVE PENDING state */ - LOG_TRACE(WARNING, "ESM-PROC - EBI %d was already ACTIVE PENDING", - ebi); - } - } - - LOG_FUNC_RETURN (rc); -} - -/**************************************************************************** - ** ** - ** Name: esm_proc_default_eps_bearer_context_accept() ** - ** ** - ** Description: Performs default EPS bearer context activation procedure ** - ** accepted by the UE. ** - ** ** - ** 3GPP TS 24.301, section 6.4.1.3 ** - ** Upon receipt of the ACTIVATE DEFAULT EPS BEARER CONTEXT ** - ** ACCEPT message, the MME shall enter the state BEARER CON- ** - ** TEXT ACTIVE and stop the timer T3485, if it is running. ** - ** ** - ** Inputs: ueid: UE local identifier ** - ** ebi: EPS bearer identity ** - ** Others: None ** - ** ** - ** Outputs: esm_cause: Cause code returned upon ESM procedure ** - ** failure ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int esm_proc_default_eps_bearer_context_accept(emm_data_context_t *ctx, int ebi, - int *esm_cause) -{ - LOG_FUNC_IN; - - int rc; - - LOG_TRACE(INFO, "ESM-PROC - Default EPS bearer context activation " - "accepted by the UE (ueid="NAS_UE_ID_FMT", ebi=%d)", ctx->ueid, ebi); - - /* Stop T3485 timer if running */ - rc = esm_ebr_stop_timer(ctx, ebi); - - if (rc != RETURNerror) { - /* Set the EPS bearer context state to ACTIVE */ - rc = esm_ebr_set_status(ctx, ebi, ESM_EBR_ACTIVE, FALSE); - - if (rc != RETURNok) { - /* The EPS bearer context was already in ACTIVE state */ - LOG_TRACE(WARNING, "ESM-PROC - EBI %d was already ACTIVE", ebi); - *esm_cause = ESM_CAUSE_PROTOCOL_ERROR; - } - } - - LOG_FUNC_RETURN (rc); -} - -/**************************************************************************** - ** ** - ** Name: esm_proc_default_eps_bearer_context_reject() ** - ** ** - ** Description: Performs default EPS bearer context activation procedure ** - ** not accepted by the UE. ** - ** ** - ** 3GPP TS 24.301, section 6.4.1.4 ** - ** Upon receipt of the ACTIVATE DEFAULT EPS BEARER CONTEXT ** - ** REJECT message, the MME shall enter the state BEARER CON- ** - ** TEXT INACTIVE and stop the timer T3485, if it is running. ** - ** ** - ** Inputs: ueid: UE local identifier ** - ** ebi: EPS bearer identity ** - ** Others: None ** - ** ** - ** Outputs: esm_cause: Cause code returned upon ESM procedure ** - ** failure ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int esm_proc_default_eps_bearer_context_reject(emm_data_context_t *ctx, int ebi, - int *esm_cause) -{ - LOG_FUNC_IN; - - int rc; - - LOG_TRACE(WARNING, "ESM-PROC - Default EPS bearer context activation " - "not accepted by the UE (ueid="NAS_UE_ID_FMT", ebi=%d)", ctx->ueid, ebi); - - /* Stop T3485 timer if running */ - rc = esm_ebr_stop_timer(ctx, ebi); - - if (rc != RETURNerror) { - int pid, bid; - /* Release the default EPS bearer context and enter state INACTIVE */ - rc = esm_proc_eps_bearer_context_deactivate(ctx, TRUE, ebi, - &pid, &bid, NULL); - - if (rc != RETURNok) { - /* Failed to release the default EPS bearer context */ - *esm_cause = ESM_CAUSE_PROTOCOL_ERROR; - } - } - - LOG_FUNC_RETURN (rc); -} - -/**************************************************************************** - ** ** - ** Name: esm_proc_default_eps_bearer_context_failure() ** - ** ** - ** Description: Performs default EPS bearer context activation procedure ** - ** upon receiving notification from the EPS Mobility Manage- ** - ** ment sublayer that EMM procedure that initiated EPS de- ** - ** fault bearer context activation locally failed. ** - ** ** - ** The MME releases the default EPS bearer context previous- ** - ** ly allocated when ACTIVATE DEFAULT EPS BEARER CONTEXT RE- ** - ** QUEST message was received. ** - ** ** - ** Inputs: ueid: UE local identifier ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: The identifier of the PDN connection the ** - ** default EPS bearer context belongs to if ** - ** successfully released; ** - ** RETURNerror otherwise. ** - ** Others: None ** - ** ** - ***************************************************************************/ -int esm_proc_default_eps_bearer_context_failure(emm_data_context_t *ctx) -{ - int rc = RETURNerror; - int pid; - - LOG_FUNC_IN; - - LOG_TRACE(WARNING, "ESM-PROC - Default EPS bearer context activation " - "failure (ueid="NAS_UE_ID_FMT")", ctx->ueid); - - /* Get the EPS bearer identity of the EPS bearer context which is still - * pending in the active pending state */ - int ebi = esm_ebr_get_pending_ebi(ctx, ESM_EBR_ACTIVE_PENDING); - - if (ebi != ESM_EBI_UNASSIGNED) { - int bid; - /* Release the default EPS bearer context and enter state INACTIVE */ - rc = esm_proc_eps_bearer_context_deactivate(ctx, TRUE, ebi, - &pid, &bid, NULL); - } - - if (rc != RETURNerror) { - LOG_FUNC_RETURN (pid); - } - - LOG_FUNC_RETURN (RETURNerror); -} - - - -/****************************************************************************/ -/********************* L O C A L F U N C T I O N S *********************/ -/****************************************************************************/ - -/* - * -------------------------------------------------------------------------- - * Timer handlers - * -------------------------------------------------------------------------- - */ -/**************************************************************************** - ** ** - ** Name: _default_eps_bearer_activate_t3485_handler() ** - ** ** - ** Description: T3485 timeout handler ** - ** ** - ** 3GPP TS 24.301, section 6.4.1.6, case a ** - ** On the first expiry of the timer T3485, the MME shall re- ** - ** send the ACTIVATE DEFAULT EPS BEARER CONTEXT REQUEST and ** - ** shall reset and restart timer T3485. This retransmission ** - ** is repeated four times, i.e. on the fifth expiry of timer ** - ** T3485, the MME shall release possibly allocated resources ** - ** for this activation and shall abort the procedure. ** - ** ** - ** Inputs: args: handler parameters ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: None ** - ** Others: None ** - ** ** - ***************************************************************************/ -static void *_default_eps_bearer_activate_t3485_handler(void *args) -{ - LOG_FUNC_IN; - - int rc; - - /* Get retransmission timer parameters data */ - esm_ebr_timer_data_t *data = (esm_ebr_timer_data_t *)(args); - - /* Increment the retransmission counter */ - data->count += 1; - - LOG_TRACE(WARNING, "ESM-PROC - T3485 timer expired (ueid="NAS_UE_ID_FMT", ebi=%d), " - "retransmission counter = %d", - data->ueid, data->ebi, data->count); - - if (data->count < DEFAULT_EPS_BEARER_ACTIVATE_COUNTER_MAX) { - /* Re-send activate default EPS bearer context request message - * to the UE */ - rc = _default_eps_bearer_activate(data->ctx, data->ebi, &data->msg); - } else { - /* - * The maximum number of activate default EPS bearer context request - * message retransmission has exceed - */ - int pid, bid; - /* Release the default EPS bearer context and enter state INACTIVE */ - rc = esm_proc_eps_bearer_context_deactivate(data->ctx, TRUE, - data->ebi, &pid, &bid, - NULL); - - if (rc != RETURNerror) { - /* Stop timer T3485 */ - rc = esm_ebr_stop_timer(data->ctx, data->ebi); - } - } - - LOG_FUNC_RETURN (NULL); -} - -/* - * -------------------------------------------------------------------------- - * MME specific local functions - * -------------------------------------------------------------------------- - */ - -/**************************************************************************** - ** ** - ** Name: _default_eps_bearer_activate() ** - ** ** - ** Description: Sends ACTIVATE DEFAULT EPS BEREAR CONTEXT REQUEST message ** - ** and starts timer T3485 ** - ** ** - ** Inputs: ueid: UE local identifier ** - ** ebi: EPS bearer identity ** - ** msg: Encoded ESM message to be sent ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: T3485 ** - ** ** - ***************************************************************************/ -static int _default_eps_bearer_activate(emm_data_context_t *ctx, int ebi, - const OctetString *msg) -{ - LOG_FUNC_IN; - - emm_sap_t emm_sap; - int rc; - - /* - * Notify EMM that an activate default EPS bearer context request message - * has to be sent to the UE - */ - emm_esm_data_t *emm_esm = &emm_sap.u.emm_esm.u.data; - emm_sap.primitive = EMMESM_UNITDATA_REQ; - emm_sap.u.emm_esm.ueid = ctx->ueid; - emm_sap.u.emm_esm.ctx = ctx; - emm_esm->msg = *msg; - rc = emm_sap_send(&emm_sap); - - if (rc != RETURNerror) { - /* Start T3485 retransmission timer */ - rc = esm_ebr_start_timer(ctx, ebi, msg, T3485_DEFAULT_VALUE, - _default_eps_bearer_activate_t3485_handler); - } - - LOG_FUNC_RETURN (rc); -} diff --git a/openair-cn/NAS/MME/ESM/EpsBearerContextDeactivation.c b/openair-cn/NAS/MME/ESM/EpsBearerContextDeactivation.c deleted file mode 100644 index b26240a848..0000000000 --- a/openair-cn/NAS/MME/ESM/EpsBearerContextDeactivation.c +++ /dev/null @@ -1,483 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source EpsBearerContextDeactivation.c - -Version 0.1 - -Date 2013/05/22 - -Product NAS stack - -Subsystem EPS Session Management - -Author Frederic Maurel - -Description Defines the EPS bearer context deactivation ESM procedure - executed by the Non-Access Stratum. - - The purpose of the EPS bearer context deactivation procedure - is to deactivate an EPS bearer context or disconnect from a - PDN by deactivating all EPS bearer contexts to the PDN. - The EPS bearer context deactivation procedure is initiated - by the network, and it may be triggered by the UE by means - of the UE requested bearer resource modification procedure - or UE requested PDN disconnect procedure. - -*****************************************************************************/ - -#include "esm_proc.h" -#include "commonDef.h" -#include "nas_log.h" - -#include "emmData.h" -#include "esmData.h" -#include "esm_cause.h" -#include "esm_ebr.h" -#include "esm_ebr_context.h" - -#include "emm_sap.h" -#include "esm_sap.h" - -/****************************************************************************/ -/**************** E X T E R N A L D E F I N I T I O N S ****************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************* L O C A L D E F I N I T I O N S *******************/ -/****************************************************************************/ - - - -/* - * -------------------------------------------------------------------------- - * Internal data handled by the EPS bearer context deactivation procedure - * in the MME - * -------------------------------------------------------------------------- - */ -/* - * Timer handlers - */ -static void *_eps_bearer_deactivate_t3495_handler(void *); - -/* Maximum value of the deactivate EPS bearer context request - * retransmission counter */ -#define EPS_BEARER_DEACTIVATE_COUNTER_MAX 5 - -static int _eps_bearer_deactivate(emm_data_context_t *ctx, int ebi, - const OctetString *msg); -static int _eps_bearer_release(emm_data_context_t *ctx, int ebi, int *pid, int *bid); - - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -/* - * -------------------------------------------------------------------------- - * EPS bearer context deactivation procedure executed by the MME - * -------------------------------------------------------------------------- - */ -/**************************************************************************** - ** ** - ** Name: esm_proc_eps_bearer_context_deactivate() ** - ** ** - ** Description: Locally releases the EPS bearer context identified by the ** - ** given EPS bearer identity, without peer-to-peer signal- ** - ** ling between the UE and the MME, or checks whether an EPS ** - ** bearer context with specified EPS bearer identity has ** - ** been activated for the given UE. ** - ** ** - ** Inputs: ueid: UE lower layer identifier ** - ** is local: TRUE if the EPS bearer context has to be ** - ** locally released without peer-to-peer si- ** - ** gnalling between the UE and the MME ** - ** ebi: EPS bearer identity of the EPS bearer con- ** - ** text to be deactivated ** - ** Others: _esm_data ** - ** ** - ** Outputs: pid: Identifier of the PDN connection the EPS ** - ** bearer belongs to ** - ** bid: Identifier of the released EPS bearer con- ** - ** text entry ** - ** esm_cause: Cause code returned upon ESM procedure ** - ** failure ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int esm_proc_eps_bearer_context_deactivate(emm_data_context_t *ctx, int is_local, - int ebi, int *pid, int *bid, - int *esm_cause) -{ - int rc = RETURNerror; - - LOG_FUNC_IN; - - if (is_local) { - if (ebi != ESM_SAP_ALL_EBI) { - /* Locally release the specified EPS bearer context */ - rc = _eps_bearer_release(ctx, ebi, pid, bid); - } else if (ctx != NULL) { - /* Locally release all the EPS bearer contexts */ - *bid = 0; - - for (*pid = 0; *pid < ESM_DATA_PDN_MAX; (*pid)++) { - if (ctx->esm_data_ctx.pdn[*pid].data) { - rc = _eps_bearer_release(ctx, ESM_EBI_UNASSIGNED, - pid, bid); - - if (rc != RETURNok) { - break; - } - } - } - } - - LOG_FUNC_RETURN (rc); - } - - LOG_TRACE(INFO, "ESM-PROC - EPS bearer context deactivation " - "(ueid="NAS_UE_ID_FMT", ebi=%d)", ctx->ueid, ebi); - - if ((ctx != NULL) && - (*pid < ESM_DATA_PDN_MAX) ) { - if (ctx->esm_data_ctx.pdn[*pid].pid != *pid) { - LOG_TRACE(ERROR, "ESM-PROC - PDN connection identifier %d " - "is not valid", *pid); - *esm_cause = ESM_CAUSE_PROTOCOL_ERROR; - } else if (ctx->esm_data_ctx.pdn[*pid].data == NULL) { - LOG_TRACE(ERROR, "ESM-PROC - PDN connection %d has not been " - "allocated", *pid); - *esm_cause = ESM_CAUSE_PROTOCOL_ERROR; - } else if (!ctx->esm_data_ctx.pdn[*pid].is_active) { - LOG_TRACE(WARNING, "ESM-PROC - PDN connection %d is not active", - *pid); - *esm_cause = ESM_CAUSE_PROTOCOL_ERROR; - } else { - int i; - esm_pdn_t *pdn = ctx->esm_data_ctx.pdn[*pid].data; - - *esm_cause = ESM_CAUSE_INVALID_EPS_BEARER_IDENTITY; - - for (i = 0; i < pdn->n_bearers; i++) { - if (pdn->bearer[i]->ebi != ebi) { - continue; - } - - /* The EPS bearer context to be released is valid */ - rc = RETURNok; - } - } - } - - LOG_FUNC_RETURN (rc); -} - -/**************************************************************************** - ** ** - ** Name: esm_proc_eps_bearer_context_deactivate_request() ** - ** ** - ** Description: Initiates the EPS bearer context deactivation procedure ** - ** ** - ** 3GPP TS 24.301, section 6.4.4.2 ** - ** If a NAS signalling connection exists, the MME initiates ** - ** the EPS bearer context deactivation procedure by sending ** - ** a DEACTIVATE EPS BEARER CONTEXT REQUEST message to the ** - ** UE, starting timer T3495 and entering state BEARER CON- ** - ** TEXT INACTIVE PENDING. ** - ** ** - ** Inputs: is_standalone: Not used - Always TRUE ** - ** ueid: UE lower layer identifier ** - ** ebi: EPS bearer identity ** - ** msg: Encoded ESM message to be sent ** - ** ue_triggered: TRUE if the EPS bearer context procedure ** - ** was triggered by the UE (not used) ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int esm_proc_eps_bearer_context_deactivate_request(int is_standalone, - emm_data_context_t *ctx, int ebi, - OctetString *msg, int ue_triggered) -{ - LOG_FUNC_IN; - - int rc; - - LOG_TRACE(INFO,"ESM-PROC - Initiate EPS bearer context deactivation " - "(ueid="NAS_UE_ID_FMT", ebi=%d)", ctx->ueid, ebi); - - /* Send deactivate EPS bearer context request message and - * start timer T3495 */ - rc = _eps_bearer_deactivate(ctx, ebi, msg); - - if (rc != RETURNerror) { - /* Set the EPS bearer context state to ACTIVE PENDING */ - rc = esm_ebr_set_status(ctx, ebi, ESM_EBR_INACTIVE_PENDING, - ue_triggered); - - if (rc != RETURNok) { - /* The EPS bearer context was already in ACTIVE state */ - LOG_TRACE(WARNING, "ESM-PROC - EBI %d was already INACTIVE PENDING", - ebi); - } - } - - LOG_FUNC_RETURN (rc); -} - -/**************************************************************************** - ** ** - ** Name: esm_proc_eps_bearer_context_deactivate_accept() ** - ** ** - ** Description: Performs EPS bearer context deactivation procedure accep- ** - ** ted by the UE. ** - ** ** - ** 3GPP TS 24.301, section 6.4.4.3 ** - ** Upon receipt of the DEACTIVATE EPS BEARER CONTEXT ACCEPT ** - ** message, the MME shall enter the state BEARER CONTEXT ** - ** INACTIVE and stop the timer T3495. ** - ** ** - ** Inputs: ueid: UE local identifier ** - ** ebi: EPS bearer identity ** - ** Others: None ** - ** ** - ** Outputs: esm_cause: Cause code returned upon ESM procedure ** - ** failure ** - ** Return: The identifier of the PDN connection to be ** - ** released, if it exists; ** - ** RETURNerror otherwise. ** - ** Others: T3495 ** - ** ** - ***************************************************************************/ -int esm_proc_eps_bearer_context_deactivate_accept(emm_data_context_t *ctx, int ebi, - int *esm_cause) -{ - LOG_FUNC_IN; - - int rc; - int pid = RETURNerror; - - LOG_TRACE(INFO, "ESM-PROC - EPS bearer context deactivation " - "accepted by the UE (ueid="NAS_UE_ID_FMT", ebi=%d)", ctx->ueid, ebi); - - /* Stop T3495 timer if running */ - rc = esm_ebr_stop_timer(ctx, ebi); - - if (rc != RETURNerror) { - int bid; - /* Release the EPS bearer context */ - rc = _eps_bearer_release(ctx, ebi, &pid, &bid); - - if (rc != RETURNok) { - /* Failed to release the EPS bearer context */ - *esm_cause = ESM_CAUSE_PROTOCOL_ERROR; - pid = RETURNerror; - } - } - - LOG_FUNC_RETURN (pid); -} - - - -/****************************************************************************/ -/********************* L O C A L F U N C T I O N S *********************/ -/****************************************************************************/ - -/* - * -------------------------------------------------------------------------- - * Timer handlers - * -------------------------------------------------------------------------- - */ -/**************************************************************************** - ** ** - ** Name: _eps_bearer_deactivate_t3495_handler() ** - ** ** - ** Description: T3495 timeout handler ** - ** ** - ** 3GPP TS 24.301, section 6.4.4.5, case a ** - ** On the first expiry of the timer T3495, the MME shall re- ** - ** send the DEACTIVATE EPS BEARER CONTEXT REQUEST and shall ** - ** reset and restart timer T3495. This retransmission is ** - ** repeated four times, i.e. on the fifth expiry of timer ** - ** T3495, the MME shall abort the procedure and deactivate ** - ** the EPS bearer context locally. ** - ** ** - ** Inputs: args: handler parameters ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: None ** - ** Others: None ** - ** ** - ***************************************************************************/ -static void *_eps_bearer_deactivate_t3495_handler(void *args) -{ - LOG_FUNC_IN; - - int rc; - - /* Get retransmission timer parameters data */ - esm_ebr_timer_data_t *data = (esm_ebr_timer_data_t *)(args); - - /* Increment the retransmission counter */ - data->count += 1; - - LOG_TRACE(WARNING, "ESM-PROC - T3495 timer expired (ueid="NAS_UE_ID_FMT", ebi=%d), " - "retransmission counter = %d", - data->ueid, data->ebi, data->count); - - if (data->count < EPS_BEARER_DEACTIVATE_COUNTER_MAX) { - /* Re-send deactivate EPS bearer context request message to the UE */ - rc = _eps_bearer_deactivate(data->ctx, data->ebi, &data->msg); - } else { - /* - * The maximum number of deactivate EPS bearer context request - * message retransmission has exceed - */ - int pid, bid; - /* Deactivate the EPS bearer context locally without peer-to-peer - * signalling between the UE and the MME */ - rc = _eps_bearer_release(data->ctx, data->ebi, &pid, &bid); - - if (rc != RETURNerror) { - /* Stop timer T3495 */ - rc = esm_ebr_stop_timer(data->ctx, data->ebi); - } - } - - LOG_FUNC_RETURN (NULL); -} - -/* - * -------------------------------------------------------------------------- - * MME specific local functions - * -------------------------------------------------------------------------- - */ - -/**************************************************************************** - ** ** - ** Name: _eps_bearer_deactivate() ** - ** ** - ** Description: Sends DEACTIVATE EPS BEREAR CONTEXT REQUEST message and ** - ** starts timer T3495 ** - ** ** - ** Inputs: ueid: UE local identifier ** - ** ebi: EPS bearer identity ** - ** msg: Encoded ESM message to be sent ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: T3495 ** - ** ** - ***************************************************************************/ -static int _eps_bearer_deactivate(emm_data_context_t *ctx, int ebi, - const OctetString *msg) -{ - LOG_FUNC_IN; - - emm_sap_t emm_sap; - int rc; - - /* - * Notify EMM that a deactivate EPS bearer context request message - * has to be sent to the UE - */ - emm_esm_data_t *emm_esm = &emm_sap.u.emm_esm.u.data; - emm_sap.primitive = EMMESM_UNITDATA_REQ; - emm_sap.u.emm_esm.ueid = ctx->ueid; - emm_sap.u.emm_esm.ctx = ctx; - emm_esm->msg = *msg; - rc = emm_sap_send(&emm_sap); - - if (rc != RETURNerror) { - /* Start T3495 retransmission timer */ - rc = esm_ebr_start_timer(ctx, ebi, msg, T3495_DEFAULT_VALUE, - _eps_bearer_deactivate_t3495_handler); - } - - LOG_FUNC_RETURN (rc); -} - -/**************************************************************************** - ** ** - ** Name: _eps_bearer_release() ** - ** ** - ** Description: Releases the EPS bearer context identified by the given ** - ** EPS bearer identity and enters state INACTIVE. ** - ** ** - ** Inputs: ueid: UE local identifier ** - ** ebi: EPS bearer identity ** - ** Others: None ** - ** ** - ** Outputs: pid: Identifier of the PDN connection the EPS ** - ** bearer belongs to ** - ** bid: Identifier of the released EPS bearer con- ** - ** text entry ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -static int _eps_bearer_release(emm_data_context_t *ctx, int ebi, int *pid, int *bid) -{ - LOG_FUNC_IN; - - int rc = RETURNerror; - - /* Release the EPS bearer context entry */ - ebi = esm_ebr_context_release(ctx, ebi, pid, bid); - - if (ebi == ESM_EBI_UNASSIGNED) { - LOG_TRACE(WARNING, "ESM-PROC - Failed to release EPS bearer context"); - } else { - /* Set the EPS bearer context state to INACTIVE */ - rc = esm_ebr_set_status(ctx, ebi, ESM_EBR_INACTIVE, FALSE); - - if (rc != RETURNok) { - /* The EPS bearer context was already in INACTIVE state */ - LOG_TRACE(WARNING, "ESM-PROC - EBI %d was already INACTIVE", ebi); - } else { - /* Release EPS bearer data */ - rc = esm_ebr_release(ctx, ebi); - - if (rc != RETURNok) { - LOG_TRACE(WARNING, - "ESM-PROC - Failed to release EPS bearer data"); - } - } - } - - LOG_FUNC_RETURN (rc); -} - diff --git a/openair-cn/NAS/MME/ESM/EsmStatusHdl.c b/openair-cn/NAS/MME/ESM/EsmStatusHdl.c deleted file mode 100644 index 6edada9f0c..0000000000 --- a/openair-cn/NAS/MME/ESM/EsmStatusHdl.c +++ /dev/null @@ -1,199 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source EsmStatus.c - -Version 0.1 - -Date 2013/06/17 - -Product NAS stack - -Subsystem EPS Session Management - -Author Frederic Maurel - -Description Defines the ESM status procedure executed by the Non-Access - Stratum. - - ESM status procedure can be related to an EPS bearer context - or to a procedure transaction. - - The purpose of the sending of the ESM STATUS message is to - report at any time certain error conditions detected upon - receipt of ESM protocol data. The ESM STATUS message can be - sent by both the MME and the UE. - -*****************************************************************************/ - -#include "esm_proc.h" -#include "commonDef.h" -#include "nas_log.h" - -#include "esm_cause.h" - -#include "emm_sap.h" - -/****************************************************************************/ -/**************** E X T E R N A L D E F I N I T I O N S ****************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************* L O C A L D E F I N I T I O N S *******************/ -/****************************************************************************/ - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -/**************************************************************************** - ** ** - ** Name: esm_proc_status_ind() ** - ** ** - ** Description: Processes received ESM status message. ** - ** ** - ** 3GPP TS 24.301, section 6.7 ** - ** Upon receiving ESM Status message the UE/MME shall take ** - ** different actions depending on the received ESM cause ** - ** value. ** - ** ** - ** Inputs: ueid: UE lower layer identifier ** - ** pti: Procedure transaction identity ** - ** ebi: EPS bearer identity ** - ** esm_cause: Received ESM cause code ** - ** failure ** - ** Others: None ** - ** ** - ** Outputs: esm_cause: Cause code returned upon ESM procedure ** - ** failure ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int esm_proc_status_ind( - emm_data_context_t *ctx, - int pti, int ebi, int *esm_cause) -{ - LOG_FUNC_IN; - - int rc; - - LOG_TRACE(INFO,"ESM-PROC - ESM status procedure requested (cause=%d)", - *esm_cause); - - LOG_TRACE(DEBUG, "ESM-PROC - To be implemented"); - - switch (*esm_cause) { - case ESM_CAUSE_INVALID_EPS_BEARER_IDENTITY: - /* - * Abort any ongoing ESM procedure related to the received EPS - * bearer identity, stop any related timer, and deactivate the - * corresponding EPS bearer context locally - */ - /* TODO */ - rc = RETURNok; - break; - - case ESM_CAUSE_INVALID_PTI_VALUE: - /* - * Abort any ongoing ESM procedure related to the received PTI - * value and stop any related timer - */ - /* TODO */ - rc = RETURNok; - break; - - case ESM_CAUSE_MESSAGE_TYPE_NOT_IMPLEMENTED: - /* - * Abort any ongoing ESM procedure related to the PTI or - * EPS bearer identity and stop any related timer - */ - /* TODO */ - rc = RETURNok; - break; - - default: - /* - * No state transition and no specific action shall be taken; - * local actions are possible - */ - /* TODO */ - rc = RETURNok; - break; - } - - LOG_FUNC_RETURN (rc); -} - -/**************************************************************************** - ** ** - ** Name: esm_proc_status() ** - ** ** - ** Description: Initiates ESM status procedure. ** - ** ** - ** Inputs: is_standalone: Not used - Always TRUE ** - ** ueid: UE lower layer identifier ** - ** ebi: Not used ** - ** msg: Encoded ESM status message to be sent ** - ** ue_triggered: Not used ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int esm_proc_status(int is_standalone, - emm_data_context_t *ctx, - int ebi, OctetString *msg, - int ue_triggered) -{ - LOG_FUNC_IN; - - int rc; - emm_sap_t emm_sap; - - LOG_TRACE(INFO,"ESM-PROC - ESM status procedure requested"); - - /* - * Notity EMM that ESM PDU has to be forwarded to lower layers - */ - emm_sap.primitive = EMMESM_UNITDATA_REQ; - emm_sap.u.emm_esm.ueid = ctx->ueid; - emm_sap.u.emm_esm.ctx = ctx; - emm_sap.u.emm_esm.u.data.msg.length = msg->length; - emm_sap.u.emm_esm.u.data.msg.value = msg->value; - rc = emm_sap_send(&emm_sap); - - LOG_FUNC_RETURN (rc); -} - -/****************************************************************************/ -/********************* L O C A L F U N C T I O N S *********************/ -/****************************************************************************/ diff --git a/openair-cn/NAS/MME/ESM/Makefile b/openair-cn/NAS/MME/ESM/Makefile deleted file mode 100644 index eda83656ac..0000000000 --- a/openair-cn/NAS/MME/ESM/Makefile +++ /dev/null @@ -1,59 +0,0 @@ -################################################################################ -# 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@eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ -ifndef PROJDIR -PROJDIR = $(PWD)/../.. -endif - -include $(PROJDIR)/Makerules -include $(PROJDIR)/Makefile.inc - -INCLUDES = -I. -I$(INCDIR) -I$(UTILDIR) -I$(IESDIR) -I$(MMEAPIDIR) \ - -I$(EMMSAPDIR) -I$(ESMSAPDIR) -I$(ESMMSGDIR) -I$(EMMDIR) - -all: $(OBJS) - @$(CD) $(ESMMSGDIR) && $(MAKE) - @$(CD) $(ESMSAPDIR) && $(MAKE) - -clean: - $(RM) $(OBJS) *.bak *~ - @$(CD) $(ESMSAPDIR) && $(MAKE) $@ - -veryclean: clean - @$(CD) $(ESMSAPDIR) && $(MAKE) $@ - @$(CD) $(ESMMSGDIR) && $(MAKE) $@ - $(RM) $(TARGET) - -%.o: %.c Makefile $(PROJDIR)/Makerules $(PROJDIR)/Makefile.inc - @echo Compiling $< - @$(CC) $(CFLAGS) -c $< -o $@ - -depend: - makedepend -- ${CFLAGS} -- ${SRCS} - -# DO NOT DELETE THIS LINE -- make depend depends on it. diff --git a/openair-cn/NAS/MME/ESM/PdnConnectivity.c b/openair-cn/NAS/MME/ESM/PdnConnectivity.c deleted file mode 100644 index e2eda77bed..0000000000 --- a/openair-cn/NAS/MME/ESM/PdnConnectivity.c +++ /dev/null @@ -1,556 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source PdnConnectivity.c - -Version 0.1 - -Date 2013/01/02 - -Product NAS stack - -Subsystem EPS Session Management - -Author Frederic Maurel - -Description Defines the PDN connectivity ESM procedure executed by the - Non-Access Stratum. - - The PDN connectivity procedure is used by the UE to request - the setup of a default EPS bearer to a PDN. - - The procedure is used either to establish the 1st default - bearer by including the PDN CONNECTIVITY REQUEST message - into the initial attach message, or to establish subsequent - default bearers to additional PDNs in order to allow the UE - simultaneous access to multiple PDNs by sending the message - stand-alone. - -*****************************************************************************/ - -#include <stdlib.h> // malloc, free -#include <string.h> // memset, memcpy, memcmp -#include <ctype.h> // isprint - -#include "esm_proc.h" -#include "commonDef.h" -#include "nas_log.h" - -#include "esmData.h" -#include "esm_cause.h" -#include "esm_pt.h" - -# include "mme_api.h" - -#include "emm_sap.h" - -#if defined(ENABLE_ITTI) -# include "assertions.h" -#endif - -/****************************************************************************/ -/**************** E X T E R N A L D E F I N I T I O N S ****************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************* L O C A L D E F I N I T I O N S *******************/ -/****************************************************************************/ - - - -/* - * -------------------------------------------------------------------------- - * Internal data handled by the PDN connectivity procedure in the MME - * -------------------------------------------------------------------------- - */ -/* - * PDN connection handlers - */ -static int _pdn_connectivity_create(emm_data_context_t *ctx, - int pti, - const OctetString *apn, - esm_proc_pdn_type_t pdn_type, - const OctetString *pdn_addr, - int is_emergency); -int _pdn_connectivity_delete(emm_data_context_t *ctx, int pid); - - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - - -/* - * -------------------------------------------------------------------------- - * PDN connectivity procedure executed by the MME - * -------------------------------------------------------------------------- - */ -/**************************************************************************** - ** ** - ** Name: esm_proc_pdn_connectivity_request() ** - ** ** - ** Description: Performs PDN connectivity procedure requested by the UE. ** - ** ** - ** 3GPP TS 24.301, section 6.5.1.3 ** - ** Upon receipt of the PDN CONNECTIVITY REQUEST message, the ** - ** MME checks if connectivity with the requested PDN can be ** - ** established. If no requested APN is provided the MME ** - ** shall use the default APN as the requested APN if the ** - ** request type is different from "emergency", or the APN ** - ** configured for emergency bearer services if the request ** - ** type is "emergency". ** - ** If connectivity with the requested PDN is accepted by the ** - ** network, the MME shall initiate the default EPS bearer ** - ** context activation procedure. ** - ** ** - ** Inputs: ueid: UE local identifier ** - ** pti: Identifies the PDN connectivity procedure ** - ** requested by the UE ** - ** request_type: Type of the PDN request ** - ** pdn_type: PDN type value (IPv4, IPv6, IPv4v6) ** - ** apn: Requested Access Point Name ** - ** Others: _esm_data ** - ** ** - ** Outputs: apn: Default Access Point Name ** - ** pdn_addr: Assigned IPv4 address and/or IPv6 suffix ** - ** esm_qos: EPS bearer level QoS parameters ** - ** esm_cause: Cause code returned upon ESM procedure ** - ** failure ** - ** Return: The identifier of the PDN connection if ** - ** successfully created; ** - ** RETURNerror otherwise. ** - ** Others: _esm_data ** - ** ** - ***************************************************************************/ -int esm_proc_pdn_connectivity_request(emm_data_context_t *ctx, int pti, - esm_proc_pdn_request_t request_type, - OctetString *apn, - esm_proc_pdn_type_t pdn_type, - OctetString *pdn_addr, - esm_proc_qos_t *esm_qos, - int *esm_cause) -{ - int rc = RETURNerror; - int pid = RETURNerror; - - LOG_FUNC_IN; - - LOG_TRACE(INFO, "ESM-PROC - PDN connectivity requested by the UE " - "(ueid="NAS_UE_ID_FMT", pti=%d) PDN type = %s, APN = %s pdn addr = %s", ctx->ueid, pti, - (pdn_type == ESM_PDN_TYPE_IPV4)? "IPv4" : - (pdn_type == ESM_PDN_TYPE_IPV6)? "IPv6" : "IPv4v6", - (apn) ? (char *)(apn->value) : "null", - (pdn_addr) ? (char *)(pdn_addr->value) : "null"); - -#if !defined(NAS_BUILT_IN_EPC) - - /* UE identifier sanity check */ - if (ctx->ueid >= ESM_DATA_NB_UE_MAX) { - LOG_TRACE(WARNING, "ESM-PROC - Number of connected UEs exceeded"); - LOG_FUNC_RETURN (RETURNerror); - } - -#endif - - /* - * Check network IP capabilities - */ - *esm_cause = ESM_CAUSE_SUCCESS; - LOG_TRACE(INFO, "ESM-PROC - _esm_data.conf.features %08x", _esm_data.conf.features); -#warning "Uncomment code about _esm_data.conf.features & (MME_API_IPV4 | MME_API_IPV6) later" -#if defined(ORIGINAL_CODE) - - switch (_esm_data.conf.features & (MME_API_IPV4 | MME_API_IPV6)) { - case (MME_API_IPV4 | MME_API_IPV6): - - /* The network supports both IPv4 and IPv6 connection */ - if ( (pdn_type == ESM_PDN_TYPE_IPV4V6) && - (_esm_data.conf.features & MME_API_SINGLE_ADDR_BEARERS) ) { - /* The network supports single IP version bearers only */ - *esm_cause = ESM_CAUSE_SINGLE_ADDRESS_BEARERS_ONLY_ALLOWED; - } - - rc = RETURNok; - break; - - case MME_API_IPV6: - /* The network supports connection to IPv6 only */ - *esm_cause = ESM_CAUSE_PDN_TYPE_IPV6_ONLY_ALLOWED; - - if (pdn_type != ESM_PDN_TYPE_IPV4) { - rc = RETURNok; - } - - break; - - case MME_API_IPV4: - /* The network supports connection to IPv4 only */ - *esm_cause = ESM_CAUSE_PDN_TYPE_IPV4_ONLY_ALLOWED; - - if (pdn_type != ESM_PDN_TYPE_IPV6) { - rc = RETURNok; - } - - break; - - default: - LOG_TRACE(ERROR, - "ESM-PROC - _esm_data.conf.features incorrect value (no IPV4 or IPV6 ) %X", - _esm_data.conf.features); - } - -#else - rc = RETURNok; -#endif - - if (rc != RETURNerror) { - int is_emergency = (request_type == ESM_PDN_REQUEST_EMERGENCY); -#if defined(ORIGINAL_CODE) - mme_api_ip_version_t mme_pdn_index; - mme_api_qos_t qos; - - switch (pdn_type) { - case ESM_PDN_TYPE_IPV4: - mme_pdn_index = MME_API_IPV4_ADDR; - break; - - case ESM_PDN_TYPE_IPV6: - mme_pdn_index = MME_API_IPV6_ADDR; - break; - - case ESM_PDN_TYPE_IPV4V6: - default: - mme_pdn_index = MME_API_IPV4V6_ADDR; - break; - } - - /* Check if connectivity with the requested PDN can be established */ - rc = mme_api_subscribe(apn, mme_pdn_index, pdn_addr, is_emergency, &qos); - - if (rc != RETURNok) { - LOG_TRACE(WARNING, "ESM-PROC - Connectivity to the requested PDN " - "cannot be established"); - *esm_cause = ESM_CAUSE_REQUEST_REJECTED_UNSPECIFIED; - LOG_FUNC_RETURN (RETURNerror); - } - -#endif - - /* Create new PDN connection */ - pid = _pdn_connectivity_create(ctx, pti, apn, pdn_type, - pdn_addr, is_emergency); -#if defined(ORIGINAL_CODE) - - /* Setup ESM QoS parameters */ - if (esm_qos) { - esm_qos->gbrUL = qos.gbr[MME_API_UPLINK]; - esm_qos->gbrDL = qos.gbr[MME_API_DOWNLINK]; - esm_qos->mbrUL = qos.mbr[MME_API_UPLINK]; - esm_qos->mbrDL = qos.mbr[MME_API_DOWNLINK]; - esm_qos->qci = qos.qci; - } - -#endif - - if (pid < 0) { - LOG_TRACE(WARNING, "ESM-PROC - Failed to create PDN connection"); - *esm_cause = ESM_CAUSE_INSUFFICIENT_RESOURCES; - LOG_FUNC_RETURN(RETURNerror); - } - } - - LOG_FUNC_RETURN(pid); -} - -/**************************************************************************** - ** ** - ** Name: esm_proc_pdn_connectivity_reject() ** - ** ** - ** Description: Performs PDN connectivity procedure not accepted by the ** - ** network. ** - ** ** - ** 3GPP TS 24.301, section 6.5.1.4 ** - ** If connectivity with the requested PDN cannot be accepted ** - ** by the network, the MME shall send a PDN CONNECTIVITY RE- ** - ** JECT message to the UE. ** - ** ** - ** Inputs: is_standalone: Indicates whether the PDN connectivity ** - ** procedure was initiated as part of the at- ** - ** tach procedure ** - ** ueid: UE lower layer identifier ** - ** ebi: Not used ** - ** msg: Encoded PDN connectivity reject message to ** - ** be sent ** - ** ue_triggered: Not used ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int esm_proc_pdn_connectivity_reject(int is_standalone, emm_data_context_t *ctx, - int ebi, OctetString *msg, int ue_triggered) -{ - LOG_FUNC_IN; - - int rc = RETURNerror; - - LOG_TRACE(WARNING, "ESM-PROC - PDN connectivity not accepted by the " - "network (ueid="NAS_UE_ID_FMT")", ctx->ueid); - - if (is_standalone) { - emm_sap_t emm_sap; - /* - * Notity EMM that ESM PDU has to be forwarded to lower layers - */ - emm_sap.primitive = EMMESM_UNITDATA_REQ; - emm_sap.u.emm_esm.ctx = ctx; - emm_sap.u.emm_esm.u.data.msg.length = msg->length; - emm_sap.u.emm_esm.u.data.msg.value = msg->value; - rc = emm_sap_send(&emm_sap); - } - - /* If the PDN connectivity procedure initiated as part of the initial - * attach procedure has failed, an error is returned to notify EMM that - * the ESM sublayer did not accept UE requested PDN connectivity */ - LOG_FUNC_RETURN (rc); -} - -/**************************************************************************** - ** ** - ** Name: esm_proc_pdn_connectivity_failure() ** - ** ** - ** Description: Performs PDN connectivity procedure upon receiving noti- ** - ** fication from the EPS Mobility Management sublayer that ** - ** EMM procedure that initiated PDN connectivity activation ** - ** locally failed. ** - ** ** - ** The MME releases the PDN connection entry allocated when ** - ** the PDN connectivity procedure was requested by the UE. ** - ** ** - ** Inputs: ueid: UE local identifier ** - ** pid: Identifier of the PDN connection to be ** - ** released ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int esm_proc_pdn_connectivity_failure(emm_data_context_t *ctx, int pid) -{ - int pti; - - LOG_FUNC_IN; - - LOG_TRACE(WARNING, "ESM-PROC - PDN connectivity failure (ueid="NAS_UE_ID_FMT", pid=%d)", - ctx->ueid, pid); - - /* Delete the PDN connection entry */ - pti = _pdn_connectivity_delete(ctx, pid); - - if (pti != ESM_PT_UNASSIGNED) { - LOG_FUNC_RETURN (RETURNok); - } - - LOG_FUNC_RETURN (RETURNerror); -} - -/****************************************************************************/ -/********************* L O C A L F U N C T I O N S *********************/ -/****************************************************************************/ - - -/* - *--------------------------------------------------------------------------- - * PDN connection handlers - *--------------------------------------------------------------------------- - */ -/**************************************************************************** - ** ** - ** Name: _pdn_connectivity_create() ** - ** ** - ** Description: Creates a new PDN connection entry for the specified UE ** - ** ** - ** Inputs: ueid: UE local identifier ** - ** ctx: UE context ** - ** pti: Procedure transaction identity ** - ** apn: Access Point Name of the PDN connection ** - ** pdn_type: PDN type (IPv4, IPv6, IPv4v6) ** - ** pdn_addr: Network allocated PDN IPv4 or IPv6 address ** - ** is_emergency: TRUE if the PDN connection has to be esta- ** - ** blished for emergency bearer services ** - ** Others: _esm_data ** - ** ** - ** Outputs: None ** - ** Return: The identifier of the PDN connection if ** - ** successfully created; -1 otherwise. ** - ** Others: _esm_data ** - ** ** - ***************************************************************************/ -static int _pdn_connectivity_create(emm_data_context_t *ctx, - int pti, - const OctetString *apn, - esm_proc_pdn_type_t pdn_type, - const OctetString *pdn_addr, - int is_emergency) -{ - int pid = ESM_DATA_PDN_MAX; - - LOG_TRACE(INFO, "ESM-PROC - Create new PDN connection " - "(pti=%d) APN = %s, IP address = %s (ueid="NAS_UE_ID_FMT")", pti, apn->value, - (pdn_type == ESM_PDN_TYPE_IPV4)? esm_data_get_ipv4_addr(pdn_addr) : - (pdn_type == ESM_PDN_TYPE_IPV6)? esm_data_get_ipv6_addr(pdn_addr) : - esm_data_get_ipv4v6_addr(pdn_addr), ctx->ueid); - - /* Search for an available PDN connection entry */ - for (pid = 0; pid < ESM_DATA_PDN_MAX; pid++) { - if (ctx->esm_data_ctx.pdn[pid].data != NULL) { - continue; - } - - break; - } - - if (pid < ESM_DATA_PDN_MAX) { - /* Create new PDN connection */ - esm_pdn_t *pdn = (esm_pdn_t *)malloc(sizeof(esm_pdn_t)); - - if (pdn != NULL) { - memset(pdn, 0, sizeof(esm_pdn_t)); - /* Increment the number of PDN connections */ - ctx->esm_data_ctx.n_pdns += 1; - /* Set the PDN connection identifier */ - ctx->esm_data_ctx.pdn[pid].pid = pid; - /* Reset the PDN connection active indicator */ - ctx->esm_data_ctx.pdn[pid].is_active = FALSE; - /* Setup the PDN connection data */ - ctx->esm_data_ctx.pdn[pid].data = pdn; - - /* Set the procedure transaction identity */ - pdn->pti = pti; - /* Set the emergency bearer services indicator */ - pdn->is_emergency = is_emergency; - - /* Setup the Access Point Name */ - if ( apn && (apn->length > 0) ) { - pdn->apn.value = (uint8_t *)malloc(apn->length + 1); - - if (pdn->apn.value) { - pdn->apn.length = apn->length; - memcpy(pdn->apn.value, apn->value, apn->length); - pdn->apn.value[pdn->apn.length] = '\0'; - } - } - - /* Setup the IP address allocated by the network */ - if ( pdn_addr && (pdn_addr->length > 0) ) { - int length = - ((pdn_addr->length < ESM_DATA_IP_ADDRESS_SIZE) ? - pdn_addr->length : ESM_DATA_IP_ADDRESS_SIZE); - memcpy(pdn->ip_addr, pdn_addr->value, length); - pdn->type = pdn_type; - } - - /* Return the identifier of the new PDN connection */ - return (ctx->esm_data_ctx.pdn[pid].pid); - } - - LOG_TRACE(WARNING, "ESM-PROC - Failed to create new PDN connection " - "(pid=%d)", pid); - } - - return (-1); -} - -/**************************************************************************** - ** ** - ** Name: _pdn_connectivity_delete() ** - ** ** - ** Description: Deletes PDN connection to the specified UE associated to ** - ** PDN connection entry with given identifier ** - ** ** - ** Inputs: ueid: UE local identifier ** - ** pid: Identifier of the PDN connection to be ** - ** released ** - ** Others: _esm_data ** - ** ** - ** Outputs: None ** - ** Return: The identity of the procedure transaction ** - ** assigned to the PDN connection when suc- ** - ** cessfully released; ** - ** UNASSIGNED value otherwise. ** - ** Others: _esm_data ** - ** ** - ***************************************************************************/ -int _pdn_connectivity_delete(emm_data_context_t *ctx, int pid) -{ - int pti = ESM_PT_UNASSIGNED; - - if (ctx == NULL) { - return pti; - } - - if (pid < ESM_DATA_PDN_MAX) { - if (pid != ctx->esm_data_ctx.pdn[pid].pid) { - LOG_TRACE(ERROR, - "ESM-PROC - PDN connection identifier is not valid"); - } else if (ctx->esm_data_ctx.pdn[pid].data == NULL) { - LOG_TRACE(ERROR, - "ESM-PROC - PDN connection has not been allocated"); - } else if (ctx->esm_data_ctx.pdn[pid].is_active) { - LOG_TRACE(ERROR, "ESM-PROC - PDN connection is active"); - } else { - /* Get the identity of the procedure transaction that created - * the PDN connection */ - pti = ctx->esm_data_ctx.pdn[pid].data->pti; - } - } - - if (pti != ESM_PT_UNASSIGNED) { - /* Decrement the number of PDN connections */ - ctx->esm_data_ctx.n_pdns -= 1; - /* Set the PDN connection as available */ - ctx->esm_data_ctx.pdn[pid].pid = -1; - - /* Release allocated PDN connection data */ - if (ctx->esm_data_ctx.pdn[pid].data->apn.length > 0) { - free(ctx->esm_data_ctx.pdn[pid].data->apn.value); - } - - free(ctx->esm_data_ctx.pdn[pid].data); - ctx->esm_data_ctx.pdn[pid].data = NULL; - LOG_TRACE(WARNING, "ESM-PROC - PDN connection %d released", pid); - } - - /* Return the procedure transaction identity */ - return (pti); -} diff --git a/openair-cn/NAS/MME/ESM/PdnDisconnect.c b/openair-cn/NAS/MME/ESM/PdnDisconnect.c deleted file mode 100644 index 9dfcbd66fb..0000000000 --- a/openair-cn/NAS/MME/ESM/PdnDisconnect.c +++ /dev/null @@ -1,299 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source PdnDisconnect.c - -Version 0.1 - -Date 2013/05/15 - -Product NAS stack - -Subsystem EPS Session Management - -Author Frederic Maurel - -Description Defines the PDN disconnect ESM procedure executed by the - Non-Access Stratum. - - The PDN disconnect procedure is used by the UE to request - disconnection from one PDN. - - All EPS bearer contexts established towards this PDN, inclu- - ding the default EPS bearer context, are released. - -*****************************************************************************/ - -#include "esm_proc.h" -#include "commonDef.h" -#include "nas_log.h" - -#include "esmData.h" -#include "esm_cause.h" -#include "esm_pt.h" -#include "emm_sap.h" - -/****************************************************************************/ -/**************** E X T E R N A L D E F I N I T I O N S ****************/ -/****************************************************************************/ - -extern int _pdn_connectivity_delete(emm_data_context_t *ctx, int pid); - -/****************************************************************************/ -/******************* L O C A L D E F I N I T I O N S *******************/ -/****************************************************************************/ - - -/* - * -------------------------------------------------------------------------- - * Internal data handled by the PDN disconnect procedure in the MME - * -------------------------------------------------------------------------- - */ -/* - * PDN disconnection handlers - */ -static int _pdn_disconnect_get_pid(esm_data_context_t *ctx, int pti); - - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - - - -/* - * -------------------------------------------------------------------------- - * PDN disconnect procedure executed by the MME - * -------------------------------------------------------------------------- - */ -/**************************************************************************** - ** ** - ** Name: esm_proc_pdn_disconnect_request() ** - ** ** - ** Description: Performs PDN disconnect procedure requested by the UE. ** - ** ** - ** 3GPP TS 24.301, section 6.5.2.3 ** - ** Upon receipt of the PDN DISCONNECT REQUEST message, if it ** - ** is accepted by the network, the MME shall initiate the ** - ** bearer context deactivation procedure. ** - ** ** - ** Inputs: ueid: UE lower layer identifier ** - ** pti: Identifies the PDN disconnect procedure ** - ** requested by the UE ** - ** Others: _esm_data ** - ** ** - ** Outputs: esm_cause: Cause code returned upon ESM procedure ** - ** failure ** - ** Return: The identifier of the PDN connection to be ** - ** released, if it exists; ** - ** RETURNerror otherwise. ** - ** Others: None ** - ** ** - ***************************************************************************/ -int esm_proc_pdn_disconnect_request(emm_data_context_t *ctx, int pti, int *esm_cause) -{ - int pid = RETURNerror; - - LOG_FUNC_IN; - - LOG_TRACE(INFO, "ESM-PROC - PDN disconnect requested by the UE " - "(ueid="NAS_UE_ID_FMT", pti=%d)", ctx->ueid, pti); - - /* Get UE's ESM context */ - if (ctx->esm_data_ctx.n_pdns > 1) { - /* Get the identifier of the PDN connection entry assigned to the - * procedure transaction identity */ - pid = _pdn_disconnect_get_pid(&ctx->esm_data_ctx, pti); - - if (pid < 0) { - LOG_TRACE(ERROR, "ESM-PROC - No PDN connection found (pti=%d)", - pti); - *esm_cause = ESM_CAUSE_PROTOCOL_ERROR; - LOG_FUNC_RETURN (RETURNerror); - } - } else { - /* Attempt to disconnect from the last PDN disconnection - * is not allowed */ - *esm_cause = ESM_CAUSE_LAST_PDN_DISCONNECTION_NOT_ALLOWED; - } - - LOG_FUNC_RETURN(pid); -} - -/**************************************************************************** - ** ** - ** Name: esm_proc_pdn_disconnect_accept() ** - ** ** - ** Description: Performs PDN disconnect procedure accepted by the UE. ** - ** ** - ** 3GPP TS 24.301, section 6.5.2.3 ** - ** On reception of DEACTIVATE EPS BEARER CONTEXT ACCEPT mes- ** - ** sage from the UE, the MME releases all the resources re- ** - ** served for the PDN in the network. ** - ** ** - ** Inputs: ueid: UE lower layer identifier ** - ** pid: Identifier of the PDN connection to be ** - ** released ** - ** Others: _esm_data ** - ** ** - ** Outputs: esm_cause: Cause code returned upon ESM procedure ** - ** failure ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int esm_proc_pdn_disconnect_accept(emm_data_context_t *ctx, int pid, int *esm_cause) -{ - LOG_FUNC_IN; - - LOG_TRACE(INFO, "ESM-PROC - PDN disconnect accepted by the UE " - "(ueid="NAS_UE_ID_FMT", pid=%d)", ctx->ueid, pid); - - /* Release the connectivity with the requested PDN */ - int rc = mme_api_unsubscribe(NULL); - - if (rc != RETURNerror) { - /* Delete the PDN connection entry */ - int pti = _pdn_connectivity_delete(ctx, pid); - - if (pti != ESM_PT_UNASSIGNED) { - LOG_FUNC_RETURN (RETURNok); - } - } - - *esm_cause = ESM_CAUSE_PROTOCOL_ERROR; - LOG_FUNC_RETURN (RETURNerror); -} - -/**************************************************************************** - ** ** - ** Name: esm_proc_pdn_disconnect_reject() ** - ** ** - ** Description: Performs PDN disconnect procedure not accepted by the ** - ** network. ** - ** ** - ** 3GPP TS 24.301, section 6.5.2.4 ** - ** Upon receipt of the PDN DISCONNECT REQUEST message, if it ** - ** is not accepted by the network, the MME shall send a PDN ** - ** DISCONNECT REJECT message to the UE. ** - ** ** - ** Inputs: is_standalone: Not used - Always TRUE ** - ** ueid: UE lower layer identifier ** - ** ebi: Not used ** - ** msg: Encoded PDN disconnect reject message to ** - ** be sent ** - ** ue_triggered: Not used ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int esm_proc_pdn_disconnect_reject(int is_standalone, emm_data_context_t *ctx, - int ebi, OctetString *msg, int ue_triggered) -{ - LOG_FUNC_IN; - - int rc; - emm_sap_t emm_sap; - - LOG_TRACE(WARNING, "ESM-PROC - PDN disconnect not accepted by the network " - "(ueid="NAS_UE_ID_FMT")", ctx->ueid); - - /* - * Notity EMM that ESM PDU has to be forwarded to lower layers - */ - emm_sap.primitive = EMMESM_UNITDATA_REQ; - emm_sap.u.emm_esm.ueid = ctx->ueid; - emm_sap.u.emm_esm.ctx = ctx; - emm_sap.u.emm_esm.u.data.msg.length = msg->length; - emm_sap.u.emm_esm.u.data.msg.value = msg->value; - rc = emm_sap_send(&emm_sap); - - LOG_FUNC_RETURN(rc); -} - -/****************************************************************************/ -/********************* L O C A L F U N C T I O N S *********************/ -/****************************************************************************/ - -/* - * -------------------------------------------------------------------------- - * Timer handlers - * -------------------------------------------------------------------------- - */ - - -/* - *--------------------------------------------------------------------------- - * PDN disconnection handlers - *--------------------------------------------------------------------------- - */ - - -/**************************************************************************** - ** ** - ** Name: _pdn_disconnect_get_pid() ** - ** ** - ** Description: Returns the identifier of the PDN connection to which the ** - ** given procedure transaction identity has been assigned ** - ** to establish connectivity to the specified UE ** - ** ** - ** Inputs: ueid: UE local identifier ** - ** pti: The procedure transaction identity ** - ** Others: _esm_data ** - ** ** - ** Outputs: None ** - ** Return: The identifier of the PDN connection if ** - ** found in the list; -1 otherwise. ** - ** Others: None ** - ** ** - ***************************************************************************/ -static int _pdn_disconnect_get_pid(esm_data_context_t *ctx, int pti) -{ - int i = ESM_DATA_PDN_MAX; - - if (ctx != NULL) { - for (i = 0; i < ESM_DATA_PDN_MAX; i++) { - if ( (ctx->pdn[i].pid != -1) && - (ctx->pdn[i].data != NULL) ) { - if (ctx->pdn[i].data->pti != pti) { - continue; - } - - /* PDN entry found */ - break; - } - } - } - - /* Return the identifier of the PDN connection */ - return (ctx->pdn[i].pid); -} diff --git a/openair-cn/NAS/MME/ESM/SAP/COPYING b/openair-cn/NAS/MME/ESM/SAP/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair-cn/NAS/MME/ESM/SAP/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program 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. - - This program 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 this program. If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - <program> Copyright (C) <year> <name of author> - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<http://www.gnu.org/licenses/>. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<http://www.gnu.org/philosophy/why-not-lgpl.html>. diff --git a/openair-cn/NAS/MME/ESM/SAP/Makefile b/openair-cn/NAS/MME/ESM/SAP/Makefile deleted file mode 100644 index 18bae24927..0000000000 --- a/openair-cn/NAS/MME/ESM/SAP/Makefile +++ /dev/null @@ -1,70 +0,0 @@ -################################################################################ -# 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@eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ -ifndef PROJDIR -PROJDIR = $(PWD)/../../.. -endif - -include $(PROJDIR)/Makerules -include $(PROJDIR)/Makefile.inc - -INCLUDES = -I. -I$(INCDIR) -I$(UTILDIR) -I$(ESMDIR) \ - -I$(IESDIR) -I$(ESMMSGDIR) -I$(EMMDIR) -I$(MMEAPIDIR) -I$(EMMSAPDIR) - -TARGET = $(LIBESMSAP) -TARGETS = $(TARGET).a $(TARGET).so - -all: $(TARGETS) - -%.o: %.c Makefile $(PROJDIR)/Makerules $(PROJDIR)/Makefile.inc - @echo Compiling $< - @$(CC) $(CFLAGS) -c $< -o $@ - -$(TARGET).a: $(OBJS) - @$(RM) $@ - @$(AR) $(ARFLAGS) $@ $(OBJS) - @echo Replacing $@ to $(LIBPROCESS) - @$(RM) $(LIBPROCESS)/$@ - @$(CP) $@ $(LIBPROCESS) - -$(TARGET).so: $(OBJS) - @$(LD) -G -o $@ $(OBJS) - @echo Replacing $@ to $(LIBPROCESS) - @$(RM) $(LIBPROCESS)/$@ - @$(CP) $@ $(LIBPROCESS) - -clean: - $(RM) $(OBJS) *.bak *~ - -veryclean: clean - $(RM) $(TARGETS) - -depend: - makedepend -- ${CFLAGS} -- ${SRCS} - -# DO NOT DELETE THIS LINE -- make depend depends on it. diff --git a/openair-cn/NAS/MME/ESM/SAP/esm_recv.c b/openair-cn/NAS/MME/ESM/SAP/esm_recv.c deleted file mode 100644 index 1114178154..0000000000 --- a/openair-cn/NAS/MME/ESM/SAP/esm_recv.c +++ /dev/null @@ -1,713 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source esm_recv.c - -Version 0.1 - -Date 2013/02/06 - -Product NAS stack - -Subsystem EPS Session Management - -Author Frederic Maurel - -Description Defines functions executed at the ESM Service Access - Point upon receiving EPS Session Management messages - from the EPS Mobility Management sublayer. - -*****************************************************************************/ - -#include "esm_recv.h" -#include "commonDef.h" -#include "nas_log.h" - -#include "esm_pt.h" -#include "esm_ebr.h" -#include "esm_proc.h" - -#include "esm_cause.h" -#include "nas_itti_messaging.h" - - -/****************************************************************************/ -/**************** E X T E R N A L D E F I N I T I O N S ****************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************* L O C A L D E F I N I T I O N S *******************/ -/****************************************************************************/ - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -/* - * -------------------------------------------------------------------------- - * Functions executed by both the UE and the MME upon receiving ESM messages - * -------------------------------------------------------------------------- - */ -/**************************************************************************** - ** ** - ** Name: esm_recv_status() ** - ** ** - ** Description: Processes ESM status message ** - ** ** - ** Inputs: ueid: UE local identifier ** - ** pti: Procedure transaction identity ** - ** ebi: EPS bearer identity ** - ** msg: The received ESM message ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: ESM cause code whenever the processing of ** - ** the ESM message fails ** - ** Others: None ** - ** ** - ***************************************************************************/ - -int esm_recv_status(emm_data_context_t *ctx, int pti, int ebi, - const esm_status_msg *msg) -{ - int esm_cause; - int rc; - - LOG_FUNC_IN; - - LOG_TRACE(INFO, "ESM-SAP - Received ESM status message (pti=%d, ebi=%d)", - pti, ebi); - - /* - * Message processing - */ - /* Get the ESM cause */ - esm_cause = msg->esmcause; - - /* Execute the ESM status procedure */ - rc = esm_proc_status_ind(ctx, pti, ebi, &esm_cause); - - if (rc != RETURNerror) { - esm_cause = ESM_CAUSE_SUCCESS; - } - - /* Return the ESM cause value */ - LOG_FUNC_RETURN (esm_cause); -} - - -/* - * -------------------------------------------------------------------------- - * Functions executed by the MME upon receiving ESM message from the UE - * -------------------------------------------------------------------------- - */ -/**************************************************************************** - ** ** - ** Name: esm_recv_pdn_connectivity_request() ** - ** ** - ** Description: Processes PDN connectivity request message ** - ** ** - ** Inputs: ueid: UE local identifier ** - ** pti: Procedure transaction identity ** - ** ebi: EPS bearer identity ** - ** msg: The received ESM message ** - ** Others: None ** - ** ** - ** Outputs: new_ebi: New assigned EPS bearer identity ** - ** data: PDN connection and EPS bearer context data ** - ** Return: ESM cause code whenever the processing of ** - ** the ESM message fails ** - ** Others: None ** - ** ** - ***************************************************************************/ -int esm_recv_pdn_connectivity_request(emm_data_context_t *ctx, int pti, int ebi, - const pdn_connectivity_request_msg *msg, - unsigned int *new_ebi, void *data) -{ - int esm_cause = ESM_CAUSE_SUCCESS; - uint8_t i; - - LOG_FUNC_IN; - - LOG_TRACE(INFO, "ESM-SAP - Received PDN Connectivity Request message " - "(ueid=%u, pti=%d, ebi=%d)", ctx->ueid, pti, ebi); - - /* - * Procedure transaction identity checking - */ - if ( (pti == ESM_PT_UNASSIGNED) || esm_pt_is_reserved(pti) ) { - /* 3GPP TS 24.301, section 7.3.1, case a - * Reserved or unassigned PTI value - */ - LOG_TRACE(WARNING, "ESM-SAP - Invalid PTI value (pti=%d)", pti); - LOG_FUNC_RETURN (ESM_CAUSE_INVALID_PTI_VALUE); - } - /* - * EPS bearer identity checking - */ - else if ( ebi != ESM_EBI_UNASSIGNED ) { - /* 3GPP TS 24.301, section 7.3.2, case a - * Reserved or assigned EPS bearer identity value */ - LOG_TRACE(WARNING, "ESM-SAP - Invalid EPS bearer identity (ebi=%d)", - ebi); - LOG_FUNC_RETURN (ESM_CAUSE_INVALID_EPS_BEARER_IDENTITY); - } - - /* - * Message processing - */ - /* Get PDN connection and EPS bearer context data structure to setup */ - esm_proc_data_t *esm_data = (esm_proc_data_t *)(data); - - if (data == NULL) { - LOG_TRACE(ERROR, "ESM-SAP - Invalid ESM data structure"); - LOG_FUNC_RETURN (ESM_CAUSE_PROTOCOL_ERROR); - } - - /* Get the PDN connectivity request type */ - int request_type = -1; - - if (msg->requesttype == REQUEST_TYPE_INITIAL_REQUEST) { - request_type = ESM_PDN_REQUEST_INITIAL; - } else if (msg->requesttype == REQUEST_TYPE_HANDOVER) { - request_type = ESM_PDN_REQUEST_HANDOVER; - } else if (msg->requesttype == REQUEST_TYPE_EMERGENCY) { - request_type = ESM_PDN_REQUEST_EMERGENCY; - } else { - /* Unkown PDN request type */ - LOG_TRACE(ERROR, "ESM-SAP - Invalid PDN request type"); - LOG_FUNC_RETURN (ESM_CAUSE_INVALID_MANDATORY_INFO); - } - - /* Get the value of the PDN type indicator */ - if (msg->pdntype == PDN_TYPE_IPV4) { - esm_data->pdn_type = ESM_PDN_TYPE_IPV4; - } else if (msg->pdntype == PDN_TYPE_IPV6) { - esm_data->pdn_type = ESM_PDN_TYPE_IPV6; - } else if (msg->pdntype == PDN_TYPE_IPV4V6) { - esm_data->pdn_type = ESM_PDN_TYPE_IPV4V6; - } else { - /* Unkown PDN type */ - LOG_TRACE(ERROR, "ESM-SAP - Invalid PDN type"); - LOG_FUNC_RETURN (ESM_CAUSE_UNKNOWN_PDN_TYPE); - } - - /* Get the Access Point Name, if provided */ - if (msg->presencemask & PDN_CONNECTIVITY_REQUEST_ACCESS_POINT_NAME_PRESENT) { - esm_data->apn = msg->accesspointname.accesspointnamevalue; - } - - /* Get the ESM information transfer flag */ - if (msg->presencemask & - PDN_CONNECTIVITY_REQUEST_ESM_INFORMATION_TRANSFER_FLAG_PRESENT) { - /* 3GPP TS 24.301, sections 6.5.1.2, 6.5.1.3 - * ESM information, i.e. protocol configuration options, APN, or both, - * has to be sent after the NAS signalling security has been activated - * between the UE and the MME. - * - * The MME then at a later stage in the PDN connectivity procedure - * initiates the ESM information request procedure in which the UE - * can provide the MME with protocol configuration options or APN - * or both. - * The MME waits for completion of the ESM information request - * procedure before proceeding with the PDN connectivity procedure. - */ - //TODO: rc = esm_proc_information_request(); - } - esm_data->pco = msg->protocolconfigurationoptions; - for (i = 0; i < msg->protocolconfigurationoptions.num_protocol_id_or_container_id; i++) { - DUP_OCTET_STRING(msg->protocolconfigurationoptions.protocolidcontents[i], esm_data->pco.protocolidcontents[i]); - esm_data->pco.protocolid[i] = msg->protocolconfigurationoptions.protocolid[i]; - esm_data->pco.lengthofprotocolid[i] = msg->protocolconfigurationoptions.lengthofprotocolid[i]; - } - - -#if defined(ORIGINAL_CODE) - /* Execute the PDN connectivity procedure requested by the UE */ - int pid = esm_proc_pdn_connectivity_request(ctx, pti, request_type, - &esm_data->apn, - esm_data->pdn_type, - &esm_data->pdn_addr, - &esm_data->qos, - &esm_cause); - - if (pid != RETURNerror) { - /* Create local default EPS bearer context */ - int rc = esm_proc_default_eps_bearer_context(ctx, pid, new_ebi, - &esm_data->qos, &esm_cause); - - if (rc != RETURNerror) { - esm_cause = ESM_CAUSE_SUCCESS; - } - } - -#else - int is_emergency = (request_type == ESM_PDN_REQUEST_EMERGENCY); - - nas_itti_pdn_connectivity_req( - pti, - ctx->ueid, - ctx->imsi, - esm_data, - request_type); - esm_cause = ESM_CAUSE_SUCCESS; -#endif - /* Return the ESM cause value */ - LOG_FUNC_RETURN (esm_cause); -} - -/**************************************************************************** - ** ** - ** Name: esm_recv_pdn_disconnect_request() ** - ** ** - ** Description: Processes PDN disconnect request message ** - ** ** - ** Inputs: ueid: UE local identifier ** - ** pti: Procedure transaction identity ** - ** ebi: EPS bearer identity ** - ** msg: The received ESM message ** - ** Others: None ** - ** ** - ** Outputs: linked_ebi: Linked EPS bearer identity of the default ** - ** bearer associated with the PDN to discon- ** - ** nect from ** - ** Return: ESM cause code whenever the processing of ** - ** the ESM message fails ** - ** Others: None ** - ** ** - ***************************************************************************/ -int esm_recv_pdn_disconnect_request(emm_data_context_t *ctx, int pti, int ebi, - const pdn_disconnect_request_msg *msg, - unsigned int *linked_ebi) -{ - LOG_FUNC_IN; - - int esm_cause = ESM_CAUSE_SUCCESS; - - LOG_TRACE(INFO, "ESM-SAP - Received PDN Disconnect Request message " - "(ueid=%d, pti=%d, ebi=%d)", ctx->ueid, pti, ebi); - - /* - * Procedure transaction identity checking - */ - if ( (pti == ESM_PT_UNASSIGNED) || esm_pt_is_reserved(pti) ) { - /* 3GPP TS 24.301, section 7.3.1, case b - * Reserved or unassigned PTI value - */ - LOG_TRACE(WARNING, "ESM-SAP - Invalid PTI value (pti=%d)", pti); - LOG_FUNC_RETURN (ESM_CAUSE_INVALID_PTI_VALUE); - } - /* - * EPS bearer identity checking - */ - else if ( ebi != ESM_EBI_UNASSIGNED ) { - /* 3GPP TS 24.301, section 7.3.2, case b - * Reserved or assigned EPS bearer identity value */ - LOG_TRACE(WARNING, "ESM-SAP - Invalid EPS bearer identity (ebi=%d)", - ebi); - LOG_FUNC_RETURN (ESM_CAUSE_INVALID_EPS_BEARER_IDENTITY); - } - - /* - * Message processing - */ - /* Execute the PDN disconnect procedure requested by the UE */ - int pid = esm_proc_pdn_disconnect_request(ctx, pti, &esm_cause); - - if (pid != RETURNerror) { - /* Get the identity of the default EPS bearer context assigned to - * the PDN connection to disconnect from */ - *linked_ebi = msg->linkedepsbeareridentity; - /* Release the associated default EPS bearer context */ - int bid = 0; - int rc = esm_proc_eps_bearer_context_deactivate(ctx, FALSE, - *linked_ebi, - &pid, &bid, &esm_cause); - - if (rc != RETURNerror) { - esm_cause = ESM_CAUSE_SUCCESS; - } - } - - /* Return the ESM cause value */ - LOG_FUNC_RETURN (esm_cause); -} - -/**************************************************************************** - ** ** - ** Name: esm_recv_activate_default_eps_bearer_context_accept() ** - ** ** - ** Description: Processes Activate Default EPS Bearer Context Accept ** - ** message ** - ** ** - ** Inputs: ueid: UE local identifier ** - ** pti: Procedure transaction identity ** - ** ebi: EPS bearer identity ** - ** msg: The received ESM message ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: ESM cause code whenever the processing of ** - ** the ESM message fails ** - ** Others: None ** - ** ** - ***************************************************************************/ -int esm_recv_activate_default_eps_bearer_context_accept(emm_data_context_t *ctx, - int pti, int ebi, - const activate_default_eps_bearer_context_accept_msg *msg) -{ - LOG_FUNC_IN; - - int esm_cause = ESM_CAUSE_SUCCESS; - - LOG_TRACE(INFO, "ESM-SAP - Received Activate Default EPS Bearer Context " - "Accept message (ueid=%d, pti=%d, ebi=%d)", ctx->ueid, pti, ebi); - - /* - * Procedure transaction identity checking - */ - if (esm_pt_is_reserved(pti)) { - /* 3GPP TS 24.301, section 7.3.1, case f - * Reserved PTI value - */ - LOG_TRACE(WARNING, "ESM-SAP - Invalid PTI value (pti=%d)", pti); - LOG_FUNC_RETURN (ESM_CAUSE_INVALID_PTI_VALUE); - } - /* - * EPS bearer identity checking - */ - else if ( esm_ebr_is_reserved(ebi) || esm_ebr_is_not_in_use(ctx, ebi) ) { - /* 3GPP TS 24.301, section 7.3.2, case f - * Reserved or assigned value that does not match an existing EPS - * bearer context - */ - LOG_TRACE(WARNING, "ESM-SAP - Invalid EPS bearer identity (ebi=%d)", - ebi); - LOG_FUNC_RETURN (ESM_CAUSE_INVALID_EPS_BEARER_IDENTITY); - } - - /* - * Message processing - */ - /* Execute the default EPS bearer context activation procedure accepted - * by the UE */ - int rc = esm_proc_default_eps_bearer_context_accept(ctx, ebi, &esm_cause); - - if (rc != RETURNerror) { - esm_cause = ESM_CAUSE_SUCCESS; - } - - /* Return the ESM cause value */ - LOG_FUNC_RETURN (esm_cause); -} - -/**************************************************************************** - ** ** - ** Name: esm_recv_activate_default_eps_bearer_context_reject() ** - ** ** - ** Description: Processes Activate Default EPS Bearer Context Reject ** - ** message ** - ** ** - ** Inputs: ueid: UE local identifier ** - ** pti: Procedure transaction identity ** - ** ebi: EPS bearer identity ** - ** msg: The received ESM message ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: ESM cause code whenever the processing of ** - ** the ESM message fail ** - ** Others: None ** - ** ** - ***************************************************************************/ -int esm_recv_activate_default_eps_bearer_context_reject(emm_data_context_t *ctx, - int pti, int ebi, - const activate_default_eps_bearer_context_reject_msg *msg) -{ - LOG_FUNC_IN; - - int esm_cause = ESM_CAUSE_SUCCESS; - - LOG_TRACE(INFO, "ESM-SAP - Received Activate Default EPS Bearer Context " - "Reject message (ueid=%d, pti=%d, ebi=%d)", ctx->ueid, pti, ebi); - - /* - * Procedure transaction identity checking - */ - if (esm_pt_is_reserved(pti)) { - /* 3GPP TS 24.301, section 7.3.1, case f - * Reserved PTI value - */ - LOG_TRACE(WARNING, "ESM-SAP - Invalid PTI value (pti=%d)", pti); - LOG_FUNC_RETURN (ESM_CAUSE_INVALID_PTI_VALUE); - } - /* - * EPS bearer identity checking - */ - else if ( esm_ebr_is_reserved(ebi) || esm_ebr_is_not_in_use(ctx, ebi) ) { - /* 3GPP TS 24.301, section 7.3.2, case f - * Reserved or assigned value that does not match an existing EPS - * bearer context - */ - LOG_TRACE(WARNING, "ESM-SAP - Invalid EPS bearer identity (ebi=%d)", - ebi); - LOG_FUNC_RETURN (ESM_CAUSE_INVALID_EPS_BEARER_IDENTITY); - } - - /* - * Message processing - */ - /* Execute the default EPS bearer context activation procedure not accepted - * by the UE */ - int rc = esm_proc_default_eps_bearer_context_reject(ctx, ebi, &esm_cause); - - if (rc != RETURNerror) { - esm_cause = ESM_CAUSE_SUCCESS; - } - - /* Return the ESM cause value */ - LOG_FUNC_RETURN (esm_cause); -} - -/**************************************************************************** - ** ** - ** Name: esm_recv_activate_dedicated_eps_bearer_context_accept() ** - ** ** - ** Description: Processes Activate Dedicated EPS Bearer Context Accept ** - ** message ** - ** ** - ** Inputs: ueid: UE local identifier ** - ** pti: Procedure transaction identity ** - ** ebi: EPS bearer identity ** - ** msg: The received ESM message ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: ESM cause code whenever the processing of ** - ** the ESM message fails ** - ** Others: None ** - ** ** - ***************************************************************************/ -int esm_recv_activate_dedicated_eps_bearer_context_accept(emm_data_context_t *ctx, - int pti, int ebi, - const activate_dedicated_eps_bearer_context_accept_msg *msg) -{ - LOG_FUNC_IN; - - int esm_cause = ESM_CAUSE_SUCCESS; - - LOG_TRACE(INFO, "ESM-SAP - Received Activate Dedicated EPS Bearer " - "Context Accept message (ueid=%d, pti=%d, ebi=%d)", - ctx->ueid, pti, ebi); - - /* - * Procedure transaction identity checking - */ - if (esm_pt_is_reserved(pti)) { - /* 3GPP TS 24.301, section 7.3.1, case f - * Reserved PTI value - */ - LOG_TRACE(WARNING, "ESM-SAP - Invalid PTI value (pti=%d)", pti); - LOG_FUNC_RETURN (ESM_CAUSE_INVALID_PTI_VALUE); - } - /* - * EPS bearer identity checking - */ - else if ( esm_ebr_is_reserved(ebi) || esm_ebr_is_not_in_use(ctx, ebi) ) { - /* 3GPP TS 24.301, section 7.3.2, case f - * Reserved or assigned value that does not match an existing EPS - * bearer context - */ - LOG_TRACE(WARNING, "ESM-SAP - Invalid EPS bearer identity (ebi=%d)", - ebi); - LOG_FUNC_RETURN (ESM_CAUSE_INVALID_EPS_BEARER_IDENTITY); - } - - /* - * Message processing - */ - /* Execute the dedicated EPS bearer context activation procedure accepted - * by the UE */ - int rc = esm_proc_dedicated_eps_bearer_context_accept(ctx, ebi, - &esm_cause); - - if (rc != RETURNerror) { - esm_cause = ESM_CAUSE_SUCCESS; - } - - /* Return the ESM cause value */ - LOG_FUNC_RETURN (esm_cause); -} - -/**************************************************************************** - ** ** - ** Name: esm_recv_activate_dedicated_eps_bearer_context_reject() ** - ** ** - ** Description: Processes Activate Dedicated EPS Bearer Context Reject ** - ** message ** - ** ** - ** Inputs: ueid: UE local identifier ** - ** pti: Procedure transaction identity ** - ** ebi: EPS bearer identity ** - ** msg: The received ESM message ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: ESM cause code whenever the processing of ** - ** the ESM message fail ** - ** Others: None ** - ** ** - ***************************************************************************/ -int esm_recv_activate_dedicated_eps_bearer_context_reject(emm_data_context_t *ctx, - int pti, int ebi, - const activate_dedicated_eps_bearer_context_reject_msg *msg) -{ - LOG_FUNC_IN; - - int esm_cause = ESM_CAUSE_SUCCESS; - - LOG_TRACE(INFO, "ESM-SAP - Received Activate Dedicated EPS Bearer " - "Context Reject message (ueid=%d, pti=%d, ebi=%d)", - ctx->ueid, pti, ebi); - - /* - * Procedure transaction identity checking - */ - if (esm_pt_is_reserved(pti)) { - /* 3GPP TS 24.301, section 7.3.1, case f - * Reserved PTI value - */ - LOG_TRACE(WARNING, "ESM-SAP - Invalid PTI value (pti=%d)", pti); - LOG_FUNC_RETURN (ESM_CAUSE_INVALID_PTI_VALUE); - } - /* - * EPS bearer identity checking - */ - else if ( esm_ebr_is_reserved(ebi) || esm_ebr_is_not_in_use(ctx, ebi) ) { - /* 3GPP TS 24.301, section 7.3.2, case f - * Reserved or assigned value that does not match an existing EPS - * bearer context - */ - LOG_TRACE(WARNING, "ESM-SAP - Invalid EPS bearer identity (ebi=%d)", - ebi); - LOG_FUNC_RETURN (ESM_CAUSE_INVALID_EPS_BEARER_IDENTITY); - } - - /* - * Message processing - */ - /* Execute the dedicated EPS bearer context activation procedure not - * accepted by the UE */ - int rc = esm_proc_dedicated_eps_bearer_context_reject(ctx, ebi, - &esm_cause); - - if (rc != RETURNerror) { - esm_cause = ESM_CAUSE_SUCCESS; - } - - /* Return the ESM cause value */ - LOG_FUNC_RETURN (esm_cause); -} - -/**************************************************************************** - ** ** - ** Name: esm_recv_deactivate_eps_bearer_context_accept() ** - ** ** - ** Description: Processes Deactivate EPS Bearer Context Accept message ** - ** ** - ** Inputs: ueid: UE local identifier ** - ** pti: Procedure transaction identity ** - ** ebi: EPS bearer identity ** - ** msg: The received ESM message ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: ESM cause code whenever the processing of ** - ** the ESM message fails ** - ** Others: None ** - ** ** - ***************************************************************************/ -int esm_recv_deactivate_eps_bearer_context_accept(emm_data_context_t *ctx, - int pti, int ebi, - const deactivate_eps_bearer_context_accept_msg *msg) -{ - LOG_FUNC_IN; - - int esm_cause = ESM_CAUSE_SUCCESS; - - LOG_TRACE(INFO, "ESM-SAP - Received Deactivate EPS Bearer Context " - "Accept message (ueid=%d, pti=%d, ebi=%d)", ctx->ueid, pti, ebi); - - /* - * Procedure transaction identity checking - */ - if (esm_pt_is_reserved(pti)) { - /* 3GPP TS 24.301, section 7.3.1, case f - * Reserved PTI value - */ - LOG_TRACE(WARNING, "ESM-SAP - Invalid PTI value (pti=%d)", pti); - LOG_FUNC_RETURN (ESM_CAUSE_INVALID_PTI_VALUE); - } - /* - * EPS bearer identity checking - */ - else if ( esm_ebr_is_reserved(ebi) || esm_ebr_is_not_in_use(ctx, ebi) ) { - /* 3GPP TS 24.301, section 7.3.2, case f - * Reserved or assigned value that does not match an existing EPS - * bearer context - */ - LOG_TRACE(WARNING, "ESM-SAP - Invalid EPS bearer identity (ebi=%d)", - ebi); - LOG_FUNC_RETURN (ESM_CAUSE_INVALID_EPS_BEARER_IDENTITY); - } - - /* - * Message processing - */ - /* Execute the default EPS bearer context activation procedure accepted - * by the UE */ - int pid = esm_proc_eps_bearer_context_deactivate_accept(ctx, ebi, - &esm_cause); - - if (pid != RETURNerror) { - /* Release all the resources reserved for the PDN */ - int rc = esm_proc_pdn_disconnect_accept(ctx, pid, &esm_cause); - - if (rc != RETURNerror) { - esm_cause = ESM_CAUSE_SUCCESS; - } - } - - /* Return the ESM cause value */ - LOG_FUNC_RETURN (esm_cause); -} - -/****************************************************************************/ -/********************* L O C A L F U N C T I O N S *********************/ -/****************************************************************************/ diff --git a/openair-cn/NAS/MME/ESM/SAP/esm_recv.h b/openair-cn/NAS/MME/ESM/SAP/esm_recv.h deleted file mode 100644 index 6883d61885..0000000000 --- a/openair-cn/NAS/MME/ESM/SAP/esm_recv.h +++ /dev/null @@ -1,129 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source esm_recv.h - -Version 0.1 - -Date 2013/02/06 - -Product NAS stack - -Subsystem EPS Session Management - -Author Frederic Maurel - -Description Defines functions executed at the ESM Service Access - Point upon receiving EPS Session Management messages - from the EPS Mobility Management sublayer. - -*****************************************************************************/ -#ifndef __ESM_RECV_H__ -#define __ESM_RECV_H__ - -#include "EsmStatus.h" -#include "emmData.h" - - -#include "PdnConnectivityRequest.h" -#include "PdnDisconnectRequest.h" -#include "BearerResourceAllocationRequest.h" -#include "BearerResourceModificationRequest.h" - -#include "ActivateDefaultEpsBearerContextAccept.h" -#include "ActivateDefaultEpsBearerContextReject.h" -#include "ActivateDedicatedEpsBearerContextAccept.h" -#include "ActivateDedicatedEpsBearerContextReject.h" -#include "ModifyEpsBearerContextAccept.h" -#include "ModifyEpsBearerContextReject.h" -#include "DeactivateEpsBearerContextAccept.h" - -#include "EsmInformationResponse.h" - -/****************************************************************************/ -/********************* G L O B A L C O N S T A N T S *******************/ -/****************************************************************************/ - -/****************************************************************************/ -/************************ G L O B A L T Y P E S ************************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************** G L O B A L V A R I A B L E S ********************/ -/****************************************************************************/ - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -/* - * -------------------------------------------------------------------------- - * Functions executed by both the UE and the MME upon receiving ESM messages - * -------------------------------------------------------------------------- - */ - -int esm_recv_status(emm_data_context_t *ctx, int pti, int ebi, - const esm_status_msg *msg); - -/* - * -------------------------------------------------------------------------- - * Functions executed by the MME upon receiving ESM message from the UE - * -------------------------------------------------------------------------- - */ -/* - * Transaction related messages - * ---------------------------- - */ -int esm_recv_pdn_connectivity_request(emm_data_context_t *ctx, int pti, int ebi, - const pdn_connectivity_request_msg *msg, unsigned int *new_ebi, void *data); - -int esm_recv_pdn_disconnect_request(emm_data_context_t *ctx, int pti, int ebi, - const pdn_disconnect_request_msg *msg, - unsigned int *linked_ebi); - -/* - * Messages related to EPS bearer contexts - * --------------------------------------- - */ -int esm_recv_activate_default_eps_bearer_context_accept(emm_data_context_t *ctx, - int pti, int ebi, const activate_default_eps_bearer_context_accept_msg *msg); - -int esm_recv_activate_default_eps_bearer_context_reject(emm_data_context_t *ctx, - int pti, int ebi, const activate_default_eps_bearer_context_reject_msg *msg); - -int esm_recv_activate_dedicated_eps_bearer_context_accept(emm_data_context_t *ctx, - int pti, int ebi, const activate_dedicated_eps_bearer_context_accept_msg *msg); - -int esm_recv_activate_dedicated_eps_bearer_context_reject(emm_data_context_t *ctx, - int pti, int ebi, const activate_dedicated_eps_bearer_context_reject_msg *msg); - -int esm_recv_deactivate_eps_bearer_context_accept(emm_data_context_t *ctx, int pti, - int ebi, const deactivate_eps_bearer_context_accept_msg *msg); - -#endif /* __ESM_RECV_H__*/ diff --git a/openair-cn/NAS/MME/ESM/SAP/esm_sap.c b/openair-cn/NAS/MME/ESM/SAP/esm_sap.c deleted file mode 100644 index 9c2d07c2c5..0000000000 --- a/openair-cn/NAS/MME/ESM/SAP/esm_sap.c +++ /dev/null @@ -1,799 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source esm_sap.c - -Version 0.1 - -Date 2012/11/22 - -Product NAS stack - -Subsystem EPS Session Management - -Author Frederic Maurel - -Description Defines the ESM Service Access Points at which the EPS - Session Management sublayer provides procedures for the - EPS bearer context handling and resources allocation. - -*****************************************************************************/ - -#include "esm_sap.h" -#include "esm_recv.h" -#include "esm_send.h" -#include "commonDef.h" -#include "nas_log.h" - -#include "OctetString.h" -#include "TLVDecoder.h" -#include "esm_msgDef.h" -#include "esm_msg.h" - -#include "esm_cause.h" -#include "esm_proc.h" - -#include <string.h> // memset, strlen -#include <assert.h> - -/****************************************************************************/ -/**************** E X T E R N A L D E F I N I T I O N S ****************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************* L O C A L D E F I N I T I O N S *******************/ -/****************************************************************************/ - - -static int _esm_sap_recv(int msg_type, int is_standalone, emm_data_context_t *ctx, - const OctetString *req, OctetString *rsp, esm_sap_error_t *err); -static int _esm_sap_send(int msg_type, int is_standalone, emm_data_context_t *ctx, - int pti, int ebi, const esm_sap_data_t *data, OctetString *rsp); - -/* - * String representation of ESM-SAP primitives - */ -static const char *_esm_sap_primitive_str[] = { - "ESM_DEFAULT_EPS_BEARER_CONTEXT_ACTIVATE_REQ", - "ESM_DEFAULT_EPS_BEARER_CONTEXT_ACTIVATE_CNF", - "ESM_DEFAULT_EPS_BEARER_CONTEXT_ACTIVATE_REJ", - "ESM_DEDICATED_EPS_BEARER_CONTEXT_ACTIVATE_REQ", - "ESM_DEDICATED_EPS_BEARER_CONTEXT_ACTIVATE_CNF", - "ESM_DEDICATED_EPS_BEARER_CONTEXT_ACTIVATE_REJ", - "ESM_EPS_BEARER_CONTEXT_MODIFY_REQ", - "ESM_EPS_BEARER_CONTEXT_MODIFY_CNF", - "ESM_EPS_BEARER_CONTEXT_MODIFY_REJ", - "ESM_EPS_BEARER_CONTEXT_DEACTIVATE_REQ", - "ESM_EPS_BEARER_CONTEXT_DEACTIVATE_CNF", - "ESM_PDN_CONNECTIVITY_REQ", - "ESM_PDN_CONNECTIVITY_REJ", - "ESM_PDN_DISCONNECT_REQ", - "ESM_PDN_DISCONNECT_REJ", - "ESM_BEARER_RESOURCE_ALLOCATE_REQ", - "ESM_BEARER_RESOURCE_ALLOCATE_REJ", - "ESM_BEARER_RESOURCE_MODIFY_REQ", - "ESM_BEARER_RESOURCE_MODIFY_REJ", - "ESM_UNITDATA_IND", -}; - -/* - * Buffer used to encode ESM messages before being returned to the EPS - * Mobility Management sublayer in order to be sent onto the network - */ -#define ESM_SAP_BUFFER_SIZE 4096 -static char _esm_sap_buffer[ESM_SAP_BUFFER_SIZE]; - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -/**************************************************************************** - ** ** - ** Name: esm_sap_initialize() ** - ** ** - ** Description: Initializes the ESM Service Access Point state machine ** - ** ** - ** Inputs: None ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: None ** - ** Others: NONE ** - ** ** - ***************************************************************************/ -void esm_sap_initialize(void) -{ - LOG_FUNC_IN; - - /* Initialize ESM state machine */ - //esm_fsm_initialize(); - - LOG_FUNC_OUT; -} - -/**************************************************************************** - ** ** - ** Name: esm_sap_send() ** - ** ** - ** Description: Processes the ESM Service Access Point primitive ** - ** ** - ** Inputs: msg: The ESM-SAP primitive to process ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int esm_sap_send(esm_sap_t *msg) -{ - LOG_FUNC_IN; - - int rc = RETURNerror; - int pid; - - /* Check the ESM-SAP primitive */ - esm_primitive_t primitive = msg->primitive; - assert( (primitive > ESM_START) && (primitive < ESM_END)); - - LOG_TRACE(INFO, "ESM-SAP - Received primitive %s (%d)", - _esm_sap_primitive_str[primitive - ESM_START - 1], primitive); - - switch (primitive) { - case ESM_PDN_CONNECTIVITY_REQ: - - /* The MME received a PDN connectivity request message */ - rc = _esm_sap_recv(PDN_CONNECTIVITY_REQUEST, msg->is_standalone, - msg->ctx, msg->recv, &msg->send, &msg->err); - break; - - case ESM_PDN_CONNECTIVITY_REJ: - /* PDN connectivity locally failed */ - pid = esm_proc_default_eps_bearer_context_failure(msg->ctx); - - if (pid != RETURNerror) { - rc = esm_proc_pdn_connectivity_failure(msg->ctx, pid); - } - break; - - case ESM_PDN_DISCONNECT_REQ: - break; - - case ESM_PDN_DISCONNECT_REJ: - break; - - case ESM_BEARER_RESOURCE_ALLOCATE_REQ: - break; - - case ESM_BEARER_RESOURCE_ALLOCATE_REJ: - break; - - case ESM_BEARER_RESOURCE_MODIFY_REQ: - break; - - case ESM_BEARER_RESOURCE_MODIFY_REJ: - break; - - case ESM_DEFAULT_EPS_BEARER_CONTEXT_ACTIVATE_REQ: - break; - - case ESM_DEFAULT_EPS_BEARER_CONTEXT_ACTIVATE_CNF: - /* The MME received activate default ESP bearer context accept */ - rc = _esm_sap_recv(ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_ACCEPT, - msg->is_standalone, msg->ctx, - msg->recv, &msg->send, &msg->err); - break; - - case ESM_DEFAULT_EPS_BEARER_CONTEXT_ACTIVATE_REJ: - /* The MME received activate default ESP bearer context reject */ - rc = _esm_sap_recv(ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REJECT, - msg->is_standalone, msg->ctx, - msg->recv, &msg->send, &msg->err); - break; - - case ESM_DEDICATED_EPS_BEARER_CONTEXT_ACTIVATE_REQ: - break; - - case ESM_DEDICATED_EPS_BEARER_CONTEXT_ACTIVATE_CNF: - break; - - case ESM_DEDICATED_EPS_BEARER_CONTEXT_ACTIVATE_REJ: - break; - - case ESM_EPS_BEARER_CONTEXT_MODIFY_REQ: - break; - - case ESM_EPS_BEARER_CONTEXT_MODIFY_CNF: - break; - - case ESM_EPS_BEARER_CONTEXT_MODIFY_REJ: - break; - - case ESM_EPS_BEARER_CONTEXT_DEACTIVATE_REQ: { - int bid; - /* - * Locally deactivate EPS bearer context - */ - rc = esm_proc_eps_bearer_context_deactivate(msg->ctx, TRUE, - msg->data.eps_bearer_context_deactivate.ebi, - &pid, &bid, NULL); - } - break; - - case ESM_EPS_BEARER_CONTEXT_DEACTIVATE_CNF: - break; - - case ESM_UNITDATA_IND: - rc = _esm_sap_recv(-1, msg->is_standalone, msg->ctx, - msg->recv, &msg->send, &msg->err); - break; - - default: - break; - } - - - if (rc != RETURNok) { - LOG_TRACE(ERROR, "ESM-SAP - Failed to process primitive %s (%d)", - _esm_sap_primitive_str[primitive - ESM_START - 1], primitive); - } - - - LOG_FUNC_RETURN (rc); -} - -/****************************************************************************/ -/********************* L O C A L F U N C T I O N S *********************/ -/****************************************************************************/ - -/**************************************************************************** - ** ** - ** Name: _esm_sap_recv() ** - ** ** - ** Description: Processes ESM messages received from the network: Decodes ** - ** the message and checks whether it is of the expected ty- ** - ** pe, checks the validity of the procedure transaction iden-** - ** tity, checks the validity of the EPS bearer identity, and ** - ** parses the message content. ** - ** If no protocol error is found the ESM response message is ** - ** returned in order to be sent back onto the network upon ** - ** the relevant ESM procedure completion. ** - ** If a protocol error is found the ESM status message is ** - ** returned including the value of the ESM cause code. ** - ** ** - ** Inputs: msg_type: Expected type of the received ESM message ** - ** is_standalone: Indicates whether the ESM message has been ** - ** received standalone or together within EMM ** - ** attach related message ** - ** ueid: UE identifier within the MME ** - ** req: The encoded ESM request message to process ** - ** Others: None ** - ** ** - ** Outputs: rsp: The encoded ESM response message to be re- ** - ** turned upon ESM procedure completion ** - ** err: Error code of the ESM procedure ** - ** Return: RETURNok, RETURNerror ** - ** Others: _esm_sap_buffer ** - ** ** - ***************************************************************************/ -static int _esm_sap_recv(int msg_type, int is_standalone, - emm_data_context_t *ctx, - const OctetString *req, OctetString *rsp, - esm_sap_error_t *err) -{ - esm_proc_procedure_t esm_procedure = NULL; - int esm_cause = ESM_CAUSE_SUCCESS; - int rc = RETURNerror; - int decoder_rc; - - ESM_msg esm_msg; - - LOG_FUNC_IN; - - memset(&esm_msg, 0 , sizeof(ESM_msg)); - - /* Decode the received ESM message */ - decoder_rc = esm_msg_decode(&esm_msg, req->value, req->length); - - /* Process decoding errors */ - if (decoder_rc < 0) { - /* 3GPP TS 24.301, section 7.2 - * Ignore received message that is too short to contain a complete - * message type information element */ - if (decoder_rc == TLV_DECODE_BUFFER_TOO_SHORT) { - LOG_TRACE(WARNING, "ESM-SAP - Discard message too short to " - "contain a complete message type IE"); - /* Return indication that received message has been discarded */ - *err = ESM_SAP_DISCARDED; - LOG_FUNC_RETURN (RETURNok); - } - /* 3GPP TS 24.301, section 7.2 - * Unknown or unforeseen message type */ - else if (decoder_rc == TLV_DECODE_WRONG_MESSAGE_TYPE) { - esm_cause = ESM_CAUSE_MESSAGE_TYPE_NOT_IMPLEMENTED; - } - /* 3GPP TS 24.301, section 7.7.2 - * Conditional IE errors */ - else if (decoder_rc == TLV_DECODE_UNEXPECTED_IEI) { - esm_cause = ESM_CAUSE_CONDITIONAL_IE_ERROR; - } else { - esm_cause = ESM_CAUSE_PROTOCOL_ERROR; - } - } - /* Check the type of the ESM message actually received */ - else if ( (msg_type > 0) && (msg_type != esm_msg.header.message_type) ) { - if (esm_msg.header.message_type != ESM_STATUS) { - /* Semantically incorrect ESM message */ - LOG_TRACE(ERROR, "ESM-SAP - Received ESM message 0x%x is not " - "of the expected type (0x%x)", - esm_msg.header.message_type, msg_type); - esm_cause = ESM_CAUSE_SEMANTICALLY_INCORRECT; - } - } - - /* Get the procedure transaction identity */ - unsigned int pti = esm_msg.header.procedure_transaction_identity; - /* Get the EPS bearer identity */ - unsigned int ebi = esm_msg.header.eps_bearer_identity; - /* Indicate whether the ESM bearer context related procedure was triggered - * by the receipt of a transaction related request message from the UE or - * was triggered network-internally */ - int triggered_by_ue = (pti != PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED); - /* Indicate whether the received message shall be ignored */ - int is_discarded = FALSE; - - if (esm_cause != ESM_CAUSE_SUCCESS) { - LOG_TRACE(ERROR, "ESM-SAP - Failed to decode expected ESM message " - "0x%x", msg_type); - } - /* Process the received ESM message */ - else switch (esm_msg.header.message_type) { - - - case ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_ACCEPT: - /* - * Process activate default EPS bearer context accept message - * received from the UE - */ - esm_cause = esm_recv_activate_default_eps_bearer_context_accept( - ctx, pti, ebi, - &esm_msg.activate_default_eps_bearer_context_accept); - - if ( (esm_cause == ESM_CAUSE_INVALID_PTI_VALUE) || - (esm_cause == ESM_CAUSE_INVALID_EPS_BEARER_IDENTITY) ) { - /* 3GPP TS 24.301, section 7.3.1, case f - * Ignore ESM message received with reserved PTI value - * 3GPP TS 24.301, section 7.3.2, case f - * Ignore ESM message received with reserved or assigned - * value that does not match an existing EPS bearer context - */ - is_discarded = TRUE; - } - - break; - - case ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REJECT: - /* - * Process activate default EPS bearer context reject message - * received from the UE - */ - esm_cause = esm_recv_activate_default_eps_bearer_context_reject( - ctx, pti, ebi, - &esm_msg.activate_default_eps_bearer_context_reject); - - if ( (esm_cause == ESM_CAUSE_INVALID_PTI_VALUE) || - (esm_cause == ESM_CAUSE_INVALID_EPS_BEARER_IDENTITY) ) { - /* 3GPP TS 24.301, section 7.3.1, case f - * Ignore ESM message received with reserved PTI value - * 3GPP TS 24.301, section 7.3.2, case f - * Ignore ESM message received with reserved or assigned - * value that does not match an existing EPS bearer context - */ - is_discarded = TRUE; - } - - break; - - case DEACTIVATE_EPS_BEARER_CONTEXT_ACCEPT: - /* - * Process deactivate EPS bearer context accept message - * received from the UE - */ - esm_cause = esm_recv_deactivate_eps_bearer_context_accept( - ctx, pti, ebi, - &esm_msg.deactivate_eps_bearer_context_accept); - - if ( (esm_cause == ESM_CAUSE_INVALID_PTI_VALUE) || - (esm_cause == ESM_CAUSE_INVALID_EPS_BEARER_IDENTITY) ) { - /* 3GPP TS 24.301, section 7.3.1, case f - * Ignore ESM message received with reserved PTI value - * 3GPP TS 24.301, section 7.3.2, case f - * Ignore ESM message received with reserved or assigned - * value that does not match an existing EPS bearer context - */ - is_discarded = TRUE; - } - - break; - - case ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_ACCEPT: - /* - * Process activate dedicated EPS bearer context accept message - * received from the UE - */ - esm_cause = esm_recv_activate_dedicated_eps_bearer_context_accept( - ctx, pti, ebi, - &esm_msg.activate_dedicated_eps_bearer_context_accept); - - if ( (esm_cause == ESM_CAUSE_INVALID_PTI_VALUE) || - (esm_cause == ESM_CAUSE_INVALID_EPS_BEARER_IDENTITY) ) { - /* 3GPP TS 24.301, section 7.3.1, case f - * Ignore ESM message received with reserved PTI value - * 3GPP TS 24.301, section 7.3.2, case f - * Ignore ESM message received with reserved or assigned - * value that does not match an existing EPS bearer context - */ - is_discarded = TRUE; - } - - break; - - case ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REJECT: - /* - * Process activate dedicated EPS bearer context reject message - * received from the UE - */ - esm_cause = esm_recv_activate_dedicated_eps_bearer_context_reject( - ctx, pti, ebi, - &esm_msg.activate_dedicated_eps_bearer_context_reject); - - if ( (esm_cause == ESM_CAUSE_INVALID_PTI_VALUE) || - (esm_cause == ESM_CAUSE_INVALID_EPS_BEARER_IDENTITY) ) { - /* 3GPP TS 24.301, section 7.3.1, case f - * Ignore ESM message received with reserved PTI value - * 3GPP TS 24.301, section 7.3.2, case f - * Ignore ESM message received with reserved or assigned - * value that does not match an existing EPS bearer context - */ - is_discarded = TRUE; - } - - break; - - case MODIFY_EPS_BEARER_CONTEXT_ACCEPT: - break; - - case MODIFY_EPS_BEARER_CONTEXT_REJECT: - break; - - case PDN_CONNECTIVITY_REQUEST: { - esm_proc_data_t data; - memset(&data, 0, sizeof(esm_proc_data_t)); - - LOG_TRACE(DEBUG, "ESM-SAP - PDN_CONNECTIVITY_REQUEST pti %u ebi %u", pti, ebi); - - /* - * Process PDN connectivity request message received from the UE - */ - esm_cause = esm_recv_pdn_connectivity_request(ctx, pti, ebi, - &esm_msg.pdn_connectivity_request, - &ebi, &data); - - if (esm_cause != ESM_CAUSE_SUCCESS) { - /* Return reject message */ - rc = esm_send_pdn_connectivity_reject(pti, - &esm_msg.pdn_connectivity_reject, esm_cause); - /* Setup the callback function used to send PDN connectivity - * reject message onto the network */ - esm_procedure = esm_proc_pdn_connectivity_reject; - /* No ESM status message should be returned */ - esm_cause = ESM_CAUSE_SUCCESS; - } else { -#if defined(ORIGINAL_CODE) - /* Setup PDN type */ - int pdn_type = -1; - - if (data.pdn_type == ESM_PDN_TYPE_IPV4) { - pdn_type = PDN_VALUE_TYPE_IPV4; - } else if (data.pdn_type == ESM_PDN_TYPE_IPV6) { - pdn_type = PDN_VALUE_TYPE_IPV6; - } else if (data.pdn_type == ESM_PDN_TYPE_IPV4V6) { - pdn_type = PDN_VALUE_TYPE_IPV4V6; - } - - /* Setup EPS bearer level Quality of Service */ - EpsQualityOfService qos; - qos.bitRatesPresent = 1; - qos.bitRatesExtPresent = 0; - qos.qci = data.qos.qci; - qos.bitRates.maxBitRateForUL = data.qos.mbrUL; - qos.bitRates.maxBitRateForDL = data.qos.mbrDL; - qos.bitRates.guarBitRateForUL = data.qos.gbrUL; - qos.bitRates.guarBitRateForDL = data.qos.gbrDL; - - /* Return default EPS bearer context request message */ - rc = esm_send_activate_default_eps_bearer_context_request( - pti, ebi, - &esm_msg.activate_default_eps_bearer_context_request, - &data.apn, pdn_type, &data.pdn_addr, &qos, esm_cause); -#if 0 - PacketFilters pkfs; - pkfs[0].identifier = 1; - pkfs[0].direction = TRAFFIC_FLOW_TEMPLATE_DOWNLINK_ONLY; - pkfs[0].eval_precedence = 2; - pkfs[0].packetfilter.flags = - (TRAFFIC_FLOW_TEMPLATE_IPV4_REMOTE_ADDR_FLAG | - TRAFFIC_FLOW_TEMPLATE_PROTOCOL_NEXT_HEADER_FLAG | - TRAFFIC_FLOW_TEMPLATE_SINGLE_LOCAL_PORT_FLAG | - TRAFFIC_FLOW_TEMPLATE_SINGLE_REMOTE_PORT_FLAG); - pkfs[0].packetfilter.ipv4remoteaddr[0].addr = 192; - pkfs[0].packetfilter.ipv4remoteaddr[1].addr = 168; - pkfs[0].packetfilter.ipv4remoteaddr[2].addr = 12; - pkfs[0].packetfilter.ipv4remoteaddr[3].addr = 1; - pkfs[0].packetfilter.ipv4remoteaddr[0].mask = 255; - pkfs[0].packetfilter.ipv4remoteaddr[1].mask = 255; - pkfs[0].packetfilter.ipv4remoteaddr[2].mask = 255; - pkfs[0].packetfilter.ipv4remoteaddr[3].mask = 0; - pkfs[0].packetfilter.protocolidentifier_nextheader = 17; - pkfs[0].packetfilter.singlelocalport = 10001; - pkfs[0].packetfilter.singleremoteport = 12001; - pkfs[1].identifier = 2; - pkfs[1].direction = TRAFFIC_FLOW_TEMPLATE_UPLINK_ONLY; - pkfs[1].eval_precedence = 3; - pkfs[1].packetfilter.flags = - (TRAFFIC_FLOW_TEMPLATE_IPV4_REMOTE_ADDR_FLAG | - TRAFFIC_FLOW_TEMPLATE_PROTOCOL_NEXT_HEADER_FLAG | - TRAFFIC_FLOW_TEMPLATE_SINGLE_LOCAL_PORT_FLAG | - TRAFFIC_FLOW_TEMPLATE_SINGLE_REMOTE_PORT_FLAG); - pkfs[1].packetfilter.ipv4remoteaddr[0].addr = 192; - pkfs[1].packetfilter.ipv4remoteaddr[1].addr = 168; - pkfs[1].packetfilter.ipv4remoteaddr[2].addr = 12; - pkfs[1].packetfilter.ipv4remoteaddr[3].addr = 1; - pkfs[1].packetfilter.ipv4remoteaddr[0].mask = 255; - pkfs[1].packetfilter.ipv4remoteaddr[1].mask = 255; - pkfs[1].packetfilter.ipv4remoteaddr[2].mask = 255; - pkfs[1].packetfilter.ipv4remoteaddr[3].mask = 0; - pkfs[1].packetfilter.protocolidentifier_nextheader = 17; - pkfs[1].packetfilter.singlelocalport = 10002; - pkfs[1].packetfilter.singleremoteport = 12002; - /* Return dedicated EPS bearer context request message */ - rc = esm_send_activate_dedicated_eps_bearer_context_request( - pti, ebi, - &esm_msg.activate_dedicated_eps_bearer_context_request, - ebi, &qos, &pkfs, 2); -#endif - esm_procedure = esm_proc_default_eps_bearer_context_request; -#else - esm_cause = ESM_CAUSE_SUCCESS; -#endif - /* Setup the callback function used to send default EPS bearer - * context request message onto the network */ - //esm_procedure = esm_proc_default_eps_bearer_context_request; - } - - break; - } - - - case PDN_DISCONNECT_REQUEST: - /* - * Process PDN disconnect request message received from the UE - */ - esm_cause = esm_recv_pdn_disconnect_request(ctx, pti, ebi, - &esm_msg.pdn_disconnect_request, &ebi); - - if (esm_cause != ESM_CAUSE_SUCCESS) { - /* Return reject message */ - rc = esm_send_pdn_disconnect_reject(pti, - &esm_msg.pdn_disconnect_reject, esm_cause); - /* Setup the callback function used to send PDN connectivity - * reject message onto the network */ - esm_procedure = esm_proc_pdn_disconnect_reject; - /* No ESM status message should be returned */ - esm_cause = ESM_CAUSE_SUCCESS; - } else { - /* Return deactivate EPS bearer context request message */ - rc = esm_send_deactivate_eps_bearer_context_request(pti, ebi, - &esm_msg.deactivate_eps_bearer_context_request, - ESM_CAUSE_REGULAR_DEACTIVATION); - /* Setup the callback function used to send deactivate EPS - * bearer context request message onto the network */ - esm_procedure = esm_proc_eps_bearer_context_deactivate_request; - } - - break; - - case BEARER_RESOURCE_ALLOCATION_REQUEST: - break; - - case BEARER_RESOURCE_MODIFICATION_REQUEST: - break; - - case ESM_INFORMATION_RESPONSE: - break; - - case ESM_STATUS: - /* - * Process received ESM status message - */ - esm_cause = esm_recv_status(ctx, pti, ebi, &esm_msg.esm_status); - break; - - default: - LOG_TRACE(WARNING, "ESM-SAP - Received unexpected ESM message " - "0x%x", esm_msg.header.message_type); - esm_cause = ESM_CAUSE_MESSAGE_TYPE_NOT_IMPLEMENTED; - break; - } - - if ( (esm_cause != ESM_CAUSE_SUCCESS) && (esm_procedure == NULL) ) { - /* ESM message processing failed */ - if (!is_discarded) { - /* 3GPP TS 24.301, section 7.1 - * Handling of unknown, unforeseen, and erroneous protocol data */ - LOG_TRACE(WARNING, "ESM-SAP - Received ESM message is not valid " - "(cause=%d)", esm_cause); - /* Return an ESM status message */ - rc = esm_send_status(pti, ebi, &esm_msg.esm_status, esm_cause); - /* Setup the callback function used to send ESM status message - * onto the network */ - esm_procedure = esm_proc_status; - /* Discard received ESM message */ - is_discarded = TRUE; - } - } else { - /* ESM message processing succeed */ - *err = ESM_SAP_SUCCESS; - rc = RETURNok; - } - - if ( (rc != RETURNerror) && (esm_procedure != NULL) ) { - /* Encode the returned ESM response message */ - int size = esm_msg_encode(&esm_msg, (uint8_t *)_esm_sap_buffer, - ESM_SAP_BUFFER_SIZE); - - if (size > 0) { - rsp->length = size; - rsp->value = (uint8_t *)(_esm_sap_buffer); - } - - /* Complete the relevant ESM procedure */ - rc = (*esm_procedure)(is_standalone, ctx, ebi, rsp, triggered_by_ue); - - if (is_discarded) { - /* Return indication that received message has been discarded */ - *err = ESM_SAP_DISCARDED; - } else if (rc != RETURNok) { - /* Return indication that ESM procedure failed */ - *err = ESM_SAP_FAILED; - } - } else if (is_discarded) { - LOG_TRACE(WARNING, "ESM-SAP - Silently discard message type 0x%x", - esm_msg.header.message_type); - /* Return indication that received message has been discarded */ - *err = ESM_SAP_DISCARDED; - rc = RETURNok; - } - - LOG_FUNC_RETURN(rc); -} - -/**************************************************************************** - ** ** - ** Name: _esm_sap_send() ** - ** ** - ** Description: Processes ESM messages to send onto the network: Encoded ** - ** the message and execute the relevant ESM procedure. ** - ** ** - ** Inputs: msg_type: Type of the ESM message to be sent ** - ** is_standalone: Indicates whether the ESM message has to ** - ** be sent standalone or together within EMM ** - ** attach related message ** - ** ueid: UE identifier within the MME ** - ** pti: Procedure transaction identity ** - ** ebi: EPS bearer identity ** - ** data: Data required to build the message ** - ** Others: None ** - ** ** - ** Outputs: rsp: The encoded ESM response message to be re- ** - ** turned upon ESM procedure completion ** - ** Return: RETURNok, RETURNerror ** - ** Others: _esm_sap_buffer ** - ** ** - ***************************************************************************/ -static int _esm_sap_send(int msg_type, int is_standalone, - emm_data_context_t *ctx, - int pti, int ebi, const esm_sap_data_t *data, - OctetString *rsp) -{ - LOG_FUNC_IN; - - esm_proc_procedure_t esm_procedure = NULL; - int rc = RETURNok; - - /* Indicate whether the message is sent by the UE or the MME */ - int sent_by_ue = FALSE; - - ESM_msg esm_msg; - memset(&esm_msg, 0 , sizeof(ESM_msg)); - - /* Process the ESM message to send */ - switch (msg_type) { - - - - case ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST: - break; - - case ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST: - break; - - case MODIFY_EPS_BEARER_CONTEXT_REQUEST: - break; - - case DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST: - break; - - case PDN_CONNECTIVITY_REJECT: - break; - - case PDN_DISCONNECT_REJECT: - break; - - case BEARER_RESOURCE_ALLOCATION_REJECT: - break; - - case BEARER_RESOURCE_MODIFICATION_REJECT: - break; - - default: - LOG_TRACE(WARNING, "ESM-SAP - Send unexpected ESM message 0x%x", - msg_type); - break; - } - - if (rc != RETURNerror) { - /* Encode the returned ESM response message */ - int size = esm_msg_encode(&esm_msg, (uint8_t *)_esm_sap_buffer, - ESM_SAP_BUFFER_SIZE); - - if (size > 0) { - rsp->length = size; - rsp->value = (uint8_t *)(_esm_sap_buffer); - } - - /* Execute the relevant ESM procedure */ - if (esm_procedure) { - rc = (*esm_procedure)(is_standalone, ctx, pti, rsp, sent_by_ue); - } - } - - LOG_FUNC_RETURN(rc); -} - diff --git a/openair-cn/NAS/MME/ESM/SAP/esm_sap.h b/openair-cn/NAS/MME/ESM/SAP/esm_sap.h deleted file mode 100644 index c2d900a4ae..0000000000 --- a/openair-cn/NAS/MME/ESM/SAP/esm_sap.h +++ /dev/null @@ -1,72 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source esm_sap.h - -Version 0.1 - -Date 2012/11/22 - -Product NAS stack - -Subsystem EPS Session Management - -Author Frederic Maurel - -Description Defines the ESM Service Access Points at which the EPS - Session Management sublayer provides procedures for the - EPS bearer context handling and resources allocation. - -*****************************************************************************/ -#ifndef __ESM_SAP_H__ -#define __ESM_SAP_H__ - -#include "esm_sapDef.h" - -/****************************************************************************/ -/********************* G L O B A L C O N S T A N T S *******************/ -/****************************************************************************/ - -/****************************************************************************/ -/************************ G L O B A L T Y P E S ************************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************** G L O B A L V A R I A B L E S ********************/ -/****************************************************************************/ - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -void esm_sap_initialize(void); - -int esm_sap_send(esm_sap_t *msg); - -#endif /* __ESM_SAP_H__*/ diff --git a/openair-cn/NAS/MME/ESM/SAP/esm_sapDef.h b/openair-cn/NAS/MME/ESM/SAP/esm_sapDef.h deleted file mode 100644 index a1372193f1..0000000000 --- a/openair-cn/NAS/MME/ESM/SAP/esm_sapDef.h +++ /dev/null @@ -1,179 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source esm_sapDef.h - -Version 0.1 - -Date 2012/11/21 - -Product NAS stack - -Subsystem EPS Session Management - -Author Frederic Maurel - -Description Defines the ESM Service Access Point that provides EPS - bearer context handling and resources allocation procedures. - -*****************************************************************************/ - -#include "emmData.h" - -#ifndef __ESM_SAPDEF_H__ -#define __ESM_SAPDEF_H__ - -#include "OctetString.h" - -/****************************************************************************/ -/********************* G L O B A L C O N S T A N T S *******************/ -/****************************************************************************/ - -/* - * EPS Session Management primitives - * --------------------------------- - */ -typedef enum esm_primitive_s { - ESM_START = 0, - /* Procedures related to EPS bearer contexts (initiated by the network) */ - ESM_DEFAULT_EPS_BEARER_CONTEXT_ACTIVATE_REQ, - ESM_DEFAULT_EPS_BEARER_CONTEXT_ACTIVATE_CNF, - ESM_DEFAULT_EPS_BEARER_CONTEXT_ACTIVATE_REJ, - ESM_DEDICATED_EPS_BEARER_CONTEXT_ACTIVATE_REQ, - ESM_DEDICATED_EPS_BEARER_CONTEXT_ACTIVATE_CNF, - ESM_DEDICATED_EPS_BEARER_CONTEXT_ACTIVATE_REJ, - ESM_EPS_BEARER_CONTEXT_MODIFY_REQ, - ESM_EPS_BEARER_CONTEXT_MODIFY_CNF, - ESM_EPS_BEARER_CONTEXT_MODIFY_REJ, - ESM_EPS_BEARER_CONTEXT_DEACTIVATE_REQ, - ESM_EPS_BEARER_CONTEXT_DEACTIVATE_CNF, - /* Transaction related procedures (initiated by the UE) */ - ESM_PDN_CONNECTIVITY_REQ, - ESM_PDN_CONNECTIVITY_REJ, - ESM_PDN_DISCONNECT_REQ, - ESM_PDN_DISCONNECT_REJ, - ESM_BEARER_RESOURCE_ALLOCATE_REQ, - ESM_BEARER_RESOURCE_ALLOCATE_REJ, - ESM_BEARER_RESOURCE_MODIFY_REQ, - ESM_BEARER_RESOURCE_MODIFY_REJ, - /* ESM data indication ("raw" ESM message) */ - ESM_UNITDATA_IND, - ESM_END -} esm_primitive_t; - -/****************************************************************************/ -/************************ G L O B A L T Y P E S ************************/ -/****************************************************************************/ - -/* - * Error code returned upon processing ESM-SAP primitive - */ -typedef enum { - ESM_SAP_SUCCESS = 1, /* ESM-SAP primitive succeed */ - ESM_SAP_DISCARDED, /* ESM-SAP primitive failed, the caller should - * ignore the error */ - ESM_SAP_FAILED /* ESM-SAP primitive failed, the caller should - * take specific action and state transition may - * occurs */ -} esm_sap_error_t; - -/* - * ESM primitive for activate EPS default bearer context procedure - * --------------------------------------------------------------- - */ -typedef struct esm_activate_eps_default_bearer_context_s { -} esm_activate_eps_default_bearer_context_t; - -/* - * ESM primitive for PDN connectivity procedure - * -------------------------------------------- - */ -typedef struct esm_pdn_connectivity_s { - int cid; /* PDN connection local identifier */ - int is_defined; /* Indicates whether a PDN context has been defined - * for the specified APN */ - int pdn_type; /* PDN address type (IPv4, IPv6, IPv4v6) */ - const char *apn; /* PDN's Access Point Name */ - int is_emergency; /* Indicates whether the PDN context has been - * defined to establish connection for emergency - * bearer services */ -} esm_pdn_connectivity_t; - -/* - * ESM primitive for PDN disconnect procedure - * ------------------------------------------ - */ -typedef struct esm_pdn_disconnect_s { - int cid; /* PDN connection local identifier */ -} esm_pdn_disconnect_t; - -/* - * ESM primitive for deactivate EPS bearer context procedure - * --------------------------------------------------------- - */ -typedef struct esm_eps_bearer_context_deactivate_s { -#define ESM_SAP_ALL_EBI 0xff - unsigned int ebi; /* EPS bearer identity of the EPS bearer context - * to be deactivated */ -} esm_eps_bearer_context_deactivate_t; - -/* - * ------------------------------ - * Structure of ESM-SAP primitive - * ------------------------------ - */ -typedef union { - esm_pdn_connectivity_t pdn_connect; - esm_pdn_disconnect_t pdn_disconnect; - esm_eps_bearer_context_deactivate_t eps_bearer_context_deactivate; -} esm_sap_data_t; - -typedef struct esm_sap_s { - esm_primitive_t primitive; /* ESM-SAP primitive to process */ - int is_standalone; /* Indicates whether the ESM message handled - * within this primitive has to be sent/received - * standalone or together within an EMM related - * message */ - emm_data_context_t *ctx; /* UE context */ - unsigned int ueid; /* Local UE identifier */ - esm_sap_error_t err; /* ESM-SAP error code */ - const OctetString *recv; /* Encoded ESM message received */ - OctetString send; /* Encoded ESM message to be sent */ - esm_sap_data_t data; /* ESM message data parameters */ -} esm_sap_t; - -/****************************************************************************/ -/******************** G L O B A L V A R I A B L E S ********************/ -/****************************************************************************/ - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -#endif /* __ESM_SAPDEF_H__*/ diff --git a/openair-cn/NAS/MME/ESM/SAP/esm_send.c b/openair-cn/NAS/MME/ESM/SAP/esm_send.c deleted file mode 100644 index 4926c749a2..0000000000 --- a/openair-cn/NAS/MME/ESM/SAP/esm_send.c +++ /dev/null @@ -1,427 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source esm_send.c - -Version 0.1 - -Date 2013/02/11 - -Product NAS stack - -Subsystem EPS Session Management - -Author Frederic Maurel - -Description Defines functions executed at the ESM Service Access - Point to send EPS Session Management messages to the - EPS Mobility Management sublayer. - -*****************************************************************************/ - -#include "esm_send.h" -#include "commonDef.h" -#include "nas_log.h" - - -#include "esm_msgDef.h" -#include "esm_cause.h" - -#include <string.h> // strlen - -/****************************************************************************/ -/**************** E X T E R N A L D E F I N I T I O N S ****************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************* L O C A L D E F I N I T I O N S *******************/ -/****************************************************************************/ - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -/* - * -------------------------------------------------------------------------- - * Functions executed by both the UE and the MME to send ESM messages - * -------------------------------------------------------------------------- - */ -/**************************************************************************** - ** ** - ** Name: esm_send_status() ** - ** ** - ** Description: Builds ESM status message ** - ** ** - ** The ESM status message is sent by the network or the UE ** - ** to pass information on the status of the indicated EPS ** - ** bearer context and report certain error conditions. ** - ** ** - ** Inputs: pti: Procedure transaction identity ** - ** ebi: EPS bearer identity ** - ** esm_cause: ESM cause code ** - ** Others: None ** - ** ** - ** Outputs: msg: The ESM message to be sent ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int esm_send_status(int pti, int ebi, esm_status_msg *msg, int esm_cause) -{ - LOG_FUNC_IN; - - /* Mandatory - ESM message header */ - msg->protocoldiscriminator = EPS_SESSION_MANAGEMENT_MESSAGE; - msg->epsbeareridentity = ebi; - msg->messagetype = ESM_STATUS; - msg->proceduretransactionidentity = pti; - - /* Mandatory - ESM cause code */ - msg->esmcause = esm_cause; - - LOG_TRACE(WARNING, "ESM-SAP - Send ESM Status message (pti=%d, ebi=%d)", - msg->proceduretransactionidentity, msg->epsbeareridentity); - - LOG_FUNC_RETURN(RETURNok); -} - - -/* - * -------------------------------------------------------------------------- - * Functions executed by the MME to send ESM message to the UE - * -------------------------------------------------------------------------- - */ -/**************************************************************************** - ** ** - ** Name: esm_send_pdn_connectivity_reject() ** - ** ** - ** Description: Builds PDN Connectivity Reject message ** - ** ** - ** The PDN connectivity reject message is sent by the net- ** - ** work to the UE to reject establishment of a PDN connec- ** - ** tion. ** - ** ** - ** Inputs: pti: Procedure transaction identity ** - ** esm_cause: ESM cause code ** - ** Others: None ** - ** ** - ** Outputs: msg: The ESM message to be sent ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int esm_send_pdn_connectivity_reject(int pti, pdn_connectivity_reject_msg *msg, - int esm_cause) -{ - LOG_FUNC_IN; - - /* Mandatory - ESM message header */ - msg->protocoldiscriminator = EPS_SESSION_MANAGEMENT_MESSAGE; - msg->epsbeareridentity = EPS_BEARER_IDENTITY_UNASSIGNED; - msg->messagetype = PDN_CONNECTIVITY_REJECT; - msg->proceduretransactionidentity = pti; - - /* Mandatory - ESM cause code */ - msg->esmcause = esm_cause; - /* Optional IEs */ - msg->presencemask = 0; - - LOG_TRACE(INFO, "ESM-SAP - Send PDN Connectivity Reject message " - "(pti=%d, ebi=%d)", - msg->proceduretransactionidentity, msg->epsbeareridentity); - - LOG_FUNC_RETURN(RETURNok); -} - -/**************************************************************************** - ** ** - ** Name: esm_send_pdn_disconnect_reject() ** - ** ** - ** Description: Builds PDN Disconnect Reject message ** - ** ** - ** The PDN disconnect reject message is sent by the network ** - ** to the UE to reject release of a PDN connection. ** - ** ** - ** Inputs: pti: Procedure transaction identity ** - ** esm_cause: ESM cause code ** - ** Others: None ** - ** ** - ** Outputs: msg: The ESM message to be sent ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int esm_send_pdn_disconnect_reject(int pti, pdn_disconnect_reject_msg *msg, - int esm_cause) -{ - LOG_FUNC_IN; - - /* Mandatory - ESM message header */ - msg->protocoldiscriminator = EPS_SESSION_MANAGEMENT_MESSAGE; - msg->epsbeareridentity = EPS_BEARER_IDENTITY_UNASSIGNED; - msg->messagetype = PDN_DISCONNECT_REJECT; - msg->proceduretransactionidentity = pti; - - /* Mandatory - ESM cause code */ - msg->esmcause = esm_cause; - /* Optional IEs */ - msg->presencemask = 0; - - LOG_TRACE(INFO, "ESM-SAP - Send PDN Disconnect Reject message " - "(pti=%d, ebi=%d)", - msg->proceduretransactionidentity, msg->epsbeareridentity); - - LOG_FUNC_RETURN(RETURNok); -} - -/**************************************************************************** - ** ** - ** Name: esm_send_activate_default_eps_bearer_context_request() ** - ** ** - ** Description: Builds Activate Default EPS Bearer Context Request ** - ** message ** - ** ** - ** The activate default EPS bearer context request message ** - ** is sent by the network to the UE to request activation of ** - ** a default EPS bearer context. ** - ** ** - ** Inputs: pti: Procedure transaction identity ** - ** ebi: EPS bearer identity ** - ** qos: Subscribed EPS quality of service ** - ** apn: Access Point Name in used ** - ** pdn_addr: PDN IPv4 address and/or IPv6 suffix ** - ** esm_cause: ESM cause code ** - ** Others: None ** - ** ** - ** Outputs: msg: The ESM message to be sent ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int esm_send_activate_default_eps_bearer_context_request(int pti, - int ebi, - activate_default_eps_bearer_context_request_msg *msg, - const OctetString *apn, - const ProtocolConfigurationOptions *pco, - int pdn_type, - const OctetString *pdn_addr, - const EpsQualityOfService *qos, - int esm_cause) -{ - LOG_FUNC_IN; - - /* Mandatory - ESM message header */ - msg->protocoldiscriminator = EPS_SESSION_MANAGEMENT_MESSAGE; - msg->epsbeareridentity = ebi; - msg->messagetype = ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST; - msg->proceduretransactionidentity = pti; - - /* Mandatory - EPS QoS */ - msg->epsqos = *qos; - LOG_TRACE(INFO, "ESM-SAP - epsqos qci: %u", qos->qci); - - if (qos->bitRatesPresent) { - LOG_TRACE(INFO, "ESM-SAP - epsqos maxBitRateForUL: %u", qos->bitRates.maxBitRateForUL); - LOG_TRACE(INFO, "ESM-SAP - epsqos maxBitRateForDL: %u", qos->bitRates.maxBitRateForDL); - LOG_TRACE(INFO, "ESM-SAP - epsqos guarBitRateForUL: %u", qos->bitRates.guarBitRateForUL); - LOG_TRACE(INFO, "ESM-SAP - epsqos guarBitRateForDL: %u", qos->bitRates.guarBitRateForDL); - } else { - LOG_TRACE(INFO, "ESM-SAP - epsqos no bit rates defined"); - } - - if (qos->bitRatesExtPresent) { - LOG_TRACE(INFO, "ESM-SAP - epsqos maxBitRateForUL Ext: %u", qos->bitRatesExt.maxBitRateForUL); - LOG_TRACE(INFO, "ESM-SAP - epsqos maxBitRateForDL Ext: %u", qos->bitRatesExt.maxBitRateForDL); - LOG_TRACE(INFO, "ESM-SAP - epsqos guarBitRateForUL Ext: %u", qos->bitRatesExt.guarBitRateForUL); - LOG_TRACE(INFO, "ESM-SAP - epsqos guarBitRateForDL Ext: %u", qos->bitRatesExt.guarBitRateForDL); - } else { - LOG_TRACE(INFO, "ESM-SAP - epsqos no bit rates ext defined"); - } - - - if ((apn == NULL) || ((apn != NULL) && (apn->value == NULL))) { - LOG_TRACE(WARNING, "ESM-SAP - apn is NULL!"); - } - - LOG_TRACE(INFO, "ESM-SAP - apn is %s", apn->value); - - /* Mandatory - Access Point Name */ - msg->accesspointname.accesspointnamevalue = *apn; - - /* Mandatory - PDN address */ - LOG_TRACE(INFO, "ESM-SAP - pdn_type is %u", pdn_type); - msg->pdnaddress.pdntypevalue = pdn_type; - LOG_TRACE(INFO, "ESM-SAP - pdn_addr is %u", dump_octet_string(pdn_addr)); - msg->pdnaddress.pdnaddressinformation = *pdn_addr; - - /* Optional - ESM cause code */ - msg->presencemask = 0; - - if (esm_cause != ESM_CAUSE_SUCCESS) { - msg->presencemask |= - ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_ESM_CAUSE_PRESENT; - msg->esmcause = esm_cause; - } - - if (pco != NULL) { - msg->presencemask |= - ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; - msg->protocolconfigurationoptions = *pco; - } - -#warning "TEST LG FORCE APN-AMBR" - LOG_TRACE(INFO, "ESM-SAP - FORCE APN-AMBR"); - msg->presencemask |= - ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_APNAMBR_PRESENT; - msg->apnambr.apnambrfordownlink = 0xfe; // (8640kbps) - msg->apnambr.apnambrforuplink = 0xfe; // (8640kbps) - msg->apnambr.apnambrfordownlink_extended = 0xde; // (200Mbps) - msg->apnambr.apnambrforuplink_extended = 0x9e; // (100Mbps) - msg->apnambr.apnambrfordownlink_extended2 = 0; - msg->apnambr.apnambrforuplink_extended2 = 0; - msg->apnambr.extensions = 0 | APN_AGGREGATE_MAXIMUM_BIT_RATE_MAXIMUM_EXTENSION_PRESENT; - - LOG_TRACE(INFO, "ESM-SAP - Send Activate Default EPS Bearer Context " - "Request message (pti=%d, ebi=%d)", - msg->proceduretransactionidentity, msg->epsbeareridentity); - - LOG_FUNC_RETURN(RETURNok); -} - -/**************************************************************************** - ** ** - ** Name: esm_send_activate_dedicated_eps_bearer_context_request() ** - ** ** - ** Description: Builds Activate Dedicated EPS Bearer Context Request ** - ** message ** - ** ** - ** The activate dedicated EPS bearer context request message ** - ** is sent by the network to the UE to request activation of ** - ** a dedicated EPS bearer context associated with the same ** - ** PDN address(es) and APN as an already active default EPS ** - ** bearer context. ** - ** ** - ** Inputs: pti: Procedure transaction identity ** - ** ebi: EPS bearer identity ** - ** linked_ebi: EPS bearer identity of the default bearer ** - ** associated with the EPS dedicated bearer ** - ** to be activated ** - ** qos: EPS quality of service ** - ** tft: Traffic flow template ** - ** Others: None ** - ** ** - ** Outputs: msg: The ESM message to be sent ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int esm_send_activate_dedicated_eps_bearer_context_request(int pti, int ebi, - activate_dedicated_eps_bearer_context_request_msg *msg, - int linked_ebi, const EpsQualityOfService *qos, - PacketFilters *pkfs, int n_pkfs) -{ - int i; - LOG_FUNC_IN; - - /* Mandatory - ESM message header */ - msg->protocoldiscriminator = EPS_SESSION_MANAGEMENT_MESSAGE; - msg->epsbeareridentity = ebi; - msg->messagetype = ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST; - msg->proceduretransactionidentity = pti; - - /* Mandatory - EPS QoS */ - msg->epsqos = *qos; - - /* Mandatory - traffic flow template */ - msg->tft.tftoperationcode = TRAFFIC_FLOW_TEMPLATE_OPCODE_CREATE; - msg->tft.ebit = TRAFFIC_FLOW_TEMPLATE_PARAMETER_LIST_IS_NOT_INCLUDED; - msg->tft.numberofpacketfilters = n_pkfs; - - for (i = 0; i < msg->tft.numberofpacketfilters; i++) { - msg->tft.packetfilterlist.createtft[i] = (*pkfs)[i]; - } - - /* Optional */ - msg->presencemask = 0; - - LOG_TRACE(INFO, "ESM-SAP - Send Activate Dedicated EPS Bearer Context " - "Request message (pti=%d, ebi=%d)", - msg->proceduretransactionidentity, msg->epsbeareridentity); - - LOG_FUNC_RETURN(RETURNok); -} - -/**************************************************************************** - ** ** - ** Name: esm_send_deactivate_eps_bearer_context_request() ** - ** ** - ** Description: Builds Deactivate EPS Bearer Context Request message ** - ** ** - ** The deactivate EPS bearer context request message is sent ** - ** by the network to request deactivation of an active EPS ** - ** bearer context. ** - ** ** - ** Inputs: pti: Procedure transaction identity ** - ** ebi: EPS bearer identity ** - ** esm_cause: ESM cause code ** - ** Others: None ** - ** ** - ** Outputs: msg: The ESM message to be sent ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int esm_send_deactivate_eps_bearer_context_request(int pti, int ebi, - deactivate_eps_bearer_context_request_msg *msg, - int esm_cause) -{ - LOG_FUNC_IN; - - /* Mandatory - ESM message header */ - msg->protocoldiscriminator = EPS_SESSION_MANAGEMENT_MESSAGE; - msg->epsbeareridentity = ebi; - msg->messagetype = DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST; - msg->proceduretransactionidentity = pti; - - /* Mandatory - ESM cause code */ - msg->esmcause = esm_cause; - /* Optional IEs */ - msg->presencemask = 0; - - LOG_TRACE(INFO, "ESM-SAP - Send Deactivate EPS Bearer Context Request " - "message (pti=%d, ebi=%d)", - msg->proceduretransactionidentity, msg->epsbeareridentity); - - LOG_FUNC_RETURN(RETURNok); -} - -/****************************************************************************/ -/********************* L O C A L F U N C T I O N S *********************/ -/****************************************************************************/ - diff --git a/openair-cn/NAS/MME/ESM/SAP/esm_send.h b/openair-cn/NAS/MME/ESM/SAP/esm_send.h deleted file mode 100644 index 07c0af4635..0000000000 --- a/openair-cn/NAS/MME/ESM/SAP/esm_send.h +++ /dev/null @@ -1,119 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source esm_send.h - -Version 0.1 - -Date 2013/02/11 - -Product NAS stack - -Subsystem EPS Session Management - -Author Frederic Maurel - -Description Defines functions executed at the ESM Service Access - Point to send EPS Session Management messages to the - EPS Mobility Management sublayer. - -*****************************************************************************/ -#ifndef __ESM_SEND_H__ -#define __ESM_SEND_H__ - -#include "EsmStatus.h" - -#include "PdnConnectivityReject.h" -#include "PdnDisconnectReject.h" -#include "BearerResourceAllocationReject.h" -#include "BearerResourceModificationReject.h" - -#include "ActivateDefaultEpsBearerContextRequest.h" -#include "ActivateDedicatedEpsBearerContextRequest.h" -#include "ModifyEpsBearerContextRequest.h" -#include "DeactivateEpsBearerContextRequest.h" - -#include "EsmInformationRequest.h" - -/****************************************************************************/ -/********************* G L O B A L C O N S T A N T S *******************/ -/****************************************************************************/ - -/****************************************************************************/ -/************************ G L O B A L T Y P E S ************************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************** G L O B A L V A R I A B L E S ********************/ -/****************************************************************************/ - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -/* - * -------------------------------------------------------------------------- - * Functions executed by both the UE and the MME to send ESM messages - * -------------------------------------------------------------------------- - */ -int esm_send_status(int pti, int ebi, esm_status_msg *msg, int esm_cause); - - -/* - * -------------------------------------------------------------------------- - * Functions executed by the MME to send ESM message to the UE - * -------------------------------------------------------------------------- - */ -/* - * Transaction related messages - * ---------------------------- - */ -int esm_send_pdn_connectivity_reject(int pti, pdn_connectivity_reject_msg *msg, - int esm_cause); - -int esm_send_pdn_disconnect_reject(int pti, pdn_disconnect_reject_msg *msg, - int esm_cause); - -/* - * Messages related to EPS bearer contexts - * --------------------------------------- - */ -int esm_send_activate_default_eps_bearer_context_request(int pti, int ebi, - activate_default_eps_bearer_context_request_msg *msg, const OctetString *apn, - const ProtocolConfigurationOptions *pco, int pdn_type, const OctetString *pdn_addr, - const EpsQualityOfService *qos, int esm_cause); - -int esm_send_activate_dedicated_eps_bearer_context_request(int pti, int ebi, - activate_dedicated_eps_bearer_context_request_msg *msg, int linked_ebi, - const EpsQualityOfService *qos, PacketFilters *pkfs, int n_pkfs); - -int esm_send_deactivate_eps_bearer_context_request(int pti, int ebi, - deactivate_eps_bearer_context_request_msg *msg, int esm_cause); - -#endif /* __ESM_SEND_H__*/ diff --git a/openair-cn/NAS/MME/ESM/esmData.h b/openair-cn/NAS/MME/ESM/esmData.h deleted file mode 100644 index a5f839c1dc..0000000000 --- a/openair-cn/NAS/MME/ESM/esmData.h +++ /dev/null @@ -1,265 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source esmData.h - -Version 0.1 - -Date 2012/12/04 - -Product NAS stack - -Subsystem EPS Session Management - -Author Frederic Maurel - -Description Defines internal private data handled by EPS Session - Management sublayer. - -*****************************************************************************/ -#include <stdio.h> // sprintf - -#include "networkDef.h" -#include "OctetString.h" -#include "EpsBearerIdentity.h" - -#include "mme_api.h" - -#if defined(NAS_BUILT_IN_EPC) -# include "tree.h" -#endif - -#ifndef __ESMDATA_H__ -#define __ESMDATA_H__ - -/****************************************************************************/ -/********************* G L O B A L C O N S T A N T S *******************/ -/****************************************************************************/ - -/* Total number of active EPS bearers */ -#define ESM_DATA_EPS_BEARER_TOTAL 11 - -/****************************************************************************/ -/************************ G L O B A L T Y P E S ************************/ -/****************************************************************************/ - -/* - * Minimal and maximal value of an EPS bearer identity: - * The EPS Bearer Identity (EBI) identifies a message flow - */ -#define ESM_EBI_MIN (EPS_BEARER_IDENTITY_FIRST) -#define ESM_EBI_MAX (EPS_BEARER_IDENTITY_LAST) - -/* EPS bearer context states */ -typedef enum { - ESM_EBR_INACTIVE, /* No EPS bearer context exists */ - ESM_EBR_ACTIVE, /* The EPS bearer context is active, - * in the UE, in the network */ - ESM_EBR_INACTIVE_PENDING, /* The network has initiated an EPS bearer - * context deactivation towards the UE */ - ESM_EBR_MODIFY_PENDING, /* The network has initiated an EPS bearer - * context modification towards the UE */ - ESM_EBR_ACTIVE_PENDING, /* The network has initiated an EPS bearer - * context activation towards the UE */ - ESM_EBR_STATE_MAX -} esm_ebr_state; - -/* ESM message timer retransmission data */ -typedef struct esm_ebr_timer_data_s { - void *ctx; - unsigned int ueid; /* Lower layers UE identifier */ - unsigned int ebi; /* EPS bearer identity */ - unsigned int count; /* Retransmission counter */ - OctetString msg; /* Encoded ESM message to re-transmit */ -} esm_ebr_timer_data_t; - -/* - * ----------------------- - * EPS bearer context data - * ----------------------- - */ -typedef struct esm_ebr_context_s { - unsigned char ebi; /* EPS bearer identity */ - esm_ebr_state status; /* EPS bearer context status */ - - struct nas_timer_t timer; /* Retransmission timer */ - esm_ebr_timer_data_t *args; /* Retransmission timer parameters data */ -} esm_ebr_context_t; - -typedef struct esm_ebr_data_s { - unsigned char index; /* Index of the next EPS bearer context - * identity to be used */ -#define ESM_EBR_DATA_SIZE (ESM_EBI_MAX - ESM_EBI_MIN + 1) - esm_ebr_context_t *context[ESM_EBR_DATA_SIZE + 1]; -} esm_ebr_data_t; - -/* - * -------------------------------------------------------------------------- - * Structure of data handled by EPS Session Management sublayer in the UE - * and in the MME - * -------------------------------------------------------------------------- - */ - -/* - * Structure of an EPS bearer - * -------------------------- - * An EPS bearer is a logical concept which applies to the connection - * between two endpoints (UE and PDN Gateway) with specific QoS attri- - * butes. An EPS bearer corresponds to one Quality of Service policy - * applied within the EPC and E-UTRAN. - */ -typedef struct esm_bearer_s { - int bid; /* Identifier of the EPS bearer */ - unsigned int ebi; /* EPS bearer identity */ - network_qos_t qos; /* EPS bearer level QoS parameters */ - network_tft_t tft; /* Traffic Flow Template for packet filtering */ -} esm_bearer_t; - -/* - * Structure of a PDN connection - * ----------------------------- - * A PDN connection is the association between a UE represented by - * one IPv4 address and/or one IPv6 prefix and a PDN represented by - * an Access Point Name (APN). - */ -typedef struct esm_pdn_s { - unsigned int pti; /* Identity of the procedure transaction executed - * to activate the PDN connection entry */ - int is_emergency; /* Emergency bearer services indicator */ - OctetString apn; /* Access Point Name currently in used */ - int ambr; /* Aggregate Maximum Bit Rate of this APN */ - int type; /* Address PDN type (IPv4, IPv6, IPv4v6) */ -#define ESM_DATA_IPV4_ADDRESS_SIZE 4 -#define ESM_DATA_IPV6_ADDRESS_SIZE 8 -#define ESM_DATA_IP_ADDRESS_SIZE (ESM_DATA_IPV4_ADDRESS_SIZE + \ - ESM_DATA_IPV6_ADDRESS_SIZE) - /* IPv4 PDN address and/or IPv6 prefix */ - char ip_addr[ESM_DATA_IP_ADDRESS_SIZE+1]; - int addr_realloc; /* Indicates whether the UE is allowed to subsequently - * request another PDN connectivity to the same APN - * using an address PDN type (IPv4 or IPv6) other - * than the one already activated */ - int n_bearers; /* Number of allocated EPS bearers; - * default EPS bearer is defined at index 0 */ -#define ESM_DATA_EPS_BEARER_MAX 4 - esm_bearer_t *bearer[ESM_DATA_EPS_BEARER_MAX]; -} esm_pdn_t; - -/* - * Structure of the ESM data - * ------------------------- - * The EPS Session Management sublayer handles data related to PDN - * connections and EPS bearers. Each active PDN connection has a de- - * fault EPS bearer. Several dedicated EPS bearers may exist within - * a PDN connection. - */ -typedef struct esm_data_context_s { - unsigned int ue_id; - - int n_ebrs; /* Total number of active EPS bearer contexts */ - int n_pdns; /* Number of active PDN connections */ - int emergency; /* Indicates whether a PDN connection for emergency - * bearer services is established */ -#define ESM_DATA_PDN_MAX 4 - struct { - int pid; /* Identifier of the PDN connection */ - int is_active; /* TRUE/FALSE if the PDN connection is active/inactive - * or the process to activate/deactivate the PDN - * connection is in progress */ - esm_pdn_t *data; /* Active PDN connection data */ - } pdn[ESM_DATA_PDN_MAX+1]; - - esm_ebr_data_t ebr; -} esm_data_context_t; - - - -/* - * -------------------------------------------------------------------------- - * ESM internal data handled by EPS Session Management sublayer in the MME - * -------------------------------------------------------------------------- - */ -/* - * Structure of the ESM data - * ------------------------- - */ -typedef struct esm_data_s { - /* - * MME configuration - * ----------------- - */ - mme_api_esm_config_t conf; - /* - * ESM contexts - * ------------ - */ -# if defined(NAS_BUILT_IN_EPC) - /* Use a tree for ue data context within MME */ - RB_HEAD(esm_data_context_map, esm_data_context_s) ctx_map; -# else -# define ESM_DATA_NB_UE_MAX (MME_API_NB_UE_MAX + 1) - esm_data_context_t *ctx[ESM_DATA_NB_UE_MAX]; -# endif -} esm_data_t; - -# if defined(NAS_BUILT_IN_EPC) -struct esm_data_context_s *esm_data_context_get( - esm_data_t *esm_data, unsigned int _ueid); - -struct esm_data_context_s *esm_data_context_remove( - esm_data_t *esm_data, struct esm_data_context_s *elm); - -void esm_data_context_add(esm_data_t *esm_data, struct esm_data_context_s *elm); - -# endif - - -/****************************************************************************/ -/******************** G L O B A L V A R I A B L E S ********************/ -/****************************************************************************/ - -/* - * ESM internal data (used within ESM only) - * ---------------------------------------- - */ -esm_data_t _esm_data; - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -extern char ip_addr_str[100]; - -extern char *esm_data_get_ipv4_addr(const OctetString *ip_addr); - -extern char *esm_data_get_ipv6_addr(const OctetString *ip_addr); - -extern char *esm_data_get_ipv4v6_addr(const OctetString *ip_addr); - -#endif /* __ESMDATA_H__*/ diff --git a/openair-cn/NAS/MME/ESM/esm_ebr.c b/openair-cn/NAS/MME/ESM/esm_ebr.c deleted file mode 100644 index 720e69a5eb..0000000000 --- a/openair-cn/NAS/MME/ESM/esm_ebr.c +++ /dev/null @@ -1,680 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source esm_ebr.c - -Version 0.1 - -Date 2013/01/29 - -Product NAS stack - -Subsystem EPS Session Management - -Author Frederic Maurel - -Description Defines functions used to handle state of EPS bearer contexts - and manage ESM messages re-transmission. - -*****************************************************************************/ - -#include <stdlib.h> // malloc, free -#include <string.h> // memcpy - -#include "emmData.h" -#include "esm_ebr.h" -#include "commonDef.h" -#include "nas_log.h" - -#include "mme_api.h" -#include "msc.h" - -/****************************************************************************/ -/**************** E X T E R N A L D E F I N I T I O N S ****************/ -/****************************************************************************/ - - -#define ESM_EBR_NB_UE_MAX (MME_API_NB_UE_MAX + 1) - -/****************************************************************************/ -/******************* L O C A L D E F I N I T I O N S *******************/ -/****************************************************************************/ - -/* String representation of EPS bearer context status */ -static const char *_esm_ebr_state_str[ESM_EBR_STATE_MAX] = { - "BEARER CONTEXT INACTIVE", - "BEARER CONTEXT ACTIVE", - "BEARER CONTEXT INACTIVE PENDING", - "BEARER CONTEXT MODIFY PENDING", - "BEARER CONTEXT ACTIVE PENDING" -}; - -/* - * ---------------------------------- - * List of EPS bearer contexts per UE - * ---------------------------------- - */ - -#if !defined(NAS_BUILT_IN_EPC) -static esm_ebr_data_t _esm_ebr_data[ESM_EBR_NB_UE_MAX]; -#endif - -/* - * ---------------------- - * User notification data - * ---------------------- - */ - - -/* Returns the index of the next available entry in the list of EPS bearer - * context data */ -static int _esm_ebr_get_available_entry(emm_data_context_t *ctx); - - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -/**************************************************************************** - ** ** - ** Name: esm_ebr_initialize() ** - ** ** - ** Description: Initialize EPS bearer context data ** - ** ** - ** Inputs: cb: User notification callback ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: None ** - ** Others: _esm_ebr_data ** - ** ** - ***************************************************************************/ -void esm_ebr_initialize(void -) -{ -#if !defined(NAS_BUILT_IN_EPC) - int ueid, i; - - LOG_FUNC_IN; - - for (ueid = 0; ueid < ESM_EBR_NB_UE_MAX; ueid++) { - _esm_ebr_data[ueid].index = 0; - - /* Initialize EPS bearer context data */ - for (i = 0; i < ESM_EBR_DATA_SIZE + 1; i++) { - _esm_ebr_data[ueid].context[i] = NULL; - } - } - LOG_FUNC_OUT; -#endif -} - -/**************************************************************************** - ** ** - ** Name: esm_ebr_assign() ** - ** ** - ** Description: Assigns a new EPS bearer context ** - ** ** - ** Inputs: ueid: Lower layers UE identifier ** - ** ebi: Identity of the new EPS bearer context ** - ** cid: Identifier of the PDN context the EPS bea- ** - ** rer context is associated to ** - ** default_ebr TRUE if the new bearer context is associa- ** - ** ted to a default EPS bearer ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: The identity of the new EPS bearer context ** - ** if successfully assigned; ** - ** the not assigned EBI (0) otherwise. ** - ** Others: _esm_ebr_data ** - ** ** - ***************************************************************************/ -int esm_ebr_assign(emm_data_context_t *ctx, int ebi) -{ - esm_ebr_context_t *ebr_ctx = NULL; - unsigned int ueid = 0; - int i; - - LOG_FUNC_IN; - - ebr_ctx = ctx->esm_data_ctx.ebr.context[ebi - ESM_EBI_MIN]; - - if (ebi != ESM_EBI_UNASSIGNED) { - if ( (ebi < ESM_EBI_MIN) || (ebi > ESM_EBI_MAX) ) { - LOG_FUNC_RETURN (ESM_EBI_UNASSIGNED); - } else if (ebr_ctx != NULL) { - LOG_TRACE(WARNING, "ESM-FSM - EPS bearer context already " - "assigned (ebi=%d)", ebi); - LOG_FUNC_RETURN (ESM_EBI_UNASSIGNED); - } - - /* The specified EPS bearer context is available */ - i = ebi - ESM_EBI_MIN; - } else { - /* Search for an available EPS bearer identity */ - i = _esm_ebr_get_available_entry(ctx); - - if (i < 0) { - LOG_FUNC_RETURN(ESM_EBI_UNASSIGNED); - } - - /* An available EPS bearer context is found */ - ebi = i + ESM_EBI_MIN; - } - - /* Assign new EPS bearer context */ - ebr_ctx = - (esm_ebr_context_t *)malloc(sizeof(esm_ebr_context_t)); - - if (ebr_ctx == NULL) { - LOG_FUNC_RETURN(ESM_EBI_UNASSIGNED); - } - -#if defined(NAS_BUILT_IN_EPC) - ctx->esm_data_ctx.ebr.context[ebi - ESM_EBI_MIN] = ebr_ctx; -#else - _esm_ebr_data[ueid].context[ebi - ESM_EBI_MIN] = ebr_ctx; -#endif - - /* Store the index of the next available EPS bearer identity */ - ctx->esm_data_ctx.ebr.index = i + 1; - - - /* Set the EPS bearer identity */ - ebr_ctx->ebi = ebi; - /* Set the EPS bearer context status to INACTIVE */ - ebr_ctx->status = ESM_EBR_INACTIVE; - /* Disable the retransmission timer */ - ebr_ctx->timer.id = NAS_TIMER_INACTIVE_ID; - /* Setup retransmission timer parameters */ - ebr_ctx->args = NULL; - - LOG_TRACE(INFO, "ESM-FSM - EPS bearer context %d assigned", ebi); - LOG_FUNC_RETURN(ebr_ctx->ebi); -} - -/**************************************************************************** - ** ** - ** Name: esm_ebr_release() ** - ** ** - ** Description: Release the given EPS bearer identity ** - ** ** - ** Inputs: ueid: Lower layers UE identifier ** - ** ebi: The identity of the EPS bearer context to ** - ** be released ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok if the EPS bearer context has ** - ** been successfully released; ** - ** RETURNerror otherwise. ** - ** Others: _esm_ebr_data ** - ** ** - ***************************************************************************/ -int esm_ebr_release( - emm_data_context_t *ctx, - int ebi) -{ - esm_ebr_context_t *ebr_ctx; - - LOG_FUNC_IN; - - if ( (ebi < ESM_EBI_MIN) || (ebi > ESM_EBI_MAX) ) { - LOG_FUNC_RETURN (RETURNerror); - } - - /* Get EPS bearer context data */ - ebr_ctx = ctx->esm_data_ctx.ebr.context[ebi - ESM_EBI_MIN]; - - if ( (ebr_ctx == NULL) || (ebr_ctx->ebi != ebi) ) { - /* EPS bearer context not assigned */ - LOG_FUNC_RETURN (RETURNerror); - } - - /* Do not release active EPS bearer context */ - if (ebr_ctx->status != ESM_EBR_INACTIVE) { - LOG_TRACE(ERROR, "ESM-FSM - EPS bearer context is not INACTIVE"); - LOG_FUNC_RETURN (RETURNerror); - } - - /* Stop the retransmission timer if still running */ - if (ebr_ctx->timer.id != NAS_TIMER_INACTIVE_ID) { - LOG_TRACE(INFO, "ESM-FSM - Stop retransmission timer %d", - ebr_ctx->timer.id); - ebr_ctx->timer.id = nas_timer_stop(ebr_ctx->timer.id); - MSC_LOG_EVENT(MSC_NAS_ESM_MME, "0 Timer %x ebi %u stopped",ebr_ctx->timer.id, ebi); - } - - /* Release the retransmisison timer parameters */ - if (ebr_ctx->args) { - if (ebr_ctx->args->msg.length > 0) { - free(ebr_ctx->args->msg.value); - } - - free(ebr_ctx->args); - ebr_ctx->args = NULL; - } - - /* Release EPS bearer context data */ - free(ebr_ctx); - ebr_ctx = NULL; - - LOG_TRACE(INFO, "ESM-FSM - EPS bearer context %d released", ebi); - LOG_FUNC_RETURN (RETURNok); -} - -/**************************************************************************** - ** ** - ** Name: esm_ebr_start_timer() ** - ** ** - ** Description: Start the timer of the specified EPS bearer context to ** - ** expire after a given time interval. Timer expiration will ** - ** schedule execution of the callback function where stored ** - ** ESM message should be re-transmit. ** - ** ** - ** Inputs: ueid: Lower layers UE identifier ** - ** ebi: The identity of the EPS bearer ** - ** msg: The encoded ESM message to be stored ** - ** sec: The value of the time interval in seconds ** - ** cb: Function executed upon timer expiration ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: _esm_ebr_data ** - ** ** - ***************************************************************************/ -int esm_ebr_start_timer(emm_data_context_t *ctx, int ebi, const OctetString *msg, - long sec, nas_timer_callback_t cb) -{ - esm_ebr_context_t *ebr_ctx; - - LOG_FUNC_IN; - - if ( (ebi < ESM_EBI_MIN) || (ebi > ESM_EBI_MAX) ) { - LOG_TRACE(ERROR, "ESM-FSM - Retransmission timer bad ebi %d", - ebi); - LOG_FUNC_RETURN (RETURNerror); - } - - /* Get EPS bearer context data */ - ebr_ctx = ctx->esm_data_ctx.ebr.context[ebi - ESM_EBI_MIN]; - - if ( (ebr_ctx == NULL) || (ebr_ctx->ebi != ebi) ) { - /* EPS bearer context not assigned */ - LOG_TRACE(ERROR, "ESM-FSM - EPS bearer context not assigned"); - LOG_FUNC_RETURN (RETURNerror); - } - - if (ebr_ctx->timer.id != NAS_TIMER_INACTIVE_ID) { - if (ebr_ctx->args) { - /* Re-start the retransmission timer */ - ebr_ctx->timer.id = nas_timer_restart(ebr_ctx->timer.id); - MSC_LOG_EVENT(MSC_NAS_ESM_MME, "0 Timer %x ebi %u restarted",ebr_ctx->timer.id, ebi); - } - } else { - /* Setup the retransmission timer parameters */ - ebr_ctx->args = (esm_ebr_timer_data_t *)malloc(sizeof(esm_ebr_timer_data_t)); - - if (ebr_ctx->args) { - /* Set the UE identifier */ - ebr_ctx->args->ueid = ctx->ueid; - /* Set the EPS bearer identity */ - ebr_ctx->args->ebi = ebi; - /* Reset the retransmission counter */ - ebr_ctx->args->count = 0; - /* Set the ESM message to be re-transmited */ - ebr_ctx->args->msg.value = (uint8_t *)malloc(msg->length); - ebr_ctx->args->msg.length = 0; - - if (ebr_ctx->args->msg.value) { - memcpy(ebr_ctx->args->msg.value, msg->value, msg->length); - ebr_ctx->args->msg.length = msg->length; - } - - /* Setup the retransmission timer to expire at the given - * time interval */ - ebr_ctx->timer.id = nas_timer_start(sec, cb, ebr_ctx->args); - MSC_LOG_EVENT(MSC_NAS_ESM_MME, "0 Timer %x ebi %u started",ebr_ctx->timer.id, ebi); - ebr_ctx->timer.sec = sec; - } - } - - if ( (ebr_ctx->args != NULL) && (ebr_ctx->timer.id != NAS_TIMER_INACTIVE_ID) ) { - LOG_TRACE(INFO, "ESM-FSM - Retransmission timer %d expires in " - "%ld seconds", ebr_ctx->timer.id, ebr_ctx->timer.sec); - LOG_FUNC_RETURN (RETURNok); - } else { - LOG_TRACE(ERROR, "ESM-FSM - ebr_ctx->args == NULL(%p) or ebr_ctx->timer.id == NAS_TIMER_INACTIVE_ID == -1 (%d)" , - ebr_ctx->args, - ebr_ctx->timer.id); - } - - LOG_FUNC_RETURN (RETURNerror); -} - -/**************************************************************************** - ** ** - ** Name: esm_ebr_stop_timer() ** - ** ** - ** Description: Stop the timer previously started for the given EPS bea- ** - ** rer context ** - ** ** - ** Inputs: ueid: Lower layers UE identifier ** - ** ebi: The identity of the EPS bearer ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: _esm_ebr_data ** - ** ** - ***************************************************************************/ -int esm_ebr_stop_timer(emm_data_context_t *ctx, int ebi) -{ - esm_ebr_context_t *ebr_ctx ; - - LOG_FUNC_IN; - - if ( (ebi < ESM_EBI_MIN) || (ebi > ESM_EBI_MAX) ) { - LOG_FUNC_RETURN (RETURNerror); - } - - /* Get EPS bearer context data */ - ebr_ctx = ctx->esm_data_ctx.ebr.context[ebi - ESM_EBI_MIN]; - - if ( (ebr_ctx == NULL) || (ebr_ctx->ebi != ebi) ) { - /* EPS bearer context not assigned */ - LOG_FUNC_RETURN (RETURNerror); - } - - /* Stop the retransmission timer if still running */ - if (ebr_ctx->timer.id != NAS_TIMER_INACTIVE_ID) { - LOG_TRACE(INFO, "ESM-FSM - Stop retransmission timer %d", - ebr_ctx->timer.id); - ebr_ctx->timer.id = nas_timer_stop(ebr_ctx->timer.id); - MSC_LOG_EVENT(MSC_NAS_ESM_MME, "0 Timer %x ebi %u stopped",ebr_ctx->timer.id, ebi); - } - - /* Release the retransmisison timer parameters */ - if (ebr_ctx->args) { - if (ebr_ctx->args->msg.length > 0) { - free(ebr_ctx->args->msg.value); - } - - free(ebr_ctx->args); - ebr_ctx->args = NULL; - } - - LOG_FUNC_RETURN (RETURNok); -} - -/**************************************************************************** - ** ** - ** Name: esm_ebr_get_pending_ebi() ** - ** ** - ** Description: Returns the EPS bearer identity assigned to the first EPS ** - ** bearer context entry which is pending in the given state ** - ** ** - ** Inputs: ueid: Lower layers UE identifier ** - ** status: The EPS bearer context status ** - ** Others: _esm_ebr_data ** - ** ** - ** Outputs: None ** - ** Return: The EPS bearer identity of the EPS bearer ** - ** context entry if it exists; ** - ** the not assigned EBI (0) otherwise. ** - ** Others: None ** - ** ** - ***************************************************************************/ -int esm_ebr_get_pending_ebi(emm_data_context_t *ctx, esm_ebr_state status) -{ - int i; - - LOG_FUNC_IN; - - for (i = 0; i < ESM_EBR_DATA_SIZE; i++) { - if (ctx->esm_data_ctx.ebr.context[i] == NULL) { - continue; - } - - if (ctx->esm_data_ctx.ebr.context[i]->status != status) { - continue; - } - - /* EPS bearer context entry found */ - break; - } - - if (i < ESM_EBR_DATA_SIZE) { - LOG_FUNC_RETURN (ctx->esm_data_ctx.ebr.context[i]->ebi); - } - - /* EPS bearer context entry not found */ - LOG_FUNC_RETURN (ESM_EBI_UNASSIGNED); -} - -/**************************************************************************** - ** ** - ** Name: esm_ebr_set_status() ** - ** ** - ** Description: Set the status of the specified EPS bearer context to the ** - ** given state ** - ** ** - ** Inputs: ueid: Lower layers UE identifier ** - ** ebi: The identity of the EPS bearer ** - ** status: The new EPS bearer context status ** - ** ue_requested: TRUE/FALSE if the modification of the EPS ** - ** bearer context status was requested by the ** - ** UE/network ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: _esm_ebr_data ** - ** ** - ***************************************************************************/ -int esm_ebr_set_status( - emm_data_context_t *ctx, - int ebi, esm_ebr_state status, int ue_requested) -{ - esm_ebr_context_t *ebr_ctx; - esm_ebr_state old_status; - - LOG_FUNC_IN; - - if (ctx == NULL) { - LOG_FUNC_RETURN (RETURNerror); - } - - - if ( (ebi < ESM_EBI_MIN) || (ebi > ESM_EBI_MAX) ) { - LOG_FUNC_RETURN (RETURNerror); - } - - /* Get EPS bearer context data */ - ebr_ctx = ctx->esm_data_ctx.ebr.context[ebi - ESM_EBI_MIN]; - - if ( (ebr_ctx == NULL) || (ebr_ctx->ebi != ebi) ) { - /* EPS bearer context not assigned */ - LOG_TRACE(ERROR, "ESM-FSM - EPS bearer context not assigned " - "(ebi=%d)", ebi); - LOG_FUNC_RETURN (RETURNerror); - } - - old_status = ebr_ctx->status; - - if (status < ESM_EBR_STATE_MAX) { - if (status != old_status) { - LOG_TRACE(INFO, "ESM-FSM - Status of EPS bearer context %d changed:" - " %s ===> %s", ebi, - _esm_ebr_state_str[old_status], _esm_ebr_state_str[status]); - MSC_LOG_EVENT(MSC_NAS_ESM_MME, "0 ESM state %s => %s "NAS_UE_ID_FMT" ", - _esm_ebr_state_str[old_status], _esm_ebr_state_str[status], ctx->ueid); - - ebr_ctx->status = status; - LOG_FUNC_RETURN (RETURNok); - } else { - LOG_TRACE(INFO, "ESM-FSM - Status of EPS bearer context %d unchanged:" - " %s ", ebi, _esm_ebr_state_str[status]); - } - } - - LOG_FUNC_RETURN (RETURNerror); -} - -/**************************************************************************** - ** ** - ** Name: esm_ebr_get_status() ** - ** ** - ** Description: Get the current status value of the specified EPS bearer ** - ** context ** - ** ** - ** Inputs: ueid: Lower layers UE identifier ** - ** ebi: The identity of the EPS bearer ** - ** Others: _esm_ebr_data ** - ** ** - ** Outputs: None ** - ** Return: The current value of the EPS bearer con- ** - ** text status ** - ** Others: None ** - ** ** - ***************************************************************************/ -esm_ebr_state esm_ebr_get_status( - emm_data_context_t *ctx, - int ebi) -{ - if ( (ebi < ESM_EBI_MIN) || (ebi > ESM_EBI_MAX) ) { - return (ESM_EBR_INACTIVE); - } - - if (ctx->esm_data_ctx.ebr.context[ebi - ESM_EBI_MIN] == NULL) { - /* EPS bearer context not allocated */ - return (ESM_EBR_INACTIVE); - } - - if (ctx->esm_data_ctx.ebr.context[ebi - ESM_EBI_MIN]->ebi != ebi) { - /* EPS bearer context not assigned */ - return (ESM_EBR_INACTIVE); - } - - return (ctx->esm_data_ctx.ebr.context[ebi - ESM_EBI_MIN]->status); -} - - -/**************************************************************************** - ** ** - ** Name: esm_ebr_is_reserved() ** - ** ** - ** Description: Check whether the given EPS bearer identity is a reserved ** - ** value ** - ** ** - ** Inputs: ebi: The identity of the EPS bearer ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: TRUE, FALSE ** - ** Others: None ** - ** ** - ***************************************************************************/ -int esm_ebr_is_reserved(int ebi) -{ - return ( (ebi != ESM_EBI_UNASSIGNED) && (ebi < ESM_EBI_MIN) ); -} - -/**************************************************************************** - ** ** - ** Name: esm_ebr_is_not_in_use() ** - ** ** - ** Description: Check whether the given EPS bearer identity does not ** - ** match an assigned EBI value currently in use ** - ** ** - ** Inputs: ueid: Lower layers UE identifier ** - ** ebi: The identity of the EPS bearer ** - ** Others: _esm_ebr_data ** - ** ** - ** Outputs: None ** - ** Return: TRUE, FALSE ** - ** Others: None ** - ** ** - ***************************************************************************/ -int esm_ebr_is_not_in_use( - emm_data_context_t *ctx, - int ebi) -{ - - return ( (ebi == ESM_EBI_UNASSIGNED) || - (ctx->esm_data_ctx.ebr.context[ebi - ESM_EBI_MIN] == NULL) || - (ctx->esm_data_ctx.ebr.context[ebi - ESM_EBI_MIN]->ebi) != ebi); -} - -/****************************************************************************/ -/********************* L O C A L F U N C T I O N S *********************/ -/****************************************************************************/ - -/**************************************************************************** - ** ** - ** Name: _esm_ebr_get_available_entry() ** - ** ** - ** Description: Returns the index of the next available entry in the list ** - ** of EPS bearer context data ** - ** ** - ** Inputs: ueid: Lower layers UE identifier ** - ** Others: _esm_ebr_data ** - ** ** - ** Outputs: None ** - ** Return: The index of the next available EPS bearer ** - ** context data entry; -1 if no any entry is ** - ** available. ** - ** Others: None ** - ** ** - ***************************************************************************/ -static int _esm_ebr_get_available_entry(emm_data_context_t *ctx) -{ - int i; - - for (i = ctx->esm_data_ctx.ebr.index; i < ESM_EBR_DATA_SIZE; i++) { - if (ctx->esm_data_ctx.ebr.context[i] != NULL) { - continue; - } - - return i; - } - - for (i = 0; i < ctx->esm_data_ctx.ebr.index; i++) { - if (ctx->esm_data_ctx.ebr.context[i] != NULL) { - continue; - } - - return i; - } - - /* No available EBI entry found */ - return (-1); -} diff --git a/openair-cn/NAS/MME/ESM/esm_ebr.h b/openair-cn/NAS/MME/ESM/esm_ebr.h deleted file mode 100644 index bacd62802c..0000000000 --- a/openair-cn/NAS/MME/ESM/esm_ebr.h +++ /dev/null @@ -1,89 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source esm_ebr.h - -Version 0.1 - -Date 2013/01/29 - -Product NAS stack - -Subsystem EPS Session Management - -Author Frederic Maurel - -Description Defines functions used to handle state of EPS bearer contexts - and manage ESM messages re-transmission. - -*****************************************************************************/ -#ifndef __ESM_EBR_H__ -#define __ESM_EBR_H__ - -#include "OctetString.h" -#include "nas_timer.h" - -/****************************************************************************/ -/********************* G L O B A L C O N S T A N T S *******************/ -/****************************************************************************/ - -/* Unassigned EPS bearer identity value */ -#define ESM_EBI_UNASSIGNED (EPS_BEARER_IDENTITY_UNASSIGNED) - -/****************************************************************************/ -/************************ G L O B A L T Y P E S ************************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************** G L O B A L V A R I A B L E S ********************/ -/****************************************************************************/ - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -int esm_ebr_is_reserved(int ebi); - -void esm_ebr_initialize(void); -int esm_ebr_assign(emm_data_context_t *ctx, int ebi); -int esm_ebr_release(emm_data_context_t *ctx, int ebi); - -int esm_ebr_start_timer(emm_data_context_t *ctx, int ebi, const OctetString *msg, - long sec, nas_timer_callback_t cb); -int esm_ebr_stop_timer(emm_data_context_t *ctx, int ebi); - -int esm_ebr_get_pending_ebi(emm_data_context_t *ctx, esm_ebr_state status); - -int esm_ebr_set_status(emm_data_context_t *ctx, int ebi, esm_ebr_state status, - int ue_requested); -esm_ebr_state esm_ebr_get_status(emm_data_context_t *ctx, int ebi); - -int esm_ebr_is_not_in_use(emm_data_context_t *ctx, int ebi); - -#endif /* __ESM_EBR_H__*/ diff --git a/openair-cn/NAS/MME/ESM/esm_ebr_context.c b/openair-cn/NAS/MME/ESM/esm_ebr_context.c deleted file mode 100644 index db0d99500f..0000000000 --- a/openair-cn/NAS/MME/ESM/esm_ebr_context.c +++ /dev/null @@ -1,431 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source esm_ebr_context.h - -Version 0.1 - -Date 2013/05/28 - -Product NAS stack - -Subsystem EPS Session Management - -Author Frederic Maurel - -Description Defines functions used to handle EPS bearer contexts. - -*****************************************************************************/ -#include <stdlib.h> // malloc, free -#include <string.h> // memset - -#include "commonDef.h" -#include "nas_log.h" - -#include "emmData.h" -#include "esm_ebr.h" - -#include "esm_ebr_context.h" - -#include "emm_sap.h" - -#if defined(ENABLE_ITTI) -# include "assertions.h" -#endif - - - -/****************************************************************************/ -/**************** E X T E R N A L D E F I N I T I O N S ****************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************* L O C A L D E F I N I T I O N S *******************/ -/****************************************************************************/ - - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -/**************************************************************************** - ** ** - ** Name: esm_ebr_context_create() ** - ** ** - ** Description: Creates a new EPS bearer context to the PDN with the spe- ** - ** cified PDN connection identifier ** - ** ** - ** Inputs: ueid: UE identifier ** - ** pid: PDN connection identifier ** - ** ebi: EPS bearer identity ** - ** is_default: TRUE if the new bearer is a default EPS ** - ** bearer context ** - ** esm_qos: EPS bearer level QoS parameters ** - ** tft: Traffic flow template parameters ** - ** Others: _esm_data ** - ** ** - ** Outputs: None ** - ** Return: The EPS bearer identity of the default EPS ** - ** bearer associated to the new EPS bearer ** - ** context if successfully created; ** - ** UNASSIGN EPS bearer value otherwise. ** - ** Others: _esm_data ** - ** ** - ***************************************************************************/ -int esm_ebr_context_create( - emm_data_context_t *ctx, - int pid, int ebi, int is_default, - const network_qos_t *qos, const network_tft_t *tft) -{ - int bid = 0; - esm_data_context_t *esm_ctx = NULL; - esm_pdn_t *pdn = NULL; - unsigned int ueid = 0; - - LOG_FUNC_IN; - - -# if defined(NAS_BUILT_IN_EPC) - esm_ctx = &ctx->esm_data_ctx; -# else - - if (ueid < ESM_DATA_NB_UE_MAX) { - ctx = _esm_data.ctx[ueid]; - } else { - LOG_FUNC_RETURN (ESM_EBI_UNASSIGNED); - } - -# endif - - bid = ESM_DATA_EPS_BEARER_MAX; - - LOG_TRACE(INFO, "ESM-PROC - Create new %s EPS bearer context (ebi=%d) " - "for PDN connection (pid=%d)", - (is_default)? "default" : "dedicated", ebi, pid); - - if (pid < ESM_DATA_PDN_MAX) { - if (pid != esm_ctx->pdn[pid].pid) { - LOG_TRACE(ERROR, "ESM-PROC - PDN connection identifier %d is " - "not valid", pid); - } else if (esm_ctx->pdn[pid].data == NULL) { - LOG_TRACE(ERROR, "ESM-PROC - PDN connection %d has not been " - "allocated", pid); - } - /* Check the total number of active EPS bearers */ - else if (esm_ctx->n_ebrs > ESM_DATA_EPS_BEARER_TOTAL) { - LOG_TRACE(WARNING, "ESM-PROC - The total number of active EPS" - "bearers is exceeded"); - } else { - /* Get the PDN connection entry */ - pdn = esm_ctx->pdn[pid].data; - - if (is_default) { - /* Default EPS bearer entry is defined at index 0 */ - bid = 0; - - if (pdn->bearer[bid] != NULL) { - LOG_TRACE(ERROR, "ESM-PROC - A default EPS bearer context " - "is already allocated"); - LOG_FUNC_RETURN (ESM_EBI_UNASSIGNED); - } - } else { - /* Search for an available EPS bearer context entry */ - for (bid = 1; bid < ESM_DATA_EPS_BEARER_MAX; bid++) { - if (pdn->bearer[bid] != NULL) { - continue; - } - - break; - } - } - } - } - - if (bid < ESM_DATA_EPS_BEARER_MAX) { - /* Create new EPS bearer context */ - esm_bearer_t *ebr = (esm_bearer_t *)malloc(sizeof(esm_bearer_t)); - - if (ebr != NULL) { - memset(ebr, 0 , sizeof(esm_bearer_t)); - /* Increment the total number of active EPS bearers */ - esm_ctx->n_ebrs += 1; - /* Increment the number of EPS bearer for this PDN connection */ - pdn->n_bearers += 1; - /* Setup the EPS bearer data */ - pdn->bearer[bid] = ebr; - ebr->bid = bid; - ebr->ebi = ebi; - - if (qos != NULL) { - /* EPS bearer level QoS parameters */ - ebr->qos = *qos; - } - - if ( (tft != NULL) && (tft->n_pkfs < NET_PACKET_FILTER_MAX) ) { - int i; - - /* Traffic flow template parameters */ - for (i = 0; i < tft->n_pkfs; i++) { - ebr->tft.pkf[i] = - (network_pkf_t *)malloc(sizeof(network_pkf_t)); - - if (ebr->tft.pkf[i] != NULL) { - *(ebr->tft.pkf[i]) = *(tft->pkf[i]); - ebr->tft.n_pkfs += 1; - } - } - } - - if (is_default) { - /* Set the PDN connection activation indicator */ - esm_ctx->pdn[pid].is_active = TRUE; - - /* Update the emergency bearer services indicator */ - if (pdn->is_emergency) { - esm_ctx->emergency = TRUE; - } - - - } - - /* Return the EPS bearer identity of the default EPS bearer - * associated to the new EPS bearer context */ - LOG_FUNC_RETURN (pdn->bearer[0]->ebi); - } - - LOG_TRACE(WARNING, "ESM-PROC - Failed to create new EPS bearer " - "context (ebi=%d)", ebi); - } - - LOG_FUNC_RETURN (ESM_EBI_UNASSIGNED); -} - -/**************************************************************************** - ** ** - ** Name: esm_ebr_context_release() ** - ** ** - ** Description: Releases EPS bearer context entry previously allocated ** - ** to the EPS bearer with the specified EPS bearer identity ** - ** ** - ** Inputs: ueid: UE identifier ** - ** ebi: EPS bearer identity ** - ** Others: _esm_data ** - ** ** - ** Outputs: pid: Identifier of the PDN connection entry the ** - ** EPS bearer context belongs to ** - ** bid: Identifier of the released EPS bearer con- ** - ** text entry ** - ** Return: The EPS bearer identity associated to the ** - ** EPS bearer context if successfully relea- ** - ** sed; UNASSIGN EPS bearer value otherwise. ** - ** Others: _esm_data ** - ** ** - ***************************************************************************/ -int esm_ebr_context_release( - emm_data_context_t *ctx, - int ebi, int *pid, int *bid) -{ - int found = FALSE; - esm_pdn_t *pdn = NULL; - esm_data_context_t *esm_ctx; - - unsigned int ueid = 0; - - LOG_FUNC_IN; - - - -# if defined(NAS_BUILT_IN_EPC) - esm_ctx = &ctx->esm_data_ctx; -# else - - if (ueid < ESM_DATA_NB_UE_MAX) { - ctx = &_esm_data.ctx[ueid]; - } else { - LOG_FUNC_RETURN (ESM_EBI_UNASSIGNED); - } - -# endif - - if (ebi != ESM_EBI_UNASSIGNED) { - /* - * The identity of the EPS bearer to released is given; - * Release the EPS bearer context entry that match the specified EPS - * bearer identity - */ - - /* Search for active PDN connection */ - for (*pid = 0; *pid < ESM_DATA_PDN_MAX; (*pid)++) { - if ( !esm_ctx->pdn[*pid].is_active ) { - continue; - } - - /* An active PDN connection is found */ - if (esm_ctx->pdn[*pid].data != NULL) { - pdn = esm_ctx->pdn[*pid].data; - - /* Search for the specified EPS bearer context entry */ - for (*bid = 0; *bid < pdn->n_bearers; (*bid)++) { - if (pdn->bearer[*bid] != NULL) { - if (pdn->bearer[*bid]->ebi != ebi) { - continue; - } - - /* The EPS bearer context entry is found */ - found = TRUE; - break; - } - } - } - - if (found) { - break; - } - } - } else { - /* - * The identity of the EPS bearer to released is not given; - * Release the EPS bearer context entry allocated with the EPS - * bearer context identifier (bid) to establish connectivity to - * the PDN identified by the PDN connection identifier (pid). - * Default EPS bearer to a given PDN is always identified by the - * first EPS bearer context entry at index bid = 0 - */ - if (*pid < ESM_DATA_PDN_MAX) { - if (*pid != esm_ctx->pdn[*pid].pid) { - LOG_TRACE(ERROR, "ESM-PROC - PDN connection identifier %d " - "is not valid", *pid); - } else if (!esm_ctx->pdn[*pid].is_active) { - LOG_TRACE(WARNING,"ESM-PROC - PDN connection %d is not active", - *pid); - } else if (esm_ctx->pdn[*pid].data == NULL) { - LOG_TRACE(ERROR, "ESM-PROC - PDN connection %d has not been " - "allocated", *pid); - } else { - pdn = esm_ctx->pdn[*pid].data; - - if (pdn->bearer[*bid] != NULL) { - ebi = pdn->bearer[*bid]->ebi; - found = TRUE; - } - } - } - } - - if (found) { - int i, j; - - /* - * Delete the specified EPS bearer context entry - */ - if (pdn->bearer[*bid]->bid != *bid) { - LOG_TRACE(ERROR, "ESM-PROC - EPS bearer identifier %d is " - "not valid", *bid); - LOG_FUNC_RETURN (ESM_EBI_UNASSIGNED); - } - - LOG_TRACE(WARNING, "ESM-PROC - Release EPS bearer context " - "(ebi=%d)", ebi); - - /* Delete the TFT */ - for (i = 0; i < pdn->bearer[*bid]->tft.n_pkfs; i++) { - free(pdn->bearer[*bid]->tft.pkf[i]); - } - - /* Release the specified EPS bearer data */ - free(pdn->bearer[*bid]); - pdn->bearer[*bid] = NULL; - /* Decrement the number of EPS bearer context allocated - * to the PDN connection */ - pdn->n_bearers -= 1; - /* Decrement the total number of active EPS bearers */ - esm_ctx->n_ebrs -= 1; - - if (*bid == 0) { - /* 3GPP TS 24.301, section 6.4.4.3, 6.4.4.6 - * If the EPS bearer identity is that of the default bearer to a - * PDN, the UE shall delete all EPS bearer contexts associated to - * that PDN connection. - */ - for (i = 1; pdn->n_bearers > 0; i++) { - if (pdn->bearer[i]) { - - LOG_TRACE(WARNING, "ESM-PROC - Release EPS bearer context " - "(ebi=%d)", pdn->bearer[i]->ebi); - - /* Delete the TFT */ - for (j = 0; j < pdn->bearer[i]->tft.n_pkfs; j++) { - free(pdn->bearer[i]->tft.pkf[j]); - } - - /* Set the EPS bearer context state to INACTIVE */ - - (void) esm_ebr_set_status(ctx, pdn->bearer[i]->ebi, - ESM_EBR_INACTIVE, TRUE); - - /* Release EPS bearer data */ - (void) esm_ebr_release(ctx, pdn->bearer[i]->ebi); - // esm_ebr_release() - /* Release dedicated EPS bearer data */ - free(pdn->bearer[i]); - pdn->bearer[i] = NULL; - /* Decrement the number of EPS bearer context allocated - * to the PDN connection */ - pdn->n_bearers -= 1; - /* Decrement the total number of active EPS bearers */ - esm_ctx->n_ebrs -= 1; - } - } - - /* Reset the PDN connection activation indicator */ - esm_ctx->pdn[*pid].is_active = FALSE; - - /* Update the emergency bearer services indicator */ - if (pdn->is_emergency) { - esm_ctx->emergency = FALSE; - } - } - - if (esm_ctx->n_ebrs == 0) { - /* TODO: Release the PDN connection and marked the UE as inactive - * in the network for EPS services (is_attached = FALSE) */ - } - - LOG_FUNC_RETURN (ebi); - } - - LOG_FUNC_RETURN (ESM_EBI_UNASSIGNED); -} - - -/****************************************************************************/ -/********************* L O C A L F U N C T I O N S *********************/ -/****************************************************************************/ - - diff --git a/openair-cn/NAS/MME/ESM/esm_ebr_context.h b/openair-cn/NAS/MME/ESM/esm_ebr_context.h deleted file mode 100644 index c59661d768..0000000000 --- a/openair-cn/NAS/MME/ESM/esm_ebr_context.h +++ /dev/null @@ -1,73 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source esm_ebr_context.h - -Version 0.1 - -Date 2013/05/28 - -Product NAS stack - -Subsystem EPS Session Management - -Author Frederic Maurel - -Description Defines functions used to handle EPS bearer contexts. - -*****************************************************************************/ -#ifndef __ESM_EBR_CONTEXT_H__ -#define __ESM_EBR_CONTEXT_H__ - -#include "networkDef.h" - -/****************************************************************************/ -/********************* G L O B A L C O N S T A N T S *******************/ -/****************************************************************************/ - -/****************************************************************************/ -/************************ G L O B A L T Y P E S ************************/ -/****************************************************************************/ - - -/****************************************************************************/ -/******************** G L O B A L V A R I A B L E S ********************/ -/****************************************************************************/ - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - - -int esm_ebr_context_create(emm_data_context_t *ctx, int pid, int ebi, int is_default, - const network_qos_t *qos, const network_tft_t *tft); - -int esm_ebr_context_release(emm_data_context_t *ctx, int ebi, int *pid, int *bid); - -#endif /* __ESM_EBR_CONTEXT_H__ */ diff --git a/openair-cn/NAS/MME/ESM/esm_ip.c b/openair-cn/NAS/MME/ESM/esm_ip.c deleted file mode 100644 index b2fb84b970..0000000000 --- a/openair-cn/NAS/MME/ESM/esm_ip.c +++ /dev/null @@ -1,74 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -#include "emmData.h" -#include "esmData.h" - -char ip_addr_str[100]; - -inline char *esm_data_get_ipv4_addr(const OctetString *ip_addr) -{ - if (ip_addr->length > 0) { - sprintf(ip_addr_str, "%u.%u.%u.%u", - ip_addr->value[0], ip_addr->value[1], - ip_addr->value[2], ip_addr->value[3]); - return ip_addr_str; - } - - return (NULL); -} - -inline char *esm_data_get_ipv6_addr(const OctetString *ip_addr) -{ - if (ip_addr->length > 0) { - sprintf(ip_addr_str, "%x%.2x:%x%.2x:%x%.2x:%x%.2x", - ip_addr->value[0], ip_addr->value[1], - ip_addr->value[2], ip_addr->value[3], - ip_addr->value[4], ip_addr->value[5], - ip_addr->value[6], ip_addr->value[7]); - return ip_addr_str; - } - - return (NULL); -} - -inline char *esm_data_get_ipv4v6_addr(const OctetString *ip_addr) -{ - if (ip_addr->length > 0) { - sprintf(ip_addr_str, "%u.%u.%u.%u / %x%.2x:%x%.2x:%x%.2x:%x%.2x", - ip_addr->value[0], ip_addr->value[1], - ip_addr->value[2], ip_addr->value[3], - ip_addr->value[4], ip_addr->value[5], - ip_addr->value[6], ip_addr->value[7], - ip_addr->value[8], ip_addr->value[9], - ip_addr->value[10], ip_addr->value[11]); - return ip_addr_str; - } - - return (NULL); -} diff --git a/openair-cn/NAS/MME/ESM/esm_main.c b/openair-cn/NAS/MME/ESM/esm_main.c deleted file mode 100644 index 3e883527b9..0000000000 --- a/openair-cn/NAS/MME/ESM/esm_main.c +++ /dev/null @@ -1,134 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source esm_main.c - -Version 0.1 - -Date 2012/12/04 - -Product NAS stack - -Subsystem EPS Session Management - -Author Frederic Maurel - -Description Defines the EPS Session Management procedure call manager, - the main entry point for elementary ESM processing. - -*****************************************************************************/ - -#include "esm_main.h" -#include "commonDef.h" -#include "nas_log.h" - -#include "emmData.h" -#include "esmData.h" -#include "esm_pt.h" -#include "esm_ebr.h" - -/****************************************************************************/ -/**************** E X T E R N A L D E F I N I T I O N S ****************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************* L O C A L D E F I N I T I O N S *******************/ -/****************************************************************************/ - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - - -/**************************************************************************** - ** ** - ** Name: esm_main_initialize() ** - ** ** - ** Description: Initializes ESM internal data ** - ** ** - ** Inputs: None ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: None ** - ** Others: None ** - ** ** - ***************************************************************************/ -void esm_main_initialize(void) -{ - int i; - - LOG_FUNC_IN; - - /* Retreive MME supported configuration data */ - if (mme_api_get_esm_config(&_esm_data.conf) != RETURNok) { - LOG_TRACE(ERROR, "ESM-MAIN - Failed to get MME configuration data"); - } - -# if !defined(NAS_BUILT_IN_EPC) - - /* Initialize ESM contexts */ - for (i = 0; i < ESM_DATA_NB_UE_MAX; i++) { - _esm_data.ctx[i] = NULL; - } - -# endif - - /* Initialize the EPS bearer context manager */ - esm_ebr_initialize(); - - LOG_FUNC_OUT; -} - -/**************************************************************************** - ** ** - ** Name: esm_main_cleanup() ** - ** ** - ** Description: Performs the EPS Session Management clean up procedure ** - ** ** - ** Inputs: None ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: None ** - ** Others: None ** - ** ** - ***************************************************************************/ -void esm_main_cleanup(void) -{ - LOG_FUNC_IN; - - LOG_FUNC_OUT; -} - - -/****************************************************************************/ -/********************* L O C A L F U N C T I O N S *********************/ -/****************************************************************************/ - diff --git a/openair-cn/NAS/MME/ESM/esm_main.h b/openair-cn/NAS/MME/ESM/esm_main.h deleted file mode 100644 index feb80c1c45..0000000000 --- a/openair-cn/NAS/MME/ESM/esm_main.h +++ /dev/null @@ -1,73 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source esm_main.h - -Version 0.1 - -Date 2012/12/04 - -Product NAS stack - -Subsystem EPS Session Management - -Author Frederic Maurel - -Description Defines the EPS Session Management procedure call manager, - the main entry point for elementary ESM processing. - -*****************************************************************************/ - -#ifndef __ESM_MAIN_H__ -#define __ESM_MAIN_H__ - -#include "networkDef.h" - -/****************************************************************************/ -/********************* G L O B A L C O N S T A N T S *******************/ -/****************************************************************************/ - -/****************************************************************************/ -/************************ G L O B A L T Y P E S ************************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************** G L O B A L V A R I A B L E S ********************/ -/****************************************************************************/ - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - - -void esm_main_initialize(void); -void esm_main_cleanup(void); - - -#endif /* __ESM_MAIN_H__*/ diff --git a/openair-cn/NAS/MME/ESM/esm_proc.h b/openair-cn/NAS/MME/ESM/esm_proc.h deleted file mode 100644 index 3015be6543..0000000000 --- a/openair-cn/NAS/MME/ESM/esm_proc.h +++ /dev/null @@ -1,204 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source esm_proc.h - -Version 0.1 - -Date 2013/01/02 - -Product NAS stack - -Subsystem EPS Session Management - -Author Frederic Maurel - -Description Defines the EPS Session Management procedures executed at - the ESM Service Access Points. - -*****************************************************************************/ -#ifndef __ESM_PROC_H__ -#define __ESM_PROC_H__ - -#include "networkDef.h" -#include "OctetString.h" -#include "emmData.h" -#include "ProtocolConfigurationOptions.h" - -/****************************************************************************/ -/********************* G L O B A L C O N S T A N T S *******************/ -/****************************************************************************/ - -/* - * ESM retransmission timers - * ------------------------- - */ - -#define T3485_DEFAULT_VALUE 8 /* Activate EPS bearer request */ -#define T3495_DEFAULT_VALUE 8 /* Deactivate EPS bearer request */ - -/* Type of PDN address */ -typedef enum { - ESM_PDN_TYPE_IPV4 = NET_PDN_TYPE_IPV4, - ESM_PDN_TYPE_IPV6 = NET_PDN_TYPE_IPV6, - ESM_PDN_TYPE_IPV4V6 = NET_PDN_TYPE_IPV4V6 -} esm_proc_pdn_type_t; - -/* Type of PDN request */ -typedef enum { - ESM_PDN_REQUEST_INITIAL = 1, - ESM_PDN_REQUEST_HANDOVER, - ESM_PDN_REQUEST_EMERGENCY -} esm_proc_pdn_request_t; - -/****************************************************************************/ -/************************ G L O B A L T Y P E S ************************/ -/****************************************************************************/ - -/* - * Type of the ESM procedure callback executed when requested by the UE - * or initiated by the network - */ -typedef int (*esm_proc_procedure_t) (int, emm_data_context_t *, int, OctetString *, int); - -/* EPS bearer level QoS parameters */ -typedef network_qos_t esm_proc_qos_t; - -/* Traffic Flow Template for packet filtering */ -typedef network_tft_t esm_proc_tft_t; - -typedef ProtocolConfigurationOptions esm_proc_pco_t; - -/* PDN connection and EPS bearer context data */ -typedef struct { - OctetString apn; - esm_proc_pdn_type_t pdn_type; - OctetString pdn_addr; - esm_proc_qos_t qos; - esm_proc_tft_t tft; - esm_proc_pco_t pco; -} esm_proc_data_t; - -/****************************************************************************/ -/******************** G L O B A L V A R I A B L E S ********************/ -/****************************************************************************/ - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -/* - * -------------------------------------------------------------------------- - * ESM status procedure - * -------------------------------------------------------------------------- - */ - - -int esm_proc_status_ind(emm_data_context_t *ctx, int pti, int ebi, int *esm_cause); -int esm_proc_status(int is_standalone, emm_data_context_t *ctx, int pti, - OctetString *msg, int sent_by_ue); - - -/* - * -------------------------------------------------------------------------- - * PDN connectivity procedure - * -------------------------------------------------------------------------- - */ - -int esm_proc_pdn_connectivity_request(emm_data_context_t *ctx, int pti, - esm_proc_pdn_request_t request_type, OctetString *apn, - esm_proc_pdn_type_t pdn_type, OctetString *pdn_addr, esm_proc_qos_t *esm_qos, - int *esm_cause); - -int esm_proc_pdn_connectivity_reject(int is_standalone, emm_data_context_t *ctx, - int ebi, OctetString *msg, int ue_triggered); -int esm_proc_pdn_connectivity_failure(emm_data_context_t *ctx, int pid); - -/* - * -------------------------------------------------------------------------- - * PDN disconnect procedure - * -------------------------------------------------------------------------- - */ - -int esm_proc_pdn_disconnect_request(emm_data_context_t *ctx, int pti, int *esm_cause); - -int esm_proc_pdn_disconnect_accept(emm_data_context_t *ctx, int pid, int *esm_cause); -int esm_proc_pdn_disconnect_reject(int is_standalone, emm_data_context_t *ctx, - int ebi, OctetString *msg, int ue_triggered); - -/* - * -------------------------------------------------------------------------- - * Default EPS bearer context activation procedure - * -------------------------------------------------------------------------- - */ -int esm_proc_default_eps_bearer_context(emm_data_context_t *ctx, int pid, - unsigned int *ebi, const esm_proc_qos_t *esm_qos, int *esm_cause); -int esm_proc_default_eps_bearer_context_request(int is_standalone, - emm_data_context_t *ctx, int ebi, OctetString *msg, int ue_triggered); -int esm_proc_default_eps_bearer_context_failure(emm_data_context_t *ctx); - -int esm_proc_default_eps_bearer_context_accept(emm_data_context_t *ctx, int ebi, - int *esm_cause); -int esm_proc_default_eps_bearer_context_reject(emm_data_context_t *ctx, int ebi, - int *esm_cause); - - -/* - * -------------------------------------------------------------------------- - * Dedicated EPS bearer context activation procedure - * -------------------------------------------------------------------------- - */ -int esm_proc_dedicated_eps_bearer_context(emm_data_context_t *ctx, int pid, - unsigned int *ebi, unsigned int *default_ebi, const esm_proc_qos_t *qos, - const esm_proc_tft_t *tft, int *esm_cause); -int esm_proc_dedicated_eps_bearer_context_request(int is_standalone, - emm_data_context_t *ctx, int ebi, OctetString *msg, int ue_triggered); - -int esm_proc_dedicated_eps_bearer_context_accept(emm_data_context_t *ctx, int ebi, - int *esm_cause); -int esm_proc_dedicated_eps_bearer_context_reject(emm_data_context_t *ctx, int ebi, - int *esm_cause); - - -/* - * -------------------------------------------------------------------------- - * EPS bearer context deactivation procedure - * -------------------------------------------------------------------------- - */ -int esm_proc_eps_bearer_context_deactivate(emm_data_context_t *ctx, int is_local, - int ebi, int *pid, int *bid, - int *esm_cause); -int esm_proc_eps_bearer_context_deactivate_request(int is_standalone, - emm_data_context_t *ctx, int ebi, OctetString *msg, int ue_triggered); -int esm_proc_eps_bearer_context_deactivate_accept(emm_data_context_t *ctx, int ebi, - int *esm_cause); - - - -#endif /* __ESM_PROC_H__*/ diff --git a/openair-cn/NAS/MME/ESM/esm_pt.c b/openair-cn/NAS/MME/ESM/esm_pt.c deleted file mode 100644 index d9e1be5150..0000000000 --- a/openair-cn/NAS/MME/ESM/esm_pt.c +++ /dev/null @@ -1,95 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source esm_pt.c - -Version 0.1 - -Date 2013/01/03 - -Product NAS stack - -Subsystem EPS Session Management - -Author Frederic Maurel - -Description Defines functions used to handle ESM procedure transactions. - -*****************************************************************************/ - -#include "esm_pt.h" - - -/****************************************************************************/ -/**************** E X T E R N A L D E F I N I T I O N S ****************/ -/****************************************************************************/ - -/* - * Minimal and maximal value of a procedure transaction identity: - * The Procedure Transaction Identity (PTI) identifies bi-directional - * messages flows - */ -#define ESM_PTI_MIN (PROCEDURE_TRANSACTION_IDENTITY_FIRST) -#define ESM_PTI_MAX (PROCEDURE_TRANSACTION_IDENTITY_LAST) - -/****************************************************************************/ -/******************* L O C A L D E F I N I T I O N S *******************/ -/****************************************************************************/ - - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - - - -/**************************************************************************** - ** ** - ** Name: esm_pt_is_reserved() ** - ** ** - ** Description: Check whether the given procedure transaction identity is ** - ** a reserved value ** - ** ** - ** Inputs: pti: The identity of the procedure transaction ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: TRUE, FALSE ** - ** Others: None ** - ** ** - ***************************************************************************/ -int esm_pt_is_reserved(int pti) -{ - return ( (pti != ESM_PT_UNASSIGNED) && (pti > ESM_PTI_MAX) ); -} - -/****************************************************************************/ -/********************* L O C A L F U N C T I O N S *********************/ -/****************************************************************************/ - diff --git a/openair-cn/NAS/MME/ESM/esm_pt.h b/openair-cn/NAS/MME/ESM/esm_pt.h deleted file mode 100644 index 2a2cf81202..0000000000 --- a/openair-cn/NAS/MME/ESM/esm_pt.h +++ /dev/null @@ -1,74 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source esm_pt.h - -Version 0.1 - -Date 2013/01/03 - -Product NAS stack - -Subsystem EPS Session Management - -Author Frederic Maurel - -Description Defines functions used to handle ESM procedure transactions. - -*****************************************************************************/ -#ifndef __ESM_PT_H__ -#define __ESM_PT_H__ - -#include "ProcedureTransactionIdentity.h" - -/****************************************************************************/ -/********************* G L O B A L C O N S T A N T S *******************/ -/****************************************************************************/ - -/* Unassigned procedure transaction identity value */ -#define ESM_PT_UNASSIGNED (PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED) - -/****************************************************************************/ -/************************ G L O B A L T Y P E S ************************/ -/****************************************************************************/ - - -/****************************************************************************/ -/******************** G L O B A L V A R I A B L E S ********************/ -/****************************************************************************/ - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -int esm_pt_is_reserved(int pti); - - - -#endif /* __ESM_PT_H__*/ diff --git a/openair-cn/NAS/MME/MMEprocess.c b/openair-cn/NAS/MME/MMEprocess.c deleted file mode 100644 index abd29a0c14..0000000000 --- a/openair-cn/NAS/MME/MMEprocess.c +++ /dev/null @@ -1,345 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** - Source MMEprocess.c - - Version 0.1 - - Date 2013/02/26 - - Product NAS stack - - Subsystem MME NAS main process - - Author Frederic Maurel - - Description Implements the Non-Access Stratum protocol for Evolved Packet - system (EPS) running at the Network side. - - *****************************************************************************/ - -#include "commonDef.h" -#include "nas_log.h" -#include "nas_timer.h" - -#include "network_api.h" -#include "nas_network.h" -#include "nas_parser.h" - -#include <stdlib.h> // exit -#include <poll.h> // poll -#include <string.h> // memset -#include <signal.h> // sigaction -#include <pthread.h> - -/****************************************************************************/ -/**************** E X T E R N A L D E F I N I T I O N S ****************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************* L O C A L D E F I N I T I O N S *******************/ -/****************************************************************************/ - -#define NAS_SLEEP_TIMEOUT 1000 /* 1 second */ - -static void *_nas_network_mngr(void *); - -static int _nas_set_signal_handler(int signal, void (handler)(int)); -static void _nas_signal_handler(int signal); - -static void _nas_clean(int net_fd); - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -/****************************************************************************/ -int main(int argc, const char *argv[]) -{ - /* - * Get the command line options - */ - if (nas_parser_get_options (argc, argv) != RETURNok) { - nas_parser_print_usage (FIRMWARE_VERSION); - exit (EXIT_FAILURE); - } - - /* - * Initialize logging trace utility - */ - nas_log_init (nas_parser_get_trace_level ()); - - const char *nhost = nas_parser_get_network_host (); - const char *nport = nas_parser_get_network_port (); - - LOG_TRACE (INFO, "MME-MAIN - %s -nhost %s -nport %s -trace 0x%x", argv[0], - nhost, nport, - nas_parser_get_trace_level ()); - - /* - * Initialize the Network interface - */ - if (network_api_initialize (nhost, nport) != RETURNok) { - LOG_TRACE (ERROR, "MME-MAIN - network_api_initialize() failed"); - exit (EXIT_FAILURE); - } - - int network_fd = network_api_get_fd (); - - /* - * Initialize the NAS contexts - */ - nas_network_initialize (); - - /* - * Initialize NAS timer handlers - */ - nas_timer_init (); - - /* - * Set up signal handlers - */ - (void) _nas_set_signal_handler (SIGINT, _nas_signal_handler); - (void) _nas_set_signal_handler (SIGTERM, _nas_signal_handler); - - pthread_attr_t attr; - pthread_attr_init (&attr); - pthread_attr_setscope (&attr, PTHREAD_SCOPE_SYSTEM); - pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED); - - /* - * Start thread use to manage the network connection endpoint - */ - pthread_t network_mngr; - - if (pthread_create (&network_mngr, &attr, _nas_network_mngr, - &network_fd) != 0) { - LOG_TRACE (ERROR, "MME-MAIN - " - "Failed to create the network management thread"); - network_api_close (network_fd); - exit (EXIT_FAILURE); - } - - pthread_attr_destroy (&attr); - - /* - * Suspend execution of the main process until the network connection - * endpoint is still active - */ - while (network_fd != -1) { - poll (NULL, 0, NAS_SLEEP_TIMEOUT); - network_fd = network_api_get_fd (); - } - - /* Termination cleanup */ - _nas_clean (network_fd); - - LOG_TRACE - (WARNING, "MME-MAIN - NAS main process exited"); -} - -/****************************************************************************/ -/********************* L O C A L F U N C T I O N S *********************/ -/****************************************************************************/ - -/**************************************************************************** - ** ** - ** Name: _nas_network_mngr() ** - ** ** - ** Description: Manages the connection endpoint use to communicate with ** - ** the network sublayer ** - ** ** - ** Inputs: fd: The descriptor of the network connection ** - ** endpoint ** - ** Others: None ** - ** ** - ** Outputs: Return: None ** - ** Others: None ** - ** ** - ***************************************************************************/ -static void *_nas_network_mngr(void *args) -{ - LOG_FUNC_IN; - - int ret_code; - int network_message_id; - int bytes; - - int *fd = (int *) args; - - LOG_TRACE (INFO, "MME-MAIN - Network connection manager started (%d)", *fd); - - /* Network receiving loop */ - while (TRUE) { - /* Read the network data message */ - bytes = network_api_read_data (*fd); - - if (bytes == RETURNerror) { - /* Failed to read data from the network sublayer; - * exit from the receiving loop */ - LOG_TRACE (ERROR, "MME-MAIN - " - "Failed to read data from the network sublayer"); - break; - } - - if (bytes == 0) { - /* A signal was caught before any data were available */ - continue; - } - - /* Decode the network data message */ - network_message_id = network_api_decode_data (bytes); - - if (network_message_id == RETURNerror) { - /* Failed to decode data read from the network sublayer */ - continue; - } - - /* Process the network data message */ - ret_code = nas_network_process_data (network_message_id, - network_api_get_data ()); - - if (ret_code != RETURNok) { - /* The network data message has not been successfully - * processed */ - LOG_TRACE - (WARNING, "MME-MAIN - " - "The network procedure call 0x%x failed", - network_message_id); - } - } - - /* Close the connection to the network sublayer */LOG_TRACE (WARNING, - "MME-MAIN - " - "The network connection endpoint manager exited"); - - LOG_FUNC_RETURN(NULL); -} - -/**************************************************************************** - ** ** - ** Name: _nas_set_signal_handler() ** - ** ** - ** Description: Set up a signal handler ** - ** ** - ** Inputs: signal: Signal number ** - ** handler: Signal handler ** - ** Others: None ** - ** ** - ** Outputs: Return: RETURNerror, RETURNok ** - ** Others: None ** - ** ** - ***************************************************************************/ -static int _nas_set_signal_handler(int signal, void (handler)(int)) -{ - LOG_FUNC_IN; - - struct sigaction act; - - /* Initialize signal set */ - (void) memset (&act, 0, sizeof(act)); - (void) sigfillset (&act.sa_mask); - (void) sigdelset (&act.sa_mask, SIGHUP); - (void) sigdelset (&act.sa_mask, SIGINT); - (void) sigdelset (&act.sa_mask, SIGTERM); - (void) sigdelset (&act.sa_mask, SIGILL); - (void) sigdelset (&act.sa_mask, SIGTRAP); - (void) sigdelset (&act.sa_mask, SIGIOT); -#ifndef LINUX - (void) sigdelset (&act.sa_mask, SIGEMT); -#endif - (void) sigdelset (&act.sa_mask, SIGFPE); - (void) sigdelset (&act.sa_mask, SIGBUS); - (void) sigdelset (&act.sa_mask, SIGSEGV); - (void) sigdelset (&act.sa_mask, SIGSYS); - - /* Initialize signal handler */ - act.sa_handler = handler; - - if (sigaction (signal, &act, 0) < 0) { - return RETURNerror; - } - - LOG_TRACE (INFO, "MME-MAIN - Handler successfully set for signal %d", signal); - - LOG_FUNC_RETURN(RETURNok); -} - -/**************************************************************************** - ** ** - ** Name: _nas_signal_handler() ** - ** ** - ** Description: Signal handler ** - ** ** - ** Inputs: signal: Signal number ** - ** Others: None ** - ** ** - ** Outputs: Return: None ** - ** Others: None ** - ** ** - ***************************************************************************/ -static void _nas_signal_handler(int signal) -{ - LOG_FUNC_IN; - - LOG_TRACE (WARNING, "MME-MAIN - Signal %d received", signal); - _nas_clean (network_api_get_fd ()); - exit (EXIT_SUCCESS); - - LOG_FUNC_OUT - ; -} - -/**************************************************************************** - ** ** - ** Name: _nas_clean() ** - ** ** - ** Description: Performs termination cleanup ** - ** ** - ** Inputs: net_fd: Network's connection file descriptor ** - ** Others: None ** - ** ** - ** Outputs: Return: None ** - ** Others: None ** - ** ** - ***************************************************************************/ -static void _nas_clean(int net_fd) -{ - LOG_FUNC_IN; - - LOG_TRACE (INFO, "MME-MAIN - Perform EMM and ESM cleanup"); - nas_network_cleanup (); - - LOG_TRACE (INFO, "MME-MAIN - Closing network connection %d", net_fd); - network_api_close (net_fd); - - LOG_FUNC_OUT - ; -} - diff --git a/openair-cn/NAS/MME/nas_defs.h b/openair-cn/NAS/MME/nas_defs.h deleted file mode 100644 index e896d61fbc..0000000000 --- a/openair-cn/NAS/MME/nas_defs.h +++ /dev/null @@ -1,34 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -#ifndef NAS_DEFS_H_ -#define NAS_DEFS_H_ - -int nas_init(mme_config_t *mme_config_p); - -#endif /* NAS_DEFS_H_ */ diff --git a/openair-cn/NAS/MME/nas_itti_messaging.c b/openair-cn/NAS/MME/nas_itti_messaging.c deleted file mode 100644 index c22f408954..0000000000 --- a/openair-cn/NAS/MME/nas_itti_messaging.c +++ /dev/null @@ -1,211 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -#include <string.h> - -#include "intertask_interface.h" -#include "nas_itti_messaging.h" -#include "msc.h" - - -#define TASK_ORIGIN TASK_NAS_MME - - -#if defined(NAS_BUILT_IN_EPC) -static const uint8_t emm_message_ids[] = { - ATTACH_REQUEST, - ATTACH_ACCEPT, - ATTACH_COMPLETE, - ATTACH_REJECT, - DETACH_REQUEST, - DETACH_ACCEPT, - TRACKING_AREA_UPDATE_REQUEST, - TRACKING_AREA_UPDATE_ACCEPT, - TRACKING_AREA_UPDATE_COMPLETE, - TRACKING_AREA_UPDATE_REJECT, - EXTENDED_SERVICE_REQUEST, - SERVICE_REQUEST, - SERVICE_REJECT, - GUTI_REALLOCATION_COMMAND, - GUTI_REALLOCATION_COMPLETE, - AUTHENTICATION_REQUEST, - AUTHENTICATION_RESPONSE, - AUTHENTICATION_REJECT, - AUTHENTICATION_FAILURE, - IDENTITY_REQUEST, - IDENTITY_RESPONSE, - SECURITY_MODE_COMMAND, - SECURITY_MODE_COMPLETE, - SECURITY_MODE_REJECT, - EMM_STATUS, - EMM_INFORMATION, - DOWNLINK_NAS_TRANSPORT, - UPLINK_NAS_TRANSPORT, - CS_SERVICE_NOTIFICATION, -}; - -static const uint8_t esm_message_ids[] = { - ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST, - ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_ACCEPT, - ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REJECT, - ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST, - ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_ACCEPT, - ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REJECT, - MODIFY_EPS_BEARER_CONTEXT_REQUEST, - MODIFY_EPS_BEARER_CONTEXT_ACCEPT, - MODIFY_EPS_BEARER_CONTEXT_REJECT, - DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST, - DEACTIVATE_EPS_BEARER_CONTEXT_ACCEPT, - PDN_CONNECTIVITY_REQUEST, - PDN_CONNECTIVITY_REJECT, - PDN_DISCONNECT_REQUEST, - PDN_DISCONNECT_REJECT, - BEARER_RESOURCE_ALLOCATION_REQUEST, - BEARER_RESOURCE_ALLOCATION_REJECT, - BEARER_RESOURCE_MODIFICATION_REQUEST, - BEARER_RESOURCE_MODIFICATION_REJECT, - ESM_INFORMATION_REQUEST, - ESM_INFORMATION_RESPONSE, - ESM_STATUS, -}; - -static int _nas_find_message_index(const uint8_t message_id, const uint8_t *message_ids, const int ids_number) -{ - int i; - - for(i = 0; i < ids_number; i ++) { - if (message_id == message_ids[i]) { - return (2 + i); - } - } - - return (1); -} - -int nas_itti_plain_msg(const char *buffer, const nas_message_t *msg, const int length, const int down_link) -{ - MessageDef *message_p; - int data_length = length < NAS_DATA_LENGHT_MAX ? length : NAS_DATA_LENGHT_MAX; - int message_type = -1; - MessagesIds messageId_raw = -1; - MessagesIds messageId_plain = -1; - - /* Define message ids */ - if (msg->header.protocol_discriminator == EPS_MOBILITY_MANAGEMENT_MESSAGE) { - message_type = 0; - messageId_raw = down_link ? NAS_DL_EMM_RAW_MSG : NAS_UL_EMM_RAW_MSG; - messageId_plain = down_link ? NAS_DL_EMM_PLAIN_MSG : NAS_UL_EMM_PLAIN_MSG; - } else { - if (msg->header.protocol_discriminator == EPS_SESSION_MANAGEMENT_MESSAGE) { - message_type = 1; - messageId_raw = down_link ? NAS_DL_ESM_RAW_MSG : NAS_UL_ESM_RAW_MSG; - messageId_plain = down_link ? NAS_DL_ESM_PLAIN_MSG : NAS_UL_ESM_PLAIN_MSG; - } - } - - if (message_type >= 0) { - /* Create and send the RAW message */ - message_p = itti_alloc_new_message(TASK_ORIGIN, messageId_raw); - - NAS_DL_EMM_RAW_MSG(message_p).lenght = length; - memset ((void *) &(NAS_DL_EMM_RAW_MSG(message_p).data), 0, NAS_DATA_LENGHT_MAX); - memcpy ((void *) &(NAS_DL_EMM_RAW_MSG(message_p).data), buffer, data_length); - - itti_send_msg_to_task(TASK_UNKNOWN, INSTANCE_DEFAULT, message_p); - - /* Create and send the plain message */ - if (message_type == 0) { - message_p = itti_alloc_new_message(TASK_ORIGIN, messageId_plain); - - NAS_DL_EMM_PLAIN_MSG(message_p).present = _nas_find_message_index(msg->plain.emm.header.message_type, emm_message_ids, sizeof(emm_message_ids) / sizeof(emm_message_ids[0])); - memcpy ((void *) &(NAS_DL_EMM_PLAIN_MSG(message_p).choice), &msg->plain.emm, sizeof (EMM_msg)); - } else { - message_p = itti_alloc_new_message(TASK_ORIGIN, messageId_plain); - - NAS_DL_ESM_PLAIN_MSG(message_p).present = _nas_find_message_index(msg->plain.esm.header.message_type, esm_message_ids, sizeof(esm_message_ids) / sizeof(esm_message_ids[0])); - memcpy ((void *) &(NAS_DL_ESM_PLAIN_MSG(message_p).choice), &msg->plain.esm, sizeof (ESM_msg)); - } - - return itti_send_msg_to_task(TASK_UNKNOWN, INSTANCE_DEFAULT, message_p); - } - - return EXIT_FAILURE; -} - -int nas_itti_protected_msg(const char *buffer, const nas_message_t *msg, const int length, const int down_link) -{ - MessageDef *message_p = NULL; - - if (msg->header.protocol_discriminator == EPS_MOBILITY_MANAGEMENT_MESSAGE) { - message_p = itti_alloc_new_message(TASK_ORIGIN, down_link ? NAS_DL_EMM_PROTECTED_MSG : NAS_UL_EMM_PROTECTED_MSG); - - memcpy ((void *) &(NAS_DL_EMM_PROTECTED_MSG(message_p).header), &msg->header, sizeof (nas_message_security_header_t)); - NAS_DL_EMM_PROTECTED_MSG(message_p).present = _nas_find_message_index(msg->security_protected.plain.emm.header.message_type, emm_message_ids, sizeof(emm_message_ids) / sizeof(emm_message_ids[0])); - memcpy ((void *) &(NAS_DL_EMM_PROTECTED_MSG(message_p).choice), &msg->security_protected.plain.emm, sizeof (EMM_msg)); - } else { - if (msg->header.protocol_discriminator == EPS_SESSION_MANAGEMENT_MESSAGE) { - message_p = itti_alloc_new_message(TASK_ORIGIN, down_link ? NAS_DL_ESM_PROTECTED_MSG : NAS_UL_ESM_PROTECTED_MSG); - - memcpy ((void *) &(NAS_DL_ESM_PROTECTED_MSG(message_p).header), &msg->header, sizeof (nas_message_security_header_t)); - NAS_DL_ESM_PROTECTED_MSG(message_p).present = _nas_find_message_index(msg->security_protected.plain.esm.header.message_type, esm_message_ids, sizeof(esm_message_ids) / sizeof(esm_message_ids[0])); - memcpy ((void *) &(NAS_DL_ESM_PROTECTED_MSG(message_p).choice), &msg->security_protected.plain.esm, sizeof (ESM_msg)); - } - } - - if (message_p != NULL) { - return itti_send_msg_to_task(TASK_UNKNOWN, INSTANCE_DEFAULT, message_p); - } - - return EXIT_FAILURE; -} -#endif - -#if defined(NAS_BUILT_IN_EPC) -int nas_itti_dl_data_req(const uint32_t ue_id, void *const data, - const uint32_t length) -{ - MessageDef *message_p; - - message_p = itti_alloc_new_message(TASK_NAS_MME, NAS_DOWNLINK_DATA_REQ); - - NAS_DL_DATA_REQ(message_p).UEid = ue_id; - NAS_DL_DATA_REQ(message_p).nasMsg.data = data; - NAS_DL_DATA_REQ(message_p).nasMsg.length = length; - - MSC_LOG_TX_MESSAGE( - MSC_NAS_MME, - MSC_S1AP_MME, - NULL,0, - "0 NAS_DOWNLINK_DATA_REQ ue id "NAS_UE_ID_FMT" len %u", ue_id, length); - - return itti_send_msg_to_task(TASK_S1AP, INSTANCE_DEFAULT, message_p); -} - -#endif - - diff --git a/openair-cn/NAS/MME/nas_itti_messaging.h b/openair-cn/NAS/MME/nas_itti_messaging.h deleted file mode 100644 index e18741f815..0000000000 --- a/openair-cn/NAS/MME/nas_itti_messaging.h +++ /dev/null @@ -1,283 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -#include <string.h> -#include <stdint.h> -#include <ctype.h> - -#include "assertions.h" -#include "intertask_interface.h" -#include "esm_proc.h" -#include "msc.h" - -#ifndef NAS_ITTI_MESSAGING_H_ -#define NAS_ITTI_MESSAGING_H_ - -# if defined(NAS_BUILT_IN_EPC) -int nas_itti_plain_msg( - const char *buffer, - const nas_message_t *msg, - const int lengthP, - const int instance); - -int nas_itti_protected_msg( - const char *buffer, - const nas_message_t *msg, - const int lengthP, - const int instance); -# endif - -# if defined(NAS_BUILT_IN_EPC) -#include "conversions.h" - -int nas_itti_dl_data_req( - const uint32_t ue_idP, - void *const data_pP, - const uint32_t lengthP); - -static inline void nas_itti_pdn_connectivity_req( - int ptiP, - unsigned int ueidP, - const imsi_t *const imsi_pP, - esm_proc_data_t *proc_data_pP, - esm_proc_pdn_request_t request_typeP) -{ - MessageDef *message_p = NULL; - uint8_t i; - uint8_t index; - - AssertFatal(imsi_pP != NULL, "imsi_pP param is NULL"); - AssertFatal(proc_data_pP != NULL, "proc_data_pP param is NULL"); - - - message_p = itti_alloc_new_message(TASK_NAS_MME, NAS_PDN_CONNECTIVITY_REQ); - memset(&message_p->ittiMsg.nas_pdn_connectivity_req, - 0, - sizeof(nas_pdn_connectivity_req_t)); - - hexa_to_ascii((uint8_t *)imsi_pP->u.value, - NAS_PDN_CONNECTIVITY_REQ(message_p).imsi, - 8); - - NAS_PDN_CONNECTIVITY_REQ(message_p).pti = ptiP; - NAS_PDN_CONNECTIVITY_REQ(message_p).ue_id = ueidP; - NAS_PDN_CONNECTIVITY_REQ(message_p).imsi[15] = '\0'; - - if (isdigit(NAS_PDN_CONNECTIVITY_REQ(message_p).imsi[14])) { - NAS_PDN_CONNECTIVITY_REQ(message_p).imsi_length = 15; - } else { - NAS_PDN_CONNECTIVITY_REQ(message_p).imsi_length = 14; - NAS_PDN_CONNECTIVITY_REQ(message_p).imsi[14] = '\0'; - } - - DUP_OCTET_STRING(proc_data_pP->apn, NAS_PDN_CONNECTIVITY_REQ(message_p).apn); - DUP_OCTET_STRING(proc_data_pP->pdn_addr, NAS_PDN_CONNECTIVITY_REQ(message_p).pdn_addr); - - switch (proc_data_pP->pdn_type) { - case ESM_PDN_TYPE_IPV4: - NAS_PDN_CONNECTIVITY_REQ(message_p).pdn_type = IPv4; - break; - - case ESM_PDN_TYPE_IPV6: - NAS_PDN_CONNECTIVITY_REQ(message_p).pdn_type = IPv6; - break; - - case ESM_PDN_TYPE_IPV4V6: - NAS_PDN_CONNECTIVITY_REQ(message_p).pdn_type = IPv4_AND_v6; - break; - - default: - NAS_PDN_CONNECTIVITY_REQ(message_p).pdn_type = IPv4; - break; - } - - // not efficient but be careful about "typedef network_qos_t esm_proc_qos_t;" - NAS_PDN_CONNECTIVITY_REQ(message_p).qos.gbrUL = proc_data_pP->qos.gbrUL; - NAS_PDN_CONNECTIVITY_REQ(message_p).qos.gbrDL = proc_data_pP->qos.gbrDL; - NAS_PDN_CONNECTIVITY_REQ(message_p).qos.mbrUL = proc_data_pP->qos.mbrUL; - NAS_PDN_CONNECTIVITY_REQ(message_p).qos.mbrDL = proc_data_pP->qos.mbrDL; - NAS_PDN_CONNECTIVITY_REQ(message_p).qos.qci = proc_data_pP->qos.qci; - - NAS_PDN_CONNECTIVITY_REQ(message_p).proc_data = proc_data_pP; - - NAS_PDN_CONNECTIVITY_REQ(message_p).request_type = request_typeP; - - if (proc_data_pP->pco.num_protocol_id_or_container_id <= PROTOCOL_CONFIGURATION_OPTIONS_MAXIMUM_PROTOCOL_ID_OR_CONTAINER_ID) { - NAS_PDN_CONNECTIVITY_REQ(message_p).pco.byte[0] = ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_ACCEPT_PROTOCOL_CONFIGURATION_OPTIONS_IEI; - NAS_PDN_CONNECTIVITY_REQ(message_p).pco.byte[1] = 1 + 3 * proc_data_pP->pco.num_protocol_id_or_container_id; - NAS_PDN_CONNECTIVITY_REQ(message_p).pco.byte[2] = 0x80; // do it fast - i = 0; - index = 3; - while (( i < proc_data_pP->pco.num_protocol_id_or_container_id) && - ((index + proc_data_pP->pco.protocolidcontents[i].length) <= PROTOCOL_CONFIGURATION_OPTIONS_MAXIMUM_LENGTH)){ - NAS_PDN_CONNECTIVITY_REQ(message_p).pco.byte[1] += proc_data_pP->pco.lengthofprotocolid[i]; - NAS_PDN_CONNECTIVITY_REQ(message_p).pco.byte[index++] = (proc_data_pP->pco.protocolid[i] >> 8); - NAS_PDN_CONNECTIVITY_REQ(message_p).pco.byte[index++] = (proc_data_pP->pco.protocolid[i] & 0x00FF); - NAS_PDN_CONNECTIVITY_REQ(message_p).pco.byte[index++] = proc_data_pP->pco.lengthofprotocolid[i]; - if (proc_data_pP->pco.lengthofprotocolid[i] > 0) { - memcpy( &NAS_PDN_CONNECTIVITY_REQ(message_p).pco.byte[index], - proc_data_pP->pco.protocolidcontents[i].value, - proc_data_pP->pco.lengthofprotocolid[i]); - index += proc_data_pP->pco.lengthofprotocolid[i]; - } - i++; - } - NAS_PDN_CONNECTIVITY_REQ(message_p).pco.length = index; - } - - - MSC_LOG_TX_MESSAGE( - MSC_NAS_MME, - MSC_MMEAPP_MME, - NULL,0, - "0 NAS_PDN_CONNECTIVITY_REQ ue id %06"PRIX32" IMSI %X", - ueidP, NAS_PDN_CONNECTIVITY_REQ(message_p).imsi); - - itti_send_msg_to_task(TASK_MME_APP, INSTANCE_DEFAULT, message_p); -} - - - -static inline void nas_itti_establish_cnf( - const uint32_t ue_idP, - const nas_error_code_t error_codeP, - void *const data_pP, - const uint32_t lengthP, - const uint16_t selected_encryption_algorithmP, - const uint16_t selected_integrity_algorithmP) -{ - MessageDef *message_p = NULL; - - message_p = itti_alloc_new_message(TASK_NAS_MME, NAS_CONNECTION_ESTABLISHMENT_CNF); - memset(&message_p->ittiMsg.nas_conn_est_cnf, - 0, - sizeof(nas_conn_est_cnf_t)); - NAS_CONNECTION_ESTABLISHMENT_CNF(message_p).UEid = ue_idP; - NAS_CONNECTION_ESTABLISHMENT_CNF(message_p).errCode = error_codeP; - NAS_CONNECTION_ESTABLISHMENT_CNF(message_p).nasMsg.data = data_pP; - NAS_CONNECTION_ESTABLISHMENT_CNF(message_p).nasMsg.length = lengthP; - NAS_CONNECTION_ESTABLISHMENT_CNF(message_p).selected_encryption_algorithm = selected_encryption_algorithmP; - NAS_CONNECTION_ESTABLISHMENT_CNF(message_p).selected_integrity_algorithm = selected_integrity_algorithmP; - - MSC_LOG_TX_MESSAGE( - MSC_NAS_MME, - MSC_MMEAPP_MME, - NULL,0, - "0 NAS_CONNECTION_ESTABLISHMENT_CNF ue id %06"PRIX32" len %u sea %x sia %x ", - ue_idP, lengthP, selected_encryption_algorithmP, selected_integrity_algorithmP); - - itti_send_msg_to_task(TASK_MME_APP, INSTANCE_DEFAULT, message_p); -} - -static inline void nas_itti_auth_info_req( - const uint32_t ue_idP, - const imsi_t *const imsi_pP, - uint8_t initial_reqP, - const uint8_t *auts_pP) -{ - MessageDef *message_p; - - message_p = itti_alloc_new_message(TASK_NAS_MME, NAS_AUTHENTICATION_PARAM_REQ); - memset(&message_p->ittiMsg.nas_auth_param_req, - 0, - sizeof(nas_auth_param_req_t)); - - hexa_to_ascii((uint8_t *)imsi_pP->u.value, - NAS_AUTHENTICATION_PARAM_REQ(message_p).imsi, 8); - - NAS_AUTHENTICATION_PARAM_REQ(message_p).imsi[15] = '\0'; - - if (isdigit(NAS_AUTHENTICATION_PARAM_REQ(message_p).imsi[14])) { - NAS_AUTHENTICATION_PARAM_REQ(message_p).imsi_length = 15; - } else { - NAS_AUTHENTICATION_PARAM_REQ(message_p).imsi_length = 14; - NAS_AUTHENTICATION_PARAM_REQ(message_p).imsi[14] = '\0'; - } - - NAS_AUTHENTICATION_PARAM_REQ(message_p).initial_req = initial_reqP; - NAS_AUTHENTICATION_PARAM_REQ(message_p).ue_id = ue_idP; - - /* Re-synchronisation */ - if (auts_pP != NULL) { - NAS_AUTHENTICATION_PARAM_REQ(message_p).re_synchronization = 1; - memcpy(NAS_AUTHENTICATION_PARAM_REQ(message_p).auts, auts_pP, AUTS_LENGTH); - } else { - NAS_AUTHENTICATION_PARAM_REQ(message_p).re_synchronization = 0; - memset(NAS_AUTHENTICATION_PARAM_REQ(message_p).auts, 0, AUTS_LENGTH); - } - - MSC_LOG_TX_MESSAGE( - MSC_NAS_MME, - MSC_MMEAPP_MME, - NULL,0, - "0 NAS_AUTHENTICATION_PARAM_REQ ue id %06"PRIX32" IMSI %s ", - ue_idP, NAS_AUTHENTICATION_PARAM_REQ(message_p).imsi); - - itti_send_msg_to_task(TASK_MME_APP, INSTANCE_DEFAULT, message_p); -} - -static inline void nas_itti_establish_rej( - const uint32_t ue_idP, - const imsi_t *const imsi_pP - , uint8_t initial_reqP) -{ - MessageDef *message_p; - - message_p = itti_alloc_new_message(TASK_NAS_MME, NAS_AUTHENTICATION_PARAM_REQ); - memset(&message_p->ittiMsg.nas_auth_param_req, - 0, - sizeof(nas_auth_param_req_t)); - - hexa_to_ascii((uint8_t *)imsi_pP->u.value, - NAS_AUTHENTICATION_PARAM_REQ(message_p).imsi, 8); - - NAS_AUTHENTICATION_PARAM_REQ(message_p).imsi[15] = '\0'; - - if (isdigit(NAS_AUTHENTICATION_PARAM_REQ(message_p).imsi[14])) { - NAS_AUTHENTICATION_PARAM_REQ(message_p).imsi_length = 15; - } else { - NAS_AUTHENTICATION_PARAM_REQ(message_p).imsi_length = 14; - NAS_AUTHENTICATION_PARAM_REQ(message_p).imsi[14] = '\0'; - } - - NAS_AUTHENTICATION_PARAM_REQ(message_p).initial_req = initial_reqP; - NAS_AUTHENTICATION_PARAM_REQ(message_p).ue_id = ue_idP; - - MSC_LOG_TX_MESSAGE( - MSC_NAS_MME, - MSC_MMEAPP_MME, - NULL,0, - "0 NAS_AUTHENTICATION_PARAM_REQ ue id %06"PRIX32" IMSI %s (establish reject)", - ue_idP, NAS_AUTHENTICATION_PARAM_REQ(message_p).imsi); - - itti_send_msg_to_task(TASK_MME_APP, INSTANCE_DEFAULT, message_p); -} -# endif - - -#endif /* NAS_ITTI_MESSAGING_H_ */ diff --git a/openair-cn/NAS/MME/nas_mme_task.c b/openair-cn/NAS/MME/nas_mme_task.c deleted file mode 100644 index 88939f93c2..0000000000 --- a/openair-cn/NAS/MME/nas_mme_task.c +++ /dev/null @@ -1,226 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <stdint.h> -#include <string.h> - -#include "intertask_interface.h" -#include "mme_config.h" -#include "nas_defs.h" -#include "msc.h" - -#if !defined(DISABLE_USE_NAS) -# include "nas_network.h" -# include "nas_proc.h" -# include "emm_main.h" -# include "nas_log.h" -# include "nas_timer.h" -#endif - -#define NAS_ERROR(x, args...) do { fprintf(stderr, "[NAS] [E]"x, ##args); } while(0) -#define NAS_DEBUG(x, args...) do { fprintf(stdout, "[NAS] [D]"x, ##args); } while(0) -#define NAS_WARN(x, args...) do { fprintf(stdout, "[NAS] [W]"x, ##args); } while(0) - -static void *nas_intertask_interface(void *args_p) -{ - itti_mark_task_ready(TASK_NAS_MME); - MSC_START_USE(); - - while(1) { - MessageDef *received_message_p; - -next_message: - itti_receive_msg(TASK_NAS_MME, &received_message_p); - - switch (ITTI_MSG_ID(received_message_p)) { - case NAS_CONNECTION_ESTABLISHMENT_IND: { -#if defined(DISABLE_USE_NAS) - MessageDef *message_p; - nas_attach_req_t *nas_req_p; - s1ap_initial_ue_message_t *transparent; - - NAS_DEBUG("NAS abstraction: Generating NAS ATTACH REQ\n"); - - message_p = itti_alloc_new_message(TASK_NAS_MME, NAS_ATTACH_REQ); - - nas_req_p = &message_p->ittiMsg.nas_attach_req; - transparent = &message_p->ittiMsg.nas_attach_req.transparent; - - nas_req_p->initial = INITIAL_REQUEST; - sprintf(nas_req_p->imsi, "%14llu", 20834123456789ULL); - - memcpy(transparent, &received_message_p->ittiMsg.nas_conn_est_ind.transparent, - sizeof(s1ap_initial_ue_message_t)); - - itti_send_msg_to_task(TASK_MME_APP, INSTANCE_DEFAULT, message_p); -#else - nas_establish_ind_t *nas_est_ind_p; - - nas_est_ind_p = &received_message_p->ittiMsg.nas_conn_est_ind.nas; - - nas_proc_establish_ind(nas_est_ind_p->UEid, - nas_est_ind_p->tac, - nas_est_ind_p->initialNasMsg.data, - nas_est_ind_p->initialNasMsg.length); -#endif - } - break; - -#if defined(DISABLE_USE_NAS) - - case NAS_ATTACH_ACCEPT: { - itti_send_msg_to_task(TASK_S1AP, INSTANCE_DEFAULT, received_message_p); - goto next_message; - } - break; - - case NAS_AUTHENTICATION_REQ: { - MessageDef *message_p; - nas_auth_resp_t *nas_resp_p; - - NAS_DEBUG("NAS abstraction: Generating NAS AUTHENTICATION RESPONSE\n"); - - message_p = itti_alloc_new_message(TASK_NAS_MME, NAS_AUTHENTICATION_RESP); - - nas_resp_p = &message_p->ittiMsg.nas_auth_resp; - - memcpy(nas_resp_p->imsi, received_message_p->ittiMsg.nas_auth_req.imsi, 16); - - itti_send_msg_to_task(TASK_MME_APP, INSTANCE_DEFAULT, message_p); - } - break; -#else - - case NAS_UPLINK_DATA_IND: { - nas_proc_ul_transfer_ind(NAS_UL_DATA_IND(received_message_p).UEid, - NAS_UL_DATA_IND(received_message_p).nasMsg.data, - NAS_UL_DATA_IND(received_message_p).nasMsg.length); - } - break; - - case NAS_DOWNLINK_DATA_CNF: { - nas_proc_dl_transfer_cnf(NAS_DL_DATA_CNF(received_message_p).UEid); - } break; - - case NAS_DOWNLINK_DATA_REJ: { - nas_proc_dl_transfer_rej(NAS_DL_DATA_REJ(received_message_p).UEid); - } break; - - case NAS_AUTHENTICATION_PARAM_RSP: { - nas_proc_auth_param_res(&NAS_AUTHENTICATION_PARAM_RSP(received_message_p)); - } - break; - - case NAS_AUTHENTICATION_PARAM_FAIL: { - nas_proc_auth_param_fail(&NAS_AUTHENTICATION_PARAM_FAIL(received_message_p)); - } - break; -#endif - - case NAS_PDN_CONNECTIVITY_RSP: { - nas_proc_pdn_connectivity_res(&NAS_PDN_CONNECTIVITY_RSP(received_message_p)); - } - break; - - case NAS_PDN_CONNECTIVITY_FAIL: { - nas_proc_pdn_connectivity_fail(&NAS_PDN_CONNECTIVITY_FAIL(received_message_p)); - } - break; - - - case TIMER_HAS_EXPIRED: { -#if !defined(DISABLE_USE_NAS) - /* Call the NAS timer api */ - nas_timer_handle_signal_expiry(TIMER_HAS_EXPIRED(received_message_p).timer_id, - TIMER_HAS_EXPIRED(received_message_p).arg); -#endif - } - break; - - case S1AP_ENB_DEREGISTERED_IND: { -#if !defined(DISABLE_USE_NAS) - int i; - - for (i = 0; i < S1AP_ENB_DEREGISTERED_IND(received_message_p).nb_ue_to_deregister; i ++) { - nas_proc_deregister_ue(S1AP_ENB_DEREGISTERED_IND(received_message_p).mme_ue_s1ap_id[i]); - } - -#endif - } - break; - - case S1AP_DEREGISTER_UE_REQ: { -#if !defined(DISABLE_USE_NAS) - nas_proc_deregister_ue(S1AP_DEREGISTER_UE_REQ(received_message_p).mme_ue_s1ap_id); -#endif - } - break; - - case TERMINATE_MESSAGE: { - itti_exit_task(); - } - break; - - default: { - NAS_DEBUG("Unkwnon message ID %d:%s from %s\n", - ITTI_MSG_ID(received_message_p), - ITTI_MSG_NAME(received_message_p), - ITTI_MSG_ORIGIN_NAME(received_message_p)); - } - break; - } - - itti_free(ITTI_MSG_ORIGIN_ID(received_message_p), received_message_p); - received_message_p = NULL; - } - - return NULL; -} - -int nas_init(mme_config_t *mme_config_p) -{ - NAS_DEBUG("Initializing NAS task interface\n"); - -#if !defined(DISABLE_USE_NAS) - nas_log_init(0x3F); - nas_network_initialize(mme_config_p); -#endif - - if (itti_create_task(TASK_NAS_MME, &nas_intertask_interface, - NULL) < 0) { - NAS_ERROR("Create task failed"); - NAS_DEBUG("Initializing NAS task interface: FAILED\n"); - return -1; - } - - NAS_DEBUG("Initializing NAS task interface: DONE\n"); - return 0; -} diff --git a/openair-cn/NAS/MME/nas_network.c b/openair-cn/NAS/MME/nas_network.c deleted file mode 100644 index 0af3aa3425..0000000000 --- a/openair-cn/NAS/MME/nas_network.c +++ /dev/null @@ -1,208 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source nas_network.h - -Version 0.1 - -Date 2012/09/20 - -Product NAS stack - -Subsystem NAS main process - -Author Frederic Maurel - -Description NAS procedure functions triggered by the network - -*****************************************************************************/ - -#include "nas_network.h" -#include "commonDef.h" -#include "nas_log.h" -#include "nas_timer.h" - -#include "as_message.h" -#include "nas_proc.h" - -/****************************************************************************/ -/**************** E X T E R N A L D E F I N I T I O N S ****************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************* L O C A L D E F I N I T I O N S *******************/ -/****************************************************************************/ - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -/**************************************************************************** - ** ** - ** Name: nas_network_initialize() ** - ** ** - ** Description: Initializes network internal data ** - ** ** - ** Inputs: None ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: None ** - ** Others: None ** - ** ** - ***************************************************************************/ -#if defined(NAS_BUILT_IN_EPC) -void nas_network_initialize(mme_config_t *mme_config_p) -#else -void nas_network_initialize(void) -#endif -{ - LOG_FUNC_IN; - - /* Initialize the internal NAS processing data */ -# if defined(NAS_BUILT_IN_EPC) - nas_timer_init(); - nas_proc_initialize(mme_config_p); -# else - nas_proc_initialize(); -# endif - - LOG_FUNC_OUT; -} - -/**************************************************************************** - ** ** - ** Name: nas_network_cleanup() ** - ** ** - ** Description: Performs clean up procedure before the system is shutdown ** - ** ** - ** Inputs: None ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: None ** - ** Others: None ** - ** ** - ***************************************************************************/ -void nas_network_cleanup(void) -{ - LOG_FUNC_IN; - - nas_proc_cleanup(); - - LOG_FUNC_OUT; -} - -/**************************************************************************** - ** ** - ** Name: nas_network_process_data() ** - ** ** - ** Description: Process Access Stratum messages received from the network ** - ** and call applicable NAS procedure function. ** - ** ** - ** Inputs: msg_id: AS message identifier ** - ** data: Generic pointer to data structure that has ** - ** to be processed ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok if the message has been success- ** - ** fully processed; RETURNerror otherwise ** - ** Others: None ** - ** ** - ***************************************************************************/ -int nas_network_process_data(int msg_id, const void *data) -{ - LOG_FUNC_IN; - - const as_message_t *msg = (as_message_t *)(data); - int rc = RETURNok; - - /* Sanity check */ - if (msg_id != msg->msgID) { - LOG_TRACE(ERROR, "NET-MAIN - Message identifier 0x%x to process " - "is different from that of the network data (0x%x)", - msg_id, msg->msgID); - LOG_FUNC_RETURN (RETURNerror); - } - - switch (msg_id) { - - - case AS_NAS_ESTABLISH_IND: { - /* Received NAS signalling connection establishment indication */ - const nas_establish_ind_t *indication = &msg->msg.nas_establish_ind; - rc = nas_proc_establish_ind(indication->UEid, - indication->tac, - indication->initialNasMsg.data, - indication->initialNasMsg.length); - break; - } - - case AS_DL_INFO_TRANSFER_CNF: { - const dl_info_transfer_cnf_t *info = &msg->msg.dl_info_transfer_cnf; - - /* Received downlink data transfer confirm */ - if (info->errCode != AS_SUCCESS) { - LOG_TRACE(WARNING, "NET-MAIN - " - "Downlink NAS message not delivered"); - rc = nas_proc_dl_transfer_rej(info->UEid); - } else { - rc = nas_proc_dl_transfer_cnf(info->UEid); - } - - break; - } - - case AS_UL_INFO_TRANSFER_IND: { - const ul_info_transfer_ind_t *info = &msg->msg.ul_info_transfer_ind; - /* Received uplink data transfer indication */ - rc = nas_proc_ul_transfer_ind(info->UEid, - info->nasMsg.data, - info->nasMsg.length); - break; - } - - case AS_RAB_ESTABLISH_CNF: - break; - - default: - LOG_TRACE(ERROR, "NET-MAIN - Unexpected AS message type: 0x%x", - msg_id); - rc = RETURNerror; - break; - } - - LOG_FUNC_RETURN (rc); -} - -/****************************************************************************/ -/********************* L O C A L F U N C T I O N S *********************/ -/****************************************************************************/ - diff --git a/openair-cn/NAS/MME/nas_network.h b/openair-cn/NAS/MME/nas_network.h deleted file mode 100644 index ef235dcdb7..0000000000 --- a/openair-cn/NAS/MME/nas_network.h +++ /dev/null @@ -1,81 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source nas_network.h - -Version 0.1 - -Date 2012/09/20 - -Product NAS stack - -Subsystem NAS main process - -Author Frederic Maurel - -Description NAS procedure functions triggered by the network - -*****************************************************************************/ - -#if defined(NAS_BUILT_IN_EPC) -# include "mme_config.h" -#endif - -#ifndef __NAS_NETWORK_H__ -#define __NAS_NETWORK_H__ - -/****************************************************************************/ -/********************* G L O B A L C O N S T A N T S *******************/ -/****************************************************************************/ - -/****************************************************************************/ -/************************ G L O B A L T Y P E S ************************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************** G L O B A L V A R I A B L E S ********************/ -/****************************************************************************/ - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -#if defined(NAS_BUILT_IN_EPC) -void nas_network_initialize(mme_config_t *mme_config_p); -#else -void nas_network_initialize(void); -#endif - -void nas_network_cleanup(void); - -int nas_network_process_data(int command_id, const void *data); - -const void *nas_network_get_data(void); - -#endif /* __NAS_NETWORK_H__*/ diff --git a/openair-cn/NAS/MME/nas_parser.c b/openair-cn/NAS/MME/nas_parser.c deleted file mode 100644 index af87d1ce97..0000000000 --- a/openair-cn/NAS/MME/nas_parser.c +++ /dev/null @@ -1,243 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source nas_parser.c - -Version 0.1 - -Date 2012/02/27 - -Product NAS stack - -Subsystem NAS main process - -Author Frederic Maurel - -Description NAS command line parser - -*****************************************************************************/ - -#include "nas_parser.h" -#include "parser.h" - -#include <stdio.h> // fprintf -#include <stdlib.h> // atoi - -/****************************************************************************/ -/**************** E X T E R N A L D E F I N I T I O N S ****************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************* L O C A L D E F I N I T I O N S *******************/ -/****************************************************************************/ - -/* - * Identifiers of the NAS command line options - */ -enum { - NAS_PARSER_TRACE_LEVEL, /* Logging trace level */ - NAS_PARSER_NETWORK_HOST, /* Network layer's hostname */ - NAS_PARSER_NETWORK_PORT, /* Network layer's port number */ - NAS_PARSER_NB_OPTIONS -}; - -/* ----------------------------------------------------- - * Definition of the internal NAS command line structure - * ----------------------------------------------------- - * The command line is defined with a name (default is "NASprocess" - * but it will be replaced by the command name actually used at - * runtime), a number of options and the list of options. - * An option is defined with a name, an argument following the name, - * the usage displayed by the usage function and a default value. - */ -static parser_command_line_t nasParserCommandLine = { - "NASprocess", /* Command name */ - NAS_PARSER_NB_OPTIONS, /* Number of options */ - { /* Command line options */ - { - "-trace", "<mask>", "Logging trace level\t\t", - NAS_PARSER_DEFAULT_TRACE_LEVEL - }, - { - "-nhost", "<nhost>", "Network layer's hostname\t", - NAS_PARSER_DEFAULT_NETWORK_HOSTNAME - }, - { - "-nport", "<nport>", "Network layer's port number\t", - NAS_PARSER_DEFAULT_NETWORK_PORT_NUMBER - }, - } -}; - -/* - * Converts a string, containing hexadecimal formatted integer, to an integer - */ -static int atohex(const char *a_char); - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -/**************************************************************************** - ** ** - ** Name: nas_parser_print_usage() ** - ** ** - ** Description: Displays the command line options used to run the NAS ** - ** process and the firmware version defined at compilation ** - ** time ** - ** ** - ** Inputs: version: Firmware version ** - ** Others: None ** - ** ** - ** Outputs: Return: None ** - ** Others: None ** - ** ** - ***************************************************************************/ -void nas_parser_print_usage(const char *version) -{ - parser_print_usage(&nasParserCommandLine); - fprintf(stderr, "Version: %s\n", version); -} - -/**************************************************************************** - ** ** - ** Name: nas_parser_get_options() ** - ** ** - ** Description: Gets the command line options used to run the NAS process ** - ** ** - ** Inputs: argc: Number of options ** - ** argv: Pointer to the list of options ** - ** Others: None ** - ** ** - ** Outputs: Return: RETURNerror, RETURNok ** - ** Others: None ** - ** ** - ***************************************************************************/ -int nas_parser_get_options(int argc, const char **argv) -{ - return parser_get_options(argc, argv, &nasParserCommandLine); -} - -/**************************************************************************** - ** ** - ** Name: nas_parser_get_nb_options() ** - ** ** - ** Description: Returns the number of the command line options used to ** - ** run the NAS process ** - ** ** - ** Inputs: None ** - ** Others: None ** - ** ** - ** Outputs: Return: Number of command line options ** - ** Others: None ** - ** ** - ***************************************************************************/ -int nas_parser_get_nb_options(void) -{ - return nasParserCommandLine.nb_options; -} - -/**************************************************************************** - ** ** - ** Name: nas_parser_get_trace_level() ** - ** ** - ** Description: Returns the value of the logging trace level ** - ** ** - ** Inputs: None ** - ** Others: None ** - ** ** - ** Outputs: Return: Value of the logging trace level ** - ** Others: None ** - ** ** - ***************************************************************************/ -int nas_parser_get_trace_level(void) -{ - return atohex( nasParserCommandLine.options[NAS_PARSER_TRACE_LEVEL].pvalue ); -} - -/**************************************************************************** - ** ** - ** Name: nas_parser_get_network_host() ** - ** ** - ** Description: Returns the value of the network layer hostname ** - ** ** - ** Inputs: None ** - ** Others: None ** - ** ** - ** Outputs: Return: Value of the network layer hostname ** - ** Others: None ** - ** ** - ***************************************************************************/ -const char *nas_parser_get_network_host(void) -{ - return nasParserCommandLine.options[NAS_PARSER_NETWORK_HOST].pvalue; -} - -/**************************************************************************** - ** ** - ** Name: nas_parser_get_network_port() ** - ** ** - ** Description: Returns the value of the network layer port number ** - ** ** - ** Inputs: None ** - ** Others: None ** - ** ** - ** Outputs: Return: Value of the network layer port number ** - ** Others: None ** - ** ** - ***************************************************************************/ -const char *nas_parser_get_network_port(void) -{ - return nasParserCommandLine.options[NAS_PARSER_NETWORK_PORT].pvalue; -} - - - -/****************************************************************************/ -/********************* L O C A L F U N C T I O N S *********************/ -/****************************************************************************/ - -static int atohex(const char *a_char) -{ - int result; - - for (result=0; a_char; a_char++) { - if (*a_char >= '0' && *a_char <= '9') { - result = (result << 4) + (*a_char - '0'); - } else if (*a_char >= 'A' && *a_char <= 'F') { - result = (result << 4) + (*a_char - 'A' + 10); - } else if (*a_char >= 'a' && *a_char <= 'f') { - result = (result << 4) + (*a_char - 'a' + 10); - } else { - break; - } - } - - return result; -} diff --git a/openair-cn/NAS/MME/nas_parser.h b/openair-cn/NAS/MME/nas_parser.h deleted file mode 100644 index c536c1375c..0000000000 --- a/openair-cn/NAS/MME/nas_parser.h +++ /dev/null @@ -1,84 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source nas_parser.h - -Version 0.1 - -Date 2012/02/27 - -Product NAS stack - -Subsystem NAS main process - -Author Frederic Maurel - -Description NAS command line parser - -*****************************************************************************/ -#ifndef __NAS_PARSER_H__ -#define __NAS_PARSER_H__ - -/****************************************************************************/ -/********************* G L O B A L C O N S T A N T S *******************/ -/****************************************************************************/ - -/* Logging trace level default value */ -#define NAS_PARSER_DEFAULT_TRACE_LEVEL "0" /* No trace */ - -/* Network layer default hostname */ -#define NAS_PARSER_DEFAULT_NETWORK_HOSTNAME "localhost" - -/* Network layer default port number */ -#define NAS_PARSER_DEFAULT_NETWORK_PORT_NUMBER "12000" - - - -/****************************************************************************/ -/************************ G L O B A L T Y P E S ************************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************** G L O B A L V A R I A B L E S ********************/ -/****************************************************************************/ - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -void nas_parser_print_usage(const char *version); -int nas_parser_get_options(int argc, const char **argv); - -int nas_parser_get_nb_options(void); -int nas_parser_get_trace_level(void); -const char *nas_parser_get_network_host(void); -const char *nas_parser_get_network_port(void); - - -#endif /* __NAS_PARSER_H__*/ diff --git a/openair-cn/NAS/MME/nas_proc.c b/openair-cn/NAS/MME/nas_proc.c deleted file mode 100644 index 7fae146a89..0000000000 --- a/openair-cn/NAS/MME/nas_proc.c +++ /dev/null @@ -1,443 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source nas_proc.c - -Version 0.1 - -Date 2012/09/20 - -Product NAS stack - -Subsystem NAS main process - -Author Frederic Maurel - -Description NAS procedure call manager - -*****************************************************************************/ - -#include "nas_proc.h" -#include "nas_log.h" - -#include "emm_main.h" -#include "emm_sap.h" - -#include "esm_main.h" -#include "esm_sap.h" -#include "msc.h" - -#include <stdio.h> // sprintf - -/****************************************************************************/ -/**************** E X T E R N A L D E F I N I T I O N S ****************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************* L O C A L D E F I N I T I O N S *******************/ -/****************************************************************************/ - - - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -/**************************************************************************** - ** ** - ** Name: nas_proc_initialize() ** - ** ** - ** Description: ** - ** ** - ** Inputs: None ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: None ** - ** Others: None ** - ** ** - ***************************************************************************/ -# if defined(NAS_BUILT_IN_EPC) -void nas_proc_initialize(mme_config_t *mme_config_p) -{ - LOG_FUNC_IN; - - /* Initialize the EMM procedure manager */ - emm_main_initialize(mme_config_p); - - /* Initialize the ESM procedure manager */ - esm_main_initialize(); - - LOG_FUNC_OUT; -} -# else -void nas_proc_initialize(void) -{ - LOG_FUNC_IN; - - /* Initialize the EMM procedure manager */ - emm_main_initialize(); - - /* Initialize the ESM procedure manager */ - esm_main_initialize(); - - LOG_FUNC_OUT; -} -# endif - -/**************************************************************************** - ** ** - ** Name: nas_proc_cleanup() ** - ** ** - ** Description: Performs clean up procedure before the system is shutdown ** - ** ** - ** Inputs: None ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: None ** - ** Others: None ** - ** ** - ***************************************************************************/ -void nas_proc_cleanup(void) -{ - LOG_FUNC_IN; - - /* Perform the EPS Mobility Manager's clean up procedure */ - emm_main_cleanup(); - - /* Perform the EPS Session Manager's clean up procedure */ - esm_main_cleanup(); - - LOG_FUNC_OUT; -} - -/* - * -------------------------------------------------------------------------- - * NAS procedures triggered by the user - * -------------------------------------------------------------------------- - */ - - -/**************************************************************************** - ** ** - ** Name: nas_proc_establish_ind() ** - ** ** - ** Description: Processes the NAS signalling connection establishment ** - ** indication message received from the network ** - ** ** - ** Inputs: ueid: UE identifier ** - ** tac: The code of the tracking area the initia- ** - ** ting UE belongs to ** - ** data: The initial NAS message transfered within ** - ** the message ** - ** len: The length of the initial NAS message ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int nas_proc_establish_ind(uint32_t ueid, tac_t tac, - const Byte_t *data, uint32_t len) -{ - LOG_FUNC_IN; - - int rc = RETURNerror; - - if (len > 0) { - emm_sap_t emm_sap; - - MSC_LOG_TX_MESSAGE( - MSC_NAS_MME, - MSC_NAS_EMM_MME, - NULL,0, - "0 EMMAS_ESTABLISH_REQ ue id "NAS_UE_ID_FMT" tac %u", ueid, tac); - /* - * Notify the EMM procedure call manager that NAS signalling - * connection establishment indication message has been received - * from the Access-Stratum sublayer - */ - emm_sap.primitive = EMMAS_ESTABLISH_REQ; - emm_sap.u.emm_as.u.establish.ueid = ueid; - emm_sap.u.emm_as.u.establish.NASmsg.length = len; - emm_sap.u.emm_as.u.establish.NASmsg.value = (uint8_t *)data; - rc = emm_sap_send(&emm_sap); - } - - LOG_FUNC_RETURN (rc); -} - -/**************************************************************************** - ** ** - ** Name: nas_proc_dl_transfer_cnf() ** - ** ** - ** Description: Processes the downlink data transfer confirm message re- ** - ** ceived from the network while NAS message has been succes-** - ** sfully delivered to the NAS sublayer on the receiver side.** - ** ** - ** Inputs: ueid: UE identifier ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int nas_proc_dl_transfer_cnf(uint32_t ueid) -{ - LOG_FUNC_IN; - - emm_sap_t emm_sap; - int rc; - - MSC_LOG_TX_MESSAGE( - MSC_NAS_MME, - MSC_NAS_EMM_MME, - NULL,0, - "0 EMMAS_DATA_IND dl_transfer_conf ue id "NAS_UE_ID_FMT" ", ueid); - - /* - * Notify the EMM procedure call manager that downlink NAS message - * has been successfully delivered to the NAS sublayer on the - * receiver side - */ - emm_sap.primitive = EMMAS_DATA_IND; - emm_sap.u.emm_as.u.data.ueid = ueid; - emm_sap.u.emm_as.u.data.delivered = TRUE; - emm_sap.u.emm_as.u.data.NASmsg.length = 0; - rc = emm_sap_send(&emm_sap); - - LOG_FUNC_RETURN (rc); -} - -/**************************************************************************** - ** ** - ** Name: nas_proc_dl_transfer_rej() ** - ** ** - ** Description: Processes the downlink data transfer confirm message re- ** - ** ceived from the network while NAS message has not been ** - ** delivered to the NAS sublayer on the receiver side. ** - ** ** - ** Inputs: ueid: UE identifier ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int nas_proc_dl_transfer_rej(uint32_t ueid) -{ - LOG_FUNC_IN; - - emm_sap_t emm_sap; - int rc; - - MSC_LOG_TX_MESSAGE( - MSC_NAS_MME, - MSC_NAS_EMM_MME, - NULL,0, - "0 EMMAS_DATA_IND dl_transfer_reject ue id "NAS_UE_ID_FMT" ", ueid); - - /* - * Notify the EMM procedure call manager that transmission - * failure of downlink NAS message indication has been received - * from lower layers - */ - emm_sap.primitive = EMMAS_DATA_IND; - emm_sap.u.emm_as.u.data.ueid = ueid; - emm_sap.u.emm_as.u.data.delivered = FALSE; - emm_sap.u.emm_as.u.data.NASmsg.length = 0; - rc = emm_sap_send(&emm_sap); - - LOG_FUNC_RETURN (rc); -} - -/**************************************************************************** - ** ** - ** Name: nas_proc_ul_transfer_ind() ** - ** ** - ** Description: Processes uplink data transfer indication message recei- ** - ** ved from the network ** - ** ** - ** Inputs: ueid: UE identifier ** - ** data: The transfered NAS message ** - ** len: The length of the NAS message ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: None ** - ** ** - ***************************************************************************/ -int nas_proc_ul_transfer_ind(uint32_t ueid, const Byte_t *data, uint32_t len) -{ - int rc = RETURNerror; - - LOG_FUNC_IN; - - if (len > 0) { - emm_sap_t emm_sap; - /* - * Notify the EMM procedure call manager that data transfer - * indication has been received from the Access-Stratum sublayer - */ - MSC_LOG_TX_MESSAGE( - MSC_NAS_MME, - MSC_NAS_EMM_MME, - NULL,0, - "0 EMMAS_DATA_IND ue id "NAS_UE_ID_FMT" len %u", ueid, len); - - emm_sap.primitive = EMMAS_DATA_IND; - emm_sap.u.emm_as.u.data.ueid = ueid; - emm_sap.u.emm_as.u.data.delivered = TRUE; - emm_sap.u.emm_as.u.data.NASmsg.length = len; - emm_sap.u.emm_as.u.data.NASmsg.value = (uint8_t *)data; - rc = emm_sap_send(&emm_sap); - } - - LOG_FUNC_RETURN (rc); -} - -# if defined(NAS_BUILT_IN_EPC) -int nas_proc_auth_param_res(emm_cn_auth_res_t *emm_cn_auth_res) -{ - int rc = RETURNerror; - emm_sap_t emm_sap; - - LOG_FUNC_IN; - - MSC_LOG_TX_MESSAGE( - MSC_NAS_MME, - MSC_NAS_EMM_MME, - NULL,0, - "0 EMMCN_AUTHENTICATION_PARAM_RES"); - - emm_sap.primitive = EMMCN_AUTHENTICATION_PARAM_RES; - emm_sap.u.emm_cn.u.auth_res = emm_cn_auth_res; - - rc = emm_sap_send(&emm_sap); - - LOG_FUNC_RETURN (rc); -} - -int nas_proc_auth_param_fail(emm_cn_auth_fail_t *emm_cn_auth_fail) -{ - int rc = RETURNerror; - emm_sap_t emm_sap; - - LOG_FUNC_IN; - - MSC_LOG_TX_MESSAGE( - MSC_NAS_MME, - MSC_NAS_EMM_MME, - NULL,0, - "0 EMMCN_AUTHENTICATION_PARAM_FAIL"); - - emm_sap.primitive = EMMCN_AUTHENTICATION_PARAM_FAIL; - emm_sap.u.emm_cn.u.auth_fail = emm_cn_auth_fail; - - rc = emm_sap_send(&emm_sap); - - LOG_FUNC_RETURN (rc); -} - -int nas_proc_deregister_ue(uint32_t ue_id) -{ - int rc = RETURNerror; - emm_sap_t emm_sap; - - LOG_FUNC_IN; - - MSC_LOG_TX_MESSAGE( - MSC_NAS_MME, - MSC_NAS_EMM_MME, - NULL,0, - "0 EMMCN_DEREGISTER_UE ue_id "NAS_UE_ID_FMT" ",ue_id); - - emm_sap.primitive = EMMCN_DEREGISTER_UE; - emm_sap.u.emm_cn.u.deregister.UEid = ue_id; - - rc = emm_sap_send(&emm_sap); - - LOG_FUNC_RETURN (rc); -} - -int nas_proc_pdn_connectivity_res(emm_cn_pdn_res_t *emm_cn_pdn_res) -{ - int rc = RETURNerror; - emm_sap_t emm_sap; - - LOG_FUNC_IN; - - MSC_LOG_TX_MESSAGE( - MSC_NAS_MME, - MSC_NAS_EMM_MME, - NULL,0, - "0 EMMCN_PDN_CONNECTIVITY_RES"); - - emm_sap.primitive = EMMCN_PDN_CONNECTIVITY_RES; - emm_sap.u.emm_cn.u.emm_cn_pdn_res = emm_cn_pdn_res; - - rc = emm_sap_send(&emm_sap); - - LOG_FUNC_RETURN (rc); -} - -int nas_proc_pdn_connectivity_fail(emm_cn_pdn_fail_t *emm_cn_pdn_fail) -{ - int rc = RETURNerror; - emm_sap_t emm_sap; - - LOG_FUNC_IN; - - MSC_LOG_TX_MESSAGE( - MSC_NAS_MME, - MSC_NAS_EMM_MME, - NULL,0, - "0 EMMCN_PDN_CONNECTIVITY_FAIL"); - - emm_sap.primitive = EMMCN_PDN_CONNECTIVITY_FAIL; - emm_sap.u.emm_cn.u.emm_cn_pdn_fail = emm_cn_pdn_fail; - - rc = emm_sap_send(&emm_sap); - - LOG_FUNC_RETURN (rc); -} - - - -# endif - -/****************************************************************************/ -/********************* L O C A L F U N C T I O N S *********************/ -/****************************************************************************/ - diff --git a/openair-cn/NAS/MME/nas_proc.h b/openair-cn/NAS/MME/nas_proc.h deleted file mode 100644 index a00060ed9d..0000000000 --- a/openair-cn/NAS/MME/nas_proc.h +++ /dev/null @@ -1,116 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source nas_proc.h - -Version 0.1 - -Date 2012/09/20 - -Product NAS stack - -Subsystem NAS main process - -Author Frederic Maurel - -Description NAS procedure call manager - -*****************************************************************************/ -#ifndef __NAS_PROC_H__ -#define __NAS_PROC_H__ - -#if defined(NAS_BUILT_IN_EPC) -# include "mme_config.h" -# include "emm_cnDef.h" -#endif - -#include "commonDef.h" -#include "networkDef.h" - -/****************************************************************************/ -/********************* G L O B A L C O N S T A N T S *******************/ -/****************************************************************************/ - -/****************************************************************************/ -/************************ G L O B A L T Y P E S ************************/ -/****************************************************************************/ - -/****************************************************************************/ -/******************** G L O B A L V A R I A B L E S ********************/ -/****************************************************************************/ - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - - -# if defined(NAS_BUILT_IN_EPC) -void nas_proc_initialize(mme_config_t *mme_config_p); -# else -void nas_proc_initialize(void); -# endif - -void nas_proc_cleanup(void); - -/* - * -------------------------------------------------------------------------- - * NAS procedures triggered by the user - * -------------------------------------------------------------------------- - */ - - -/* - * -------------------------------------------------------------------------- - * NAS procedures triggered by the network - * -------------------------------------------------------------------------- - */ - - - -int nas_proc_establish_ind(uint32_t ueid, tac_t tac, const Byte_t *data, - uint32_t len); - -int nas_proc_dl_transfer_cnf(uint32_t ueid); -int nas_proc_dl_transfer_rej(uint32_t ueid); -int nas_proc_ul_transfer_ind(uint32_t ueid, const Byte_t *data, uint32_t len); - -/* - * -------------------------------------------------------------------------- - * NAS procedures triggered by the mme applicative layer - * -------------------------------------------------------------------------- - */ -#if defined(NAS_BUILT_IN_EPC) -int nas_proc_auth_param_res(emm_cn_auth_res_t *emm_cn_auth_res); -int nas_proc_auth_param_fail(emm_cn_auth_fail_t *emm_cn_auth_fail); -int nas_proc_deregister_ue(uint32_t ue_id); -int nas_proc_pdn_connectivity_res(nas_pdn_connectivity_rsp_t *nas_pdn_connectivity_rsp); -int nas_proc_pdn_connectivity_fail(nas_pdn_connectivity_fail_t *nas_pdn_connectivity_fail); -#endif - -#endif /* __NAS_PROC_H__*/ diff --git a/openair-cn/NAS/TEST/AS_SIMULATOR/Makefile b/openair-cn/NAS/TEST/AS_SIMULATOR/Makefile index 94c27037e4..91146b1afa 100644 --- a/openair-cn/NAS/TEST/AS_SIMULATOR/Makefile +++ b/openair-cn/NAS/TEST/AS_SIMULATOR/Makefile @@ -21,7 +21,7 @@ # Contact Information # OpenAirInterface Admin: openair_admin@eurecom.fr # OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@eurecom.fr +# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr # # Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. # diff --git a/openair-cn/NAS/TEST/NETWORK/Makefile b/openair-cn/NAS/TEST/NETWORK/Makefile index b9075e5c77..e6e03f1362 100644 --- a/openair-cn/NAS/TEST/NETWORK/Makefile +++ b/openair-cn/NAS/TEST/NETWORK/Makefile @@ -21,7 +21,7 @@ # Contact Information # OpenAirInterface Admin: openair_admin@eurecom.fr # OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@eurecom.fr +# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr # # Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. # diff --git a/openair-cn/NAS/TEST/USER/Makefile b/openair-cn/NAS/TEST/USER/Makefile index 797d0614ab..f65e6ff557 100644 --- a/openair-cn/NAS/TEST/USER/Makefile +++ b/openair-cn/NAS/TEST/USER/Makefile @@ -21,7 +21,7 @@ # Contact Information # OpenAirInterface Admin: openair_admin@eurecom.fr # OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@eurecom.fr +# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr # # Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. # diff --git a/openair-cn/NAS/TOOLS/Makefile b/openair-cn/NAS/TOOLS/Makefile index 9c3c54e602..d54edd3049 100644 --- a/openair-cn/NAS/TOOLS/Makefile +++ b/openair-cn/NAS/TOOLS/Makefile @@ -21,7 +21,7 @@ # Contact Information # OpenAirInterface Admin: openair_admin@eurecom.fr # OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@eurecom.fr +# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr # # Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. # diff --git a/openair-cn/NAS/TOOLS/network.h b/openair-cn/NAS/TOOLS/network.h index 849c30f88f..54bf61a7b4 100644 --- a/openair-cn/NAS/TOOLS/network.h +++ b/openair-cn/NAS/TOOLS/network.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/TOOLS/ue_data.c b/openair-cn/NAS/TOOLS/ue_data.c index 5dcbdf79de..478119acda 100644 --- a/openair-cn/NAS/TOOLS/ue_data.c +++ b/openair-cn/NAS/TOOLS/ue_data.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/TOOLS/usim_data.c b/openair-cn/NAS/TOOLS/usim_data.c index ea867fef3c..ea046245ed 100644 --- a/openair-cn/NAS/TOOLS/usim_data.c +++ b/openair-cn/NAS/TOOLS/usim_data.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/API/USER/Makefile b/openair-cn/NAS/UE/API/USER/Makefile index 8e7c24a4c4..d4981975fc 100644 --- a/openair-cn/NAS/UE/API/USER/Makefile +++ b/openair-cn/NAS/UE/API/USER/Makefile @@ -21,7 +21,7 @@ # Contact Information # OpenAirInterface Admin: openair_admin@eurecom.fr # OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@eurecom.fr +# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr # # Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. # diff --git a/openair-cn/NAS/UE/API/USER/at_command.c b/openair-cn/NAS/UE/API/USER/at_command.c index c6f26a4b1b..dc4dd3c040 100644 --- a/openair-cn/NAS/UE/API/USER/at_command.c +++ b/openair-cn/NAS/UE/API/USER/at_command.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/API/USER/at_command.h b/openair-cn/NAS/UE/API/USER/at_command.h index d1b74dc4c3..4c65b0cf2c 100644 --- a/openair-cn/NAS/UE/API/USER/at_command.h +++ b/openair-cn/NAS/UE/API/USER/at_command.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/API/USER/at_error.c b/openair-cn/NAS/UE/API/USER/at_error.c index 440db34d9f..7b93fb5808 100644 --- a/openair-cn/NAS/UE/API/USER/at_error.c +++ b/openair-cn/NAS/UE/API/USER/at_error.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/API/USER/at_error.h b/openair-cn/NAS/UE/API/USER/at_error.h index d03896a383..1554f3fa3e 100644 --- a/openair-cn/NAS/UE/API/USER/at_error.h +++ b/openair-cn/NAS/UE/API/USER/at_error.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/API/USER/at_response.c b/openair-cn/NAS/UE/API/USER/at_response.c index 7d067d1cfc..68aa9137aa 100644 --- a/openair-cn/NAS/UE/API/USER/at_response.c +++ b/openair-cn/NAS/UE/API/USER/at_response.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/API/USER/at_response.h b/openair-cn/NAS/UE/API/USER/at_response.h index 17c3ea0d81..2fa30fabeb 100644 --- a/openair-cn/NAS/UE/API/USER/at_response.h +++ b/openair-cn/NAS/UE/API/USER/at_response.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/API/USER/tst/Makefile b/openair-cn/NAS/UE/API/USER/tst/Makefile index 867c3f697e..3ec0f767ca 100644 --- a/openair-cn/NAS/UE/API/USER/tst/Makefile +++ b/openair-cn/NAS/UE/API/USER/tst/Makefile @@ -21,7 +21,7 @@ # Contact Information # OpenAirInterface Admin: openair_admin@eurecom.fr # OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@eurecom.fr +# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr # # Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. # diff --git a/openair-cn/NAS/UE/API/USER/tst/at_parser.c b/openair-cn/NAS/UE/API/USER/tst/at_parser.c index 7d0ca3f1e1..9700018386 100644 --- a/openair-cn/NAS/UE/API/USER/tst/at_parser.c +++ b/openair-cn/NAS/UE/API/USER/tst/at_parser.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/API/USER/user_api.c b/openair-cn/NAS/UE/API/USER/user_api.c index 42e7cb1538..6762877ad0 100644 --- a/openair-cn/NAS/UE/API/USER/user_api.c +++ b/openair-cn/NAS/UE/API/USER/user_api.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/API/USER/user_api.h b/openair-cn/NAS/UE/API/USER/user_api.h index d58b59577d..a71ab458d4 100644 --- a/openair-cn/NAS/UE/API/USER/user_api.h +++ b/openair-cn/NAS/UE/API/USER/user_api.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/API/USER/user_indication.c b/openair-cn/NAS/UE/API/USER/user_indication.c index 79759a3253..a4e1b7cd93 100644 --- a/openair-cn/NAS/UE/API/USER/user_indication.c +++ b/openair-cn/NAS/UE/API/USER/user_indication.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/API/USER/user_indication.h b/openair-cn/NAS/UE/API/USER/user_indication.h index 4cf762b609..74679fb52a 100644 --- a/openair-cn/NAS/UE/API/USER/user_indication.h +++ b/openair-cn/NAS/UE/API/USER/user_indication.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/API/USIM/Makefile b/openair-cn/NAS/UE/API/USIM/Makefile index 8e7c24a4c4..d4981975fc 100644 --- a/openair-cn/NAS/UE/API/USIM/Makefile +++ b/openair-cn/NAS/UE/API/USIM/Makefile @@ -21,7 +21,7 @@ # Contact Information # OpenAirInterface Admin: openair_admin@eurecom.fr # OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@eurecom.fr +# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr # # Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. # diff --git a/openair-cn/NAS/UE/API/USIM/aka_functions.h b/openair-cn/NAS/UE/API/USIM/aka_functions.h index 1bb4bbf021..0d1a6fe1df 100644 --- a/openair-cn/NAS/UE/API/USIM/aka_functions.h +++ b/openair-cn/NAS/UE/API/USIM/aka_functions.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/API/USIM/usim_api.c b/openair-cn/NAS/UE/API/USIM/usim_api.c index e69e78ddec..64bc05d0c3 100644 --- a/openair-cn/NAS/UE/API/USIM/usim_api.c +++ b/openair-cn/NAS/UE/API/USIM/usim_api.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/API/USIM/usim_api.h b/openair-cn/NAS/UE/API/USIM/usim_api.h index 7b5a767d98..f7e85f95e7 100644 --- a/openair-cn/NAS/UE/API/USIM/usim_api.h +++ b/openair-cn/NAS/UE/API/USIM/usim_api.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/Attach.c b/openair-cn/NAS/UE/EMM/Attach.c index 3a0c079685..d7bdeb9120 100755 --- a/openair-cn/NAS/UE/EMM/Attach.c +++ b/openair-cn/NAS/UE/EMM/Attach.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/Authentication.c b/openair-cn/NAS/UE/EMM/Authentication.c index e0acb302ac..6285534450 100755 --- a/openair-cn/NAS/UE/EMM/Authentication.c +++ b/openair-cn/NAS/UE/EMM/Authentication.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/Detach.c b/openair-cn/NAS/UE/EMM/Detach.c index d494515107..7ec7a3d74d 100755 --- a/openair-cn/NAS/UE/EMM/Detach.c +++ b/openair-cn/NAS/UE/EMM/Detach.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/EmmStatusHdl.c b/openair-cn/NAS/UE/EMM/EmmStatusHdl.c index b81f7d5051..85d423fd23 100755 --- a/openair-cn/NAS/UE/EMM/EmmStatusHdl.c +++ b/openair-cn/NAS/UE/EMM/EmmStatusHdl.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/Identification.c b/openair-cn/NAS/UE/EMM/Identification.c index b9d75f1917..80eede61be 100755 --- a/openair-cn/NAS/UE/EMM/Identification.c +++ b/openair-cn/NAS/UE/EMM/Identification.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/IdleMode.c b/openair-cn/NAS/UE/EMM/IdleMode.c index 78c21205e3..b04670819b 100755 --- a/openair-cn/NAS/UE/EMM/IdleMode.c +++ b/openair-cn/NAS/UE/EMM/IdleMode.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/IdleMode.h b/openair-cn/NAS/UE/EMM/IdleMode.h index 7f23bb1bf4..c0e13c9a7d 100755 --- a/openair-cn/NAS/UE/EMM/IdleMode.h +++ b/openair-cn/NAS/UE/EMM/IdleMode.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/LowerLayer.c b/openair-cn/NAS/UE/EMM/LowerLayer.c index 10f7c4ccc9..130fe1bb5d 100755 --- a/openair-cn/NAS/UE/EMM/LowerLayer.c +++ b/openair-cn/NAS/UE/EMM/LowerLayer.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/LowerLayer.h b/openair-cn/NAS/UE/EMM/LowerLayer.h index 4d9b4c5d39..80ee4acb2a 100755 --- a/openair-cn/NAS/UE/EMM/LowerLayer.h +++ b/openair-cn/NAS/UE/EMM/LowerLayer.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/SAP/EmmDeregistered.c b/openair-cn/NAS/UE/EMM/SAP/EmmDeregistered.c index 83ae79f428..13a55b3846 100755 --- a/openair-cn/NAS/UE/EMM/SAP/EmmDeregistered.c +++ b/openair-cn/NAS/UE/EMM/SAP/EmmDeregistered.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/SAP/EmmDeregisteredAttachNeeded.c b/openair-cn/NAS/UE/EMM/SAP/EmmDeregisteredAttachNeeded.c index b2def20a57..0d0301c392 100755 --- a/openair-cn/NAS/UE/EMM/SAP/EmmDeregisteredAttachNeeded.c +++ b/openair-cn/NAS/UE/EMM/SAP/EmmDeregisteredAttachNeeded.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/SAP/EmmDeregisteredAttemptingToAttach.c b/openair-cn/NAS/UE/EMM/SAP/EmmDeregisteredAttemptingToAttach.c index 51053ab925..40911608bf 100755 --- a/openair-cn/NAS/UE/EMM/SAP/EmmDeregisteredAttemptingToAttach.c +++ b/openair-cn/NAS/UE/EMM/SAP/EmmDeregisteredAttemptingToAttach.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/SAP/EmmDeregisteredInitiated.c b/openair-cn/NAS/UE/EMM/SAP/EmmDeregisteredInitiated.c index fc0e0524be..060329f2e5 100755 --- a/openair-cn/NAS/UE/EMM/SAP/EmmDeregisteredInitiated.c +++ b/openair-cn/NAS/UE/EMM/SAP/EmmDeregisteredInitiated.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/SAP/EmmDeregisteredLimitedService.c b/openair-cn/NAS/UE/EMM/SAP/EmmDeregisteredLimitedService.c index 6af83fd855..92df829b8d 100755 --- a/openair-cn/NAS/UE/EMM/SAP/EmmDeregisteredLimitedService.c +++ b/openair-cn/NAS/UE/EMM/SAP/EmmDeregisteredLimitedService.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/SAP/EmmDeregisteredNoCellAvailable.c b/openair-cn/NAS/UE/EMM/SAP/EmmDeregisteredNoCellAvailable.c index 9708f3a6be..65154d4d97 100755 --- a/openair-cn/NAS/UE/EMM/SAP/EmmDeregisteredNoCellAvailable.c +++ b/openair-cn/NAS/UE/EMM/SAP/EmmDeregisteredNoCellAvailable.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/SAP/EmmDeregisteredNoImsi.c b/openair-cn/NAS/UE/EMM/SAP/EmmDeregisteredNoImsi.c index 315ce0f8ff..7740b22e9b 100755 --- a/openair-cn/NAS/UE/EMM/SAP/EmmDeregisteredNoImsi.c +++ b/openair-cn/NAS/UE/EMM/SAP/EmmDeregisteredNoImsi.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/SAP/EmmDeregisteredNormalService.c b/openair-cn/NAS/UE/EMM/SAP/EmmDeregisteredNormalService.c index 386a4fd4b4..25924fd9f2 100755 --- a/openair-cn/NAS/UE/EMM/SAP/EmmDeregisteredNormalService.c +++ b/openair-cn/NAS/UE/EMM/SAP/EmmDeregisteredNormalService.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/SAP/EmmDeregisteredPlmnSearch.c b/openair-cn/NAS/UE/EMM/SAP/EmmDeregisteredPlmnSearch.c index 071b9a576c..08c3ff5ea1 100755 --- a/openair-cn/NAS/UE/EMM/SAP/EmmDeregisteredPlmnSearch.c +++ b/openair-cn/NAS/UE/EMM/SAP/EmmDeregisteredPlmnSearch.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/SAP/EmmNull.c b/openair-cn/NAS/UE/EMM/SAP/EmmNull.c index c1583d56e1..f36d579e5c 100755 --- a/openair-cn/NAS/UE/EMM/SAP/EmmNull.c +++ b/openair-cn/NAS/UE/EMM/SAP/EmmNull.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/SAP/EmmRegistered.c b/openair-cn/NAS/UE/EMM/SAP/EmmRegistered.c index 7db6e86b74..889d22663c 100755 --- a/openair-cn/NAS/UE/EMM/SAP/EmmRegistered.c +++ b/openair-cn/NAS/UE/EMM/SAP/EmmRegistered.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/SAP/EmmRegisteredAttemptingToUpdate.c b/openair-cn/NAS/UE/EMM/SAP/EmmRegisteredAttemptingToUpdate.c index 6b15df4a54..0dcaec5868 100755 --- a/openair-cn/NAS/UE/EMM/SAP/EmmRegisteredAttemptingToUpdate.c +++ b/openair-cn/NAS/UE/EMM/SAP/EmmRegisteredAttemptingToUpdate.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/SAP/EmmRegisteredImsiDetachInitiated.c b/openair-cn/NAS/UE/EMM/SAP/EmmRegisteredImsiDetachInitiated.c index ba40a549d8..24de58db86 100755 --- a/openair-cn/NAS/UE/EMM/SAP/EmmRegisteredImsiDetachInitiated.c +++ b/openair-cn/NAS/UE/EMM/SAP/EmmRegisteredImsiDetachInitiated.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/SAP/EmmRegisteredInitiated.c b/openair-cn/NAS/UE/EMM/SAP/EmmRegisteredInitiated.c index 2ee8b8dea6..18c41c8ad4 100755 --- a/openair-cn/NAS/UE/EMM/SAP/EmmRegisteredInitiated.c +++ b/openair-cn/NAS/UE/EMM/SAP/EmmRegisteredInitiated.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/SAP/EmmRegisteredLimitedService.c b/openair-cn/NAS/UE/EMM/SAP/EmmRegisteredLimitedService.c index 799914d119..1d78a97509 100755 --- a/openair-cn/NAS/UE/EMM/SAP/EmmRegisteredLimitedService.c +++ b/openair-cn/NAS/UE/EMM/SAP/EmmRegisteredLimitedService.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/SAP/EmmRegisteredNoCellAvailable.c b/openair-cn/NAS/UE/EMM/SAP/EmmRegisteredNoCellAvailable.c index 0578d8acfd..8385f4359f 100755 --- a/openair-cn/NAS/UE/EMM/SAP/EmmRegisteredNoCellAvailable.c +++ b/openair-cn/NAS/UE/EMM/SAP/EmmRegisteredNoCellAvailable.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/SAP/EmmRegisteredNormalService.c b/openair-cn/NAS/UE/EMM/SAP/EmmRegisteredNormalService.c index 51e28d2068..4f3dc54f46 100755 --- a/openair-cn/NAS/UE/EMM/SAP/EmmRegisteredNormalService.c +++ b/openair-cn/NAS/UE/EMM/SAP/EmmRegisteredNormalService.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/SAP/EmmRegisteredPlmnSearch.c b/openair-cn/NAS/UE/EMM/SAP/EmmRegisteredPlmnSearch.c index c4c053515d..a5b28bed43 100755 --- a/openair-cn/NAS/UE/EMM/SAP/EmmRegisteredPlmnSearch.c +++ b/openair-cn/NAS/UE/EMM/SAP/EmmRegisteredPlmnSearch.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/SAP/EmmRegisteredUpdateNeeded.c b/openair-cn/NAS/UE/EMM/SAP/EmmRegisteredUpdateNeeded.c index ead9ce7aa8..9f960082f0 100755 --- a/openair-cn/NAS/UE/EMM/SAP/EmmRegisteredUpdateNeeded.c +++ b/openair-cn/NAS/UE/EMM/SAP/EmmRegisteredUpdateNeeded.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/SAP/EmmServiceRequestInitiated.c b/openair-cn/NAS/UE/EMM/SAP/EmmServiceRequestInitiated.c index 3d9b593dbc..47744d8db9 100755 --- a/openair-cn/NAS/UE/EMM/SAP/EmmServiceRequestInitiated.c +++ b/openair-cn/NAS/UE/EMM/SAP/EmmServiceRequestInitiated.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/SAP/EmmTrackingAreaUpdatingInitiated.c b/openair-cn/NAS/UE/EMM/SAP/EmmTrackingAreaUpdatingInitiated.c index 7adb4e12fa..4539c63a93 100755 --- a/openair-cn/NAS/UE/EMM/SAP/EmmTrackingAreaUpdatingInitiated.c +++ b/openair-cn/NAS/UE/EMM/SAP/EmmTrackingAreaUpdatingInitiated.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/SAP/emm_as.c b/openair-cn/NAS/UE/EMM/SAP/emm_as.c index 433b4e5304..daf2d50c33 100755 --- a/openair-cn/NAS/UE/EMM/SAP/emm_as.c +++ b/openair-cn/NAS/UE/EMM/SAP/emm_as.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/SAP/emm_as.h b/openair-cn/NAS/UE/EMM/SAP/emm_as.h index ca4fc449b7..1e46431a56 100755 --- a/openair-cn/NAS/UE/EMM/SAP/emm_as.h +++ b/openair-cn/NAS/UE/EMM/SAP/emm_as.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/SAP/emm_asDef.h b/openair-cn/NAS/UE/EMM/SAP/emm_asDef.h index fbd2a6b38e..f7b9fa23f8 100755 --- a/openair-cn/NAS/UE/EMM/SAP/emm_asDef.h +++ b/openair-cn/NAS/UE/EMM/SAP/emm_asDef.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/SAP/emm_esm.c b/openair-cn/NAS/UE/EMM/SAP/emm_esm.c index 4a5400e0c1..b4baca66af 100755 --- a/openair-cn/NAS/UE/EMM/SAP/emm_esm.c +++ b/openair-cn/NAS/UE/EMM/SAP/emm_esm.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/SAP/emm_esm.h b/openair-cn/NAS/UE/EMM/SAP/emm_esm.h index 6967b97ca1..55c3b361a9 100755 --- a/openair-cn/NAS/UE/EMM/SAP/emm_esm.h +++ b/openair-cn/NAS/UE/EMM/SAP/emm_esm.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/SAP/emm_esmDef.h b/openair-cn/NAS/UE/EMM/SAP/emm_esmDef.h index 215be4fa6d..8251ee57b9 100755 --- a/openair-cn/NAS/UE/EMM/SAP/emm_esmDef.h +++ b/openair-cn/NAS/UE/EMM/SAP/emm_esmDef.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/SAP/emm_fsm.c b/openair-cn/NAS/UE/EMM/SAP/emm_fsm.c index 59c78be3e2..83c5e5f1db 100755 --- a/openair-cn/NAS/UE/EMM/SAP/emm_fsm.c +++ b/openair-cn/NAS/UE/EMM/SAP/emm_fsm.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/SAP/emm_fsm.h b/openair-cn/NAS/UE/EMM/SAP/emm_fsm.h index e554f0f9e2..c929890e05 100755 --- a/openair-cn/NAS/UE/EMM/SAP/emm_fsm.h +++ b/openair-cn/NAS/UE/EMM/SAP/emm_fsm.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/SAP/emm_recv.c b/openair-cn/NAS/UE/EMM/SAP/emm_recv.c index de9347fcff..12efa89f86 100755 --- a/openair-cn/NAS/UE/EMM/SAP/emm_recv.c +++ b/openair-cn/NAS/UE/EMM/SAP/emm_recv.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/SAP/emm_recv.h b/openair-cn/NAS/UE/EMM/SAP/emm_recv.h index a096eef376..71398f98d0 100755 --- a/openair-cn/NAS/UE/EMM/SAP/emm_recv.h +++ b/openair-cn/NAS/UE/EMM/SAP/emm_recv.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/SAP/emm_reg.c b/openair-cn/NAS/UE/EMM/SAP/emm_reg.c index ca19566cb9..7f20b25151 100755 --- a/openair-cn/NAS/UE/EMM/SAP/emm_reg.c +++ b/openair-cn/NAS/UE/EMM/SAP/emm_reg.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/SAP/emm_reg.h b/openair-cn/NAS/UE/EMM/SAP/emm_reg.h index 62d333395c..9660f641c1 100755 --- a/openair-cn/NAS/UE/EMM/SAP/emm_reg.h +++ b/openair-cn/NAS/UE/EMM/SAP/emm_reg.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/SAP/emm_regDef.h b/openair-cn/NAS/UE/EMM/SAP/emm_regDef.h index 6a85d8923d..7f96326ffb 100755 --- a/openair-cn/NAS/UE/EMM/SAP/emm_regDef.h +++ b/openair-cn/NAS/UE/EMM/SAP/emm_regDef.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/SAP/emm_sap.c b/openair-cn/NAS/UE/EMM/SAP/emm_sap.c index 84184f4f76..2da5da75ce 100755 --- a/openair-cn/NAS/UE/EMM/SAP/emm_sap.c +++ b/openair-cn/NAS/UE/EMM/SAP/emm_sap.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/SAP/emm_sap.h b/openair-cn/NAS/UE/EMM/SAP/emm_sap.h index c0c38d13a6..eda2bde514 100755 --- a/openair-cn/NAS/UE/EMM/SAP/emm_sap.h +++ b/openair-cn/NAS/UE/EMM/SAP/emm_sap.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/SAP/emm_send.c b/openair-cn/NAS/UE/EMM/SAP/emm_send.c index 75431ae388..d8e434f5a2 100755 --- a/openair-cn/NAS/UE/EMM/SAP/emm_send.c +++ b/openair-cn/NAS/UE/EMM/SAP/emm_send.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/SAP/emm_send.h b/openair-cn/NAS/UE/EMM/SAP/emm_send.h index ea90bd1775..18c8eb37f0 100755 --- a/openair-cn/NAS/UE/EMM/SAP/emm_send.h +++ b/openair-cn/NAS/UE/EMM/SAP/emm_send.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/SecurityModeControl.c b/openair-cn/NAS/UE/EMM/SecurityModeControl.c index 359ce1ea2f..fd7e4c3991 100755 --- a/openair-cn/NAS/UE/EMM/SecurityModeControl.c +++ b/openair-cn/NAS/UE/EMM/SecurityModeControl.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/ServiceRequestHdl.c b/openair-cn/NAS/UE/EMM/ServiceRequestHdl.c index 6f74b4fbbe..d34e1f9f88 100755 --- a/openair-cn/NAS/UE/EMM/ServiceRequestHdl.c +++ b/openair-cn/NAS/UE/EMM/ServiceRequestHdl.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/TrackingAreaUpdate.c b/openair-cn/NAS/UE/EMM/TrackingAreaUpdate.c index fbec3f7060..ac7944d18b 100755 --- a/openair-cn/NAS/UE/EMM/TrackingAreaUpdate.c +++ b/openair-cn/NAS/UE/EMM/TrackingAreaUpdate.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/emmData.h b/openair-cn/NAS/UE/EMM/emmData.h index 7a81600871..d3e720eab0 100755 --- a/openair-cn/NAS/UE/EMM/emmData.h +++ b/openair-cn/NAS/UE/EMM/emmData.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/emm_main.c b/openair-cn/NAS/UE/EMM/emm_main.c index 51b6b693fb..dbeacaa149 100755 --- a/openair-cn/NAS/UE/EMM/emm_main.c +++ b/openair-cn/NAS/UE/EMM/emm_main.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/emm_main.h b/openair-cn/NAS/UE/EMM/emm_main.h index 3d3d441843..b985f806a5 100755 --- a/openair-cn/NAS/UE/EMM/emm_main.h +++ b/openair-cn/NAS/UE/EMM/emm_main.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/EMM/emm_proc.h b/openair-cn/NAS/UE/EMM/emm_proc.h index 267a64fcef..65ebe4e8e2 100755 --- a/openair-cn/NAS/UE/EMM/emm_proc.h +++ b/openair-cn/NAS/UE/EMM/emm_proc.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/ESM/DedicatedEpsBearerContextActivation.c b/openair-cn/NAS/UE/ESM/DedicatedEpsBearerContextActivation.c index 65fdaf4b3e..6a9e140ad4 100755 --- a/openair-cn/NAS/UE/ESM/DedicatedEpsBearerContextActivation.c +++ b/openair-cn/NAS/UE/ESM/DedicatedEpsBearerContextActivation.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/ESM/DefaultEpsBearerContextActivation.c b/openair-cn/NAS/UE/ESM/DefaultEpsBearerContextActivation.c index b6b7fb13fa..1884590437 100755 --- a/openair-cn/NAS/UE/ESM/DefaultEpsBearerContextActivation.c +++ b/openair-cn/NAS/UE/ESM/DefaultEpsBearerContextActivation.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/ESM/EpsBearerContextDeactivation.c b/openair-cn/NAS/UE/ESM/EpsBearerContextDeactivation.c index a8a5a4c952..bceeebeff1 100755 --- a/openair-cn/NAS/UE/ESM/EpsBearerContextDeactivation.c +++ b/openair-cn/NAS/UE/ESM/EpsBearerContextDeactivation.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/ESM/EsmStatusHdl.c b/openair-cn/NAS/UE/ESM/EsmStatusHdl.c index 8ff3a21b0b..9aafc271dd 100755 --- a/openair-cn/NAS/UE/ESM/EsmStatusHdl.c +++ b/openair-cn/NAS/UE/ESM/EsmStatusHdl.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/ESM/PdnConnectivity.c b/openair-cn/NAS/UE/ESM/PdnConnectivity.c index 2cfc2f58f0..8c9d123209 100755 --- a/openair-cn/NAS/UE/ESM/PdnConnectivity.c +++ b/openair-cn/NAS/UE/ESM/PdnConnectivity.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/ESM/PdnDisconnect.c b/openair-cn/NAS/UE/ESM/PdnDisconnect.c index 54105a1c3b..e9ab748f8d 100755 --- a/openair-cn/NAS/UE/ESM/PdnDisconnect.c +++ b/openair-cn/NAS/UE/ESM/PdnDisconnect.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/ESM/SAP/esm_recv.c b/openair-cn/NAS/UE/ESM/SAP/esm_recv.c index 77805030a7..72b322e966 100755 --- a/openair-cn/NAS/UE/ESM/SAP/esm_recv.c +++ b/openair-cn/NAS/UE/ESM/SAP/esm_recv.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/ESM/SAP/esm_recv.h b/openair-cn/NAS/UE/ESM/SAP/esm_recv.h index f3c6a174d0..35e3ee49ce 100755 --- a/openair-cn/NAS/UE/ESM/SAP/esm_recv.h +++ b/openair-cn/NAS/UE/ESM/SAP/esm_recv.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/ESM/SAP/esm_sap.c b/openair-cn/NAS/UE/ESM/SAP/esm_sap.c index dd0c0114a9..d23aa07390 100755 --- a/openair-cn/NAS/UE/ESM/SAP/esm_sap.c +++ b/openair-cn/NAS/UE/ESM/SAP/esm_sap.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/ESM/SAP/esm_sap.h b/openair-cn/NAS/UE/ESM/SAP/esm_sap.h index c2d900a4ae..693185c473 100755 --- a/openair-cn/NAS/UE/ESM/SAP/esm_sap.h +++ b/openair-cn/NAS/UE/ESM/SAP/esm_sap.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/ESM/SAP/esm_sapDef.h b/openair-cn/NAS/UE/ESM/SAP/esm_sapDef.h index e36d1faed5..2430696319 100755 --- a/openair-cn/NAS/UE/ESM/SAP/esm_sapDef.h +++ b/openair-cn/NAS/UE/ESM/SAP/esm_sapDef.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/ESM/SAP/esm_send.c b/openair-cn/NAS/UE/ESM/SAP/esm_send.c index c5de9958ca..ab5341062a 100755 --- a/openair-cn/NAS/UE/ESM/SAP/esm_send.c +++ b/openair-cn/NAS/UE/ESM/SAP/esm_send.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/ESM/SAP/esm_send.h b/openair-cn/NAS/UE/ESM/SAP/esm_send.h index 4e261300c5..8f4056df6f 100755 --- a/openair-cn/NAS/UE/ESM/SAP/esm_send.h +++ b/openair-cn/NAS/UE/ESM/SAP/esm_send.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/ESM/esmData.h b/openair-cn/NAS/UE/ESM/esmData.h index 9726e83e8a..7571e25e64 100755 --- a/openair-cn/NAS/UE/ESM/esmData.h +++ b/openair-cn/NAS/UE/ESM/esmData.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/ESM/esm_ebr.c b/openair-cn/NAS/UE/ESM/esm_ebr.c index d7a36cc6db..b305dc778b 100755 --- a/openair-cn/NAS/UE/ESM/esm_ebr.c +++ b/openair-cn/NAS/UE/ESM/esm_ebr.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/ESM/esm_ebr.h b/openair-cn/NAS/UE/ESM/esm_ebr.h index 163983f8c0..1298aa1243 100755 --- a/openair-cn/NAS/UE/ESM/esm_ebr.h +++ b/openair-cn/NAS/UE/ESM/esm_ebr.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/ESM/esm_ebr_context.c b/openair-cn/NAS/UE/ESM/esm_ebr_context.c index cbc46a9461..fcf278a2e4 100755 --- a/openair-cn/NAS/UE/ESM/esm_ebr_context.c +++ b/openair-cn/NAS/UE/ESM/esm_ebr_context.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/ESM/esm_ebr_context.h b/openair-cn/NAS/UE/ESM/esm_ebr_context.h index 2a9d55a197..a93fb94eb1 100755 --- a/openair-cn/NAS/UE/ESM/esm_ebr_context.h +++ b/openair-cn/NAS/UE/ESM/esm_ebr_context.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/ESM/esm_ip.c b/openair-cn/NAS/UE/ESM/esm_ip.c index b2fb84b970..041d186b8d 100755 --- a/openair-cn/NAS/UE/ESM/esm_ip.c +++ b/openair-cn/NAS/UE/ESM/esm_ip.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/ESM/esm_main.c b/openair-cn/NAS/UE/ESM/esm_main.c index 2d2124e495..f507b0a53f 100755 --- a/openair-cn/NAS/UE/ESM/esm_main.c +++ b/openair-cn/NAS/UE/ESM/esm_main.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/ESM/esm_main.h b/openair-cn/NAS/UE/ESM/esm_main.h index 2fd2e58939..de95ba26f9 100755 --- a/openair-cn/NAS/UE/ESM/esm_main.h +++ b/openair-cn/NAS/UE/ESM/esm_main.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/ESM/esm_proc.h b/openair-cn/NAS/UE/ESM/esm_proc.h index f4721aa00c..094907257b 100755 --- a/openair-cn/NAS/UE/ESM/esm_proc.h +++ b/openair-cn/NAS/UE/ESM/esm_proc.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/ESM/esm_pt.c b/openair-cn/NAS/UE/ESM/esm_pt.c index 954049203c..9b2f4f7451 100755 --- a/openair-cn/NAS/UE/ESM/esm_pt.c +++ b/openair-cn/NAS/UE/ESM/esm_pt.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/ESM/esm_pt.h b/openair-cn/NAS/UE/ESM/esm_pt.h index 0abe6ea558..8821b3be91 100755 --- a/openair-cn/NAS/UE/ESM/esm_pt.h +++ b/openair-cn/NAS/UE/ESM/esm_pt.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/UEprocess.c b/openair-cn/NAS/UE/UEprocess.c index d42699eddb..0f45697f18 100644 --- a/openair-cn/NAS/UE/UEprocess.c +++ b/openair-cn/NAS/UE/UEprocess.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/nas_itti_messaging.c b/openair-cn/NAS/UE/nas_itti_messaging.c index d832585ebd..7b8f630b89 100755 --- a/openair-cn/NAS/UE/nas_itti_messaging.c +++ b/openair-cn/NAS/UE/nas_itti_messaging.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/nas_itti_messaging.h b/openair-cn/NAS/UE/nas_itti_messaging.h index 4165119570..9ea80f63c0 100755 --- a/openair-cn/NAS/UE/nas_itti_messaging.h +++ b/openair-cn/NAS/UE/nas_itti_messaging.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/nas_network.c b/openair-cn/NAS/UE/nas_network.c index 5c63d56067..d6aa625b36 100755 --- a/openair-cn/NAS/UE/nas_network.c +++ b/openair-cn/NAS/UE/nas_network.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/nas_network.h b/openair-cn/NAS/UE/nas_network.h index 25a8729eac..d56542ba42 100755 --- a/openair-cn/NAS/UE/nas_network.h +++ b/openair-cn/NAS/UE/nas_network.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/nas_parser.c b/openair-cn/NAS/UE/nas_parser.c index aae894b783..40ba7152b3 100755 --- a/openair-cn/NAS/UE/nas_parser.c +++ b/openair-cn/NAS/UE/nas_parser.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/nas_parser.h b/openair-cn/NAS/UE/nas_parser.h index 4e9be0aa28..003dd0895e 100755 --- a/openair-cn/NAS/UE/nas_parser.h +++ b/openair-cn/NAS/UE/nas_parser.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/nas_proc.c b/openair-cn/NAS/UE/nas_proc.c index f6327fd627..e9f61b9d8b 100755 --- a/openair-cn/NAS/UE/nas_proc.c +++ b/openair-cn/NAS/UE/nas_proc.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/nas_proc.h b/openair-cn/NAS/UE/nas_proc.h index 8d4897eddb..666c97f6dc 100755 --- a/openair-cn/NAS/UE/nas_proc.h +++ b/openair-cn/NAS/UE/nas_proc.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/nas_ue_task.c b/openair-cn/NAS/UE/nas_ue_task.c index 48c15a4835..ff57901970 100644 --- a/openair-cn/NAS/UE/nas_ue_task.c +++ b/openair-cn/NAS/UE/nas_ue_task.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/nas_user.c b/openair-cn/NAS/UE/nas_user.c index 4abb2f4040..447198b897 100644 --- a/openair-cn/NAS/UE/nas_user.c +++ b/openair-cn/NAS/UE/nas_user.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NAS/UE/nas_user.h b/openair-cn/NAS/UE/nas_user.h index 21f6680260..24603f3160 100644 --- a/openair-cn/NAS/UE/nas_user.h +++ b/openair-cn/NAS/UE/nas_user.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/NEWS b/openair-cn/NEWS deleted file mode 100644 index 8b13789179..0000000000 --- a/openair-cn/NEWS +++ /dev/null @@ -1 +0,0 @@ - diff --git a/openair-cn/OAISIM_MME/COPYING b/openair-cn/OAISIM_MME/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair-cn/OAISIM_MME/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program 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. - - This program 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 this program. If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - <program> Copyright (C) <year> <name of author> - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<http://www.gnu.org/licenses/>. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<http://www.gnu.org/philosophy/why-not-lgpl.html>. diff --git a/openair-cn/OAISIM_MME/Makefile.am b/openair-cn/OAISIM_MME/Makefile.am deleted file mode 100644 index 5fb6fd5009..0000000000 --- a/openair-cn/OAISIM_MME/Makefile.am +++ /dev/null @@ -1,76 +0,0 @@ -################################################################################ -# 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@eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ -if !STANDALONE_EPC -AM_CFLAGS = @ADD_CFLAGS@ \ - -I$(top_srcdir)/COMMON \ - -I$(top_srcdir)/GTPV1-U \ - -I$(top_srcdir)/GTPV1-U/nw-gtpv1u/include \ - -I$(top_srcdir)/GTPV1-U/nw-gtpv1u/shared \ - -I$(top_srcdir)/SCTP \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/api/network \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/include \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/ies \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/emm/msg \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/esm/msg \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/util \ - -I$(top_srcdir)/INTERTASK_INTERFACE \ - -I$(top_srcdir)/SGI \ - -I$(top_srcdir)/MME_APP \ - -I$(top_srcdir)/NAS \ - -I$(top_srcdir)/S11 \ - -I$(top_builddir)/S1AP/MESSAGES \ - -I$(top_srcdir)/S1AP \ - -I$(top_srcdir)/S6A \ - -I$(top_srcdir)/SECU \ - -I$(top_srcdir)/SGW-LITE \ - -I$(top_srcdir)/UDP \ - -I$(top_srcdir)/UTILS \ - -I$(top_srcdir)/UTILS/HASHTABLE - -oaisim_mme_LDADD = \ - $(top_builddir)/INTERTASK_INTERFACE/libitti.la \ - $(top_builddir)/NAS/libnas.la \ - $(top_builddir)/S11/libs11.la \ - $(top_builddir)/S1AP/libs1ap.la \ - $(top_builddir)/S6A/libs6a.la \ - $(top_builddir)/SCTP/libsctpserver.la \ - $(top_builddir)/UTILS/HASHTABLE/libhashtable.la \ - $(top_builddir)/UDP/libudpserver.la \ - $(top_builddir)/MME_APP/libmmeapp.la \ - $(top_builddir)/SECU/libsecu.la \ - $(top_builddir)/UTILS/libutils.la \ - $(top_builddir)/GTPV2-C/nwgtpv2c-0.11/src/libNwGtpv2c.a \ - $(abs_top_builddir)/INTERTASK_INTERFACE/UTIL/LFDS/liblfds6.1.1/liblfds611/bin/liblfds611.a - -oaisim_mme_SOURCES = \ - oai_mme_log.c \ - oaisim_mme.c - -bin_PROGRAMS = oaisim_mme -endif diff --git a/openair-cn/OAISIM_MME/oai_mme_log.c b/openair-cn/OAISIM_MME/oai_mme_log.c deleted file mode 100644 index 533719977a..0000000000 --- a/openair-cn/OAISIM_MME/oai_mme_log.c +++ /dev/null @@ -1,53 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -#include "oaisim_mme.h" -#include "log.h" - -#include <freeDiameter/freeDiameter-host.h> -#include <freeDiameter/libfdcore.h> - -int oai_mme_log_specific(int log_level) -{ - if (log_level == 1) { - asn_debug = 0; - asn1_xer_print = 1; - fd_g_debug_lvl = INFO; - } else if (log_level == 2) { - asn_debug = 1; - asn1_xer_print = 1; - fd_g_debug_lvl = ANNOYING; - } else { - asn1_xer_print = 0; - asn_debug = 0; - fd_g_debug_lvl = NONE; - } - - return 0; -} diff --git a/openair-cn/OAISIM_MME/oaisim_mme.c b/openair-cn/OAISIM_MME/oaisim_mme.c deleted file mode 100644 index 14a9871e58..0000000000 --- a/openair-cn/OAISIM_MME/oaisim_mme.c +++ /dev/null @@ -1,85 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <signal.h> - -#if HAVE_CONFIG_H -# include "config.h" -#endif - -#include "assertions.h" -#include "mme_config.h" -#include "gtpv1u_sgw_defs.h" - -#include "intertask_interface_init.h" - -#include "sctp_primitives_server.h" -#include "udp_primitives_server.h" -#include "s1ap_mme.h" -#include "log.h" -#include "timer.h" -#include "sgw_lite_defs.h" -#include "mme_app_extern.h" -#include "nas_defs.h" -#include "s11_mme.h" - -/* FreeDiameter headers for support of S6A interface */ -#include <freeDiameter/freeDiameter-host.h> -#include <freeDiameter/libfdcore.h> -#include "s6a_defs.h" - -#include "oaisim_mme.h" - -int main(int argc, char *argv[]) -{ - /* Parse the command line for options and set the mme_config accordingly. */ - CHECK_INIT_RETURN(config_parse_opt_line(argc, argv, &mme_config)); - - /* Calling each layer init function */ - CHECK_INIT_RETURN(log_init(&mme_config, oai_mme_log_specific)); - CHECK_INIT_RETURN(itti_init(TASK_MAX, THREAD_MAX, MESSAGES_ID_MAX, tasks_info, messages_info, messages_definition_xml, NULL)); - - CHECK_INIT_RETURN(nas_init(&mme_config)); - CHECK_INIT_RETURN(sctp_init(&mme_config)); - CHECK_INIT_RETURN(udp_init(&mme_config)); - CHECK_INIT_RETURN(s11_mme_init(&mme_config)); - CHECK_INIT_RETURN(s1ap_mme_init(&mme_config)); - // if (gtpv1u_init(&mme_config) < 0) return -1; - CHECK_INIT_RETURN(mme_app_init(&mme_config)); - - CHECK_INIT_RETURN(s6a_init(&mme_config)); - - /* Handle signals here */ - itti_wait_tasks_end(); - - return 0; -} diff --git a/openair-cn/OAISIM_MME/oaisim_mme.h b/openair-cn/OAISIM_MME/oaisim_mme.h deleted file mode 100644 index 5b389d75d1..0000000000 --- a/openair-cn/OAISIM_MME/oaisim_mme.h +++ /dev/null @@ -1,61 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/** @mainpage - - @section intro Introduction - - openair-mme project tends to provide an implementation of LTE core network. - - @section scope Scope - - - @section design Design Philosophy - - Included protocol stacks: - - SCTP RFC#### - - S1AP 3GPP TS 36.413 R10.5 - - S11 abstraction between MME and S-GW - - 3GPP TS 23.401 R10.5 - - nw-gtpv1u for s1-u (http://amitchawre.net/) - - freeDiameter project (http://www.freediameter.net/) 3GPP TS 29.272 R10.5 - - @section applications Applications and Usage - - Please use the script to start LTE epc in root src directory - - */ - -#ifndef OAISIM_MME_H_ -#define OAISIM_MME_H_ - -int main(int argc, char *argv[]); - -int oai_mme_log_specific(int log_level); - -#endif /* OAISIM_MME_H_ */ diff --git a/openair-cn/OAI_EPC/COPYING b/openair-cn/OAI_EPC/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair-cn/OAI_EPC/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program 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. - - This program 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 this program. If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - <program> Copyright (C) <year> <name of author> - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<http://www.gnu.org/licenses/>. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<http://www.gnu.org/philosophy/why-not-lgpl.html>. diff --git a/openair-cn/OAI_EPC/Makefile.am b/openair-cn/OAI_EPC/Makefile.am deleted file mode 100644 index 1a192009d0..0000000000 --- a/openair-cn/OAI_EPC/Makefile.am +++ /dev/null @@ -1,78 +0,0 @@ -################################################################################ -# 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@eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ -if STANDALONE_EPC -AM_CFLAGS = @ADD_CFLAGS@ \ - -I$(top_srcdir)/COMMON \ - -I$(top_srcdir)/GTPV1-U \ - -I$(top_srcdir)/GTPV1-U/nw-gtpv1u/include \ - -I$(top_srcdir)/GTPV1-U/nw-gtpv1u/shared \ - -I$(top_srcdir)/SCTP \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/api/network \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/include \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/ies \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/emm/msg \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/esm/msg \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/util \ - -I$(top_srcdir)/INTERTASK_INTERFACE \ - -I$(top_srcdir)/SGI \ - -I$(top_srcdir)/MME_APP \ - -I$(top_srcdir)/NAS \ - -I$(top_builddir)/S1AP/MESSAGES \ - -I$(top_srcdir)/S1AP \ - -I$(top_srcdir)/S6A \ - -I$(top_srcdir)/SECU \ - -I$(top_srcdir)/SGW-LITE \ - -I$(top_srcdir)/UDP \ - -I$(top_srcdir)/UTILS \ - -I$(top_srcdir)/UTILS/HASHTABLE \ - -I$(top_srcdir)/UTILS/TIMER - -oai_epc_LDADD = \ - $(top_builddir)/GTPV1-U/libgtpv1u.la \ - $(top_builddir)/GTPV2-C/nwgtpv2c-0.11/src/libNwGtpv2c.a \ - $(top_builddir)/INTERTASK_INTERFACE/libitti.la \ - $(top_builddir)/SGI/libsgi.la \ - $(top_builddir)/NAS/libnas.la \ - $(top_builddir)/S6A/libs6a.la \ - $(top_builddir)/SGW-LITE/libsgw_lite.la \ - $(top_builddir)/SCTP/libsctpserver.la \ - $(top_builddir)/UTILS/HASHTABLE/libhashtable.la \ - $(top_builddir)/UDP/libudpserver.la \ - $(top_builddir)/MME_APP/libmmeapp.la \ - $(top_builddir)/SECU/libsecu.la \ - $(top_builddir)/UTILS/libutils.la \ - $(top_builddir)/S1AP/libs1ap.la \ - $(abs_top_builddir)/INTERTASK_INTERFACE/UTIL/LFDS/liblfds6.1.1/liblfds611/bin/liblfds611.a - -oai_epc_SOURCES = \ - oai_epc_log.c \ - oai_epc.c - -bin_PROGRAMS = oai_epc -endif diff --git a/openair-cn/OAI_EPC/oai_epc.c b/openair-cn/OAI_EPC/oai_epc.c deleted file mode 100644 index f2fe6776be..0000000000 --- a/openair-cn/OAI_EPC/oai_epc.c +++ /dev/null @@ -1,93 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -/*! @file oai_epc.c - * @brief Entry point for EPC environement gathering MME, S-GW and P-GW in - * a single executable - */ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <signal.h> - -#if HAVE_CONFIG_H -# include "config.h" -#endif - -#include "mme_config.h" -#include "gtpv1u_sgw_defs.h" - -#include "assertions.h" - -#include "intertask_interface_init.h" - -#include "sctp_primitives_server.h" -#include "udp_primitives_server.h" -#include "s1ap_mme.h" -#include "log.h" -#include "timer.h" -#include "sgw_lite_defs.h" -#include "mme_app_extern.h" -#include "nas_defs.h" - -/* FreeDiameter headers for support of S6A interface */ -#include <freeDiameter/freeDiameter-host.h> -#include <freeDiameter/libfdcore.h> -#include "s6a_defs.h" - -#include "oai_epc.h" -#include "msc.h" - -int main(int argc, char *argv[]) -{ - - CHECK_INIT_RETURN(itti_init(TASK_MAX, THREAD_MAX, MESSAGES_ID_MAX, - tasks_info, messages_info, messages_definition_xml, - mme_config.itti_config.log_file)); - /* Parse the command line for options and set the mme_config accordingly. */ - CHECK_INIT_RETURN(config_parse_opt_line(argc, argv, &mme_config) < 0); - MSC_INIT(MSC_MME_GW, THREAD_MAX+TASK_MAX); - - /* Calling each layer init function */ - CHECK_INIT_RETURN(log_init(&mme_config, oai_epc_log_specific)); - CHECK_INIT_RETURN(nas_init(&mme_config)); - CHECK_INIT_RETURN(sctp_init(&mme_config)); - CHECK_INIT_RETURN(udp_init(&mme_config)); - CHECK_INIT_RETURN(gtpv1u_init(&mme_config)); - CHECK_INIT_RETURN(s1ap_mme_init(&mme_config)); - CHECK_INIT_RETURN(mme_app_init(&mme_config)); - CHECK_INIT_RETURN(s6a_init(&mme_config)); - CHECK_INIT_RETURN(sgw_lite_init(mme_config.config_file)); - /* Handle signals here */ - itti_wait_tasks_end(); - - return 0; -} diff --git a/openair-cn/OAI_EPC/oai_epc.h b/openair-cn/OAI_EPC/oai_epc.h deleted file mode 100644 index ab378bf7d9..0000000000 --- a/openair-cn/OAI_EPC/oai_epc.h +++ /dev/null @@ -1,61 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/** @mainpage - - @section intro Introduction - - openair-mme project tends to provide an implementation of LTE core network. - - @section scope Scope - - - @section design Design Philosophy - - Included protocol stacks: - - SCTP RFC#### - - S1AP 3GPP TS 36.413 R10.5 - - S11 abstraction between MME and S-GW - - 3GPP TS 23.401 R10.5 - - nw-gtpv1u for s1-u (http://amitchawre.net/) - - freeDiameter project (http://www.freediameter.net/) 3GPP TS 29.272 R10.5 - - @section applications Applications and Usage - - Please use the script to start LTE epc in root src directory - - */ - -#ifndef OAI_EPC_H_ -#define OAI_EPC_H_ - -int oai_epc_log_specific(int log_level); - -int main(int argc, char *argv[]); - -#endif /* OAI_EPC_H_ */ diff --git a/openair-cn/OAI_EPC/oai_epc_log.c b/openair-cn/OAI_EPC/oai_epc_log.c deleted file mode 100644 index 9bcf3fcbf0..0000000000 --- a/openair-cn/OAI_EPC/oai_epc_log.c +++ /dev/null @@ -1,52 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -#include "oai_epc.h" -#include "log.h" - -#include <freeDiameter/freeDiameter-host.h> -#include <freeDiameter/libfdcore.h> - -int oai_epc_log_specific(int log_level) -{ - if (log_level == 1) { - asn_debug = 0; - asn1_xer_print = 1; - fd_g_debug_lvl = INFO; - } else if (log_level == 2) { - asn_debug = 1; - asn1_xer_print = 1; - fd_g_debug_lvl = ANNOYING; - } else { - asn1_xer_print = 0; - asn_debug = 0; - fd_g_debug_lvl = NONE; - } - - return 0; -} diff --git a/openair-cn/OAI_SGW/COPYING b/openair-cn/OAI_SGW/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair-cn/OAI_SGW/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program 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. - - This program 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 this program. If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - <program> Copyright (C) <year> <name of author> - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<http://www.gnu.org/licenses/>. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<http://www.gnu.org/philosophy/why-not-lgpl.html>. diff --git a/openair-cn/OAI_SGW/Makefile.am b/openair-cn/OAI_SGW/Makefile.am deleted file mode 100644 index 4190c1dc8e..0000000000 --- a/openair-cn/OAI_SGW/Makefile.am +++ /dev/null @@ -1,67 +0,0 @@ -################################################################################ -# 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@eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ -if !STANDALONE_EPC -AM_CFLAGS = @ADD_CFLAGS@ \ - -I$(top_srcdir)/COMMON \ - -I$(top_srcdir)/GTPV1-U \ - -I$(top_srcdir)/GTPV1-U/nw-gtpv1u/include \ - -I$(top_srcdir)/GTPV1-U/nw-gtpv1u/shared \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/api/network \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/include \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/ies \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/emm/msg \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/esm/msg \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/util \ - -I$(top_srcdir)/INTERTASK_INTERFACE \ - -I$(top_srcdir)/S11 \ - -I$(top_srcdir)/SGI \ - -I$(top_srcdir)/SGW-LITE \ - -I$(top_srcdir)/UDP \ - -I$(top_srcdir)/UTILS \ - -I$(top_srcdir)/UTILS/HASHTABLE - -oai_sgw_LDADD = \ - $(top_builddir)/GTPV1-U/libgtpv1u.la \ - $(top_builddir)/INTERTASK_INTERFACE/libitti.la \ - $(top_builddir)/S11/libs11.la \ - $(top_builddir)/GTPV2-C/nwgtpv2c-0.11/src/libNwGtpv2c.a \ - $(top_builddir)/SGI/libsgi.la \ - $(top_builddir)/SGW-LITE/libsgw_lite.la \ - $(top_builddir)/UTILS/HASHTABLE/libhashtable.la \ - $(top_builddir)/UDP/libudpserver.la \ - $(top_builddir)/SECU/libsecu.la \ - $(top_builddir)/UTILS/libutils.la \ - $(abs_top_builddir)/INTERTASK_INTERFACE/UTIL/LFDS/liblfds6.1.1/liblfds611/bin/liblfds611.a - -oai_sgw_SOURCES = \ - oai_sgw_log.c \ - oai_sgw.c - -bin_PROGRAMS = oai_sgw -endif diff --git a/openair-cn/OAI_SGW/oai_sgw.c b/openair-cn/OAI_SGW/oai_sgw.c deleted file mode 100644 index 902c4c24c1..0000000000 --- a/openair-cn/OAI_SGW/oai_sgw.c +++ /dev/null @@ -1,79 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/*! \file oai_sgw.c -* \brief -* \author Lionel Gauthier -* \company Eurecom -* \email: lionel.gauthier@eurecom.fr -*/ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <signal.h> - -#if HAVE_CONFIG_H -# include "config.h" -#endif - -#include "assertions.h" -#include "mme_config.h" - -#include "intertask_interface_init.h" - -#include "udp_primitives_server.h" -#include "log.h" -#include "timer.h" -#include "s11_sgw.h" -#include "sgw_lite_defs.h" -#include "gtpv1u_sgw_defs.h" - -#include "oai_sgw.h" - -int main(int argc, char *argv[]) -{ - /* Parse the command line for options and set the mme_config accordingly. */ - CHECK_INIT_RETURN(config_parse_opt_line(argc, argv, &mme_config)); - - /* Calling each layer init function */ - CHECK_INIT_RETURN(log_init(&mme_config, oai_sgw_log_specific)); - CHECK_INIT_RETURN(itti_init(TASK_MAX, THREAD_MAX, MESSAGES_ID_MAX, tasks_info, messages_info, messages_definition_xml, NULL)); - - CHECK_INIT_RETURN(udp_init(&mme_config)); - CHECK_INIT_RETURN(s11_sgw_init(&mme_config)); - CHECK_INIT_RETURN(gtpv1u_init(&mme_config)); - - CHECK_INIT_RETURN(sgw_lite_init(mme_config.config_file)); - - /* Handle signals here */ - itti_wait_tasks_end(); - - return 0; -} diff --git a/openair-cn/OAI_SGW/oai_sgw.h b/openair-cn/OAI_SGW/oai_sgw.h deleted file mode 100644 index 5647b01790..0000000000 --- a/openair-cn/OAI_SGW/oai_sgw.h +++ /dev/null @@ -1,43 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/*! \file oai_sgw.h -* \brief -* \author Lionel Gauthier -* \company Eurecom -* \email: lionel.gauthier@eurecom.fr -*/ - -#ifndef OAI_SGW_H_ -#define OAI_SGW_H_ - -int main(int argc, char *argv[]); - -int oai_sgw_log_specific(int log_level); - -#endif /* OAI_SGW_H_ */ diff --git a/openair-cn/OAI_SGW/oai_sgw_log.c b/openair-cn/OAI_SGW/oai_sgw_log.c deleted file mode 100644 index 1cfb05b7c9..0000000000 --- a/openair-cn/OAI_SGW/oai_sgw_log.c +++ /dev/null @@ -1,41 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/*! \file oai_sgw_log.c -* \brief -* \author Lionel Gauthier -* \company Eurecom -* \email: lionel.gauthier@eurecom.fr -*/ -#include "oai_sgw.h" -#include "log.h" - -int oai_sgw_log_specific(int log_level) -{ - return 0; -} diff --git a/openair-cn/OPENAIRHSS/AUTHORS b/openair-cn/OPENAIRHSS/AUTHORS deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/openair-cn/OPENAIRHSS/ChangeLog b/openair-cn/OPENAIRHSS/ChangeLog deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/openair-cn/OPENAIRHSS/INSTALL b/openair-cn/OPENAIRHSS/INSTALL deleted file mode 100644 index 2099840756..0000000000 --- a/openair-cn/OPENAIRHSS/INSTALL +++ /dev/null @@ -1,370 +0,0 @@ -Installation Instructions -************************* - -Copyright (C) 1994-1996, 1999-2002, 2004-2013 Free Software Foundation, -Inc. - - Copying and distribution of this file, with or without modification, -are permitted in any medium without royalty provided the copyright -notice and this notice are preserved. This file is offered as-is, -without warranty of any kind. - -Basic Installation -================== - - Briefly, the shell command `./configure && make && make install' -should configure, build, and install this package. The following -more-detailed instructions are generic; see the `README' file for -instructions specific to this package. Some packages provide this -`INSTALL' file but do not implement all of the features documented -below. The lack of an optional feature in a given package is not -necessarily a bug. More recommendations for GNU packages can be found -in *note Makefile Conventions: (standards)Makefile Conventions. - - The `configure' shell script attempts to guess correct values for -various system-dependent variables used during compilation. It uses -those values to create a `Makefile' in each directory of the package. -It may also create one or more `.h' files containing system-dependent -definitions. Finally, it creates a shell script `config.status' that -you can run in the future to recreate the current configuration, and a -file `config.log' containing compiler output (useful mainly for -debugging `configure'). - - It can also use an optional file (typically called `config.cache' -and enabled with `--cache-file=config.cache' or simply `-C') that saves -the results of its tests to speed up reconfiguring. Caching is -disabled by default to prevent problems with accidental use of stale -cache files. - - If you need to do unusual things to compile the package, please try -to figure out how `configure' could check whether to do them, and mail -diffs or instructions to the address given in the `README' so they can -be considered for the next release. If you are using the cache, and at -some point `config.cache' contains results you don't want to keep, you -may remove or edit it. - - The file `configure.ac' (or `configure.in') is used to create -`configure' by a program called `autoconf'. You need `configure.ac' if -you want to change it or regenerate `configure' using a newer version -of `autoconf'. - - The simplest way to compile this package is: - - 1. `cd' to the directory containing the package's source code and type - `./configure' to configure the package for your system. - - Running `configure' might take a while. While running, it prints - some messages telling which features it is checking for. - - 2. Type `make' to compile the package. - - 3. Optionally, type `make check' to run any self-tests that come with - the package, generally using the just-built uninstalled binaries. - - 4. Type `make install' to install the programs and any data files and - documentation. When installing into a prefix owned by root, it is - recommended that the package be configured and built as a regular - user, and only the `make install' phase executed with root - privileges. - - 5. Optionally, type `make installcheck' to repeat any self-tests, but - this time using the binaries in their final installed location. - This target does not install anything. Running this target as a - regular user, particularly if the prior `make install' required - root privileges, verifies that the installation completed - correctly. - - 6. You can remove the program binaries and object files from the - source code directory by typing `make clean'. To also remove the - files that `configure' created (so you can compile the package for - a different kind of computer), type `make distclean'. There is - also a `make maintainer-clean' target, but that is intended mainly - for the package's developers. If you use it, you may have to get - all sorts of other programs in order to regenerate files that came - with the distribution. - - 7. Often, you can also type `make uninstall' to remove the installed - files again. In practice, not all packages have tested that - uninstallation works correctly, even though it is required by the - GNU Coding Standards. - - 8. Some packages, particularly those that use Automake, provide `make - distcheck', which can by used by developers to test that all other - targets like `make install' and `make uninstall' work correctly. - This target is generally not run by end users. - -Compilers and Options -===================== - - Some systems require unusual options for compilation or linking that -the `configure' script does not know about. Run `./configure --help' -for details on some of the pertinent environment variables. - - You can give `configure' initial values for configuration parameters -by setting variables in the command line or in the environment. Here -is an example: - - ./configure CC=c99 CFLAGS=-g LIBS=-lposix - - *Note Defining Variables::, for more details. - -Compiling For Multiple Architectures -==================================== - - You can compile the package for more than one kind of computer at the -same time, by placing the object files for each architecture in their -own directory. To do this, you can use GNU `make'. `cd' to the -directory where you want the object files and executables to go and run -the `configure' script. `configure' automatically checks for the -source code in the directory that `configure' is in and in `..'. This -is known as a "VPATH" build. - - With a non-GNU `make', it is safer to compile the package for one -architecture at a time in the source code directory. After you have -installed the package for one architecture, use `make distclean' before -reconfiguring for another architecture. - - On MacOS X 10.5 and later systems, you can create libraries and -executables that work on multiple system types--known as "fat" or -"universal" binaries--by specifying multiple `-arch' options to the -compiler but only a single `-arch' option to the preprocessor. Like -this: - - ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ - CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ - CPP="gcc -E" CXXCPP="g++ -E" - - This is not guaranteed to produce working output in all cases, you -may have to build one architecture at a time and combine the results -using the `lipo' tool if you have problems. - -Installation Names -================== - - By default, `make install' installs the package's commands under -`/usr/local/bin', include files under `/usr/local/include', etc. You -can specify an installation prefix other than `/usr/local' by giving -`configure' the option `--prefix=PREFIX', where PREFIX must be an -absolute file name. - - You can specify separate installation prefixes for -architecture-specific files and architecture-independent files. If you -pass the option `--exec-prefix=PREFIX' to `configure', the package uses -PREFIX as the prefix for installing programs and libraries. -Documentation and other data files still use the regular prefix. - - In addition, if you use an unusual directory layout you can give -options like `--bindir=DIR' to specify different values for particular -kinds of files. Run `configure --help' for a list of the directories -you can set and what kinds of files go in them. In general, the -default for these options is expressed in terms of `${prefix}', so that -specifying just `--prefix' will affect all of the other directory -specifications that were not explicitly provided. - - The most portable way to affect installation locations is to pass the -correct locations to `configure'; however, many packages provide one or -both of the following shortcuts of passing variable assignments to the -`make install' command line to change installation locations without -having to reconfigure or recompile. - - The first method involves providing an override variable for each -affected directory. For example, `make install -prefix=/alternate/directory' will choose an alternate location for all -directory configuration variables that were expressed in terms of -`${prefix}'. Any directories that were specified during `configure', -but not in terms of `${prefix}', must each be overridden at install -time for the entire installation to be relocated. The approach of -makefile variable overrides for each directory variable is required by -the GNU Coding Standards, and ideally causes no recompilation. -However, some platforms have known limitations with the semantics of -shared libraries that end up requiring recompilation when using this -method, particularly noticeable in packages that use GNU Libtool. - - The second method involves providing the `DESTDIR' variable. For -example, `make install DESTDIR=/alternate/directory' will prepend -`/alternate/directory' before all installation names. The approach of -`DESTDIR' overrides is not required by the GNU Coding Standards, and -does not work on platforms that have drive letters. On the other hand, -it does better at avoiding recompilation issues, and works well even -when some directory options were not specified in terms of `${prefix}' -at `configure' time. - -Optional Features -================= - - If the package supports it, you can cause programs to be installed -with an extra prefix or suffix on their names by giving `configure' the -option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. - - Some packages pay attention to `--enable-FEATURE' options to -`configure', where FEATURE indicates an optional part of the package. -They may also pay attention to `--with-PACKAGE' options, where PACKAGE -is something like `gnu-as' or `x' (for the X Window System). The -`README' should mention any `--enable-' and `--with-' options that the -package recognizes. - - For packages that use the X Window System, `configure' can usually -find the X include and library files automatically, but if it doesn't, -you can use the `configure' options `--x-includes=DIR' and -`--x-libraries=DIR' to specify their locations. - - Some packages offer the ability to configure how verbose the -execution of `make' will be. For these packages, running `./configure ---enable-silent-rules' sets the default to minimal output, which can be -overridden with `make V=1'; while running `./configure ---disable-silent-rules' sets the default to verbose, which can be -overridden with `make V=0'. - -Particular systems -================== - - On HP-UX, the default C compiler is not ANSI C compatible. If GNU -CC is not installed, it is recommended to use the following options in -order to use an ANSI C compiler: - - ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" - -and if that doesn't work, install pre-built binaries of GCC for HP-UX. - - HP-UX `make' updates targets which have the same time stamps as -their prerequisites, which makes it generally unusable when shipped -generated files such as `configure' are involved. Use GNU `make' -instead. - - On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot -parse its `<wchar.h>' header file. The option `-nodtk' can be used as -a workaround. If GNU CC is not installed, it is therefore recommended -to try - - ./configure CC="cc" - -and if that doesn't work, try - - ./configure CC="cc -nodtk" - - On Solaris, don't put `/usr/ucb' early in your `PATH'. This -directory contains several dysfunctional programs; working variants of -these programs are available in `/usr/bin'. So, if you need `/usr/ucb' -in your `PATH', put it _after_ `/usr/bin'. - - On Haiku, software installed for all users goes in `/boot/common', -not `/usr/local'. It is recommended to use the following options: - - ./configure --prefix=/boot/common - -Specifying the System Type -========================== - - There may be some features `configure' cannot figure out -automatically, but needs to determine by the type of machine the package -will run on. Usually, assuming the package is built to be run on the -_same_ architectures, `configure' can figure that out, but if it prints -a message saying it cannot guess the machine type, give it the -`--build=TYPE' option. TYPE can either be a short name for the system -type, such as `sun4', or a canonical name which has the form: - - CPU-COMPANY-SYSTEM - -where SYSTEM can have one of these forms: - - OS - KERNEL-OS - - See the file `config.sub' for the possible values of each field. If -`config.sub' isn't included in this package, then this package doesn't -need to know the machine type. - - If you are _building_ compiler tools for cross-compiling, you should -use the option `--target=TYPE' to select the type of system they will -produce code for. - - If you want to _use_ a cross compiler, that generates code for a -platform different from the build platform, you should specify the -"host" platform (i.e., that on which the generated programs will -eventually be run) with `--host=TYPE'. - -Sharing Defaults -================ - - If you want to set default values for `configure' scripts to share, -you can create a site shell script called `config.site' that gives -default values for variables like `CC', `cache_file', and `prefix'. -`configure' looks for `PREFIX/share/config.site' if it exists, then -`PREFIX/etc/config.site' if it exists. Or, you can set the -`CONFIG_SITE' environment variable to the location of the site script. -A warning: not all `configure' scripts look for a site script. - -Defining Variables -================== - - Variables not defined in a site shell script can be set in the -environment passed to `configure'. However, some packages may run -configure again during the build, and the customized values of these -variables may be lost. In order to avoid this problem, you should set -them in the `configure' command line, using `VAR=value'. For example: - - ./configure CC=/usr/local2/bin/gcc - -causes the specified `gcc' to be used as the C compiler (unless it is -overridden in the site shell script). - -Unfortunately, this technique does not work for `CONFIG_SHELL' due to -an Autoconf limitation. Until the limitation is lifted, you can use -this workaround: - - CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash - -`configure' Invocation -====================== - - `configure' recognizes the following options to control how it -operates. - -`--help' -`-h' - Print a summary of all of the options to `configure', and exit. - -`--help=short' -`--help=recursive' - Print a summary of the options unique to this package's - `configure', and exit. The `short' variant lists options used - only in the top level, while the `recursive' variant lists options - also present in any nested packages. - -`--version' -`-V' - Print the version of Autoconf used to generate the `configure' - script, and exit. - -`--cache-file=FILE' - Enable the cache: use and save the results of the tests in FILE, - traditionally `config.cache'. FILE defaults to `/dev/null' to - disable caching. - -`--config-cache' -`-C' - Alias for `--cache-file=config.cache'. - -`--quiet' -`--silent' -`-q' - Do not print messages saying which checks are being made. To - suppress all normal output, redirect it to `/dev/null' (any error - messages will still be shown). - -`--srcdir=DIR' - Look for the package's source code in directory DIR. Usually - `configure' can determine that directory automatically. - -`--prefix=DIR' - Use DIR as the installation prefix. *note Installation Names:: - for more details, including other options available for fine-tuning - the installation locations. - -`--no-create' -`-n' - Run the configure checks, but stop before creating any output - files. - -`configure' also accepts some other, not widely useful, options. Run -`configure --help' for more details. diff --git a/openair-cn/OPENAIRHSS/Makefile.am b/openair-cn/OPENAIRHSS/Makefile.am deleted file mode 100644 index 327a0a00b9..0000000000 --- a/openair-cn/OPENAIRHSS/Makefile.am +++ /dev/null @@ -1,54 +0,0 @@ -################################################################################ -# 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@eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ -ACLOCAL_AMFLAGS = -I m4 - -SUBDIRS = access_restriction auc db s6a utils tests . - -AM_CFLAGS = @ADD_CFLAGS@ \ - -I$(top_srcdir)/access_restriction \ - -I$(top_srcdir)/auc \ - -I$(top_srcdir)/db \ - -I$(top_srcdir)/s6a \ - -I$(top_srcdir)/utils - -bin_PROGRAMS = openair-hss - -openair_hssdir=$(sysconfdir)/openair-hss -openair_hss_DATA = $(top_builddir)/conf/hss.conf $(top_srcdir)/conf/hss_fd.conf - -openair_hss_LDADD = \ - $(top_builddir)/s6a/libs6a.la \ - $(top_builddir)/db/libdb.la \ - $(top_builddir)/auc/libauc.la \ - $(top_builddir)/access_restriction/libaccess_restriction.la \ - $(top_builddir)/utils/libutils.la - -openair_hss_SOURCES = \ - hss_config.h \ - hss_main.c diff --git a/openair-cn/OPENAIRHSS/NEWS b/openair-cn/OPENAIRHSS/NEWS deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/openair-cn/OPENAIRHSS/README b/openair-cn/OPENAIRHSS/README deleted file mode 100644 index 3f48e97d5f..0000000000 --- a/openair-cn/OPENAIRHSS/README +++ /dev/null @@ -1,24 +0,0 @@ -Please follow the steps below to install hss: - -1) install the hss using the scripts/install_hss.sh -2) run autogen.sh -3) mkdir objs -4) cd objs; ../configure -5) make -j2 -6) make -7) sudo apt-get install mysql-client-core-5.5 mysql-server-core-5.5 mysql-server-5.5 phpmyadmin - set the password for mysql server - open a browser and connet to the phpmyadmin: localhost/phpmyadmin - create the oai_db database using database menu - select the oai_db and import db/oai_db.sql - select the users, and insert the data - or mannully use the cmd: sudo mysql -u root -p - update the oai_db tables for users,pgw, pdn, and mmeidentity - create a new phpmyadmin user, and name it hssadmin, with admin password, grant all the global privilages on DATA as well as create, alter, and index for the structure - mysql -u root -p and add the following cmd - grant all privileges ON *.* TO 'hssadmin'@'%' WITH GRANT OPTION; - flush privileges; -8) download and install php-myadmin or lampp from http://www.apachefriends.org/en/xampp-linux.html - copy the file in /opt - chmod 755 xampp-linux-1.8.2-0-installer.run - ./xampp-linux-1.8.2-0-installer.run diff --git a/openair-cn/OPENAIRHSS/access_restriction/COPYING b/openair-cn/OPENAIRHSS/access_restriction/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair-cn/OPENAIRHSS/access_restriction/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program 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. - - This program 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 this program. If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - <program> Copyright (C) <year> <name of author> - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<http://www.gnu.org/licenses/>. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<http://www.gnu.org/philosophy/why-not-lgpl.html>. diff --git a/openair-cn/OPENAIRHSS/access_restriction/Makefile.am b/openair-cn/OPENAIRHSS/access_restriction/Makefile.am deleted file mode 100644 index 31d146bc61..0000000000 --- a/openair-cn/OPENAIRHSS/access_restriction/Makefile.am +++ /dev/null @@ -1,37 +0,0 @@ -################################################################################ -# 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@eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ -AM_CFLAGS = @ADD_CFLAGS@ \ - -I$(top_srcdir) \ - -I$(top_srcdir)/utils - -noinst_LTLIBRARIES = libaccess_restriction.la - -libaccess_restriction_la_LDFLAGS = -all-static -libaccess_restriction_la_SOURCES = \ - access_restriction.c access_restriction.h \ No newline at end of file diff --git a/openair-cn/OPENAIRHSS/access_restriction/access_restriction.c b/openair-cn/OPENAIRHSS/access_restriction/access_restriction.c deleted file mode 100644 index ec049b0c10..0000000000 --- a/openair-cn/OPENAIRHSS/access_restriction/access_restriction.c +++ /dev/null @@ -1,129 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <stdint.h> - -#include "conversion.h" -#include "access_restriction.h" - -/* TODO: identification of MCC and MNC within an IMSI should be done according - * to a table that maps MCC to 2 or 3 digits expected... - * By default we will assume there is only 2 digits for our use. - */ - -/* Split a PLMN formed of <MCC><MNC> to mcc and mnc. - * In case MNC is formed of only two digits a 0 is inserted at the most significant - * digit. - * When PLMN is represented using european convention it contains only two digits, - * while three digits are used in North American Standard. - * Encoding of PLMN is defined in ITU E.212. - * @param plmn string either 5 or 6 digits resulting of the concatenation of - * MCC and MNC. - */ -int split_plmn(uint8_t plmn[3], uint8_t mcc[3], uint8_t mnc[3]) -{ - if (plmn == NULL) { - return -1; - } - - mcc[0] = plmn[0] & 0x0F; - mcc[1] = (plmn[0] & 0xF0) >> 4; - mcc[2] = plmn[1] & 0x0F; - - if ((plmn[1] & 0xF0) == 0xF0) { - /* Only 2 digits case */ - mnc[1] = plmn[2] & 0x0F; - mnc[2] = (plmn[2] & 0xF0) >> 4; - mnc[0] = 0; - } else { - mnc[0] = plmn[2] & 0x0F; - mnc[1] = (plmn[2] & 0xF0) >> 4; - mnc[2] = ((plmn[1] & 0xF0) >> 4); - } - - return 0; -} - -/* Apply restriction (if any) to current 'visited' PLMN for this user. - * Criterias are based on ODB (operator determined barring), visited PLMN - * and user PLMN (obtain from IMSI). - * @param imsi is the user identity formed of MCC.MNC.MSIN (14 or 15 digits long) - * @param vplmn is the plmn of the cell the UE is currently attached to - */ -#define FORMAT_MCC(mCC) (mCC[0] * 100 + mCC[1] * 10 + mCC[2]) -#define FORMAT_MNC(mNC) (mNC[0] * 100 + mNC[1] * 10 + mNC[2]) - -int apply_access_restriction(char *imsi, uint8_t *vplmn) -{ - uint8_t vmcc[3], vmnc[3]; - uint8_t hmcc[3], hmnc[3]; - - uint8_t imsi_hex[15]; - - if (bcd_to_hex(imsi_hex, imsi, strlen(imsi)) != 0) { - fprintf(stderr, "Failed to convert imsi %s to hex representation\n", - imsi); - return -1; - } - - /* There is a problem while converting the PLMN... */ - if (split_plmn(vplmn, vmcc, vmnc) != 0) { - fprintf(stderr, "Fail to convert vplmn %02x%02x%02x to mcc/mnc for imsi %s\n", - vplmn[0], vplmn[1], vplmn[2], imsi); - return -1; - } - - fprintf(stderr, "Converted %02x%02x%02x to plmn %u.%u\n", vplmn[0], vplmn[1], vplmn[2], - FORMAT_MCC(vmcc), FORMAT_MNC(vmnc)); - - /* MCC is always 3 digits */ - memcpy(hmcc, &imsi_hex[0], 3); - - if (memcmp(vmcc, hmcc, 3) != 0) { - fprintf(stderr, "Only France MCC is handled for now, got imsi plmn %u.%u for a visited plmn %u.%u\n", - FORMAT_MCC(hmcc), FORMAT_MNC(hmnc), FORMAT_MCC(vmcc), FORMAT_MNC(vmnc)); - /* Reject the association */ - return -1; - } - - /* In France MNC is composed of 2 digits and thus imsi by 14 digit */ - hmnc[0] = 0; - memcpy(&hmnc[1], &imsi_hex[3], 2); - - if ((memcmp(vmcc, hmcc, 3) != 0) && (memcmp(vmnc, hmnc, 3) != 0)) { - fprintf(stderr, "UE is roaming from %u.%u to %u.%u which is not allowed" - " by the ODB\n", FORMAT_MCC(hmcc), FORMAT_MNC(hmnc), FORMAT_MCC(vmcc), FORMAT_MNC(vmnc)); - return -1; - } - - /* User has successfully passed all the checking -> accept the association */ - return 0; -} diff --git a/openair-cn/OPENAIRHSS/access_restriction/access_restriction.h b/openair-cn/OPENAIRHSS/access_restriction/access_restriction.h deleted file mode 100644 index bd9394416b..0000000000 --- a/openair-cn/OPENAIRHSS/access_restriction/access_restriction.h +++ /dev/null @@ -1,36 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -#ifndef ACCESS_RESTRICTION_H_ -#define ACCESS_RESTRICTION_H_ - -int split_plmn(uint8_t *plmn, uint8_t mcc[3], uint8_t mnc[3]); - -int apply_access_restriction(char *imsi, uint8_t *vplmn); - -#endif /* ACCESS_RESTRICTION_H_ */ diff --git a/openair-cn/OPENAIRHSS/auc/COPYING b/openair-cn/OPENAIRHSS/auc/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair-cn/OPENAIRHSS/auc/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program 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. - - This program 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 this program. If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - <program> Copyright (C) <year> <name of author> - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<http://www.gnu.org/licenses/>. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<http://www.gnu.org/philosophy/why-not-lgpl.html>. diff --git a/openair-cn/OPENAIRHSS/auc/Makefile.am b/openair-cn/OPENAIRHSS/auc/Makefile.am deleted file mode 100644 index 948cf4b1dc..0000000000 --- a/openair-cn/OPENAIRHSS/auc/Makefile.am +++ /dev/null @@ -1,42 +0,0 @@ -################################################################################ -# 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@eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ -AM_CFLAGS = @ADD_CFLAGS@ \ - -I$(top_srcdir) \ - -I$(top_srcdir)/utils - -noinst_LTLIBRARIES = libauc.la - -libauc_la_LDFLAGS = -all-static -libauc_la_SOURCES = \ - auc.h \ - fx.c \ - kdf.c \ - random.c \ - rijndael.c \ - sequence_number.c \ No newline at end of file diff --git a/openair-cn/OPENAIRHSS/auc/auc.h b/openair-cn/OPENAIRHSS/auc/auc.h deleted file mode 100644 index 00ca2b9dc7..0000000000 --- a/openair-cn/OPENAIRHSS/auc/auc.h +++ /dev/null @@ -1,118 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -#include <stdint.h> -#include <stdio.h> -#include <unistd.h> -#include <gmp.h> - -#ifndef AUC_H_ -#define AUC_H_ - -#define SQN_LENGTH_BITS (48) -#define SQN_LENGTH_OCTEST (SQN_LENGTH_BITS/8) -#define IK_LENGTH_BITS (128) -#define IK_LENGTH_OCTETS (IK_LENGTH_BITS/8) -#define RAND_LENGTH_OCTETS (16) -#define RAND_LENGTH_BITS (RAND_LENGTH_OCTETS*8) -#define XRES_LENGTH_OCTETS (8) -#define AUTN_LENGTH_OCTETS (16) -#define KASME_LENGTH_OCTETS (32) -#define MAC_S_LENGTH (8) - -extern uint8_t opc[16]; - -typedef mpz_t random_t; -typedef mpz_t sqn_t; - -typedef uint8_t uint8_t; - -typedef struct { - uint8_t rand[16]; - uint8_t rand_new; - uint8_t xres[8]; - uint8_t autn[16]; - uint8_t kasme[32]; -} auc_vector_t; - -void RijndaelKeySchedule(const uint8_t const key[16]); -void RijndaelEncrypt(const uint8_t const in[16], uint8_t out[16]); - -/* Sequence number functions */ -struct sqn_ue_s; -struct sqn_ue_s *sqn_exists(uint64_t imsi); -void sqn_insert(struct sqn_ue_s *item); -void sqn_init(struct sqn_ue_s *item); -struct sqn_ue_s *sqn_new(uint64_t imsi); -void sqn_list_init(void); -void sqn_get(uint64_t imsi, uint8_t sqn[6]); - -/* Random number functions */ -struct random_state_s; -void random_init(void); -void generate_random(uint8_t *random, ssize_t length); - -//void SetOP(char *opP); - -void ComputeOPc( const uint8_t const kP[16], const uint8_t const opP[16], uint8_t opcP[16] ); - -void f1 ( const uint8_t const kP[16],const uint8_t const k[16], const uint8_t const rand[16], const uint8_t const sqn[6], const uint8_t const amf[2], - uint8_t mac_a[8] ); -void f1star( const uint8_t const kP[16],const uint8_t const k[16], const uint8_t const rand[16], const uint8_t const sqn[6], const uint8_t const amf[2], - uint8_t mac_s[8] ); -void f2345 ( const uint8_t const kP[16],const uint8_t const k[16], const uint8_t const rand[16], - uint8_t res[8], uint8_t ck[16], uint8_t ik[16], uint8_t ak[6] ); -void f5star( const uint8_t const kP[16],const uint8_t const k[16], const uint8_t const rand[16], - uint8_t ak[6] ); - -void generate_autn(const uint8_t const sqn[6], const uint8_t const ak[6], const uint8_t const amf[2], const uint8_t const mac_a[8], uint8_t autn[16]); -int generate_vector(const uint8_t const opc[16], uint64_t imsi, uint8_t key[16], uint8_t plmn[3], - uint8_t sqn[6], auc_vector_t *vector); - -void kdf(uint8_t *key, uint16_t key_len, uint8_t *s, uint16_t s_len, uint8_t *out, - uint16_t out_len); - -void derive_kasme(uint8_t ck[16], uint8_t ik[16], uint8_t plmn[3], uint8_t sqn[6], - uint8_t ak[6], uint8_t kasme[32]); - -uint8_t *sqn_ms_derive(const uint8_t const opc[16], uint8_t *key, uint8_t *auts, uint8_t *rand); - -static inline void print_buffer(const char *prefix, uint8_t *buffer, int length) -{ - int i; - - fprintf(stdout, "%s", prefix); - - for (i = 0; i < length; i++) { - fprintf(stdout, "%02x.", buffer[i]); - } - - fprintf(stdout, "\n"); -} - -#endif /* AUC_H_ */ diff --git a/openair-cn/OPENAIRHSS/auc/fx.c b/openair-cn/OPENAIRHSS/auc/fx.c deleted file mode 100644 index 31d8d05b22..0000000000 --- a/openair-cn/OPENAIRHSS/auc/fx.c +++ /dev/null @@ -1,298 +0,0 @@ -/*------------------------------------------------------------------- - * Example algorithms f1, f1*, f2, f3, f4, f5, f5* - *------------------------------------------------------------------- - * - * A sample implementation of the example 3GPP authentication and - * key agreement functions f1, f1*, f2, f3, f4, f5 and f5*. This is - * a byte-oriented implementation of the functions, and of the block - * cipher kernel function Rijndael. - * - * This has been coded for clarity, not necessarily for efficiency. - * - * The functions f2, f3, f4 and f5 share the same inputs and have - * been coded together as a single function. f1, f1* and f5* are - * all coded separately. - * - *-----------------------------------------------------------------*/ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "auc.h" -#include "hss_config.h" - -extern hss_config_t hss_config; - -/*--------- Operator Variant Algorithm Configuration Field --------*/ - - -/*--------------------------- prototypes --------------------------*/ - - -/*------------------------------------------------------------------- - * - *------------------------------------------------------------------- - *-----------------------------------------------------------------*/ -void generate_autn(const uint8_t const sqn[6], const uint8_t const ak[6], const uint8_t const amf[2], const uint8_t const mac_a[8], uint8_t autn[16]) -{ - int i; - - for (i = 0; i < 6; i++) { - autn[i] = sqn[i] ^ ak[i]; - } - - memcpy(&autn[6], amf, 2); - memcpy(&autn[8], mac_a, 8); -} - -/*------------------------------------------------------------------- - * Algorithm f1 - *------------------------------------------------------------------- - * - * Computes network authentication code MAC-A from key K, random - * challenge RAND, sequence number SQN and authentication management - * field AMF. - * - *-----------------------------------------------------------------*/ -void f1 ( const uint8_t const opc[16], const uint8_t const k[16], const uint8_t const _rand[16], const uint8_t const sqn[6], const uint8_t const amf[2], - uint8_t mac_a[8] ) -{ - uint8_t temp[16]; - uint8_t in1[16]; - uint8_t out1[16]; - uint8_t rijndaelInput[16]; - uint8_t i; - RijndaelKeySchedule( k ); - - for (i=0; i<16; i++) - rijndaelInput[i] = _rand[i] ^ opc[i]; - - RijndaelEncrypt( rijndaelInput, temp ); - - for (i=0; i<6; i++) { - in1[i] = sqn[i]; - in1[i+8] = sqn[i]; - } - - for (i=0; i<2; i++) { - in1[i+6] = amf[i]; - in1[i+14] = amf[i]; - } - - /* XOR op_c and in1, rotate by r1=64, and XOR * - * on the constant c1 (which is all zeroes) */ - for (i=0; i<16; i++) - rijndaelInput[(i+8) % 16] = in1[i] ^ opc[i]; - - /* XOR on the value temp computed before */ - for (i=0; i<16; i++) - rijndaelInput[i] ^= temp[i]; - - RijndaelEncrypt( rijndaelInput, out1 ); - - for (i=0; i<16; i++) - out1[i] ^= opc[i]; - - for (i=0; i<8; i++) - mac_a[i] = out1[i]; - - return; -} /* end of function f1 */ - -/*------------------------------------------------------------------- - * Algorithms f2-f5 - *------------------------------------------------------------------- - * - * Takes key K and random challenge RAND, and returns response RES, - * confidentiality key CK, integrity key IK and anonymity key AK. - * - *-----------------------------------------------------------------*/ -void f2345 ( const uint8_t const opc[16], const uint8_t const k[16], const uint8_t const _rand[16], - uint8_t res[8], uint8_t ck[16], uint8_t ik[16], uint8_t ak[6] ) -{ - uint8_t temp[16]; - uint8_t out[16]; - uint8_t rijndaelInput[16]; - uint8_t i; - RijndaelKeySchedule( k ); - - for (i=0; i<16; i++) - rijndaelInput[i] = _rand[i] ^ opc[i]; - - RijndaelEncrypt( rijndaelInput, temp ); - - /* To obtain output block OUT2: XOR OPc and TEMP, * - * rotate by r2=0, and XOR on the constant c2 (which * - * is all zeroes except that the last bit is 1). */ - for (i=0; i<16; i++) - rijndaelInput[i] = temp[i] ^ opc[i]; - - rijndaelInput[15] ^= 1; - RijndaelEncrypt( rijndaelInput, out ); - - for (i=0; i<16; i++) - out[i] ^= opc[i]; - - for (i=0; i<8; i++) - res[i] = out[i+8]; - - for (i=0; i<6; i++) - ak[i] = out[i]; - - /* To obtain output block OUT3: XOR OPc and TEMP, * - * rotate by r3=32, and XOR on the constant c3 (which * - * is all zeroes except that the next to last bit is 1). */ - - for (i=0; i<16; i++) - rijndaelInput[(i+12) % 16] = temp[i] ^ opc[i]; - - rijndaelInput[15] ^= 2; - RijndaelEncrypt( rijndaelInput, out ); - - for (i=0; i<16; i++) - out[i] ^= opc[i]; - - for (i=0; i<16; i++) - ck[i] = out[i]; - - /* To obtain output block OUT4: XOR OPc and TEMP, * - * rotate by r4=64, and XOR on the constant c4 (which * - * is all zeroes except that the 2nd from last bit is 1). */ - for (i=0; i<16; i++) - rijndaelInput[(i+8) % 16] = temp[i] ^ opc[i]; - - rijndaelInput[15] ^= 4; - RijndaelEncrypt( rijndaelInput, out ); - - for (i=0; i<16; i++) - out[i] ^= opc[i]; - - for (i=0; i<16; i++) - ik[i] = out[i]; - - return; -} /* end of function f2345 */ - -/*------------------------------------------------------------------- - * Algorithm f1* - *------------------------------------------------------------------- - * - * Computes resynch authentication code MAC-S from key K, random - * challenge RAND, sequence number SQN and authentication management - * field AMF. - * - *-----------------------------------------------------------------*/ -void f1star( const uint8_t const opc[16], const uint8_t const k[16], const uint8_t const _rand[16], const uint8_t const sqn[6], const uint8_t const amf[2], - uint8_t mac_s[8] ) -{ - uint8_t temp[16]; - uint8_t in1[16]; - uint8_t out1[16]; - uint8_t rijndaelInput[16]; - uint8_t i; - RijndaelKeySchedule( k ); - - for (i=0; i<16; i++) - rijndaelInput[i] = _rand[i] ^ opc[i]; - - RijndaelEncrypt( rijndaelInput, temp ); - - for (i=0; i<6; i++) { - in1[i] = sqn[i]; - in1[i+8] = sqn[i]; - } - - for (i=0; i<2; i++) { - in1[i+6] = amf[i]; - in1[i+14] = amf[i]; - } - - /* XOR op_c and in1, rotate by r1=64, and XOR * - * on the constant c1 (which is all zeroes) */ - for (i=0; i<16; i++) - rijndaelInput[(i+8) % 16] = in1[i] ^ opc[i]; - - /* XOR on the value temp computed before */ - for (i=0; i<16; i++) - rijndaelInput[i] ^= temp[i]; - - RijndaelEncrypt( rijndaelInput, out1 ); - - for (i=0; i<16; i++) - out1[i] ^= opc[i]; - - for (i=0; i<8; i++) - mac_s[i] = out1[i+8]; - - return; -} /* end of function f1star */ - -/*------------------------------------------------------------------- - * Algorithm f5* - *------------------------------------------------------------------- - * - * Takes key K and random challenge RAND, and returns resynch - * anonymity key AK. - * - *-----------------------------------------------------------------*/ -void f5star( const uint8_t const opc[16], const uint8_t const k[16], const uint8_t const _rand[16], - uint8_t ak[6] ) -{ - uint8_t temp[16]; - uint8_t out[16]; - uint8_t rijndaelInput[16]; - uint8_t i; - - RijndaelKeySchedule( k ); - - for (i=0; i<16; i++) - rijndaelInput[i] = _rand[i] ^ opc[i]; - - RijndaelEncrypt( rijndaelInput, temp ); - - /* To obtain output block OUT5: XOR OPc and TEMP, * - * rotate by r5=96, and XOR on the constant c5 (which * - * is all zeroes except that the 3rd from last bit is 1). */ - for (i=0; i<16; i++) - rijndaelInput[(i+4) % 16] = temp[i] ^ opc[i]; - - rijndaelInput[15] ^= 8; - RijndaelEncrypt( rijndaelInput, out ); - - for (i=0; i<16; i++) - out[i] ^= opc[i]; - - for (i=0; i<6; i++) - ak[i] = out[i]; - - return; -} /* end of function f5star */ - -/*------------------------------------------------------------------- - * Function to compute OPc from OP and K. - *-----------------------------------------------------------------*/ -void ComputeOPc( const uint8_t const kP[16], const uint8_t const opP[16], uint8_t opcP[16] ) -{ - uint8_t i; - - RijndaelKeySchedule( kP ); - printf("Compute opc:\n\tK:\t%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X\n", - kP[0],kP[1],kP[2],kP[3],kP[4],kP[5],kP[6],kP[7], - kP[8],kP[9],kP[10],kP[11],kP[12],kP[13],kP[14],kP[15]); - RijndaelEncrypt( opP, opcP ); - printf("\tIn:\t%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X\n\tRinj:\t%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X\n", - opP[0],opP[1],opP[2],opP[3],opP[4],opP[5],opP[6],opP[7], - opP[8],opP[9],opP[10],opP[11],opP[12],opP[13],opP[14],opP[15], - opcP[0],opcP[1],opcP[2],opcP[3],opcP[4],opcP[5],opcP[6],opcP[7], - opcP[8],opcP[9],opcP[10],opcP[11],opcP[12],opcP[13],opcP[14],opcP[15] ); - - for (i=0; i<16; i++) - opcP[i] ^= opP[i]; - printf("\tOut:\t%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X\n", - opcP[0],opcP[1],opcP[2],opcP[3],opcP[4],opcP[5],opcP[6],opcP[7], - opcP[8],opcP[9],opcP[10],opcP[11],opcP[12],opcP[13],opcP[14],opcP[15] ); - - return; -} /* end of function ComputeOPc */ diff --git a/openair-cn/OPENAIRHSS/auc/kdf.c b/openair-cn/OPENAIRHSS/auc/kdf.c deleted file mode 100644 index a806513cbc..0000000000 --- a/openair-cn/OPENAIRHSS/auc/kdf.c +++ /dev/null @@ -1,174 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <errno.h> -#include <string.h> - -#include <gmp.h> -#include <nettle/hmac.h> - -#include "auc.h" -#include "hss_config.h" - -#define DEBUG_AUC_KDF 1 -extern hss_config_t hss_config; - -/* - * @param key the input key - * @param key_len length of the key - * @param s string for key derivation as defined in 3GPP TS.33401 Annex A - * @param s_len length of s - * @param out buffer to place the output of kdf - * @param ou_len expected length for the output key - */ -inline -void kdf(uint8_t *key, uint16_t key_len, uint8_t *s, uint16_t s_len, uint8_t *out, - uint16_t out_len) -{ - struct hmac_sha256_ctx ctx; - - memset(&ctx, 0, sizeof(ctx)); - - hmac_sha256_set_key(&ctx, key_len, key); - hmac_sha256_update(&ctx, s_len, s); - hmac_sha256_digest(&ctx, out_len, out); -} - -/* - * Derive the Kasme using the KDF (key derive function). - * See 3GPP TS.33401 Annex A.2 - * The input String S to the KDF is composed of 14 bytes: - * FC = 0x10 - * P0 = SN id = PLMN - * L0 = length(SN id) = 0x00 0x03 - * P1 = SQN xor AK - * L1 = length(P1) = 0x00 0x06 - */ -inline -void derive_kasme(uint8_t ck[16], uint8_t ik[16], uint8_t plmn[3], uint8_t sqn[6], - uint8_t ak[6], uint8_t *kasme) -{ - uint8_t s[14]; - int i; - uint8_t key[32]; - - /* The input key is equal to the concatenation of CK and IK */ - memcpy(&key[0], ck, 16); - memcpy(&key[16], ik, 16); - - /*if (hss_config.valid_opc == 0) { - SetOP(hss_config.operator_key); - }*/ - - /* FC */ - s[0] = 0x10; - - /* SN id is composed of MCC and MNC - * Octets: - * 1 MCC digit 2 | MCC digit 1 - * 2 MNC digit 3 | MCC digit 3 - * 3 MNC digit 2 | MNC digit 1 - */ - memcpy(&s[1], plmn, 3); - - /* L0 */ - s[4] = 0x00; - s[5] = 0x03; - - /* P1 */ - for (i = 0; i < 6; i++) { - s[6 + i] = sqn[i] ^ ak[i]; - } - - /* L1 */ - s[12] = 0x00; - s[13] = 0x06; - -#if defined(DEBUG_AUC_KDF) - - for (i = 0; i < 32; i++) - printf("0x%02x ", key[i]); - - printf("\n"); - - for (i = 0; i < 14; i++) - printf("0x%02x ", s[i]); - - printf("\n"); -#endif - - kdf(key, 32, s, 14, kasme, 32); -} - -int generate_vector(const uint8_t const opc[16], uint64_t imsi, uint8_t key[16], uint8_t plmn[3], - uint8_t sqn[6], auc_vector_t *vector) -{ - /* in E-UTRAN an authentication vector is composed of: - * - RAND - * - XRES - * - AUTN - * - KASME - */ - - uint8_t amf[] = { 0x80, 0x00 }; - uint8_t mac_a[8]; - uint8_t ck[16]; - uint8_t ik[16]; - uint8_t ak[6]; - - if (vector == NULL) { - return EINVAL; - } - - /* Compute MAC */ - f1(opc, key, vector->rand, sqn, amf, mac_a); - - print_buffer("MAC_A : ", mac_a, 8); - print_buffer("SQN : ", sqn, 6); - print_buffer("RAND : ", vector->rand, 16); - - /* Compute XRES, CK, IK, AK */ - f2345(opc, key, vector->rand, vector->xres, ck, ik, ak); - print_buffer("AK : ", ak, 6); - print_buffer("CK : ", ck, 16); - print_buffer("IK : ", ik, 16); - print_buffer("XRES : ", vector->xres, 8); - - /* AUTN = SQN ^ AK || AMF || MAC */ - generate_autn(sqn, ak, amf, mac_a, vector->autn); - - print_buffer("AUTN : ", vector->autn, 16); - - derive_kasme(ck, ik, plmn, sqn, ak, vector->kasme); - print_buffer("KASME : ", vector->kasme, 32); - - return 0; -} diff --git a/openair-cn/OPENAIRHSS/auc/random.c b/openair-cn/OPENAIRHSS/auc/random.c deleted file mode 100644 index 5e71b32461..0000000000 --- a/openair-cn/OPENAIRHSS/auc/random.c +++ /dev/null @@ -1,89 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - -#include <gmp.h> -#include <sys/time.h> - -#include "auc.h" -#include "hss_config.h" - -typedef struct random_state_s { - pthread_mutex_t lock; - gmp_randstate_t state; -} random_state_t; - -random_state_t random_state; -extern hss_config_t hss_config; - -void random_init(void) -{ - // mpz_t number; - // pthread_mutex_init(&random_state.lock, NULL); - // mpz_init(number); - // gmp_randinit_default(random_state.state); - // srand(time(NULL)); - struct timeval t1; - gettimeofday(&t1, NULL); - srand(t1.tv_usec * t1.tv_sec); -} - -/* Generate a random number between 0 and 2^length - 1 where length is expressed - * in bits. - */ -void generate_random(uint8_t *random_p, ssize_t length) -{ - // random_t random_nb; - - // mpz_init_set_ui(random_nb, 0); - - // pthread_mutex_lock(&random_state.lock); - // mpz_urandomb(random_nb, random_state.state, 8 * length); - // pthread_mutex_unlock(&random_state.lock); - - // mpz_export(random_p, NULL, 1, length, 0, 0, random_nb); - int i;//r = 0, mask = 0, shift; - if (hss_config.random_bool > 0) { - for (i = 0; i < length; i ++) { - // if ((i % sizeof(i)) == 0) - // r = rand(); - // shift = 8 * (i % sizeof(i)); - // mask = 0xFF << shift; - // random_p[i] = (r & mask) >> shift; - random_p[i] = rand(); - } - } else { - for (i = 0; i < length; i ++) { - random_p[i] = 0; - } - } -} diff --git a/openair-cn/OPENAIRHSS/auc/rijndael.c b/openair-cn/OPENAIRHSS/auc/rijndael.c deleted file mode 100644 index bbf1e57d30..0000000000 --- a/openair-cn/OPENAIRHSS/auc/rijndael.c +++ /dev/null @@ -1,225 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -#include <stdlib.h> -#include <stdint.h> -#include <gmp.h> - -#include "auc.h" - -typedef uint8_t u8; -typedef uint32_t u32; - -/*-------------------- Rijndael round subkeys ---------------------*/ -u8 roundKeys[11][4][4]; -/*--------------------- Rijndael S box table ----------------------*/ -u8 S[256] = { - 99,124,119,123,242,107,111,197, 48, 1,103, 43,254,215,171,118, - 202,130,201,125,250, 89, 71,240,173,212,162,175,156,164,114,192, - 183,253,147, 38, 54, 63,247,204, 52,165,229,241,113,216, 49, 21, - 4,199, 35,195, 24,150, 5,154, 7, 18,128,226,235, 39,178,117, - 9,131, 44, 26, 27,110, 90,160, 82, 59,214,179, 41,227, 47,132, - 83,209, 0,237, 32,252,177, 91,106,203,190, 57, 74, 76, 88,207, - 208,239,170,251, 67, 77, 51,133, 69,249, 2,127, 80, 60,159,168, - 81,163, 64,143,146,157, 56,245,188,182,218, 33, 16,255,243,210, - 205, 12, 19,236, 95,151, 68, 23,196,167,126, 61,100, 93, 25,115, - 96,129, 79,220, 34, 42,144,136, 70,238,184, 20,222, 94, 11,219, - 224, 50, 58, 10, 73, 6, 36, 92,194,211,172, 98,145,149,228,121, - 231,200, 55,109,141,213, 78,169,108, 86,244,234,101,122,174, 8, - 186,120, 37, 46, 28,166,180,198,232,221,116, 31, 75,189,139,138, - 112, 62,181,102, 72, 3,246, 14, 97, 53, 87,185,134,193, 29,158, - 225,248,152, 17,105,217,142,148,155, 30,135,233,206, 85, 40,223, - 140,161,137, 13,191,230, 66,104, 65,153, 45, 15,176, 84,187, 22, -}; -/*------- This array does the multiplication by x in GF(2^8) ------*/ -u8 Xtime[256] = { - 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, - 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, - 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, - 96, 98,100,102,104,106,108,110,112,114,116,118,120,122,124,126, - 128,130,132,134,136,138,140,142,144,146,148,150,152,154,156,158, - 160,162,164,166,168,170,172,174,176,178,180,182,184,186,188,190, - 192,194,196,198,200,202,204,206,208,210,212,214,216,218,220,222, - 224,226,228,230,232,234,236,238,240,242,244,246,248,250,252,254, - 27, 25, 31, 29, 19, 17, 23, 21, 11, 9, 15, 13, 3, 1, 7, 5, - 59, 57, 63, 61, 51, 49, 55, 53, 43, 41, 47, 45, 35, 33, 39, 37, - 91, 89, 95, 93, 83, 81, 87, 85, 75, 73, 79, 77, 67, 65, 71, 69, - 123,121,127,125,115,113,119,117,107,105,111,109, 99, 97,103,101, - 155,153,159,157,147,145,151,149,139,137,143,141,131,129,135,133, - 187,185,191,189,179,177,183,181,171,169,175,173,163,161,167,165, - 219,217,223,221,211,209,215,213,203,201,207,205,195,193,199,197, - 251,249,255,253,243,241,247,245,235,233,239,237,227,225,231,229 -}; -/*------------------------------------------------------------------- - * Rijndael key schedule function. Takes 16-byte key and creates - * all Rijndael's internal subkeys ready for encryption. - *-----------------------------------------------------------------*/ -void RijndaelKeySchedule( const u8 const key[16] ) -{ - u8 roundConst; - int i, j; - - printf("RijndaelKeySchedule: K %02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X\n", - key[0],key[1],key[2],key[3],key[4],key[5],key[6],key[7], - key[8],key[9],key[10],key[11],key[12],key[13],key[14],key[15] ); - /* first round key equals key */ - for (i=0; i<16; i++) - roundKeys[0][i & 0x03][i>>2] = key[i]; - - roundConst = 1; - - /* now calculate round keys */ - for (i=1; i<11; i++) { - roundKeys[i][0][0] = S[roundKeys[i-1][1][3]] - ^ roundKeys[i-1][0][0] ^ roundConst; - roundKeys[i][1][0] = S[roundKeys[i-1][2][3]] - ^ roundKeys[i-1][1][0]; - roundKeys[i][2][0] = S[roundKeys[i-1][3][3]] - ^ roundKeys[i-1][2][0]; - roundKeys[i][3][0] = S[roundKeys[i-1][0][3]] - ^ roundKeys[i-1][3][0]; - - for (j=0; j<4; j++) { - roundKeys[i][j][1] = roundKeys[i-1][j][1] ^ roundKeys[i][j][0]; - roundKeys[i][j][2] = roundKeys[i-1][j][2] ^ roundKeys[i][j][1]; - roundKeys[i][j][3] = roundKeys[i-1][j][3] ^ roundKeys[i][j][2]; - } - - /* update round constant */ - roundConst = Xtime[roundConst]; - } - - return; -} /* end of function RijndaelKeySchedule */ -/* Round key addition function */ -void KeyAdd(u8 state[4][4], u8 roundKeys[11][4][4], int round) -{ - int i, j; - - for (i=0; i<4; i++) - for (j=0; j<4; j++) - state[i][j] ^= roundKeys[round][i][j]; - - return; -} -/* Byte substitution transformation */ -int ByteSub(u8 state[4][4]) -{ - int i, j; - - for (i=0; i<4; i++) - for (j=0; j<4; j++) - state[i][j] = S[state[i][j]]; - - return 0; -} -/* Row shift transformation */ -void ShiftRow(u8 state[4][4]) -{ - u8 temp; - /* left rotate row 1 by 1 */ - temp = state[1][0]; - state[1][0] = state[1][1]; - state[1][1] = state[1][2]; - state[1][2] = state[1][3]; - state[1][3] = temp; - /* left rotate row 2 by 2 */ - temp = state[2][0]; - state[2][0] = state[2][2]; - state[2][2] = temp; - temp = state[2][1]; - state[2][1] = state[2][3]; - state[2][3] = temp; - /* left rotate row 3 by 3 */ - temp = state[3][0]; - state[3][0] = state[3][3]; - state[3][3] = state[3][2]; - state[3][2] = state[3][1]; - state[3][1] = temp; - return; -} -/* MixColumn transformation*/ -void MixColumn(u8 state[4][4]) -{ - u8 temp, tmp, tmp0; - int i; - - /* do one column at a time */ - for (i=0; i<4; i++) { - temp = state[0][i] ^ state[1][i] ^ state[2][i] ^ state[3][i]; - tmp0 = state[0][i]; - /* Xtime array does multiply by x in GF2^8 */ - tmp = Xtime[state[0][i] ^ state[1][i]]; - state[0][i] ^= temp ^ tmp; - tmp = Xtime[state[1][i] ^ state[2][i]]; - state[1][i] ^= temp ^ tmp; - tmp = Xtime[state[2][i] ^ state[3][i]]; - state[2][i] ^= temp ^ tmp; - tmp = Xtime[state[3][i] ^ tmp0]; - state[3][i] ^= temp ^ tmp; - } - - return; -} -/*------------------------------------------------------------------- - * Rijndael encryption function. Takes 16-byte input and creates - * 16-byte output (using round keys already derived from 16-byte - * key). - *-----------------------------------------------------------------*/ -void RijndaelEncrypt( const u8 const input[16], u8 output[16] ) -{ - u8 state[4][4]; - int i, r; - - /* initialise state array from input byte string */ - for (i=0; i<16; i++) - state[i & 0x3][i>>2] = input[i]; - - /* add first round_key */ - KeyAdd(state, roundKeys, 0); - - /* do lots of full rounds */ - for (r=1; r<=9; r++) { - ByteSub(state); - ShiftRow(state); - MixColumn(state); - KeyAdd(state, roundKeys, r); - } - - /* final round */ - ByteSub(state); - ShiftRow(state); - KeyAdd(state, roundKeys, r); - - /* produce output byte string from state array */ - for (i=0; i<16; i++) { - output[i] = state[i & 0x3][i>>2]; - } - - return; -} /* end of function RijndaelEncrypt */ diff --git a/openair-cn/OPENAIRHSS/auc/sequence_number.c b/openair-cn/OPENAIRHSS/auc/sequence_number.c deleted file mode 100644 index 2f53b98be0..0000000000 --- a/openair-cn/OPENAIRHSS/auc/sequence_number.c +++ /dev/null @@ -1,88 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -#include <stdio.h> -#include <stdlib.h> -#include <stdint.h> -#include <string.h> - -#include "auc.h" -#include "hss_config.h" - -extern hss_config_t hss_config; -extern uint8_t op[16]; - -uint8_t *sqn_ms_derive(const uint8_t const opc[16], uint8_t *key, uint8_t *auts, uint8_t *rand_p) -{ - /* AUTS = Conc(SQN MS ) || MAC-S - * Conc(SQN MS ) = SQN MS ^ f5* (RAND) - * MAC-S = f1* (SQN MS || RAND || AMF) - */ - uint8_t ak[6]; - uint8_t *conc_sqn_ms; - uint8_t *mac_s; - uint8_t mac_s_computed[MAC_S_LENGTH]; - uint8_t *sqn_ms; - uint8_t amf[2] = { 0, 0 }; - int i; - - conc_sqn_ms = auts; - mac_s = &auts[6]; - - sqn_ms = malloc(SQN_LENGTH_OCTEST); - - /*if (hss_config.valid_opc == 0) { - SetOP(hss_config.operator_key); - }*/ - - /* Derive AK from key and rand */ - f5star(opc, key, rand_p, ak); - - for (i = 0; i < 6; i++) { - sqn_ms[i] = ak[i] ^ conc_sqn_ms[i]; - } - - print_buffer("sqn_ms_derive() KEY : ", key, 16); - print_buffer("sqn_ms_derive() RAND : ", rand_p, 16); - print_buffer("sqn_ms_derive() AUTS : ", auts, 14); - print_buffer("sqn_ms_derive() AK : ", ak, 6); - print_buffer("sqn_ms_derive() SQN_MS : ", sqn_ms, 6); - print_buffer("sqn_ms_derive() MAC_S : ", mac_s, 8); - - f1star(opc, key, rand_p, sqn_ms, amf, mac_s_computed); - - print_buffer("MAC_S +: ", mac_s_computed, 8); - - if (memcmp(mac_s_computed, mac_s, 8) != 0) { - fprintf(stderr, "Failed to verify computed SQN_MS\n"); - free(sqn_ms); - return NULL; - } - - return sqn_ms; -} diff --git a/openair-cn/OPENAIRHSS/autogen.sh b/openair-cn/OPENAIRHSS/autogen.sh deleted file mode 100755 index fccf26a61e..0000000000 --- a/openair-cn/OPENAIRHSS/autogen.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -autoreconf --force --install -I m4 \ No newline at end of file diff --git a/openair-cn/OPENAIRHSS/conf/COPYING b/openair-cn/OPENAIRHSS/conf/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair-cn/OPENAIRHSS/conf/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program 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. - - This program 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 this program. If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - <program> Copyright (C) <year> <name of author> - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<http://www.gnu.org/licenses/>. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<http://www.gnu.org/philosophy/why-not-lgpl.html>. diff --git a/openair-cn/OPENAIRHSS/conf/demoCA/COPYING b/openair-cn/OPENAIRHSS/conf/demoCA/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair-cn/OPENAIRHSS/conf/demoCA/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program 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. - - This program 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 this program. If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - <program> Copyright (C) <year> <name of author> - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<http://www.gnu.org/licenses/>. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<http://www.gnu.org/philosophy/why-not-lgpl.html>. diff --git a/openair-cn/OPENAIRHSS/conf/hss.conf.in b/openair-cn/OPENAIRHSS/conf/hss.conf.in deleted file mode 100644 index 4c5e4c7d93..0000000000 --- a/openair-cn/OPENAIRHSS/conf/hss.conf.in +++ /dev/null @@ -1,11 +0,0 @@ -## MySQL mandatory options -MYSQL_server = "@MYSQL_server@"; -MYSQL_user = "@MYSQL_user@"; -MYSQL_pass = "@MYSQL_pass@"; -MYSQL_db = "@MYSQL_db@"; - -## HSS options -OPERATOR_key = "@OPERATOR_key@"; - -## Freediameter options -FD_conf = "@FREEDIAMETER_PATH@/../etc/freeDiameter/hss_fd.conf"; diff --git a/openair-cn/OPENAIRHSS/conf/make_certs.sh b/openair-cn/OPENAIRHSS/conf/make_certs.sh deleted file mode 100755 index 181c49912d..0000000000 --- a/openair-cn/OPENAIRHSS/conf/make_certs.sh +++ /dev/null @@ -1,75 +0,0 @@ -################################################################################ -# 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@eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ - -# ARG is REALM -# BY DEFAULT REALM IS "eur" - -DEFAULTREALMVALUE="eur" -REALM=${1:-$DEFAULTREALMVALUE} - -rm -rf demoCA -mkdir demoCA -echo 01 > demoCA/serial -touch demoCA/index.txt - -user=$(whoami) -HOSTNAME=$(hostname -f) - -echo "Creating HSS certificate for user '$HOSTNAME'.'$REALM'" -# -# # CA self certificate -# openssl req -new -batch -x509 -days 3650 -nodes -newkey rsa:1024 -out cacert.pem -keyout cakey.pem -subj /CN=test.fr/C=FR/ST=Biot/L=Aix/O=test.fr/OU=mobiles -# -# openssl genrsa -out hss.key.pem 1024 -# openssl req -new -batch -out hss.csr.pem -key hss.key.pem -subj /CN=hss.test.fr/C=FR/ST=Biot/L=Aix/O=test.fr/OU=mobiles -# openssl ca -cert cacert.pem -keyfile cakey.pem -in hss.csr.pem -out hss.cert.pem -outdir . -batch - -# Create a Root Certification Authority Certificate -openssl req -new -batch -x509 -days 3650 -nodes -newkey rsa:1024 -out hss.cacert.pem -keyout hss.cakey.pem -subj /CN=$REALM/C=FR/ST=PACA/L=Aix/O=Eurecom/OU=CM - -# Generate a Private Key -openssl genrsa -out hss.key.pem 1024 - -# Generate a CSR (Certificate Signing Request) that will be self-signed -openssl req -new -batch -out hss.csr.pem -key hss.key.pem -subj /CN=$HOSTNAME.$REALM/C=FR/ST=PACA/L=Aix/O=Eurecom/OU=CM - -# Certification authority -openssl ca -cert hss.cacert.pem -keyfile hss.cakey.pem -in hss.csr.pem -out hss.cert.pem -outdir . -batch - -if [ ! -d /usr/local/etc/freeDiameter ] -then - echo "Creating non existing directory: /usr/local/etc/freeDiameter/" - sudo mkdir /usr/local/etc/freeDiameter/ -fi - -sudo cp -upv hss.cakey.pem hss.cert.pem hss.cacert.pem hss.key.pem /usr/local/etc/freeDiameter/ - -# openssl genrsa -out $hss.key.pem 1024 -# openssl req -new -batch -out $hss.csr.pem -key $hss.key.pem -subj /CN=$hss.test.fr/C=FR/ST=Biot/L=Aix/O=test.fr/OU=mobiles -# openssl ca -cert cacert.pem -keyfile cakey.pem -in $hss.csr.pem -out $hss.cert.pem -outdir . -batch diff --git a/openair-cn/OPENAIRHSS/configure.ac b/openair-cn/OPENAIRHSS/configure.ac deleted file mode 100644 index 3aa0f11e8a..0000000000 --- a/openair-cn/OPENAIRHSS/configure.ac +++ /dev/null @@ -1,200 +0,0 @@ -################################################################################ -# 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@eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ -AC_PREREQ([2.65]) - -define([svnversion], esyscmd([sh -c "svnversion ..|tr -d '\n'"])) - -AC_DEFINE(SVN_REVISION, "svnversion", [SVN Revision]) - -AC_INIT([openair-hss], [1.0.0.svnversion], [openair_admin@eurecom.fr]) -AC_CANONICAL_BUILD -AC_CANONICAL_TARGET -AM_INIT_AUTOMAKE([1.11 silent-rules]) - -AC_CONFIG_MACRO_DIR([m4]) - -AC_CONFIG_HEADERS([config.h]) - -AM_MAINTAINER_MODE - -AM_SILENT_RULES([yes]) - -PKG_CHECK_MODULES(CHECK, [check >= 0.9.4], [HAVE_CHECK=true], [HAVE_CHECK=false]) -AM_CONDITIONAL(HAVE_CHECK, test x$HAVE_CHECK = xtrue) - -AM_PROG_LEX -AM_PROG_LIBTOOL - -AC_PROG_YACC -AC_PROG_CXX -AC_PROG_RANLIB - -AC_TYPE_INT8_T -AC_TYPE_INT16_T -AC_TYPE_INT32_T -AC_TYPE_UINT8_T -AC_TYPE_UINT16_T -AC_TYPE_UINT32_T -AC_TYPE_UINT64_T -AC_TYPE_SIZE_T -AC_TYPE_SSIZE_T - -AC_CHECK_HEADERS([libintl.h malloc.h netinet/in.h stddef.h]) - -AC_CHECK_FUNCS([memset strdup strerror]) -AC_C_INLINE - -AC_FUNC_ALLOCA -AC_FUNC_MALLOC -AC_FUNC_REALLOC - -dnl *** Autoconf support *** -AC_ARG_ENABLE(autoconf, - [ --disable-autoconf disable automatic generation of configure script ], - enable_autoconf=$enableval, enable_autoconf=yes -) -AC_PATH_PROG(AUTOCONF, autoconf, @echo autoconf not available) -AC_PATH_PROG(AUTOHEADER, autoheader, @echo autoheader not available) -if test -z "$AUTOCONF"; then enable_autoconf=no ; fi -if test -z "$AUTOHEADER"; then enable_autoconf=no ; fi -if test x$enable_autoconf = xyes; then - CONFIGURE_DEPENDS="configure.in" -fi -AC_SUBST(CONFIGURE_DEPENDS) - -AC_CHECK_LIB([mysqlclient], - [mysql_init], - [], - []) - -dnl ***freediameter support*** -AC_CHECK_LIB([fdcore], [fd_core_initialize], [], - [AC_MSG_ERROR(Free diameter lib not installed)]) -AC_CHECK_LIB([fdproto], [fd_core_initialize], [], - [AC_MSG_ERROR(Free diameter lib not installed)]) - -dnl *** Freediameter requirements *** -AC_CHECK_HEADERS([signalent.h]) -AC_CHECK_FUNCS([ntohll strndup]) -AC_DEFINE([HAVE_AI_ADDRCONFIG], [], - [Define to 1 if you have AI_ADDRCONFIG defined in netdb.h]) -AC_DEFINE([HAVE_CLOCK_GETTIME], [], - [Define to 1 if you have clock_gettime in librt]) -AC_DEFINE([HAVE_PTHREAD_BAR], [], - [Define to 1 if you have pthread_barrier_wait in libpthread]) -AC_DEFINE([SCTP_CONNECTX_4_ARGS], [], - [Define to 1 if sctp_connectx function accepts 4 arguments]) -AC_CHECK_LIB([rt], [clock_gettime], [AC_DEFINE(HAVE_CLOCK_GETTIME, 1)], []) -AC_CHECK_LIB([pthread], [pthread_barrier_wait], - [AC_DEFINE(HAVE_PTHREAD_BAR, 1)], []) -AC_CHECK_DECL([AI_ADDRCONFIG], - [AC_DEFINE(HAVE_AI_ADDRCONFIG, 1)], - [], [[#include <netdb.h>]]) -AC_MSG_CHECKING(if sctp_connectx accepts 4 arguments) -AC_LINK_IFELSE([ - AC_LANG_SOURCE( - [[int main() { return sctp_connectx(0, NULL, 0, NULL); }]]) -], [AC_DEFINE(SCTP_CONNECTX_4_ARGS, 1)]) -AC_CHECK_LIB([gnutls], - [gnutls_hash], - [AC_DEFINE(GNUTLS_VERSION_210, 1, - [Define to 1 if you have gnutls 2.10 installed])], - []) -AC_CHECK_LIB([gnutls], - [gnutls_x509_trust_list_verify_crt], - [AC_DEFINE(GNUTLS_VERSION_300, 1, - [Define to 1 if you have gnutls 3.0 installed])], - []) -AC_CHECK_LIB([gnutls], - [gnutls_handshake_set_timeout], - [AC_DEFINE(GNUTLS_VERSION_310, 1, - [Define to 1 if you have gnutls 3.1 installed])], - []) - -AC_DEFINE(FREE_DIAMETER_MINIMUM_VERSION, "1.1.5", [freeDiameter minimum version]) - -AC_CHECK_LIB(gmp, __gmpz_init, , - [AC_MSG_ERROR([GNU MP not found, see http://gmplib.org/])]) -AC_CHECK_LIB([nettle], - [nettle_hmac_sha256_set_key], - [], - [AC_MSG_ERROR(nettle is not installed)]) -AC_CHECK_LIB([pthread], - [pthread_getspecific], - [], - [AC_MSG_ERROR(lib pthread is not installed)]) - -AC_SUBST(ADD_CFLAGS) - -dnl Add these flags -CFLAGS="$CFLAGS -Wall" -CFLAGS="$CFLAGS -Wshadow" -CFLAGS="$CFLAGS -Wcast-align" -CFLAGS="$CFLAGS -Wchar-subscripts" -CFLAGS="$CFLAGS -Wmissing-prototypes" -CFLAGS="$CFLAGS -Wmissing-declarations" -CFLAGS="$CFLAGS -Werror=implicit-function-declaration" - -AC_C_BIGENDIAN -if test "x$ac_cv_c_bigendian" = "xyes"; then - CFLAGS="$CFLAGS -DBYTE_ORDER=BIG_ENDIAN" -else - CFLAGS="$CFLAGS -DBYTE_ORDER=LITTLE_ENDIAN" -fi - -AC_SUBST([AM_CFLAGS]) - -AC_ARG_ENABLE(dh_install, AS_HELP_STRING([--enable-dh-install], [Replace some variables for installation]), - [], - []) - -if test x$enable_dh_install == xyes; then - AC_SUBST(AM_CONF_DIR, $sysconfdir/openair-hss) -else - AC_SUBST(AM_CONF_DIR, $srcdir/conf) -fi - -AC_OUTPUT( \ - conf/hss.conf \ - access_restriction/Makefile \ - auc/Makefile \ - db/Makefile \ - s6a/Makefile \ - utils/Makefile \ - tests/Makefile \ - Makefile \ -) - -echo " -($PACKAGE_NAME) version $PACKAGE_VERSION -Prefix.........: $prefix -C Compiler.....: $CC $CFLAGS -Linker.........: $LD $LDFLAGS $LIBS -Tests..........: ${HAVE_CHECK} -" \ No newline at end of file diff --git a/openair-cn/OPENAIRHSS/db/COPYING b/openair-cn/OPENAIRHSS/db/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair-cn/OPENAIRHSS/db/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program 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. - - This program 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 this program. If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - <program> Copyright (C) <year> <name of author> - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<http://www.gnu.org/licenses/>. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<http://www.gnu.org/philosophy/why-not-lgpl.html>. diff --git a/openair-cn/OPENAIRHSS/db/Makefile.am b/openair-cn/OPENAIRHSS/db/Makefile.am deleted file mode 100644 index cc97c37a20..0000000000 --- a/openair-cn/OPENAIRHSS/db/Makefile.am +++ /dev/null @@ -1,40 +0,0 @@ -################################################################################ -# 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@eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ -AM_CFLAGS = @ADD_CFLAGS@ \ - -I$(top_srcdir) \ - -I$(top_srcdir)/s6a \ - -I$(top_srcdir)/utils - -noinst_LTLIBRARIES = libdb.la - -libdb_la_LDFLAGS = -all-static -libdb_la_SOURCES = \ - db_proto.h db_connector.c \ - db_subscription_data.c \ - db_epc_equipment.c \ No newline at end of file diff --git a/openair-cn/OPENAIRHSS/db/db_connector.c b/openair-cn/OPENAIRHSS/db/db_connector.c deleted file mode 100644 index f96032896a..0000000000 --- a/openair-cn/OPENAIRHSS/db/db_connector.c +++ /dev/null @@ -1,702 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -#include <pthread.h> -#include <stdlib.h> -#include <stdio.h> -#include <stdint.h> -#include <unistd.h> -#include <string.h> -#include <errno.h> -#include <error.h> -#include <inttypes.h> - -#include <mysql/mysql.h> - -#include "hss_config.h" -#include "db_proto.h" - -extern void ComputeOPc( const uint8_t const kP[16], const uint8_t const opP[16], uint8_t opcP[16] ); - - -database_t *db_desc; - -static void print_buffer(const char *prefix, uint8_t *buffer, int length) -{ - int i; - - fprintf(stdout, "%s", prefix); - - for (i = 0; i < length; i++) { - fprintf(stdout, "%02x.", buffer[i]); - } - - fprintf(stdout, "\n"); -} - -int hss_mysql_connect(const hss_config_t *hss_config_p) -{ - const int mysql_reconnect_val = 1; - - if ((hss_config_p->mysql_server == NULL) || - (hss_config_p->mysql_user == NULL) || - (hss_config_p->mysql_password == NULL) || - (hss_config_p->mysql_database == NULL)) { - DB_ERROR("An empty name is not allowed\n"); - return EINVAL; - } - - DB_DEBUG("Initializing db layer\n"); - - db_desc = malloc(sizeof(database_t)); - - if (db_desc == NULL) { - DB_DEBUG("An error occured on MALLOC\n"); - return errno; - } - - pthread_mutex_init(&db_desc->db_cs_mutex, NULL); - - /* Copy database configuration from static hss config */ - db_desc->server = strdup(hss_config_p->mysql_server); - db_desc->user = strdup(hss_config_p->mysql_user); - db_desc->password = strdup(hss_config_p->mysql_password); - db_desc->database = strdup(hss_config_p->mysql_database); - - /* Init mySQL client */ - db_desc->db_conn = mysql_init(NULL); - - mysql_options(db_desc->db_conn, MYSQL_OPT_RECONNECT, &mysql_reconnect_val); - - /* Try to connect to database */ - if (!mysql_real_connect(db_desc->db_conn, db_desc->server, db_desc->user, - db_desc->password, db_desc->database, 0, NULL, 0)) { - DB_ERROR("An error occured while connecting to db: %s\n", - mysql_error(db_desc->db_conn)); - return -1; - } - - /* Set the multi statement ON */ - mysql_set_server_option(db_desc->db_conn, MYSQL_OPTION_MULTI_STATEMENTS_ON); - - DB_DEBUG("Initializing db layer: DONE\n"); - - return 0; -} - -void hss_mysql_disconnect(void) -{ - mysql_close(db_desc->db_conn); -} - -int hss_mysql_update_loc(const char *imsi, mysql_ul_ans_t *mysql_ul_ans) -{ - MYSQL_RES *res; - MYSQL_ROW row; - char query[1000]; - int ret = 0; - - if ((db_desc->db_conn == NULL) || (mysql_ul_ans == NULL)) { - return EINVAL; - } - - if (strlen(imsi) > 15) { - return EINVAL; - } - - sprintf(query, "SELECT `access_restriction`,`mmeidentity_idmmeidentity`," - "`msisdn`,`ue_ambr_ul`,`ue_ambr_dl`,`rau_tau_timer` " - "FROM `users` WHERE `users`.`imsi`='%s' ", imsi); - - memcpy(mysql_ul_ans->imsi, imsi, strlen(imsi) + 1); - - DB_DEBUG("Query: %s\n", query); - - pthread_mutex_lock(&db_desc->db_cs_mutex); - - if (mysql_query(db_desc->db_conn, query)) { - pthread_mutex_unlock(&db_desc->db_cs_mutex); - DB_ERROR("Query execution failed: %s\n", - mysql_error(db_desc->db_conn)); - mysql_thread_end(); - return EINVAL; - } - - res = mysql_store_result(db_desc->db_conn); - - pthread_mutex_unlock(&db_desc->db_cs_mutex); - - if ((row = mysql_fetch_row(res)) != NULL) { - int mme_id; - /* MSISDN may be NULL */ - mysql_ul_ans->access_restriction = atoi(row[0]); - - if ((mme_id = atoi(row[1])) > 0) { - ret = hss_mysql_query_mmeidentity(mme_id, &mysql_ul_ans->mme_identity); - } else { - mysql_ul_ans->mme_identity.mme_host[0] = '\0'; - mysql_ul_ans->mme_identity.mme_realm[0] = '\0'; - } - - if (row[2] != 0) { - memcpy(mysql_ul_ans->msisdn, row[2], strlen(row[2])); - } - - mysql_ul_ans->aggr_ul = atoi(row[3]); - mysql_ul_ans->aggr_dl = atoi(row[4]); - mysql_ul_ans->rau_tau = atoi(row[5]); - - mysql_free_result(res); - mysql_thread_end(); - return ret; - } - - mysql_free_result(res); - mysql_thread_end(); - return EINVAL; -} - -int hss_mysql_purge_ue(mysql_pu_req_t *mysql_pu_req, - mysql_pu_ans_t *mysql_pu_ans) -{ - MYSQL_RES *res; - MYSQL_ROW row; - char query[1000]; - int ret = 0; - - if ((db_desc->db_conn == NULL) || - (mysql_pu_req == NULL) || - (mysql_pu_ans == NULL)) { - return EINVAL; - } - - if (strlen(mysql_pu_req->imsi) > 15) { - return EINVAL; - } - - sprintf(query, "UPDATE `users` SET `users`.`ms_ps_status`=\"PURGED\" " - "WHERE `users`.`imsi`='%s'; " - "SELECT `users`.`mmeidentity_idmmeidentity` FROM `users` " - "WHERE `users`.`imsi`=%s ", - mysql_pu_req->imsi, mysql_pu_req->imsi); - - DB_DEBUG("Query: %s\n", query); - - pthread_mutex_lock(&db_desc->db_cs_mutex); - - if (mysql_query(db_desc->db_conn, query)) { - pthread_mutex_unlock(&db_desc->db_cs_mutex); - DB_ERROR("Query execution failed: %s\n", - mysql_error(db_desc->db_conn)); - mysql_thread_end(); - return EINVAL; - } - - res = mysql_store_result(db_desc->db_conn); - - pthread_mutex_unlock(&db_desc->db_cs_mutex); - - if ((row = mysql_fetch_row(res)) != NULL) { - int mme_id; - - if ((mme_id = atoi(row[0])) > 0) { - ret = hss_mysql_query_mmeidentity(mme_id, mysql_pu_ans); - } else { - mysql_pu_ans->mme_host[0] = '\0'; - mysql_pu_ans->mme_realm[0] = '\0'; - } - - mysql_free_result(res); - mysql_thread_end(); - return ret; - } - - mysql_free_result(res); - mysql_thread_end(); - return EINVAL; -} - -int hss_mysql_get_user(const char *imsi) -{ - MYSQL_RES *res; - MYSQL_ROW row; - char query[1000]; - - if (db_desc->db_conn == NULL) { - return EINVAL; - } - - sprintf(query, "SELECT `imsi` FROM `users` WHERE `users`.`imsi`=%s ", imsi); - - DB_DEBUG("Query: %s\n", query); - - pthread_mutex_lock(&db_desc->db_cs_mutex); - - if (mysql_query(db_desc->db_conn, query)) { - pthread_mutex_unlock(&db_desc->db_cs_mutex); - DB_ERROR("Query execution failed: %s\n", - mysql_error(db_desc->db_conn)); - mysql_thread_end(); - return EINVAL; - } - - res = mysql_store_result(db_desc->db_conn); - - pthread_mutex_unlock(&db_desc->db_cs_mutex); - - if ((row = mysql_fetch_row(res)) != NULL) { - mysql_free_result(res); - mysql_thread_end(); - return 0; - } - - mysql_free_result(res); - mysql_thread_end(); - - return EINVAL; -} - -int mysql_push_up_loc(mysql_ul_push_t *ul_push_p) -{ - MYSQL_RES *res; - char query[1000]; - int query_length = 0; - int status; - - if ((db_desc->db_conn == NULL) || (ul_push_p == NULL)) { - return EINVAL; - } - - // TODO: multi-statement check results - - if (ul_push_p->mme_identity_present == MME_IDENTITY_PRESENT) { - query_length += sprintf(&query[query_length], "INSERT INTO `mmeidentity`" - " (`mmehost`,`mmerealm`) SELECT '%s','%s' FROM `mmeidentity` WHERE NOT" - " EXISTS (SELECT * FROM `mmeidentity` WHERE `mmehost`='%s'" - " AND `mmerealm`='%s') LIMIT 1;", ul_push_p->mme_identity.mme_host, - ul_push_p->mme_identity.mme_realm, ul_push_p->mme_identity.mme_host, - ul_push_p->mme_identity.mme_realm); - } - - query_length += sprintf(&query[query_length], "UPDATE `users`%s SET ", - ul_push_p->mme_identity_present == MME_IDENTITY_PRESENT ? - ",`mmeidentity`" : ""); - - if (ul_push_p->imei_present == IMEI_PRESENT) { - query_length += sprintf(&query[query_length], "`imei`='%s',", - ul_push_p->imei); - } - - if (ul_push_p->sv_present == SV_PRESENT) { - query_length += sprintf(&query[query_length], "`imeisv`='%*s',", 2, - ul_push_p->software_version); - } - - if (ul_push_p->mme_identity_present == MME_IDENTITY_PRESENT) { - query_length += sprintf(&query[query_length], - "`users`.`mmeidentity_idmmeidentity`=`mmeidentity`.`idmmeidentity`, " - "`users`.`ms_ps_status`=\"NOT_PURGED\""); - } - - query_length += sprintf(&query[query_length], " WHERE `users`.`imsi`='%s'", - ul_push_p->imsi); - - if (ul_push_p->mme_identity_present == MME_IDENTITY_PRESENT) { - query_length += sprintf(&query[query_length], - " AND `mmeidentity`.`mmehost`='%s'" - " AND `mmeidentity`.`mmerealm`='%s'", - ul_push_p->mme_identity.mme_host, ul_push_p->mme_identity.mme_realm); - } - - DB_DEBUG("Query: %s\n", query); - - pthread_mutex_lock(&db_desc->db_cs_mutex); - - if (mysql_query(db_desc->db_conn, query)) { - pthread_mutex_unlock(&db_desc->db_cs_mutex); - fprintf(stderr, "Query execution failed: %s\n", - mysql_error(db_desc->db_conn)); - mysql_thread_end(); - return EINVAL; - } - - /* process each statement result */ - do { - /* did current statement return data? */ - res = mysql_store_result(db_desc->db_conn); - - if (res) { - /* yes; process rows and free the result set */ - mysql_free_result(res); - } else { /* no result set or error */ - if (mysql_field_count(db_desc->db_conn) == 0) { - DB_ERROR("%lld rows affected\n", - mysql_affected_rows(db_desc->db_conn)); - } else { /* some error occurred */ - DB_ERROR("Could not retrieve result set\n"); - break; - } - } - - /* more results? -1 = no, >0 = error, 0 = yes (keep looping) */ - if ((status = mysql_next_result(db_desc->db_conn)) > 0) - DB_ERROR("Could not execute statement\n"); - } while (status == 0); - - pthread_mutex_unlock(&db_desc->db_cs_mutex); - - mysql_free_result(res); - mysql_thread_end(); - - return 0; -} - -int hss_mysql_push_rand_sqn(const char *imsi, uint8_t *rand_p, uint8_t *sqn) -{ - int status = 0, i; - MYSQL_RES *res; - char query[1000]; - int query_length = 0; - uint64_t sqn_decimal = 0; - - if (db_desc->db_conn == NULL) { - return EINVAL; - } - - if (rand_p == NULL || sqn == NULL) { - return EINVAL; - } - - sqn_decimal = ((uint64_t)sqn[0] << 40) | ((uint64_t)sqn[1] << 32) | - ((uint64_t)sqn[2] << 24) | (sqn[3] << 16) | - (sqn[4] << 8) | sqn[5]; - - query_length = sprintf(query, "UPDATE `users` SET `rand`=UNHEX('"); - - for (i = 0; i < RAND_LENGTH; i ++) { - query_length += sprintf(&query[query_length], "%02x", rand_p[i]); - } - - query_length += sprintf(&query[query_length], "'),`sqn`=%"PRIu64, sqn_decimal); - query_length += sprintf(&query[query_length], " WHERE `users`.`imsi`='%s'", imsi); - - DB_DEBUG("Query: %s\n", query); - - pthread_mutex_lock(&db_desc->db_cs_mutex); - - if (mysql_query(db_desc->db_conn, query)) { - pthread_mutex_unlock(&db_desc->db_cs_mutex); - DB_ERROR("Query execution failed: %s\n", - mysql_error(db_desc->db_conn)); - mysql_thread_end(); - return EINVAL; - } - - /* process each statement result */ - do { - /* did current statement return data? */ - res = mysql_store_result(db_desc->db_conn); - - if (res) { - /* yes; process rows and free the result set */ - mysql_free_result(res); - } else { /* no result set or error */ - if (mysql_field_count(db_desc->db_conn) == 0) { - DB_ERROR("%lld rows affected\n", - mysql_affected_rows(db_desc->db_conn)); - } else { /* some error occurred */ - DB_ERROR("Could not retrieve result set\n"); - break; - } - } - - /* more results? -1 = no, >0 = error, 0 = yes (keep looping) */ - if ((status = mysql_next_result(db_desc->db_conn)) > 0) - DB_ERROR("Could not execute statement\n"); - } while (status == 0); - - pthread_mutex_unlock(&db_desc->db_cs_mutex); - - mysql_free_result(res); - mysql_thread_end(); - - return 0; -} - -int hss_mysql_increment_sqn(const char *imsi) -{ - int status; - MYSQL_RES *res; - char query[1000]; - - if (db_desc->db_conn == NULL) { - return EINVAL; - } - - if (imsi == NULL) { - return EINVAL; - } - - /* + 32 = 2 ^ sizeof(IND) (see 3GPP TS. 33.102) */ - sprintf(query, "UPDATE `users` SET `sqn` = `sqn` + 32 WHERE `users`.`imsi`=%s", imsi); - - DB_DEBUG("Query: %s\n", query); - - if (mysql_query(db_desc->db_conn, query)) { - pthread_mutex_unlock(&db_desc->db_cs_mutex); - DB_ERROR("Query execution failed: %s\n", - mysql_error(db_desc->db_conn)); - mysql_thread_end(); - return EINVAL; - } - - /* process each statement result */ - do { - /* did current statement return data? */ - res = mysql_store_result(db_desc->db_conn); - - if (res) { - /* yes; process rows and free the result set */ - mysql_free_result(res); - } else { /* no result set or error */ - if (mysql_field_count(db_desc->db_conn) == 0) { - DB_ERROR("%lld rows affected\n", - mysql_affected_rows(db_desc->db_conn)); - } else { /* some error occurred */ - DB_ERROR("Could not retrieve result set\n"); - break; - } - } - - /* more results? -1 = no, >0 = error, 0 = yes (keep looping) */ - if ((status = mysql_next_result(db_desc->db_conn)) > 0) - DB_ERROR("Could not execute statement\n"); - } while (status == 0); - - pthread_mutex_unlock(&db_desc->db_cs_mutex); - - mysql_free_result(res); - mysql_thread_end(); - - return 0; -} - -int hss_mysql_auth_info(mysql_auth_info_req_t *auth_info_req, - mysql_auth_info_resp_t *auth_info_resp) -{ - int ret = 0; - MYSQL_RES *res; - MYSQL_ROW row; - char query[1000]; - - if (db_desc->db_conn == NULL) { - return EINVAL; - } - - if ((auth_info_req == NULL) || (auth_info_resp == NULL)) { - return EINVAL; - } - - sprintf(query, "SELECT `key`,`sqn`,`rand`,`OPc` FROM `users` WHERE `users`.`imsi`=%s ", - auth_info_req->imsi); - - DB_DEBUG("Query: %s\n", query); - - pthread_mutex_lock(&db_desc->db_cs_mutex); - - if (mysql_query(db_desc->db_conn, query)) { - pthread_mutex_unlock(&db_desc->db_cs_mutex); - DB_ERROR("Query execution failed: %s\n", - mysql_error(db_desc->db_conn)); - mysql_thread_end(); - return EINVAL; - } - - res = mysql_store_result(db_desc->db_conn); - - pthread_mutex_unlock(&db_desc->db_cs_mutex); - - if ((row = mysql_fetch_row(res)) != NULL) { - if (row[0] == NULL || row[1] == NULL || row[2] == NULL || row[3] == NULL) { - ret = EINVAL; - } - - if (row[0] != NULL) { - print_buffer("Key: ", (uint8_t*)row[0], KEY_LENGTH); - memcpy(auth_info_resp->key, row[0], KEY_LENGTH); - } - - if (row[1] != NULL) { - uint64_t sqn = 0; - - sqn = atoll(row[1]); - printf("Received SQN %s converted to %"PRIu64"\n", row[1], sqn); - - auth_info_resp->sqn[0] = (sqn & (255UL << 40)) >> 40; - auth_info_resp->sqn[1] = (sqn & (255UL << 32)) >> 32; - auth_info_resp->sqn[2] = (sqn & (255UL << 24)) >> 24; - auth_info_resp->sqn[3] = (sqn & (255UL << 16)) >> 16; - auth_info_resp->sqn[4] = (sqn & (255UL << 8)) >> 8; - auth_info_resp->sqn[5] = (sqn & 0xFF); - - print_buffer("SQN: ", auth_info_resp->sqn, SQN_LENGTH); - } - - if (row[2] != NULL) { - print_buffer("RAND: ", (uint8_t*)row[2], RAND_LENGTH); - memcpy(auth_info_resp->rand, row[2], RAND_LENGTH); - } - - if (row[3] != NULL) { - print_buffer("OPc: ", (uint8_t*)row[3], KEY_LENGTH); - memcpy(auth_info_resp->opc, row[3], KEY_LENGTH); - } - - mysql_free_result(res); - mysql_thread_end(); - return ret; - } - - mysql_free_result(res); - mysql_thread_end(); - - return EINVAL; -} - -int hss_mysql_check_opc_keys(const uint8_t const opP[16]) -{ - int ret = 0; - MYSQL_RES *res = NULL; - MYSQL_RES *res2 = NULL; - MYSQL_ROW row; - char query[1000]; - char update[1000]; - uint8_t k[16]; - uint8_t opc[16]; - int update_length = 0; - int status = 0; - int i; - - if (db_desc->db_conn == NULL) { - return EINVAL; - } - - sprintf(query, "SELECT `imsi`,`key`,`OPc` FROM `users` "); - - DB_DEBUG("Query: %s\n", query); - - pthread_mutex_lock(&db_desc->db_cs_mutex); - - if (mysql_query(db_desc->db_conn, query)) { - pthread_mutex_unlock(&db_desc->db_cs_mutex); - DB_ERROR("Query execution failed: %s\n", - mysql_error(db_desc->db_conn)); - mysql_thread_end(); - return EINVAL; - } - - res = mysql_store_result(db_desc->db_conn); - - pthread_mutex_unlock(&db_desc->db_cs_mutex); - - - while ((row = mysql_fetch_row(res))) { - if (row[0] == NULL || row[1] == NULL ) { - DB_ERROR("Query execution failed: %s\n", - mysql_error(db_desc->db_conn)); - ret = EINVAL; - } else { - if (row[0] != NULL) { - printf("IMSI: %s", (uint8_t*)row[0]); - } - if (row[1] != NULL) { - print_buffer("Key: ", (uint8_t*)row[1], KEY_LENGTH); - memcpy(k, row[1], KEY_LENGTH); - } - //if (row[3] != NULL) - { - print_buffer("OPc: ", (uint8_t*)row[2], KEY_LENGTH); - //} else { - ComputeOPc( k, opP, opc); - update_length = sprintf(update, "UPDATE `users` SET `OPc`=UNHEX('"); - for (i = 0; i < KEY_LENGTH; i ++) { - update_length += sprintf(&update[update_length], "%02x", opc[i]); - } - update_length += sprintf(&update[update_length], "') WHERE `users`.`imsi`='%s'", (uint8_t*)row[0]); - DB_DEBUG("Query: %s\n", update); - - if (mysql_query(db_desc->db_conn, update)) { - DB_ERROR("Query execution failed: %s\n", - mysql_error(db_desc->db_conn)); - } else { - printf("IMSI %s Updated OPc ", (uint8_t*)row[0]); - for (i = 0; i < KEY_LENGTH; i ++) { - printf("%02x", (uint8_t)(row[2][i])); - } - printf(" -> "); - for (i = 0; i < KEY_LENGTH; i ++) { - printf("%02x", opc[i]); - } - printf("\n"); - - /* process each statement result */ - do { - /* did current statement return data? */ - res2 = mysql_store_result(db_desc->db_conn); - - if (res2) { - /* yes; process rows and free the result set */ - mysql_free_result(res2); - } else { /* no result set or error */ - if (mysql_field_count(db_desc->db_conn) == 0) { - DB_ERROR("%lld rows affected\n", - mysql_affected_rows(db_desc->db_conn)); - } else { /* some error occurred */ - DB_ERROR("Could not retrieve result set\n"); - break; - } - } - - /* more results? -1 = no, >0 = error, 0 = yes (keep looping) */ - if ((status = mysql_next_result(db_desc->db_conn)) > 0) - DB_ERROR("Could not execute statement\n"); - } while (status == 0); - } - } - } - } - - mysql_free_result(res); - mysql_thread_end(); - - return ret; - -} - - diff --git a/openair-cn/OPENAIRHSS/db/db_epc_equipment.c b/openair-cn/OPENAIRHSS/db/db_epc_equipment.c deleted file mode 100644 index 8b6c430e7c..0000000000 --- a/openair-cn/OPENAIRHSS/db/db_epc_equipment.c +++ /dev/null @@ -1,136 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -#include <pthread.h> -#include <stdlib.h> -#include <stdio.h> -#include <unistd.h> -#include <string.h> -#include <errno.h> -#include <error.h> - -#include <mysql/mysql.h> - -#include "hss_config.h" -#include "db_proto.h" - -int hss_mysql_query_mmeidentity(const int id_mme_identity, - mysql_mme_identity_t *mme_identity_p) -{ - MYSQL_RES *res; - MYSQL_ROW row; - char query[1000]; - - if ((db_desc->db_conn == NULL) || (mme_identity_p == NULL)) { - return EINVAL; - } - - memset(mme_identity_p, 0, sizeof(mysql_mme_identity_t)); - - sprintf(query, "SELECT mmehost,mmerealm FROM mmeidentity WHERE " - "mmeidentity.idmmeidentity='%d' ", id_mme_identity); - - DB_DEBUG("Query: %s\n", query); - - pthread_mutex_lock(&db_desc->db_cs_mutex); - - if (mysql_query(db_desc->db_conn, query)) { - pthread_mutex_unlock(&db_desc->db_cs_mutex); - DB_ERROR("Query execution failed: %s\n", - mysql_error(db_desc->db_conn)); - mysql_thread_end(); - return EINVAL; - } - - res = mysql_store_result(db_desc->db_conn); - - pthread_mutex_unlock(&db_desc->db_cs_mutex); - - if ((row = mysql_fetch_row(res)) != NULL) { - if (row[0] != NULL) { - memcpy(mme_identity_p->mme_host, row[0], strlen(row[0])); - } else { - mme_identity_p->mme_host[0] = '\0'; - } - - if (row[1] != NULL) { - memcpy(mme_identity_p->mme_realm, row[1], strlen(row[1])); - } else { - mme_identity_p->mme_realm[0] = '\0'; - } - - mysql_free_result(res); - mysql_thread_end(); - return 0; - } - - mysql_free_result(res); - mysql_thread_end(); - return EINVAL; -} - -int hss_mysql_check_epc_equipment(mysql_mme_identity_t *mme_identity_p) -{ - MYSQL_RES *res; - MYSQL_ROW row; - char query[1000]; - - if ((db_desc->db_conn == NULL) || (mme_identity_p == NULL)) { - return EINVAL; - } - - sprintf(query, "SELECT idmmeidentity FROM mmeidentity WHERE mmeidentity.mmehost='%s' ", - mme_identity_p->mme_host); - - DB_DEBUG("Query: %s\n", query); - - pthread_mutex_lock(&db_desc->db_cs_mutex); - - if (mysql_query(db_desc->db_conn, query)) { - pthread_mutex_unlock(&db_desc->db_cs_mutex); - DB_ERROR("Query execution failed: %s\n", - mysql_error(db_desc->db_conn)); - mysql_thread_end(); - return EINVAL; - } - - res = mysql_store_result(db_desc->db_conn); - - pthread_mutex_unlock(&db_desc->db_cs_mutex); - - if ((row = mysql_fetch_row(res)) != NULL) { - mysql_free_result(res); - mysql_thread_end(); - return 0; - } - - mysql_free_result(res); - mysql_thread_end(); - return EINVAL; -} diff --git a/openair-cn/OPENAIRHSS/db/db_proto.h b/openair-cn/OPENAIRHSS/db/db_proto.h deleted file mode 100644 index d87ed461e5..0000000000 --- a/openair-cn/OPENAIRHSS/db/db_proto.h +++ /dev/null @@ -1,206 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -#include <stdio.h> -#include <stdint.h> -#include <pthread.h> -#include <mysql/mysql.h> - -#include <netinet/in.h> /* To provide internet addresses strings helpers */ - -#ifndef DB_PROTO_H_ -#define DB_PROTO_H_ - -#define DB_DEBUG(fmt, args...) fprintf(stdout, "%s:%d: "fmt, __FILE__, __LINE__, ##args) -#define DB_ERROR(fmt, args...) fprintf(stderr, "%s:%d: "fmt, __FILE__, __LINE__, ##args) - -typedef struct { - /* The mysql reference connector object */ - MYSQL *db_conn; - char *server; - char *user; - char *password; - char *database; - - pthread_mutex_t db_cs_mutex; -} database_t; - -extern database_t *db_desc; - -typedef uint32_t pre_emp_vul_t; -typedef uint32_t pre_emp_cap_t; -typedef uint8_t access_restriction_t; -typedef uint32_t ambr_t; -typedef uint8_t qci_t; -typedef uint8_t prio_level_t; -typedef uint32_t rau_tau_t; - -#define IMSI_LENGTH_MAX (15) - -typedef struct { - char imsi[IMSI_LENGTH_MAX + 1]; -} mysql_auth_info_req_t; - -/* Expressed in bytes */ -#define KEY_LENGTH (16) -#define SQN_LENGTH (6) -#define RAND_LENGTH (16) - -typedef struct mysql_auth_info_resp_s{ - uint8_t key[KEY_LENGTH]; - uint8_t sqn[SQN_LENGTH]; - /* RAND should not be here... */ - uint8_t rand[RAND_LENGTH]; - uint8_t opc[KEY_LENGTH]; -} mysql_auth_info_resp_t; - -typedef struct mysql_opc_push_s{ - char imsi[IMSI_LENGTH_MAX + 1]; - /* New computed SQN that will be used on next auth info req */ - uint8_t sqn[SQN_LENGTH]; -} mysql_opc_push_t; - -typedef struct mysql_sqn_push_s{ - char imsi[IMSI_LENGTH_MAX + 1]; - /* New computed SQN that will be used on next auth info req */ - uint8_t sqn[SQN_LENGTH]; -} mysql_sqn_push_t; - -typedef struct mysql_mme_identity_s{ - /* An MME may have already been registered as serving the UE. */ - char mme_host[255]; - char mme_realm[200]; -} mysql_mme_identity_t; - -typedef struct mysql_ul_ans_s{ - char imsi[16]; - /* MSISDN this parameter may be NULL */ - char msisdn[16]; - - /* Maximum aggregated bitrates for the user */ - ambr_t aggr_ul; - ambr_t aggr_dl; - - /* Subscribed RAU-TAU timer */ - rau_tau_t rau_tau; - - access_restriction_t access_restriction; - mysql_mme_identity_t mme_identity; -} mysql_ul_ans_t; - -typedef struct mysql_ul_push_s{ - /* Bit masks indicating presence of optional fields */ -#define MME_IDENTITY_PRESENT (0x1) -#define MME_SUPPORTED_FEATURES_PRESENT (0x1) -#define IMEI_PRESENT (0x1) -#define SV_PRESENT (0x1) -#define UE_SRVCC_PRESENT (0x1) - - unsigned mme_identity_present:1; - unsigned mme_supported_features_present:1; - unsigned imei_present:1; - unsigned sv_present:1; - unsigned ue_srvcc_present:1; - - /* IMSI */ - char imsi[16]; - /* Origin host and realm */ - mysql_mme_identity_t mme_identity; - /* IMEISV */ - char imei[16]; - char software_version[2]; - - uint32_t ue_srvcc; - uint32_t mme_supported_features; -} mysql_ul_push_t; - -typedef enum { - IPV4 = 0, - IPV6 = 1, - IPV4V6 = 2, - IPV4_OR_IPV6 = 3, -} pdn_type_t; - -typedef struct pdn_address_s{ - char ipv4_address[INET_ADDRSTRLEN]; - char ipv6_address[INET6_ADDRSTRLEN]; -} pdn_address_t; - -typedef struct mysql_pdn_s{ - char apn[61]; - pdn_type_t pdn_type; - pdn_address_t pdn_address; - ambr_t aggr_ul; - ambr_t aggr_dl; - qci_t qci; - prio_level_t priority_level; - pre_emp_cap_t pre_emp_cap; - pre_emp_vul_t pre_emp_vul; -} mysql_pdn_t; - -typedef struct mysql_pu_req_s{ - /* IMSI */ - char imsi[16]; -} mysql_pu_req_t; - -typedef mysql_mme_identity_t mysql_pu_ans_t; - -int hss_mysql_connect(const hss_config_t *hss_config_p); - -void hss_mysql_disconnect(void); - -int hss_mysql_get_user(const char *imsi); - -int hss_mysql_update_loc(const char *imsi, mysql_ul_ans_t *mysql_ul_ans); - -int hss_mysql_query_mmeidentity(const int id_mme_identity, - mysql_mme_identity_t *mme_identity_p); - -int hss_mysql_check_epc_equipment(mysql_mme_identity_t *mme_identity_p); - -int mysql_push_up_loc(mysql_ul_push_t *ul_push_p); - -int hss_mysql_purge_ue(mysql_pu_req_t *mysql_pu_req, - mysql_pu_ans_t *mysql_pu_ans); - -int hss_mysql_query_pdns(const char *imsi, - mysql_pdn_t **pdns_p, - uint8_t *nb_pdns); - -int hss_mysql_auth_info(mysql_auth_info_req_t *auth_info_req, - mysql_auth_info_resp_t *auth_info_resp); - -int hss_mysql_push_rand_sqn(const char *imsi, uint8_t *rand_p, uint8_t *sqn); - -int hss_mysql_increment_sqn(const char *imsi); - -int hss_mysql_check_opc_keys(const uint8_t const opP[16]); - - -#endif /* DB_PROTO_H_ */ diff --git a/openair-cn/OPENAIRHSS/db/db_subscription_data.c b/openair-cn/OPENAIRHSS/db/db_subscription_data.c deleted file mode 100644 index dc06a011a8..0000000000 --- a/openair-cn/OPENAIRHSS/db/db_subscription_data.c +++ /dev/null @@ -1,171 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -#include <pthread.h> -#include <stdlib.h> -#include <stdio.h> -#include <unistd.h> -#include <string.h> -#include <errno.h> -#include <error.h> - -#include <mysql/mysql.h> - -#include "hss_config.h" -#include "db_proto.h" - -int hss_mysql_query_pdns(const char *imsi, - mysql_pdn_t **pdns_p, - uint8_t *nb_pdns) -{ - int ret; - MYSQL_RES *res = NULL; - MYSQL_ROW row; - char query[1000]; - mysql_pdn_t *pdn_array = NULL; - - if (db_desc->db_conn == NULL) { - return EINVAL; - } - - if (nb_pdns == NULL || pdns_p == NULL) { - return EINVAL; - } - - sprintf(query, "SELECT * FROM `pdn` WHERE " - "`pdn`.`users_imsi`=%s LIMIT 10; ", imsi); - - printf("Query: %s\n", query); - - pthread_mutex_lock(&db_desc->db_cs_mutex); - - if (mysql_query(db_desc->db_conn, query)) { - pthread_mutex_unlock(&db_desc->db_cs_mutex); - fprintf(stderr, "Query execution failed: %s\n", - mysql_error(db_desc->db_conn)); - mysql_thread_end(); - return EINVAL; - } - - res = mysql_store_result(db_desc->db_conn); - - pthread_mutex_unlock(&db_desc->db_cs_mutex); - - *nb_pdns = 0; - - while ((row = mysql_fetch_row(res)) != NULL) { - mysql_pdn_t *pdn_elm; /* Local PDN element in array */ - unsigned long *lengths; - - lengths = mysql_fetch_lengths(res); - - *nb_pdns += 1; - - if (*nb_pdns == 1) { - /* First row, must malloc */ - pdn_array = malloc(sizeof(mysql_pdn_t)); - } else { - pdn_array = realloc(pdn_array, *nb_pdns * sizeof(mysql_pdn_t)); - } - - if (pdn_array == NULL) { - /* Error on malloc */ - ret = ENOMEM; - goto err; - } - - pdn_elm = &pdn_array[*nb_pdns - 1]; - /* Copying the APN */ - memset(pdn_elm, 0, sizeof(mysql_pdn_t)); - memcpy(pdn_elm->apn, row[1], lengths[1]); - - /* PDN Type + PDN address */ - if (strcmp(row[2], "IPv6") == 0) { - pdn_elm->pdn_type = IPV6; - memcpy(pdn_elm->pdn_address.ipv6_address, row[4], lengths[4]); - pdn_elm->pdn_address.ipv6_address[lengths[4]] = '\0'; - } else if (strcmp(row[2], "IPv4v6") == 0) { - pdn_elm->pdn_type = IPV4V6; - memcpy(pdn_elm->pdn_address.ipv4_address, row[3], lengths[3]); - pdn_elm->pdn_address.ipv4_address[lengths[3]] = '\0'; - memcpy(pdn_elm->pdn_address.ipv6_address, row[4], lengths[4]); - pdn_elm->pdn_address.ipv6_address[lengths[4]] = '\0'; - } else if (strcmp(row[2], "IPv4_or_IPv6") == 0) { - pdn_elm->pdn_type = IPV4_OR_IPV6; - memcpy(pdn_elm->pdn_address.ipv4_address, row[3], lengths[3]); - pdn_elm->pdn_address.ipv4_address[lengths[3]] = '\0'; - memcpy(pdn_elm->pdn_address.ipv6_address, row[4], lengths[4]); - pdn_elm->pdn_address.ipv6_address[lengths[4]] = '\0'; - } else { - pdn_elm->pdn_type = IPV4; - memcpy(pdn_elm->pdn_address.ipv4_address, row[3], lengths[3]); - pdn_elm->pdn_address.ipv4_address[lengths[3]] = '\0'; - } - - pdn_elm->aggr_ul = atoi(row[5]); - pdn_elm->aggr_dl = atoi(row[6]); - pdn_elm->qci = atoi(row[9]); - pdn_elm->priority_level = atoi(row[10]); - - if (strcmp(row[11], "ENABLED") == 0) { - pdn_elm->pre_emp_cap = 0; - } else { - pdn_elm->pre_emp_cap = 1; - } - - if (strcmp(row[12], "DISABLED") == 0) { - pdn_elm->pre_emp_vul = 1; - } else { - pdn_elm->pre_emp_vul = 0; - } - } - - mysql_free_result(res); - mysql_thread_end(); - - /* We did not find any APN for the requested IMSI */ - if (*nb_pdns == 0) { - return EINVAL; - } else { - *pdns_p = pdn_array; - return 0; - } - -err: - - if (pdn_array) { - free(pdn_array); - } - - pdn_array = NULL; - *pdns_p = pdn_array; - *nb_pdns = 0; - mysql_free_result(res); - mysql_thread_end(); - return ret; -} diff --git a/openair-cn/OPENAIRHSS/db/oai_db.sql b/openair-cn/OPENAIRHSS/db/oai_db.sql deleted file mode 100644 index c763ce4afb..0000000000 --- a/openair-cn/OPENAIRHSS/db/oai_db.sql +++ /dev/null @@ -1,175 +0,0 @@ --- phpMyAdmin SQL Dump --- version 4.0.10deb1 --- http://www.phpmyadmin.net --- --- Host: localhost --- Generation Time: May 28, 2015 at 02:32 PM --- Server version: 5.5.43-0ubuntu0.14.04.1 --- PHP Version: 5.5.9-1ubuntu4.9 - -SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; -SET time_zone = "+00:00"; - - -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; -/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -/*!40101 SET NAMES utf8 */; - --- --- Database: `oai_db` --- - --- -------------------------------------------------------- - --- --- Table structure for table `apn` --- - -CREATE TABLE IF NOT EXISTS `apn` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `apn-name` varchar(60) NOT NULL, - `pdn-type` enum('IPv4','IPv6','IPv4v6','IPv4_or_IPv6') NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `apn-name` (`apn-name`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; - --- -------------------------------------------------------- - --- --- Table structure for table `mmeidentity` --- - -CREATE TABLE IF NOT EXISTS `mmeidentity` ( - `idmmeidentity` int(11) NOT NULL AUTO_INCREMENT, - `mmehost` varchar(255) DEFAULT NULL, - `mmerealm` varchar(200) DEFAULT NULL, - `UE-Reachability` tinyint(1) NOT NULL COMMENT 'Indicates whether the MME supports UE Reachability Notifcation', - PRIMARY KEY (`idmmeidentity`) -) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=43 ; - --- --- Dumping data for table `mmeidentity` --- - -INSERT INTO `mmeidentity` (`idmmeidentity`, `mmehost`, `mmerealm`, `UE-Reachability`) VALUES -(2, 'yang.openair4G.eur', 'openair4G.eur', 0), -(1, 'ng40-erc.openair4G.eur', 'openair4G.eur', 0); - --- -------------------------------------------------------- - --- --- Table structure for table `pdn` --- - -CREATE TABLE IF NOT EXISTS `pdn` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `apn` varchar(60) NOT NULL, - `pdn_type` enum('IPv4','IPv6','IPv4v6','IPv4_or_IPv6') NOT NULL DEFAULT 'IPv4', - `pdn_ipv4` varchar(15) DEFAULT '0.0.0.0', - `pdn_ipv6` varchar(45) CHARACTER SET latin1 COLLATE latin1_general_ci DEFAULT '0:0:0:0:0:0:0:0', - `aggregate_ambr_ul` int(10) unsigned DEFAULT '50000000', - `aggregate_ambr_dl` int(10) unsigned DEFAULT '100000000', - `pgw_id` int(11) NOT NULL, - `users_imsi` varchar(15) NOT NULL, - `qci` tinyint(3) unsigned NOT NULL DEFAULT '9', - `priority_level` tinyint(3) unsigned NOT NULL DEFAULT '15', - `pre_emp_cap` enum('ENABLED','DISABLED') DEFAULT 'DISABLED', - `pre_emp_vul` enum('ENABLED','DISABLED') DEFAULT 'DISABLED', - `LIPA-Permissions` enum('LIPA-prohibited','LIPA-only','LIPA-conditional') NOT NULL DEFAULT 'LIPA-only', - PRIMARY KEY (`id`,`pgw_id`,`users_imsi`), - KEY `fk_pdn_pgw1_idx` (`pgw_id`), - KEY `fk_pdn_users1_idx` (`users_imsi`) -) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=36 ; - --- --- Dumping data for table `pdn` --- - -INSERT INTO `pdn` (`id`, `apn`, `pdn_type`, `pdn_ipv4`, `pdn_ipv6`, `aggregate_ambr_ul`, `aggregate_ambr_dl`, `pgw_id`, `users_imsi`, `qci`, `priority_level`, `pre_emp_cap`, `pre_emp_vul`, `LIPA-Permissions`) VALUES -(1, 'oai.ipv4', 'IPv4', '0.0.0.0', '0:0:0:0:0:0:0:0', 50000000, 100000000, 3, '208930000000001', 9, 15, 'DISABLED', 'ENABLED', 'LIPA-only'), -(11, 'oai.ipv4', 'IPv4', '0.0.0.0', '0:0:0:0:0:0:0:0', 50000000, 100000000, 3, '20834123456789', 9, 15, 'DISABLED', 'ENABLED', 'LIPA-only'), -(10, 'oai.ipv4', 'IPv4', '0.0.0.0', '0:0:0:0:0:0:0:0', 50000000, 100000000, 3, '20810000001234', 9, 15, 'DISABLED', 'ENABLED', 'LIPA-only'), -(12, 'oai.ipv4', 'IPv4', '0.0.0.0', '0:0:0:0:0:0:0:0', 50000000, 100000000, 3, '31002890832150', 9, 15, 'DISABLED', 'ENABLED', 'LIPA-only'), -(2, 'oai.ipv4', 'IPv4', '0.0.0.0', '0:0:0:0:0:0:0:0', 50000000, 100000000, 3, '208950000000002', 9, 15, 'DISABLED', 'ENABLED', 'LIPA-only'), -(3, 'oai.ipv4', 'IPv4', '0.0.0.0', '0:0:0:0:0:0:0:0', 50000000, 100000000, 3, '001010123456789', 9, 15, 'DISABLED', 'ENABLED', 'LIPA-only'); - --- -------------------------------------------------------- - --- --- Table structure for table `pgw` --- - -CREATE TABLE IF NOT EXISTS `pgw` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `ipv4` varchar(15) NOT NULL, - `ipv6` varchar(39) NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `ipv4` (`ipv4`), - UNIQUE KEY `ipv6` (`ipv6`) -) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ; - --- --- Dumping data for table `pgw` --- - -INSERT INTO `pgw` (`id`, `ipv4`, `ipv6`) VALUES -(1, '127.0.0.1', '0:0:0:0:0:0:0:1'), -(2, '192.168.56.101', ''), -(3, '10.0.0.2', '0'); - --- -------------------------------------------------------- - --- --- Table structure for table `terminal-info` --- - -CREATE TABLE IF NOT EXISTS `terminal-info` ( - `imei` varchar(15) NOT NULL, - `sv` varchar(2) NOT NULL, - UNIQUE KEY `imei` (`imei`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - --- -------------------------------------------------------- - --- --- Table structure for table `users` --- - -CREATE TABLE IF NOT EXISTS `users` ( - `imsi` varchar(15) NOT NULL COMMENT 'IMSI is the main reference key.', - `msisdn` varchar(46) DEFAULT NULL COMMENT 'The basic MSISDN of the UE (Presence of MSISDN is optional).', - `imei` varchar(15) DEFAULT NULL COMMENT 'International Mobile Equipment Identity', - `imei_sv` varchar(2) DEFAULT NULL COMMENT 'International Mobile Equipment Identity Software Version Number', - `ms_ps_status` enum('PURGED','NOT_PURGED') DEFAULT 'PURGED' COMMENT 'Indicates that ESM and EMM status are purged from MME', - `rau_tau_timer` int(10) unsigned DEFAULT '120', - `ue_ambr_ul` bigint(20) unsigned DEFAULT '50000000' COMMENT 'The Maximum Aggregated uplink MBRs to be shared across all Non-GBR bearers according to the subscription of the user.', - `ue_ambr_dl` bigint(20) unsigned DEFAULT '100000000' COMMENT 'The Maximum Aggregated downlink MBRs to be shared across all Non-GBR bearers according to the subscription of the user.', - `access_restriction` int(10) unsigned DEFAULT '60' COMMENT 'Indicates the access restriction subscription information. 3GPP TS.29272 #7.3.31', - `mme_cap` int(10) unsigned zerofill DEFAULT NULL COMMENT 'Indicates the capabilities of the MME with respect to core functionality e.g. regional access restrictions.', - `mmeidentity_idmmeidentity` int(11) NOT NULL DEFAULT '0', - `key` varbinary(16) NOT NULL DEFAULT '0' COMMENT 'UE security key', - `RFSP-Index` smallint(5) unsigned NOT NULL DEFAULT '1' COMMENT 'An index to specific RRM configuration in the E-UTRAN. Possible values from 1 to 256', - `urrp_mme` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'UE Reachability Request Parameter indicating that UE activity notification from MME has been requested by the HSS.', - `sqn` bigint(20) unsigned zerofill NOT NULL, - `rand` varbinary(16) NOT NULL, - `OPc` varbinary(16) DEFAULT NULL COMMENT 'Can be computed by HSS', - PRIMARY KEY (`imsi`,`mmeidentity_idmmeidentity`), - KEY `fk_users_mmeidentity_idx1` (`mmeidentity_idmmeidentity`) -) ENGINE=MyISAM DEFAULT CHARSET=latin1; - --- --- Dumping data for table `users` --- - -INSERT INTO `users` (`imsi`, `msisdn`, `imei`, `imei_sv`, `ms_ps_status`, `rau_tau_timer`, `ue_ambr_ul`, `ue_ambr_dl`, `access_restriction`, `mme_cap`, `mmeidentity_idmmeidentity`, `key`, `RFSP-Index`, `urrp_mme`, `sqn`, `rand`, `OPc`) VALUES -('20834123456789', '380561234567', '12345678', '23', 'PURGED', 50, 40000000, 100000000, 47, 0000000000, 2, '+ÖEŸ‚ų\0•,IHÿH', 0, 0, 00000000000000000096, 'Px¼X \Z1¡Éx™ß', 'gíjS+Aq„‘§6Y'), -('20810000001234', '33611123456', NULL, NULL, 'PURGED', 120, 40000000, 100000000, 47, 0000000000, 2, '‹¯G?/Д‡ÌË× |hb', 1, 0, 00000281454575616097, 'sËÚæ$r®C¹f‰=:¾xÞ', 'Ž''¶¯i.u2fz;`]'), -('31002890832150', '33638060059', '35611302209414', NULL, 'PURGED', 120, 40000000, 100000000, 47, 0000000000, 2, '‹¯G?/Д‡ÌË× |hb', 1, 0, 00000000000000012416, '`ÏF®Ý†ôéD¢¼Ï›‰Á¼', 'Ž''¶¯i.u2fz;`]'), -('001010123456789', '33600101789', NULL, NULL, 'PURGED', 120, 50000000, 100000000, 47, 0000000000, 2, '\0 \n\r', 1, 0, 00000000000000000351, '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0', '$À_|/+6á%/%öÏÂ'), -('208930000000001', '33638060008', NULL, NULL, 'PURGED', 120, 50000000, 100000000, 47, 0000000000, 2, '‹¯G?/Д‡ÌË× |hb', 1, 0, 00000000000000006103, 'ëÐwq¬ègzW®Ð²áZ]', 'Ž''¶¯i.u2fz;`]'), -('208950000000002', '33638060009', NULL, NULL, 'PURGED', 120, 50000000, 100000000, 47, 0000000000, 2, '‹¯G?/Д‡ÌË× |hb', 1, 0, 00000000000000006391, 'U¶|Ç w±DÌü\Z…7', 'Ž''¶¯i.u2fz;`]'); - -/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; -/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; -/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; diff --git a/openair-cn/OPENAIRHSS/db/pft_db.sql b/openair-cn/OPENAIRHSS/db/pft_db.sql deleted file mode 100644 index e2eb8bfaa6..0000000000 --- a/openair-cn/OPENAIRHSS/db/pft_db.sql +++ /dev/null @@ -1,173 +0,0 @@ --- phpMyAdmin SQL Dump --- version 4.0.10deb1 --- http://www.phpmyadmin.net --- --- Host: localhost --- Generation Time: May 28, 2015 at 02:24 PM --- Server version: 5.5.43-0ubuntu0.14.04.1 --- PHP Version: 5.5.9-1ubuntu4.9 - -SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; -SET time_zone = "+00:00"; - - -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; -/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -/*!40101 SET NAMES utf8 */; - --- --- Database: `oai_db` --- - --- -------------------------------------------------------- - --- --- Table structure for table `apn` --- - -CREATE TABLE IF NOT EXISTS `apn` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `apn-name` varchar(60) NOT NULL, - `pdn-type` enum('IPv4','IPv6','IPv4v6','IPv4_or_IPv6') NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `apn-name` (`apn-name`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; - --- -------------------------------------------------------- - --- --- Table structure for table `mmeidentity` --- - -CREATE TABLE IF NOT EXISTS `mmeidentity` ( - `idmmeidentity` int(11) NOT NULL AUTO_INCREMENT, - `mmehost` varchar(255) DEFAULT NULL, - `mmerealm` varchar(200) DEFAULT NULL, - `UE-Reachability` tinyint(1) NOT NULL COMMENT 'Indicates whether the MME supports UE Reachability Notifcation', - PRIMARY KEY (`idmmeidentity`) -) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=43 ; - --- --- Dumping data for table `mmeidentity` --- - -INSERT INTO `mmeidentity` (`idmmeidentity`, `mmehost`, `mmerealm`, `UE-Reachability`) VALUES -(2, 'yang.openair4G.eur', 'openair4G.eur', 0), -(1, 'ng40-erc.openair4G.eur', 'openair4G.eur', 0); - --- -------------------------------------------------------- - --- --- Table structure for table `pdn` --- - -CREATE TABLE IF NOT EXISTS `pdn` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `apn` varchar(60) NOT NULL, - `pdn_type` enum('IPv4','IPv6','IPv4v6','IPv4_or_IPv6') NOT NULL DEFAULT 'IPv4', - `pdn_ipv4` varchar(15) DEFAULT '0.0.0.0', - `pdn_ipv6` varchar(45) CHARACTER SET latin1 COLLATE latin1_general_ci DEFAULT '0:0:0:0:0:0:0:0', - `aggregate_ambr_ul` int(10) unsigned DEFAULT '50000000', - `aggregate_ambr_dl` int(10) unsigned DEFAULT '100000000', - `pgw_id` int(11) NOT NULL, - `users_imsi` varchar(15) NOT NULL, - `qci` tinyint(3) unsigned NOT NULL DEFAULT '9', - `priority_level` tinyint(3) unsigned NOT NULL DEFAULT '15', - `pre_emp_cap` enum('ENABLED','DISABLED') DEFAULT 'DISABLED', - `pre_emp_vul` enum('ENABLED','DISABLED') DEFAULT 'DISABLED', - `LIPA-Permissions` enum('LIPA-prohibited','LIPA-only','LIPA-conditional') NOT NULL DEFAULT 'LIPA-only', - PRIMARY KEY (`id`,`pgw_id`,`users_imsi`), - KEY `fk_pdn_pgw1_idx` (`pgw_id`), - KEY `fk_pdn_users1_idx` (`users_imsi`) -) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=36 ; - --- --- Dumping data for table `pdn` --- - -INSERT INTO `pdn` (`id`, `apn`, `pdn_type`, `pdn_ipv4`, `pdn_ipv6`, `aggregate_ambr_ul`, `aggregate_ambr_dl`, `pgw_id`, `users_imsi`, `qci`, `priority_level`, `pre_emp_cap`, `pre_emp_vul`, `LIPA-Permissions`) VALUES -(8, 'oai.ipv4', 'IPv4', '0.0.0.0', '0:0:0:0:0:0:0:0', 50000000, 100000000, 3, '208920000000008', 9, 15, 'DISABLED', 'ENABLED', 'LIPA-only'), -(9, 'oai.ipv4', 'IPv4', '0.0.0.0', '0:0:0:0:0:0:0:0', 50000000, 100000000, 3, '208920000000009', 9, 15, 'DISABLED', 'ENABLED', 'LIPA-only'), -(11, 'oai.ipv4', 'IPv4', '0.0.0.0', '0:0:0:0:0:0:0:0', 50000000, 100000000, 3, '208920000000053', 9, 15, 'DISABLED', 'ENABLED', 'LIPA-only'), -(12, 'oai.ipv4', 'IPv4', '0.0.0.0', '0:0:0:0:0:0:0:0', 50000000, 100000000, 3, '208920000000055', 9, 15, 'DISABLED', 'ENABLED', 'LIPA-only'), -(16, 'oai.ipv4', 'IPv4', '0.0.0.0', '0:0:0:0:0:0:0:0', 50000000, 100000000, 3, '208920000000054', 9, 15, 'DISABLED', 'ENABLED', 'LIPA-only'); - --- -------------------------------------------------------- - --- --- Table structure for table `pgw` --- - -CREATE TABLE IF NOT EXISTS `pgw` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `ipv4` varchar(15) NOT NULL, - `ipv6` varchar(39) NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `ipv4` (`ipv4`), - UNIQUE KEY `ipv6` (`ipv6`) -) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ; - --- --- Dumping data for table `pgw` --- - -INSERT INTO `pgw` (`id`, `ipv4`, `ipv6`) VALUES -(1, '127.0.0.1', '0:0:0:0:0:0:0:1'), -(2, '192.168.56.101', ''), -(3, '10.0.0.2', '0'); - --- -------------------------------------------------------- - --- --- Table structure for table `terminal-info` --- - -CREATE TABLE IF NOT EXISTS `terminal-info` ( - `imei` varchar(15) NOT NULL, - `sv` varchar(2) NOT NULL, - UNIQUE KEY `imei` (`imei`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - --- -------------------------------------------------------- - --- --- Table structure for table `users` --- - -CREATE TABLE IF NOT EXISTS `users` ( - `imsi` varchar(15) NOT NULL COMMENT 'IMSI is the main reference key.', - `msisdn` varchar(46) DEFAULT NULL COMMENT 'The basic MSISDN of the UE (Presence of MSISDN is optional).', - `imei` varchar(15) DEFAULT NULL COMMENT 'International Mobile Equipment Identity', - `imei_sv` varchar(2) DEFAULT NULL COMMENT 'International Mobile Equipment Identity Software Version Number', - `ms_ps_status` enum('PURGED','NOT_PURGED') DEFAULT 'PURGED' COMMENT 'Indicates that ESM and EMM status are purged from MME', - `rau_tau_timer` int(10) unsigned DEFAULT '120', - `ue_ambr_ul` bigint(20) unsigned DEFAULT '50000000' COMMENT 'The Maximum Aggregated uplink MBRs to be shared across all Non-GBR bearers according to the subscription of the user.', - `ue_ambr_dl` bigint(20) unsigned DEFAULT '100000000' COMMENT 'The Maximum Aggregated downlink MBRs to be shared across all Non-GBR bearers according to the subscription of the user.', - `access_restriction` int(10) unsigned DEFAULT '60' COMMENT 'Indicates the access restriction subscription information. 3GPP TS.29272 #7.3.31', - `mme_cap` int(10) unsigned zerofill DEFAULT NULL COMMENT 'Indicates the capabilities of the MME with respect to core functionality e.g. regional access restrictions.', - `mmeidentity_idmmeidentity` int(11) NOT NULL DEFAULT '0', - `key` varbinary(16) NOT NULL DEFAULT '0' COMMENT 'UE security key', - `RFSP-Index` smallint(5) unsigned NOT NULL DEFAULT '1' COMMENT 'An index to specific RRM configuration in the E-UTRAN. Possible values from 1 to 256', - `urrp_mme` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'UE Reachability Request Parameter indicating that UE activity notification from MME has been requested by the HSS.', - `sqn` bigint(20) unsigned zerofill NOT NULL, - `rand` varbinary(16) NOT NULL, - `OPc` varbinary(16) DEFAULT NULL COMMENT 'Can be computed by HSS', - PRIMARY KEY (`imsi`,`mmeidentity_idmmeidentity`), - KEY `fk_users_mmeidentity_idx1` (`mmeidentity_idmmeidentity`) -) ENGINE=MyISAM DEFAULT CHARSET=latin1; - --- --- Dumping data for table `users` --- - -INSERT INTO `users` (`imsi`, `msisdn`, `imei`, `imei_sv`, `ms_ps_status`, `rau_tau_timer`, `ue_ambr_ul`, `ue_ambr_dl`, `access_restriction`, `mme_cap`, `mmeidentity_idmmeidentity`, `key`, `RFSP-Index`, `urrp_mme`, `sqn`, `rand`, `OPc`) VALUES -('208920000000008', '33638060008', NULL, NULL, 'PURGED', 120, 40000000, 100000000, 47, 0000000000, 2, '‹¯G?/Д‡ÌË× |hb', 1, 0, 00000000004294969388, '™Iðj„æ·>OƒO×K)', 'Ž''¶¯i.u2fz;`]'), -('208920000000009', '33638060009', NULL, NULL, 'PURGED', 120, 40000000, 100000000, 47, 0000000000, 2, '‹¯G?/ДWdiHC×¾½', 1, 0, 00000000000000033361, '\ZM{™hÄÏ#‡\\*láà', '¾·¶¿xÈJø™ ÿ”'), -('208920000000053', '33638060053', '35611302209415', NULL, 'PURGED', 120, 40000000, 100000000, 47, 0000000000, 2, '‹¯G?/Д6¦`FB&w', 1, 0, 00000000004294972622, 'o.Öq@Î#ë\0ï^ñÌ4¿', 'O¢Ñ~¤ï çî˜ÀÉÓÏ'), -('208920000000055', '33638060055', NULL, NULL, 'PURGED', 120, 40000000, 100000000, 47, 0000000000, 2, '‹¯G?/ДM_^r v', 1, 0, 00000000004294969388, '™Iðj„æ·>OƒO×K)', 'NÓ0;ãbCRÿÃòó_'), -('208920000000054', '33638060054', NULL, NULL, 'PURGED', 120, 40000000, 100000000, 47, 0000000000, 2, '‹¯G?/ДM_^r v', 1, 0, 00000000000000039820, 'B@W®Ø´JUÙ°To½C', 'NÓ0;ãbCRÿÃòó_'); - -/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; -/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; -/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; diff --git a/openair-cn/OPENAIRHSS/debian/changelog b/openair-cn/OPENAIRHSS/debian/changelog deleted file mode 100644 index 5ce3ffbc17..0000000000 --- a/openair-cn/OPENAIRHSS/debian/changelog +++ /dev/null @@ -1,5 +0,0 @@ -openair-hss (1.0.0-1) UNRELEASED; urgency=low - - * Initial release. (Closes: #XXXXXX) - - -- Sebastien Roux <roux@nord> Wed, 10 Apr 2013 09:54:55 +0200 diff --git a/openair-cn/OPENAIRHSS/debian/compat b/openair-cn/OPENAIRHSS/debian/compat deleted file mode 100644 index c7930257df..0000000000 --- a/openair-cn/OPENAIRHSS/debian/compat +++ /dev/null @@ -1 +0,0 @@ -7 \ No newline at end of file diff --git a/openair-cn/OPENAIRHSS/debian/control b/openair-cn/OPENAIRHSS/debian/control deleted file mode 100644 index ff727b65fa..0000000000 --- a/openair-cn/OPENAIRHSS/debian/control +++ /dev/null @@ -1,15 +0,0 @@ -Source: openair-hss -Maintainer: Sebastien ROUX <sebastien.roux@eurecom.fr> -Section: misc -Priority: optional -Standards-Version: 3.9.2 -Build-Depends: debhelper (>= 8), - make, gcc, bison, flex, autotools, - libmysqlclient-dev, libsctp-dev, - freediameter-dev, freediameter-dictionary-s6a, freediameter-dictionary-mip6, - libgmp-dev, libnettle-dev - -Package: openair-hss -Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends} -Description: Implementation of R10 HSS for 3GPP LTE core network \ No newline at end of file diff --git a/openair-cn/OPENAIRHSS/debian/copyright b/openair-cn/OPENAIRHSS/debian/copyright deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/openair-cn/OPENAIRHSS/debian/dirs b/openair-cn/OPENAIRHSS/debian/dirs deleted file mode 100644 index b01f7e5c00..0000000000 --- a/openair-cn/OPENAIRHSS/debian/dirs +++ /dev/null @@ -1 +0,0 @@ -etc/openair-hss/ \ No newline at end of file diff --git a/openair-cn/OPENAIRHSS/debian/files b/openair-cn/OPENAIRHSS/debian/files deleted file mode 100644 index 94dcd01645..0000000000 --- a/openair-cn/OPENAIRHSS/debian/files +++ /dev/null @@ -1 +0,0 @@ -openair-hss_1.0.0-1_i386.deb misc optional diff --git a/openair-cn/OPENAIRHSS/debian/openair-hss.install b/openair-cn/OPENAIRHSS/debian/openair-hss.install deleted file mode 100644 index 66a9d5fcb7..0000000000 --- a/openair-cn/OPENAIRHSS/debian/openair-hss.install +++ /dev/null @@ -1,3 +0,0 @@ -conf/hss.conf -conf/hss_fd.conf -db/oai_db.sql \ No newline at end of file diff --git a/openair-cn/OPENAIRHSS/debian/rules b/openair-cn/OPENAIRHSS/debian/rules deleted file mode 100755 index b6e44cb04d..0000000000 --- a/openair-cn/OPENAIRHSS/debian/rules +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/make -f - -export DH_OPTIONS - -%: - dh $@ - -override_dh_auto_configure: - dh_auto_configure -- --enable-dh-install LDFLAGS='-L/usr/local/lib' - -# Don't run tests: -override_dh_auto_test: \ No newline at end of file diff --git a/openair-cn/OPENAIRHSS/hss_main.c b/openair-cn/OPENAIRHSS/hss_main.c deleted file mode 100644 index 5a226bc0d9..0000000000 --- a/openair-cn/OPENAIRHSS/hss_main.c +++ /dev/null @@ -1,68 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -#include <stdio.h> -#include <string.h> - -#include "hss_config.h" -#include "db_proto.h" -#include "s6a_proto.h" -#include "auc.h" - -hss_config_t hss_config; - - -int main(int argc, char *argv[]) -{ - - memset(&hss_config, 0, sizeof(hss_config_t)); - - if (config_init(argc, argv, &hss_config) != 0) { - return -1; - } - - if (hss_mysql_connect(&hss_config) != 0) { - return -1; - } - - random_init(); - - if (hss_config.valid_op) { - hss_mysql_check_opc_keys((uint8_t*)hss_config.operator_key_bin); - } - - s6a_init(&hss_config); - - while(1) { - /* TODO: handle signals here */ - sleep(1); - } - - return 0; -} diff --git a/openair-cn/OPENAIRHSS/s6a/COPYING b/openair-cn/OPENAIRHSS/s6a/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair-cn/OPENAIRHSS/s6a/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program 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. - - This program 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 this program. If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - <program> Copyright (C) <year> <name of author> - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<http://www.gnu.org/licenses/>. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<http://www.gnu.org/philosophy/why-not-lgpl.html>. diff --git a/openair-cn/OPENAIRHSS/s6a/Makefile.am b/openair-cn/OPENAIRHSS/s6a/Makefile.am deleted file mode 100644 index bfd6a27fe6..0000000000 --- a/openair-cn/OPENAIRHSS/s6a/Makefile.am +++ /dev/null @@ -1,49 +0,0 @@ -################################################################################ -# 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@eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ -AM_CFLAGS = @ADD_CFLAGS@ \ - -I$(top_srcdir) \ - -I$(top_srcdir)/access_restriction \ - -I$(top_srcdir)/auc \ - -I$(top_srcdir)/db \ - -I$(top_srcdir)/utils - -noinst_LTLIBRARIES = libs6a.la - -libs6a_la_LDFLAGS = -all-static -libs6a_la_SOURCES = \ - s6a_common.c \ - s6a_fd.c s6a_proto.h \ - s6a_auth_info.c \ - s6a_up_loc.c \ - s6a_purge_ue.c \ - s6a_error.c \ - s6a_subscription_data.c \ - s6a_in_addr.c \ - s6a_peers.c \ - s6a_supported_features.h s6a_supported_features.c \ No newline at end of file diff --git a/openair-cn/OPENAIRHSS/s6a/s6a_auth_info.c b/openair-cn/OPENAIRHSS/s6a/s6a_auth_info.c deleted file mode 100644 index 718e48cce4..0000000000 --- a/openair-cn/OPENAIRHSS/s6a/s6a_auth_info.c +++ /dev/null @@ -1,301 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -/*! \file s6a_auth_info.c - * \brief Handle an authentication information request procedure and generate the answer - * \author Sebastien ROUX <sebastien.roux@eurecom.fr> - * \date 2013 - * \version 0.1 - */ - -#include <freeDiameter/freeDiameter-host.h> -#include <freeDiameter/libfdproto.h> -#include <stdint.h> -#include <string.h> -#include <inttypes.h> -#include <pthread.h> - -#include "hss_config.h" -#include "db_proto.h" -#include "s6a_proto.h" -#include "auc.h" -#include "access_restriction.h" - -int s6a_auth_info_cb(struct msg **msg, struct avp *paramavp, - struct session *sess, void *opaque, - enum disp_action *act) -{ - struct msg *ans, *qry; - struct avp *avp, *failed_avp = NULL; - - struct avp_hdr *hdr; - union avp_value value; - - /* Database queries */ - mysql_auth_info_req_t auth_info_req; - mysql_auth_info_resp_t auth_info_resp; - - /* Authentication vector */ - auc_vector_t vector; - - int ret = 0; - int result_code = ER_DIAMETER_SUCCESS; - int experimental = 0; - uint64_t imsi; - uint8_t *sqn = NULL, *auts = NULL; - - if (msg == NULL) { - return EINVAL; - } - - /* Create answer header */ - qry = *msg; - CHECK_FCT(fd_msg_new_answer_from_req(fd_g_config->cnf_dict, msg, 0)); - ans = *msg; - - /* Retrieving IMSI AVP: User-Name */ - CHECK_FCT(fd_msg_search_avp(qry, s6a_cnf.dataobj_s6a_imsi, &avp)); - - if (avp) { - CHECK_FCT(fd_msg_avp_hdr(avp, &hdr)); - - if (hdr->avp_value->os.len > IMSI_LENGTH_MAX) { - result_code = ER_DIAMETER_INVALID_AVP_VALUE; - goto out; - } - - sprintf(auth_info_req.imsi, "%*s", (int)hdr->avp_value->os.len, - hdr->avp_value->os.data); - sscanf(auth_info_req.imsi, "%"SCNu64, &imsi); - } else { - result_code = ER_DIAMETER_MISSING_AVP; - goto out; - } - - /* Retrieving Supported Features AVP. This is an optional AVP. */ - CHECK_FCT(fd_msg_search_avp(qry, s6a_cnf.dataobj_s6a_supported_features, &avp)); - - if (avp) { - CHECK_FCT(fd_msg_avp_hdr(avp, &hdr)); - } - - /* Retrieving the Requested-EUTRAN-Authentication-Info. - * If this AVP is not present, we have to check for - * Requested-GERAN-Authentication-Info AVP which will mean that the request - * comes from RAT other than E-UTRAN, case not handled by this HSS - * implementation. - */ - CHECK_FCT(fd_msg_search_avp(qry, s6a_cnf.dataobj_s6a_req_e_utran_auth_info, &avp)); - - if (avp) { - struct avp *child_avp; - - /* Walk through childs avp */ - CHECK_FCT(fd_msg_browse(avp, MSG_BRW_FIRST_CHILD, &child_avp, NULL)); - - while (child_avp) { - /* Retrieve the header of the child avp */ - CHECK_FCT(fd_msg_avp_hdr(child_avp, &hdr)); - - switch(hdr->avp_code) { - case AVP_CODE_NUMBER_OF_REQ_VECTORS: { - /* We allow only one vector request */ - if (hdr->avp_value->u32 != 1) { - result_code = ER_DIAMETER_INVALID_AVP_VALUE; - failed_avp = child_avp; - goto out; - } - } - break; - - case AVP_CODE_IMMEDIATE_RESP_PREF: - /* We always respond immediately to the request */ - break; - - case AVP_CODE_RE_SYNCHRONIZATION_INFO: - - /* The resynchronization-info AVP is present. - * AUTS = Conc(SQN MS ) || MAC-S - */ - if (avp) { - auts = hdr->avp_value->os.data; - } - - break; - - default: { - /* This AVP is not expected on s6a interface */ - result_code = ER_DIAMETER_AVP_UNSUPPORTED; - failed_avp = child_avp; - goto out; - } - } - - /* Go to next AVP in the grouped AVP */ - CHECK_FCT(fd_msg_browse(child_avp, MSG_BRW_NEXT, &child_avp, NULL)); - } - } else { - CHECK_FCT(fd_msg_search_avp(qry, s6a_cnf.dataobj_s6a_req_geran_auth_info, &avp)); - - if (avp) { - result_code = DIAMETER_ERROR_RAT_NOT_ALLOWED; - experimental = 1; - goto out; - } else { - result_code = ER_DIAMETER_INVALID_AVP_VALUE; - failed_avp = avp; - goto out; - } - } - - /* Retrieving the Visited-PLMN-Id AVP */ - CHECK_FCT(fd_msg_search_avp(qry, s6a_cnf.dataobj_s6a_visited_plmn_id, &avp)); - - if (avp) { - /* TODO: check PLMN and allow/reject connectivity depending on roaming */ - CHECK_FCT(fd_msg_avp_hdr(avp, &hdr)); - - if (hdr->avp_value->os.len == 3) { - if (apply_access_restriction(auth_info_req.imsi, hdr->avp_value->os.data) != 0) { - /* We found that user is roaming and has no right to do it -> - * reject the connection - */ - result_code = DIAMETER_ERROR_ROAMING_NOT_ALLOWED; - experimental = 1; - goto out; - } - } else { - result_code = ER_DIAMETER_INVALID_AVP_VALUE; - goto out; - } - } else { - /* Mandatory AVP, raise an error if not present */ - result_code = ER_DIAMETER_MISSING_AVP; - goto out; - } - - /* Fetch User data */ - if (hss_mysql_auth_info(&auth_info_req, &auth_info_resp) != 0) { - /* Database query failed... */ - result_code = DIAMETER_AUTHENTICATION_DATA_UNAVAILABLE; - experimental = 1; - goto out; - } - - if (auts != NULL) { - /* Try to derive SQN_MS from previous RAND */ - sqn = sqn_ms_derive(auth_info_resp.opc, auth_info_resp.key, auts, auth_info_resp.rand); - - if (sqn != NULL) { - /* We succeeded to verify SQN_MS... */ - - /* Pick a new RAND and store SQN_MS + RAND in the HSS */ - generate_random(vector.rand, RAND_LENGTH); - hss_mysql_push_rand_sqn(auth_info_req.imsi, auth_info_resp.rand, sqn); - - hss_mysql_increment_sqn(auth_info_req.imsi); - - free(sqn); - } - - /* Fetch new user data */ - if (hss_mysql_auth_info(&auth_info_req, &auth_info_resp) != 0) { - /* Database query failed... */ - result_code = DIAMETER_AUTHENTICATION_DATA_UNAVAILABLE; - experimental = 1; - goto out; - } - - sqn = auth_info_resp.sqn; - - memcpy(vector.rand, auth_info_resp.rand, RAND_LENGTH); - } else { - /* Pick a new RAND and store SQN_MS + RAND in the HSS */ - generate_random(vector.rand, RAND_LENGTH); - sqn = auth_info_resp.sqn; - hss_mysql_push_rand_sqn(auth_info_req.imsi, vector.rand, sqn); - } - - hss_mysql_increment_sqn(auth_info_req.imsi); - - /* Generate authentication vector */ - generate_vector(auth_info_resp.opc, imsi, auth_info_resp.key, - hdr->avp_value->os.data, sqn, &vector); - - /* We add the vector */ - { - struct avp *e_utran_vector, *child_avp; - CHECK_FCT(fd_msg_avp_new(s6a_cnf.dataobj_s6a_authentication_info, 0, &avp)); - - CHECK_FCT(fd_msg_avp_new(s6a_cnf.dataobj_s6a_e_utran_vector, 0, &e_utran_vector)); - - CHECK_FCT(fd_msg_avp_new(s6a_cnf.dataobj_s6a_rand, 0, &child_avp)); - value.os.data = vector.rand; - value.os.len = RAND_LENGTH_OCTETS; - CHECK_FCT(fd_msg_avp_setvalue(child_avp, &value)); - CHECK_FCT(fd_msg_avp_add(e_utran_vector, MSG_BRW_LAST_CHILD, child_avp)); - - CHECK_FCT(fd_msg_avp_new(s6a_cnf.dataobj_s6a_xres, 0, &child_avp)); - value.os.data = vector.xres; - value.os.len = XRES_LENGTH_OCTETS; - CHECK_FCT(fd_msg_avp_setvalue(child_avp, &value)); - CHECK_FCT(fd_msg_avp_add(e_utran_vector, MSG_BRW_LAST_CHILD, child_avp)); - - CHECK_FCT(fd_msg_avp_new(s6a_cnf.dataobj_s6a_autn, 0, &child_avp)); - value.os.data = vector.autn; - value.os.len = AUTN_LENGTH_OCTETS; - CHECK_FCT(fd_msg_avp_setvalue(child_avp, &value)); - CHECK_FCT(fd_msg_avp_add(e_utran_vector, MSG_BRW_LAST_CHILD, child_avp)); - - CHECK_FCT(fd_msg_avp_new(s6a_cnf.dataobj_s6a_kasme, 0, &child_avp)); - value.os.data = vector.kasme; - value.os.len = KASME_LENGTH_OCTETS; - CHECK_FCT(fd_msg_avp_setvalue(child_avp, &value)); - CHECK_FCT(fd_msg_avp_add(e_utran_vector, MSG_BRW_LAST_CHILD, child_avp)); - - CHECK_FCT(fd_msg_avp_add(avp, MSG_BRW_LAST_CHILD, e_utran_vector)); - - CHECK_FCT(fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp)); - } - -out: - /* Add the Auth-Session-State AVP */ - CHECK_FCT(fd_msg_search_avp(qry, s6a_cnf.dataobj_s6a_auth_session_state, &avp)); - CHECK_FCT(fd_msg_avp_hdr(avp, &hdr)); - - CHECK_FCT(fd_msg_avp_new(s6a_cnf.dataobj_s6a_auth_session_state, 0, &avp)); - CHECK_FCT(fd_msg_avp_setvalue(avp, hdr->avp_value)); - CHECK_FCT(fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp)); - - /* Append the result code to the answer */ - CHECK_FCT(s6a_add_result_code(ans, failed_avp, result_code, experimental)); - - CHECK_FCT(fd_msg_send(msg, NULL, NULL )); - return ret; -} diff --git a/openair-cn/OPENAIRHSS/s6a/s6a_common.c b/openair-cn/OPENAIRHSS/s6a/s6a_common.c deleted file mode 100644 index fa896dd8d4..0000000000 --- a/openair-cn/OPENAIRHSS/s6a/s6a_common.c +++ /dev/null @@ -1,66 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -#include "hss_config.h" -#include "db_proto.h" -#include "s6a_proto.h" - -int s6a_add_result_code(struct msg *ans, struct avp *failed_avp, int result_code, int experimental) -{ - struct avp *avp; - union avp_value value; - - if (DIAMETER_ERROR_IS_VENDOR(result_code) && experimental != 0) { - struct avp *experimental_result; - CHECK_FCT(fd_msg_avp_new(s6a_cnf.dataobj_s6a_experimental_result, - 0, &experimental_result)); - CHECK_FCT(fd_msg_avp_new(s6a_cnf.dataobj_s6a_vendor_id, - 0, &avp)); - value.u32 = VENDOR_3GPP; - CHECK_FCT(fd_msg_avp_setvalue(avp, &value)); - CHECK_FCT(fd_msg_avp_add(experimental_result, MSG_BRW_LAST_CHILD, avp)); - CHECK_FCT(fd_msg_avp_new(s6a_cnf.dataobj_s6a_experimental_result_code, - 0, &avp)); - value.u32 = result_code; - CHECK_FCT(fd_msg_avp_setvalue(avp, &value)); - CHECK_FCT(fd_msg_avp_add(experimental_result, MSG_BRW_LAST_CHILD, avp)); - CHECK_FCT(fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, experimental_result)); - - /* Add Origin_Host & Origin_Realm AVPs */ - CHECK_FCT(fd_msg_add_origin(ans, 0)); - } else { - /* This is a code defined in the base protocol: result-code AVP should - * be used. - */ - CHECK_FCT(fd_msg_rescode_set(ans, retcode_2_string(result_code), NULL, - failed_avp, 1)); - } - - return 0; -} diff --git a/openair-cn/OPENAIRHSS/s6a/s6a_error.c b/openair-cn/OPENAIRHSS/s6a/s6a_error.c deleted file mode 100644 index 92d2465695..0000000000 --- a/openair-cn/OPENAIRHSS/s6a/s6a_error.c +++ /dev/null @@ -1,84 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -#include "hss_config.h" -#include "db_proto.h" -#include "s6a_proto.h" - -char *experimental_retcode_2_string(int ret_code) -{ - switch(ret_code) { - /* Experimental-Result-Codes */ - case DIAMETER_ERROR_USER_UNKNOWN: - return "DIAMETER_ERROR_USER_UNKNOWN"; - - case DIAMETER_ERROR_ROAMING_NOT_ALLOWED: - return "DIAMETER_ERROR_ROAMING_NOT_ALLOWED"; - - case DIAMETER_ERROR_UNKNOWN_EPS_SUBSCRIPTION: - return "DIAMETER_ERROR_UNKNOWN_EPS_SUBSCRIPTION"; - - case DIAMETER_ERROR_RAT_NOT_ALLOWED: - return "DIAMETER_ERROR_RAT_NOT_ALLOWED"; - - case DIAMETER_ERROR_EQUIPMENT_UNKNOWN: - return "DIAMETER_ERROR_EQUIPMENT_UNKNOWN"; - - case DIAMETER_ERROR_UNKOWN_SERVING_NODE: - return "DIAMETER_ERROR_UNKOWN_SERVING_NODE"; - - case DIAMETER_AUTHENTICATION_DATA_UNAVAILABLE: - return "DIAMETER_AUTHENTICATION_DATA_UNAVAILABLE"; - - default: - break; - } - - return "DIAMETER_AVP_UNSUPPORTED"; -} - -char *retcode_2_string(int ret_code) -{ - switch(ret_code) { - case ER_DIAMETER_SUCCESS: - return "DIAMETER_SUCCESS"; - - case ER_DIAMETER_MISSING_AVP: - return "DIAMETER_MISSING_AVP"; - - case ER_DIAMETER_INVALID_AVP_VALUE: - return "DIAMETER_INVALID_AVP_VALUE"; - - default: - break; - } - - return "DIAMETER_AVP_UNSUPPORTED"; -} - diff --git a/openair-cn/OPENAIRHSS/s6a/s6a_fd.c b/openair-cn/OPENAIRHSS/s6a/s6a_fd.c deleted file mode 100644 index 8a8ea04812..0000000000 --- a/openair-cn/OPENAIRHSS/s6a/s6a_fd.c +++ /dev/null @@ -1,370 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <signal.h> - -#if HAVE_CONFIG_H -# include "config.h" -#endif - -#include <freeDiameter/freeDiameter-host.h> -#include <freeDiameter/libfdcore.h> - -#include "hss_config.h" -#include "db_proto.h" -#include "s6a_proto.h" - -/* session handler for s6a sessions state machine */ -static struct session_handler *s6a_reg = NULL; - -/* handler for s6a server callback */ -static struct disp_hdl *handle; -s6a_cnf_t s6a_cnf; - -#if FREEDIAMETER_VERSION < 120 -void s6a_cli_sess_cleanup(void * arg, char * sid, void * opaque); - -void s6a_cli_sess_cleanup(void * arg, char * sid, void * opaque) -{ - -} -#else -void s6a_cli_sess_cleanup(struct sess_state * state, os0_t sid, void * opaque); -void s6a_cli_sess_cleanup(struct sess_state * state, os0_t sid, void * opaque) -{ - -} - -#endif - - -static int s6a_init_objs(void) -{ - vendor_id_t vendor_3gpp = VENDOR_3GPP; - application_id_t app_s6a = APP_S6A; - - memset(&s6a_cnf, 0, sizeof(s6a_cnf)); - - /* Pre-loading vendor object */ - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_VENDOR, VENDOR_BY_ID, - (void*)&vendor_3gpp, &s6a_cnf.dataobj_s6a_vendor, ENOENT)); - /* Pre-loading application object */ - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_APPLICATION, - APPLICATION_BY_ID, (void*)&app_s6a, - &s6a_cnf.dataobj_s6a_app, ENOENT)); - - /* Pre-loading commands objects */ - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_COMMAND, - CMD_BY_NAME, "Authentication-Information-Request", - &s6a_cnf.dataobj_s6a_auth_cmd, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_COMMAND, - CMD_BY_NAME, "Update-Location-Request", - &s6a_cnf.dataobj_s6a_loc_up, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_COMMAND, - CMD_BY_NAME, "Purge-UE-Request", - &s6a_cnf.dataobj_s6a_purge_ue, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_COMMAND, - CMD_BY_NAME, "Cancel-Location-Request", - &s6a_cnf.dataobj_s6a_cancel_loc_req, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_COMMAND, - CMD_BY_NAME, "Cancel-Location-Answer", - &s6a_cnf.dataobj_s6a_cancel_loc_ans, ENOENT)); - - /* Pre-loading AVPs objects */ - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME, "Origin-Host", - &s6a_cnf.dataobj_s6a_origin_host, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME, "Origin-Realm", - &s6a_cnf.dataobj_s6a_origin_realm, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "User-Name", - &s6a_cnf.dataobj_s6a_imsi, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "IMEI", - &s6a_cnf.dataobj_s6a_imei, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "Software-Version", - &s6a_cnf.dataobj_s6a_software_version, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "Supported-Features", - &s6a_cnf.dataobj_s6a_supported_features, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "Requested-EUTRAN-Authentication-Info", - &s6a_cnf.dataobj_s6a_req_e_utran_auth_info, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "Number-Of-Requested-Vectors", - &s6a_cnf.dataobj_s6a_req_nb_of_req_vectors, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "Re-Synchronization-Info", - &s6a_cnf.dataobj_s6a_req_resync_info, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "Requested-UTRAN-GERAN-Authentication-Info", - &s6a_cnf.dataobj_s6a_req_geran_auth_info, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "Immediate-Response-Preferred", - &s6a_cnf.dataobj_s6a_immediate_response_pref, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "Visited-PLMN-Id", - &s6a_cnf.dataobj_s6a_visited_plmn_id, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME, "Result-Code", - &s6a_cnf.dataobj_s6a_result_code, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME, "Experimental-Result", - &s6a_cnf.dataobj_s6a_experimental_result, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME, "Vendor-Id", - &s6a_cnf.dataobj_s6a_vendor_id, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME, "Experimental-Result-Code", - &s6a_cnf.dataobj_s6a_experimental_result_code, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "Auth-Session-State", - &s6a_cnf.dataobj_s6a_auth_session_state, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "Authentication-Info", - &s6a_cnf.dataobj_s6a_authentication_info, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "E-UTRAN-Vector", - &s6a_cnf.dataobj_s6a_e_utran_vector, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "RAND", - &s6a_cnf.dataobj_s6a_rand, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "XRES", - &s6a_cnf.dataobj_s6a_xres, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "AUTN", - &s6a_cnf.dataobj_s6a_autn, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "KASME", - &s6a_cnf.dataobj_s6a_kasme, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "ULR-Flags", - &s6a_cnf.dataobj_s6a_ulr_flags, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "ULA-Flags", - &s6a_cnf.dataobj_s6a_ula_flags, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "PUR-Flags", - &s6a_cnf.dataobj_s6a_pur_flags, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "PUA-Flags", - &s6a_cnf.dataobj_s6a_pua_flags, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "RAT-Type", - &s6a_cnf.dataobj_s6a_rat_type, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "Terminal-Information", - &s6a_cnf.dataobj_s6a_terminal_info, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "UE-SRVCC-Capability", - &s6a_cnf.dataobj_s6a_ue_srvcc_cap, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "GMLC-Address", - &s6a_cnf.dataobj_s6a_gmlc_addr, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "Subscription-Data", - &s6a_cnf.dataobj_s6a_subscription_data, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "Subscriber-Status", - &s6a_cnf.dataobj_s6a_subscriber_status, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "MSISDN", - &s6a_cnf.dataobj_s6a_msisdn, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "AMBR", - &s6a_cnf.dataobj_s6a_ambr, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "Network-Access-Mode", - &s6a_cnf.dataobj_s6a_network_access_mode, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "Access-Restriction-Data", - &s6a_cnf.dataobj_s6a_access_restriction_data, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "APN-Configuration-Profile", - &s6a_cnf.dataobj_s6a_apn_configuration_profile, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "Subscribed-Periodic-RAU-TAU-Timer", - &s6a_cnf.dataobj_s6a_subscribed_rau_tau_timer, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "Context-Identifier", - &s6a_cnf.dataobj_s6a_context_identifier, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "All-APN-Configurations-Included-Indicator", - &s6a_cnf.dataobj_s6a_all_apn_conf_inc_ind, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "APN-Configuration", - &s6a_cnf.dataobj_s6a_apn_configuration, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "Max-Requested-Bandwidth-UL", - &s6a_cnf.dataobj_s6a_max_bandwidth_ul, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "Max-Requested-Bandwidth-DL", - &s6a_cnf.dataobj_s6a_max_bandwidth_dl, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "PDN-Type", - &s6a_cnf.dataobj_s6a_pdn_type, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "Service-Selection", - &s6a_cnf.dataobj_s6a_service_selection, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "EPS-Subscribed-QoS-Profile", - &s6a_cnf.dataobj_s6a_eps_subscribed_qos_profile, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "QoS-Class-Identifier", - &s6a_cnf.dataobj_s6a_qos_class_identifier, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "Allocation-Retention-Priority", - &s6a_cnf.dataobj_s6a_allocation_retention_priority, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "Priority-Level", - &s6a_cnf.dataobj_s6a_priority_level, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "Pre-emption-Capability", - &s6a_cnf.dataobj_s6a_pre_emption_capability, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "Pre-emption-Vulnerability", - &s6a_cnf.dataobj_s6a_pre_emption_vulnerability, ENOENT)); - CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "Served-Party-IP-Address", - &s6a_cnf.dataobj_s6a_served_party_ip_addr, ENOENT)); - - /* Advertise the support for the test application in the peer */ - CHECK_FCT(fd_disp_app_support(s6a_cnf.dataobj_s6a_app, - s6a_cnf.dataobj_s6a_vendor, 1, 0)); - - return 0; -} - -int s6a_init(hss_config_t *hss_config_p) -{ - int ret = 0; - struct disp_when when; - char why[100]; - - fprintf(stdout, "Initializing s6a layer\n"); - - ret = fd_core_initialize(); - - if (ret != 0) { - strcpy(why, "fd_core_initialize"); - goto err; - } - - /* Parse the external configuration file */ - ret = fd_core_parseconf(hss_config_p->freediameter_config); - - if (ret != 0) { - strcpy(why, "fd_core_parseconf"); - goto err; - } - - - ret = fd_core_start(); - - if (ret != 0) { - strcpy(why, "fd_core_start"); - goto err; - } - - - /* We wait till freediameter has completed loading extensions */ - fd_core_waitstartcomplete(); - - /* Register the peer acceptor/rejector */ - fd_peer_validate_register(s6a_peer_validate); - - /* Initialize useful objects */ - ret = s6a_init_objs(); - - if (ret != 0) { - strcpy(why, "s6a_init_objs"); - goto err; - } - - /* Create handler for sessions */ -#if FREEDIAMETER_VERSION < 120 - CHECK_FCT(fd_sess_handler_create(&s6a_reg, s6a_cli_sess_cleanup, NULL)); -#else - session_state_dump dumper; - CHECK_FCT(fd_sess_handler_create(&s6a_reg, s6a_cli_sess_cleanup, dumper, NULL)); -#endif - - /* Register the callback */ - memset(&when, 0, sizeof(when)); - when.command = s6a_cnf.dataobj_s6a_auth_cmd; - when.app = s6a_cnf.dataobj_s6a_app; - - /* Register the callbacks for S6A Application */ - CHECK_FCT(fd_disp_register(s6a_auth_info_cb, DISP_HOW_CC, &when, NULL, - &handle)); - - if (handle == NULL) { - strcpy(why, "cannot register authentication info req cb"); - goto err; - } - - when.command = s6a_cnf.dataobj_s6a_loc_up; - when.app = s6a_cnf.dataobj_s6a_app; - - /* Register the callbacks for S6A Application */ - CHECK_FCT(fd_disp_register(s6a_up_loc_cb, DISP_HOW_CC, &when, NULL, - &handle)); - - if (handle == NULL) { - strcpy(why, "cannot register update location req cb"); - goto err; - } - - when.command = s6a_cnf.dataobj_s6a_purge_ue; - when.app = s6a_cnf.dataobj_s6a_app; - - /* Register the callbacks for S6A Application */ - CHECK_FCT(fd_disp_register(s6a_purge_ue_cb, DISP_HOW_CC, &when, NULL, - &handle)); - - if (handle == NULL) { - strcpy(why, "cannot register purge ue req cb"); - goto err; - } - - fprintf(stdout, "Initializing s6a layer: DONE\n"); - - return 0; - -err: - fprintf(stdout, "Initializing s6a layer: FAILED (%s)\n", why); - return -1; -} diff --git a/openair-cn/OPENAIRHSS/s6a/s6a_in_addr.c b/openair-cn/OPENAIRHSS/s6a/s6a_in_addr.c deleted file mode 100644 index 8abefce778..0000000000 --- a/openair-cn/OPENAIRHSS/s6a/s6a_in_addr.c +++ /dev/null @@ -1,109 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -#include "hss_config.h" -#include "db_proto.h" -#include "s6a_proto.h" - -/* http://www.iana.org/assignments/address-family-numbers/address-family-numbers.xml*/ - -/* Perform a conversion between ipv4 in BCD to AVP served-party-ip-address */ -int s6a_add_ipv4_address(struct avp *avp, const char *ipv4_addr) -{ - struct avp *child_avp; - union avp_value value; - - uint8_t ipv4[6]; /* Converted IPv4 address with family */ - in_addr_t sin; - - if (ipv4_addr == NULL) { - return -1; - } - - /* This is an IPv4 family -> ipv4 buffer should start with 0x0001 */ - ipv4[0] = 0x00; - ipv4[1] = 0x01; - - sin = inet_addr(ipv4_addr); - - /* No need to add the address if it is an any address */ - if (sin != INADDR_ANY) { - memcpy(&ipv4[2], &sin, 4); - CHECK_FCT(fd_msg_avp_new(s6a_cnf.dataobj_s6a_served_party_ip_addr, 0, &child_avp)); - value.os.data = ipv4; - value.os.len = 6; - CHECK_FCT(fd_msg_avp_setvalue(child_avp, &value)); - CHECK_FCT(fd_msg_avp_add(avp, MSG_BRW_LAST_CHILD, child_avp)); - return 0; - } - - /* No IP address added to AVP */ - return -1; -} - -/* Perform a conversion between ipv6 in BCD to AVP served-party-ip-address */ -int s6a_add_ipv6_address(struct avp *avp, const char *ipv6_addr) -{ - struct avp *child_avp; - union avp_value value; - - uint8_t ipv6[18]; - struct in6_addr sin6; - - if (ipv6_addr == NULL) { - return -1; - } - - memset(&sin6, 0, sizeof(struct in6_addr)); - - /* This is an IPv6 family -> ipv6 buffer should start with 0x0002 */ - ipv6[0] = 0x00; - ipv6[1] = 0x02; - - if (inet_pton(AF_INET6, ipv6_addr, &sin6) == -1) { - fprintf(stderr, "INET6 address conversion has failed\n"); - return -1; - } - - /* If the IPV6 address is 0:0:0:0:0:0:0:0 then we don't add it to the - * served-party ip address and consider the ip address can be dynamically - * allocated. - */ - if (!IN6_IS_ADDR_UNSPECIFIED(sin6.s6_addr32)) { - memcpy(&ipv6[2], &sin6.s6_addr, 16); - CHECK_FCT(fd_msg_avp_new(s6a_cnf.dataobj_s6a_served_party_ip_addr, 0, &child_avp)); - value.os.data = ipv6; - value.os.len = 18; - CHECK_FCT(fd_msg_avp_setvalue(child_avp, &value)); - CHECK_FCT(fd_msg_avp_add(avp, MSG_BRW_LAST_CHILD, child_avp)); - return 0; - } - - return -1; -} diff --git a/openair-cn/OPENAIRHSS/s6a/s6a_peers.c b/openair-cn/OPENAIRHSS/s6a/s6a_peers.c deleted file mode 100644 index 0c3bcde915..0000000000 --- a/openair-cn/OPENAIRHSS/s6a/s6a_peers.c +++ /dev/null @@ -1,75 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -/*! \file s6a_peers.c - * \brief Authenticate a new peer connecting to the HSS by checking the database - * \author Sebastien ROUX <sebastien.roux@eurecom.fr> - * \date 2013 - * \version 0.1 - */ - -#include <stdio.h> -#include <string.h> - -#include "hss_config.h" -#include "db_proto.h" -#include "s6a_proto.h" - -int s6a_peer_validate(struct peer_info *info, int *auth, int (**cb2)(struct peer_info *)) -{ - mysql_mme_identity_t mme_identity; - - if (info == NULL) { - return EINVAL; - } - - memset(&mme_identity, 0, sizeof(mysql_mme_identity_t)); - - /* We received a new connection. Check the database for allowed equipments - * on EPC - */ - - memcpy(mme_identity.mme_host, info->pi_diamid, info->pi_diamidlen); - - if (hss_mysql_check_epc_equipment(&mme_identity) != 0) { - /* The MME has not been found in list of known peers -> reject it */ - *auth = -1; - fprintf(stdout, "Rejecting %s: either db has no knowledge of this peer " - "or sql query failed\n", info->pi_diamid); - } else { - *auth = 1; - - /* For now we don't use security */ - info->config.pic_flags.sec = PI_SEC_NONE; - info->config.pic_flags.persist = PI_PRST_NONE; - fprintf(stdout, "Accepting %s peer\n", info->pi_diamid); - } - - return 0; -} diff --git a/openair-cn/OPENAIRHSS/s6a/s6a_proto.h b/openair-cn/OPENAIRHSS/s6a/s6a_proto.h deleted file mode 100644 index 2ea9221401..0000000000 --- a/openair-cn/OPENAIRHSS/s6a/s6a_proto.h +++ /dev/null @@ -1,238 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -#include <freeDiameter/freeDiameter-host.h> -#include <freeDiameter/libfdcore.h> - -#include "hss_config.h" - -#ifndef S6A_PROTO_H_ -#define S6A_PROTO_H_ - -#define VENDOR_3GPP (10415) -#define APP_S6A (16777251) - -/* Errors that fall within the Permanent Failures category shall be used to - * inform the peer that the request has failed, and should not be attempted - * again. The Result-Code AVP values defined in Diameter Base Protocol RFC 3588 - * shall be applied. When one of the result codes defined here is included in a - * response, it shall be inside an Experimental-Result AVP and the Result-Code - * AVP shall be absent. - */ -#define DIAMETER_ERROR_USER_UNKNOWN (5001) -#define DIAMETER_ERROR_ROAMING_NOT_ALLOWED (5004) -#define DIAMETER_ERROR_UNKNOWN_EPS_SUBSCRIPTION (5420) -#define DIAMETER_ERROR_RAT_NOT_ALLOWED (5421) -#define DIAMETER_ERROR_EQUIPMENT_UNKNOWN (5422) -#define DIAMETER_ERROR_UNKOWN_SERVING_NODE (5423) - -/* Result codes that fall within the transient failures category shall be used - * to inform a peer that the request could not be satisfied at the time it was - * received, but may be able to satisfy the request in the future. The - * Result-Code AVP values defined in Diameter Base Protocol RFC 3588 shall be - * applied. When one of the result codes defined here is included in a response, - * it shall be inside an Experimental-Result AVP and the Result-Code AVP shall - * be absent. - */ -#define DIAMETER_AUTHENTICATION_DATA_UNAVAILABLE (4181) - -#define DIAMETER_ERROR_IS_VENDOR(x) \ - ((x == DIAMETER_ERROR_USER_UNKNOWN) || \ - (x == DIAMETER_ERROR_ROAMING_NOT_ALLOWED) || \ - (x == DIAMETER_ERROR_UNKNOWN_EPS_SUBSCRIPTION) || \ - (x == DIAMETER_ERROR_RAT_NOT_ALLOWED) || \ - (x == DIAMETER_ERROR_EQUIPMENT_UNKNOWN) || \ - (x == DIAMETER_AUTHENTICATION_DATA_UNAVAILABLE) || \ - (x == DIAMETER_ERROR_UNKOWN_SERVING_NODE)) - -#define AVP_CODE_IMEI (1402) -#define AVP_CODE_SOFTWARE_VERSION (1403) -#define AVP_CODE_NUMBER_OF_REQ_VECTORS (1410) -#define AVP_CODE_RE_SYNCHRONIZATION_INFO (1411) -#define AVP_CODE_IMMEDIATE_RESP_PREF (1412) -#define AVP_CODE_3GPP2_MEID (1471) -#define AVP_CODE_FEATURE_LIST (629) -#define AVP_CODE_VENDOR_ID (266) - -typedef struct { - struct dict_object *dataobj_s6a_vendor; /* s6a vendor object */ - struct dict_object *dataobj_s6a_app; /* s6a application object */ - /* Commands */ - struct dict_object *dataobj_s6a_auth_cmd; /* s6a authentication command */ - struct dict_object *dataobj_s6a_loc_up; /* s6a update location */ - struct dict_object *dataobj_s6a_purge_ue; /* s6a purge ue req */ - struct dict_object *dataobj_s6a_cancel_loc_req; /* s6a Cancel Location req */ - struct dict_object *dataobj_s6a_cancel_loc_ans; /* s6a Cancel Location ans */ - /* AVPs */ - struct dict_object *dataobj_s6a_origin_host; - struct dict_object *dataobj_s6a_origin_realm; - struct dict_object *dataobj_s6a_imsi; /* s6a imsi avp */ - struct dict_object *dataobj_s6a_imei; - struct dict_object *dataobj_s6a_software_version; - struct dict_object *dataobj_s6a_supported_features; - struct dict_object *dataobj_s6a_req_e_utran_auth_info; - struct dict_object *dataobj_s6a_req_resync_info; - struct dict_object *dataobj_s6a_req_nb_of_req_vectors; - struct dict_object *dataobj_s6a_req_geran_auth_info; - struct dict_object *dataobj_s6a_immediate_response_pref; - struct dict_object *dataobj_s6a_visited_plmn_id; - struct dict_object *dataobj_s6a_result_code; - struct dict_object *dataobj_s6a_experimental_result; - struct dict_object *dataobj_s6a_vendor_id; - struct dict_object *dataobj_s6a_experimental_result_code; - struct dict_object *dataobj_s6a_auth_session_state; - struct dict_object *dataobj_s6a_authentication_info; - struct dict_object *dataobj_s6a_e_utran_vector; - struct dict_object *dataobj_s6a_rand; - struct dict_object *dataobj_s6a_xres; - struct dict_object *dataobj_s6a_autn; - struct dict_object *dataobj_s6a_kasme; - struct dict_object *dataobj_s6a_ulr_flags; - struct dict_object *dataobj_s6a_ula_flags; - struct dict_object *dataobj_s6a_pur_flags; - struct dict_object *dataobj_s6a_pua_flags; - struct dict_object *dataobj_s6a_rat_type; - struct dict_object *dataobj_s6a_terminal_info; - struct dict_object *dataobj_s6a_ue_srvcc_cap; - struct dict_object *dataobj_s6a_gmlc_addr; - struct dict_object *dataobj_s6a_subscription_data; - struct dict_object *dataobj_s6a_subscriber_status; - struct dict_object *dataobj_s6a_msisdn; - struct dict_object *dataobj_s6a_ambr; - struct dict_object *dataobj_s6a_network_access_mode; - struct dict_object *dataobj_s6a_access_restriction_data; - struct dict_object *dataobj_s6a_apn_configuration_profile; - struct dict_object *dataobj_s6a_subscribed_rau_tau_timer; - struct dict_object *dataobj_s6a_context_identifier; - /* All-APN-Configurations-Included-Indicator */ - struct dict_object *dataobj_s6a_all_apn_conf_inc_ind; - struct dict_object *dataobj_s6a_apn_configuration; - /* Max-Requested-Bandwidth-UL */ - struct dict_object *dataobj_s6a_max_bandwidth_ul; - /* Max-Requested-Bandwidth-DL */ - struct dict_object *dataobj_s6a_max_bandwidth_dl; - struct dict_object *dataobj_s6a_pdn_type; - struct dict_object *dataobj_s6a_service_selection; - struct dict_object *dataobj_s6a_eps_subscribed_qos_profile; - struct dict_object *dataobj_s6a_qos_class_identifier; - struct dict_object *dataobj_s6a_allocation_retention_priority; - struct dict_object *dataobj_s6a_priority_level; - struct dict_object *dataobj_s6a_pre_emption_capability; - struct dict_object *dataobj_s6a_pre_emption_vulnerability; - struct dict_object *dataobj_s6a_served_party_ip_addr; -} s6a_cnf_t; - -/* External definition of the S6A decriptor */ -extern s6a_cnf_t s6a_cnf; - -/* Length of IMSI should not exceed 15 digits */ -#define IMSI_LENGTH (15) -#define IMEI_LENGTH (15) -#define SV_LENGTH (2) - -/* ULR-Flags meaning: */ -#define ULR_SINGLE_REGISTRATION_IND (1U) -#define ULR_S6A_S6D_INDICATOR (1U << 1) -#define ULR_SKIP_SUBSCRIBER_DATA (1U << 2) -#define ULR_GPRS_SUBSCRIPTION_DATA_IND (1U << 3) -#define ULR_NODE_TYPE_IND (1U << 4) -#define ULR_INITIAL_ATTACH_IND (1U << 5) -#define ULR_PS_LCS_SUPPORTED_BY_UE (1U << 6) -#define ULR_PAD_VALID(x) ((x & ~0x7f) == 0) - -/* ULA-Flags */ -#define ULA_SEPARATION_IND (1U) - -/* PUR-Flags */ -#define PUR_UE_PURGED_IN_MME (1U) -#define PUR_UE_PURGED_IN_SGSN (1U << 1) -#define PUR_PAD_VALID(x) ((x & ~0x3) == 0) - -/* PUA-FLAGS */ -#define PUA_FREEZE_M_TMSI (1U) -#define PUA_FREEZE_P_TMSI (1U << 1) - -/* Access-restriction-data bits */ -#define UTRAN_NOT_ALLOWED (1U) -#define GERAN_NOT_ALLOWED (1U << 1) -#define GAN_NOT_ALLOWED (1U << 2) -#define I_HSDPA_EVO_NOT_ALLOWED (1U << 3) -#define E_UTRAN_NOT_ALLOWED (1U << 4) -#define HO_TO_NON_3GPP_NOT_ALLOWED (1U << 5) -#define ARD_CHECK_PAD(x) ((x & ~0x3f) == 0) - -#define FLAG_IS_SET(x, flag) ((x) & (flag)) - -#define FLAGS_SET(x, flags) ((x) |= (flags)) - -#define FLAGS_CLEAR(x, flags) ((x) = (x) & ~(flags)) - -/** \brief Initialize the s6a layer using freeDiameter - * \param hss_config_p pointer the global HSS configuration - * @returns 0 if the init was successfull, != 0 in case of failure - */ -int s6a_init(hss_config_t *hss_config_p); - -/** \brief Callback function for new equipements connections to the HSS. See - * libfdproto from freeDiameter for more informations on the peer validate - * callback - * \param info Peer freeDiameter info - * \param auth Result of the peer authentication, possible values: - * * 1 = accept - * * 0 = unknown - * * -1 = reject - * \param cb2 possible second callback to validate the TLS authentication - * @return 0 if the init was successfull, != 0 in case of failure - */ -int s6a_peer_validate(struct peer_info *info, int *auth, int (**cb2)(struct peer_info *)); - -/* Callback called when corresponding request/answer is received */ -int s6a_auth_info_cb(struct msg **msg, struct avp *paramavp, - struct session *sess, void *opaque, - enum disp_action *act); - -int s6a_up_loc_cb(struct msg **msg, struct avp *paramavp, - struct session *sess, void *opaque, - enum disp_action *act); - -int s6a_purge_ue_cb(struct msg **msg, struct avp *paramavp, - struct session *sess, void *opaque, - enum disp_action *act); - -int s6a_add_subscription_data_avp(struct msg *message, mysql_ul_ans_t *msql_ans); - -int s6a_add_result_code(struct msg *ans, struct avp *failed_avp, - int result_code, int experimental); - -int s6a_add_ipv4_address(struct avp *avp, const char *ipv4_addr); -int s6a_add_ipv6_address(struct avp *avp, const char *ipv6_addr); -char *experimental_retcode_2_string(int ret_code); -char *retcode_2_string(int ret_code); - -#endif /* S6A_PROTO_H_ */ diff --git a/openair-cn/OPENAIRHSS/s6a/s6a_purge_ue.c b/openair-cn/OPENAIRHSS/s6a/s6a_purge_ue.c deleted file mode 100644 index c0bc0ee031..0000000000 --- a/openair-cn/OPENAIRHSS/s6a/s6a_purge_ue.c +++ /dev/null @@ -1,151 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -/*! \file s6a_purge_ue.c - * \brief Handle a purge UE request and generate the corresponding answer - * \author Sebastien ROUX <sebastien.roux@eurecom.fr> - * \date 2013 - * \version 0.1 - */ - -#include <freeDiameter/freeDiameter-host.h> -#include <freeDiameter/libfdproto.h> - -#include "hss_config.h" -#include "db_proto.h" -#include "s6a_proto.h" - -int s6a_purge_ue_cb(struct msg **msg, struct avp *paramavp, - struct session *sess, void *opaque, - enum disp_action *act) -{ - struct msg *ans, *qry; - struct avp *avp, *failed_avp = NULL; - struct avp_hdr *hdr; - - int ret = 0; - int result_code = ER_DIAMETER_SUCCESS; - int experimental = 0; - uint32_t pur_flags = 0; - - /* MySQL requests and asnwer data */ - mysql_pu_req_t pu_req; - mysql_pu_ans_t pu_ans; - - if (msg == NULL) { - return EINVAL; - } - - memset(&pu_req, 0, sizeof(mysql_pu_req_t)); - - qry = *msg; - /* Create the answer */ - CHECK_FCT(fd_msg_new_answer_from_req(fd_g_config->cnf_dict, msg, 0)); - ans = *msg; - - /* Retrieving IMSI AVP */ - CHECK_FCT(fd_msg_search_avp(qry, s6a_cnf.dataobj_s6a_imsi, &avp)); - - if (avp) { - CHECK_FCT(fd_msg_avp_hdr(avp, &hdr)); - - if (hdr->avp_value->os.len > IMSI_LENGTH) { - result_code = ER_DIAMETER_INVALID_AVP_VALUE; - goto out; - } - - sprintf(pu_req.imsi, "%*s", (int)hdr->avp_value->os.len, hdr->avp_value->os.data); - } else { - result_code = ER_DIAMETER_MISSING_AVP; - goto out; - } - - /* Retrieving the PUR-Flags if present */ - CHECK_FCT(fd_msg_search_avp(qry, s6a_cnf.dataobj_s6a_pur_flags, &avp)); - - if (avp) { - CHECK_FCT(fd_msg_avp_hdr(avp, &hdr)); - pur_flags = hdr->avp_value->u32; - - if (FLAG_IS_SET(pur_flags, PUR_UE_PURGED_IN_SGSN)) { - /* This bit shall not be set by a standalone MME. */ - result_code = ER_DIAMETER_INVALID_AVP_VALUE; - goto out; - } - } - - if ((ret = hss_mysql_purge_ue(&pu_req, &pu_ans)) != 0) { - /* We failed to find the IMSI in the database. Replying to the request - * with the user unknown cause. - */ - experimental = 1; - result_code = DIAMETER_ERROR_USER_UNKNOWN; - goto out; - } - - /* Retrieving Origin host AVP */ - CHECK_FCT(fd_msg_search_avp(qry, s6a_cnf.dataobj_s6a_origin_host, &avp)); - - if (!avp) { - result_code = ER_DIAMETER_MISSING_AVP; - goto out; - } - - /* Retrieve the header from origin host and realm avps */ - CHECK_FCT(fd_msg_avp_hdr(avp, &hdr)); - - if (strncmp(pu_ans.mme_host, (char *)hdr->avp_value->os.data, hdr->avp_value->os.len) != 0) { - result_code = DIAMETER_ERROR_UNKOWN_SERVING_NODE; - experimental = 1; - goto out; - } - - /* Retrieving Origin realm AVP */ - CHECK_FCT(fd_msg_search_avp(qry, s6a_cnf.dataobj_s6a_origin_realm, &avp)); - - if (!avp) { - result_code = ER_DIAMETER_MISSING_AVP; - goto out; - } - - CHECK_FCT(fd_msg_avp_hdr(avp, &hdr)); - - if (strncmp(pu_ans.mme_realm, (char *)hdr->avp_value->os.data, hdr->avp_value->os.len) != 0) { - result_code = DIAMETER_ERROR_UNKOWN_SERVING_NODE; - experimental = 1; - goto out; - } - -out: - /* Append the result code to the answer */ - CHECK_FCT(s6a_add_result_code(ans, failed_avp, result_code, experimental)); - - CHECK_FCT(fd_msg_send(msg, NULL, NULL )); - return 0; -} diff --git a/openair-cn/OPENAIRHSS/s6a/s6a_subscription_data.c b/openair-cn/OPENAIRHSS/s6a/s6a_subscription_data.c deleted file mode 100644 index 5bec27ac6b..0000000000 --- a/openair-cn/OPENAIRHSS/s6a/s6a_subscription_data.c +++ /dev/null @@ -1,274 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -#include "hss_config.h" -#include "db_proto.h" -#include "s6a_proto.h" - -/*! \file s6a_subscription_data.c - * \brief Add the subscription data to a message. Data are retrieved from database - * \author Sebastien ROUX <sebastien.roux@eurecom.fr> - * \date 2013 - * \version 0.1 - */ - -int s6a_add_subscription_data_avp(struct msg *message, mysql_ul_ans_t *mysql_ans) -{ - int ret = -1, i = 0; - mysql_pdn_t *pdns = NULL; - uint8_t nb_pdns = 0; - struct avp *avp = NULL, *child_avp = NULL; - union avp_value value; - - if (mysql_ans == NULL) { - return -1; - } - - ret = hss_mysql_query_pdns(mysql_ans->imsi, &pdns, &nb_pdns); - - if (ret != 0) { - /* mysql query failed: - * - maybe no more memory - * - maybe user is not known (should have failed before) - * - maybe imsi has no EPS subscribed - */ - goto out; - } - - if (nb_pdns == 0) { - /* No PDN for this user -> DIAMETER_ERROR_UNKNOWN_EPS_SUBSCRIPTION */ - return -1; - } - - /* Create the Subscription-Data AVP */ - CHECK_FCT(fd_msg_avp_new(s6a_cnf.dataobj_s6a_subscription_data, 0, &avp)); - - { - uint8_t msisdn_len = strlen(mysql_ans->msisdn); - - /* The MSISDN is known in the HSS, add it to the subscription data */ - if (msisdn_len > 0) { - CHECK_FCT(fd_msg_avp_new(s6a_cnf.dataobj_s6a_msisdn, 0, &child_avp)); - value.os.data = (uint8_t *)mysql_ans->msisdn; - value.os.len = msisdn_len; - CHECK_FCT(fd_msg_avp_setvalue(child_avp, &value)); - CHECK_FCT(fd_msg_avp_add(avp, MSG_BRW_LAST_CHILD, child_avp)); - } - } - - /* We have to include the acess-restriction-data if the value stored in DB - * indicates that at least one restriction is applied to the USER. - */ - if (mysql_ans->access_restriction != 0) { - CHECK_FCT(fd_msg_avp_new(s6a_cnf.dataobj_s6a_access_restriction_data, 0, &child_avp)); - value.u32 = (uint32_t)mysql_ans->access_restriction; - CHECK_FCT(fd_msg_avp_setvalue(child_avp, &value)); - CHECK_FCT(fd_msg_avp_add(avp, MSG_BRW_LAST_CHILD, child_avp)); - } - - /* Add the Subscriber-Status to the list of AVP. - * It shall indicate if the service is barred or granted. - * TODO: normally this parameter comes from DB... - */ - CHECK_FCT(fd_msg_avp_new(s6a_cnf.dataobj_s6a_subscriber_status, 0, &child_avp)); - /* SERVICE_GRANTED */ - value.u32 = 0; - CHECK_FCT(fd_msg_avp_setvalue(child_avp, &value)); - CHECK_FCT(fd_msg_avp_add(avp, MSG_BRW_LAST_CHILD, child_avp)); - - /* Add the Network-Access-Mode to the list of AVP. - * LTE Standalone HSS/MME: ONLY_PACKET. - */ - CHECK_FCT(fd_msg_avp_new(s6a_cnf.dataobj_s6a_network_access_mode, 0, &child_avp)); - /* SERVICE_GRANTED */ - value.u32 = 2; - CHECK_FCT(fd_msg_avp_setvalue(child_avp, &value)); - CHECK_FCT(fd_msg_avp_add(avp, MSG_BRW_LAST_CHILD, child_avp)); - - /* Add the AMBR to list of AVPs */ - { - struct avp *bandwidth; - CHECK_FCT(fd_msg_avp_new(s6a_cnf.dataobj_s6a_ambr, 0, &child_avp)); - - /* Uplink bandwidth */ - CHECK_FCT(fd_msg_avp_new(s6a_cnf.dataobj_s6a_max_bandwidth_ul, 0, &bandwidth)); - value.u32 = mysql_ans->aggr_ul; - CHECK_FCT(fd_msg_avp_setvalue(bandwidth, &value)); - CHECK_FCT(fd_msg_avp_add(child_avp, MSG_BRW_LAST_CHILD, bandwidth)); - - /* Downlink bandwidth */ - CHECK_FCT(fd_msg_avp_new(s6a_cnf.dataobj_s6a_max_bandwidth_dl, 0, &bandwidth)); - value.u32 = mysql_ans->aggr_dl; - CHECK_FCT(fd_msg_avp_setvalue(bandwidth, &value)); - CHECK_FCT(fd_msg_avp_add(child_avp, MSG_BRW_LAST_CHILD, bandwidth)); - - CHECK_FCT(fd_msg_avp_add(avp, MSG_BRW_LAST_CHILD, child_avp)); - } - - /* Add the APN-Configuration-Profile only if at least one APN is subscribed */ - if (nb_pdns > 0) { - struct avp *apn_profile; - CHECK_FCT(fd_msg_avp_new(s6a_cnf.dataobj_s6a_apn_configuration_profile, - 0, &apn_profile)); - - /* Context-Identifier */ - CHECK_FCT(fd_msg_avp_new(s6a_cnf.dataobj_s6a_context_identifier, 0, &child_avp)); - value.u32 = 0; - /* TODO: this is the reference to the default APN... */ - CHECK_FCT(fd_msg_avp_setvalue(child_avp, &value)); - CHECK_FCT(fd_msg_avp_add(apn_profile, MSG_BRW_LAST_CHILD, child_avp)); - - /* All-APN-Configurations-Included-Indicator */ - CHECK_FCT(fd_msg_avp_new(s6a_cnf.dataobj_s6a_all_apn_conf_inc_ind, 0, &child_avp)); - value.u32 = 0; - CHECK_FCT(fd_msg_avp_setvalue(child_avp, &value)); - CHECK_FCT(fd_msg_avp_add(apn_profile, MSG_BRW_LAST_CHILD, child_avp)); - - for (i = 0; i < nb_pdns; i++) { - struct avp *apn_configuration; - mysql_pdn_t *pdn_elm; - - pdn_elm = &pdns[i]; - - /* APN-Configuration */ - CHECK_FCT(fd_msg_avp_new(s6a_cnf.dataobj_s6a_apn_configuration, 0, &apn_configuration)); - - /* Context-Identifier */ - CHECK_FCT(fd_msg_avp_new(s6a_cnf.dataobj_s6a_context_identifier, 0, &child_avp)); - value.u32 = i; - CHECK_FCT(fd_msg_avp_setvalue(child_avp, &value)); - CHECK_FCT(fd_msg_avp_add(apn_configuration, MSG_BRW_LAST_CHILD, child_avp)); - - /* PDN-Type */ - CHECK_FCT(fd_msg_avp_new(s6a_cnf.dataobj_s6a_pdn_type, 0, &child_avp)); - value.u32 = pdn_elm->pdn_type; - CHECK_FCT(fd_msg_avp_setvalue(child_avp, &value)); - CHECK_FCT(fd_msg_avp_add(apn_configuration, MSG_BRW_LAST_CHILD, child_avp)); - - if ((pdn_elm->pdn_type == IPV4) || - (pdn_elm->pdn_type == IPV4_OR_IPV6) || - (pdn_elm->pdn_type == IPV4V6)) { - s6a_add_ipv4_address(apn_configuration, pdn_elm->pdn_address.ipv4_address); - } - - if ((pdn_elm->pdn_type == IPV6) || - (pdn_elm->pdn_type == IPV4_OR_IPV6) || - (pdn_elm->pdn_type == IPV4V6)) { - s6a_add_ipv6_address(apn_configuration, pdn_elm->pdn_address.ipv6_address); - } - - /* Service-Selection */ - CHECK_FCT(fd_msg_avp_new(s6a_cnf.dataobj_s6a_service_selection, 0, &child_avp)); - value.os.data = (uint8_t*)pdn_elm->apn; - value.os.len = strlen(pdn_elm->apn); - CHECK_FCT(fd_msg_avp_setvalue(child_avp, &value)); - CHECK_FCT(fd_msg_avp_add(apn_configuration, MSG_BRW_LAST_CHILD, child_avp)); - - /* Add the eps subscribed qos profile */ - { - struct avp *qos_profile, *allocation_priority; - CHECK_FCT(fd_msg_avp_new(s6a_cnf.dataobj_s6a_eps_subscribed_qos_profile, 0, &qos_profile)); - - CHECK_FCT(fd_msg_avp_new(s6a_cnf.dataobj_s6a_qos_class_identifier, 0, &child_avp)); - /* For a QCI_1 */ - value.u32 = (uint32_t)pdn_elm->qci; - CHECK_FCT(fd_msg_avp_setvalue(child_avp, &value)); - CHECK_FCT(fd_msg_avp_add(qos_profile, MSG_BRW_LAST_CHILD, child_avp)); - - /* Allocation retention priority */ - { - CHECK_FCT(fd_msg_avp_new(s6a_cnf.dataobj_s6a_allocation_retention_priority, 0, &allocation_priority)); - - /* Priority level */ - CHECK_FCT(fd_msg_avp_new(s6a_cnf.dataobj_s6a_priority_level, 0, &child_avp)); - value.u32 = (uint32_t)pdn_elm->priority_level; - CHECK_FCT(fd_msg_avp_setvalue(child_avp, &value)); - CHECK_FCT(fd_msg_avp_add(allocation_priority, MSG_BRW_LAST_CHILD, child_avp)); - - /* Pre-emption-capability */ - CHECK_FCT(fd_msg_avp_new(s6a_cnf.dataobj_s6a_pre_emption_capability, 0, &child_avp)); - value.u32 = (uint32_t)pdn_elm->pre_emp_cap; - CHECK_FCT(fd_msg_avp_setvalue(child_avp, &value)); - CHECK_FCT(fd_msg_avp_add(allocation_priority, MSG_BRW_LAST_CHILD, child_avp)); - - /* Pre-emption-vulnerability */ - CHECK_FCT(fd_msg_avp_new(s6a_cnf.dataobj_s6a_pre_emption_vulnerability, 0, &child_avp)); - value.u32 = (uint32_t)pdn_elm->pre_emp_vul; - CHECK_FCT(fd_msg_avp_setvalue(child_avp, &value)); - CHECK_FCT(fd_msg_avp_add(allocation_priority, MSG_BRW_LAST_CHILD, child_avp)); - - CHECK_FCT(fd_msg_avp_add(qos_profile, MSG_BRW_LAST_CHILD, allocation_priority)); - } - CHECK_FCT(fd_msg_avp_add(apn_configuration, MSG_BRW_LAST_CHILD, qos_profile)); - } - - /* Add the AMBR to list of AVPs */ - { - struct avp *bandwidth; - CHECK_FCT(fd_msg_avp_new(s6a_cnf.dataobj_s6a_ambr, 0, &bandwidth)); - - /* Uplink bandwidth */ - CHECK_FCT(fd_msg_avp_new(s6a_cnf.dataobj_s6a_max_bandwidth_ul, 0, &child_avp)); - value.u32 = (uint32_t)pdn_elm->aggr_ul; - CHECK_FCT(fd_msg_avp_setvalue(child_avp, &value)); - CHECK_FCT(fd_msg_avp_add(bandwidth, MSG_BRW_LAST_CHILD, child_avp)); - - /* Downlink bandwidth */ - CHECK_FCT(fd_msg_avp_new(s6a_cnf.dataobj_s6a_max_bandwidth_dl, 0, &child_avp)); - value.u32 = (uint32_t)pdn_elm->aggr_dl; - CHECK_FCT(fd_msg_avp_setvalue(child_avp, &value)); - CHECK_FCT(fd_msg_avp_add(bandwidth, MSG_BRW_LAST_CHILD, child_avp)); - - CHECK_FCT(fd_msg_avp_add(apn_configuration, MSG_BRW_LAST_CHILD, bandwidth)); - } - - CHECK_FCT(fd_msg_avp_add(apn_profile, MSG_BRW_LAST_CHILD, apn_configuration)); - } - - CHECK_FCT(fd_msg_avp_add(avp, MSG_BRW_LAST_CHILD, apn_profile)); - } - - /* Subscribed-Periodic-RAU-TAU-Timer */ - CHECK_FCT(fd_msg_avp_new(s6a_cnf.dataobj_s6a_subscribed_rau_tau_timer, 0, &child_avp)); - /* Request an RAU/TAU update every x seconds */ - value.u32 = (uint32_t)mysql_ans->rau_tau; - CHECK_FCT(fd_msg_avp_setvalue(child_avp, &value)); - CHECK_FCT(fd_msg_avp_add(avp, MSG_BRW_LAST_CHILD, child_avp)); - - /* Add the AVP to the message */ - CHECK_FCT(fd_msg_avp_add(message, MSG_BRW_LAST_CHILD, avp)); - -out: - - if (pdns) { - free(pdns); - } - - return ret; -} diff --git a/openair-cn/OPENAIRHSS/s6a/s6a_supported_features.c b/openair-cn/OPENAIRHSS/s6a/s6a_supported_features.c deleted file mode 100644 index a2d0dd7791..0000000000 --- a/openair-cn/OPENAIRHSS/s6a/s6a_supported_features.c +++ /dev/null @@ -1,40 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -/*! \file s6a_supported_features.c - * \brief - * \author Sebastien ROUX <sebastien.roux@eurecom.fr> - * \date 2013 - * \version 0.1 - */ - -#include "hss_config.h" -#include "db_proto.h" -#include "s6a_proto.h" - diff --git a/openair-cn/OPENAIRHSS/s6a/s6a_supported_features.h b/openair-cn/OPENAIRHSS/s6a/s6a_supported_features.h deleted file mode 100644 index 5fc278a732..0000000000 --- a/openair-cn/OPENAIRHSS/s6a/s6a_supported_features.h +++ /dev/null @@ -1,141 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -#include "hss_config.h" - -#ifndef S6A_SUPPORTED_FEATURES_H_ -#define S6A_SUPPORTED_FEATURES_H_ - -/* Operator Determined Barring of all Packet Oriented Services. */ -#define ODB_ALL_APN(x) (x & 0x1) - -/* Operator Determined Barring of Packet Oriented Services from access points - * that are within the HPLMN whilst the subscriber is roaming in a VPLMN. - */ -#define ODB_HPLMN_APN(x) ((x & 0x2) >> 1) - -/* Operator Determined Barring of Packet Oriented Services from access points - * that are within the roamed to VPLMN - */ -#define ODB_VPLMN_APN(x) ((x & 0x4) >> 2) - -/* Operator Determined Barring of all outgoing calls */ -#define ODB_ALL_OG(x) ((x & 0x8) >> 3) - -/* Operator Determined Barring of all outgoing international calls */ -#define ODB_ALL_INT_OG ((x & 0x10) >> 4) - -/* Operator Determined Barring of all outgoing international calls except those - * directed to the home PLMN country - */ -#define ODB_ALL_INT_NOT_TO_HPLMN(x) ((x & 0x20) >> 5) - -/* Operator Determined Barring of all outgoing inter-zonal calls */ -#define ODB_ALL_INT_ZONE_OG(x) ((x & 0x40) >> 6) - -/* Operator Determined Barring of all outgoing inter-zonal calls except those - * directed to the home PLMN country - */ -#define ODB_ALL_INT_ZONE_OG_NOT_TO_HPLMN(x) ((x & 0x80) >> 7) - -/* Operator Determined Barring of all outgoing international calls except those - * directed to the home PLMN country and Barring of all outgoing inter-zonal calls - */ -#define ODB_ALL_INT_ZONE_OG_AND_INT_OG_NOT_TO_HPLMN(x) ((x & 0x100) >> 8) - -/* Regional Subscription */ -#define REG_SUB(x) ((x & 0x200) >> 9) - -/* Trace Function */ -#define TRACE(x) ((x & 0x400) >> 10) - -/* All LCS Privacy Exception Classes */ -#define LCS_ALL_PRIV_EXCEP(x) ((x & 0x800) >> 11) - -/* Allow location by any LCS client */ -#define LCS_UNIVERSAL(x) ((x & 0x1000) >> 12) - -/* Allow location by any value added LCS client to which a call/session is - * established from the target UE - */ -#define LCS_CALL_SESS_RELATED(x) ((x & 0x2000) >> 13) - -/* Allow location by designated external value added LCS clients */ -#define LCS_CALL_SESS_UNRELATED(x) ((x & 0x4000) >> 14) - -/* Allow location by designated PLMN operator LCS clients */ -#define LCS_PLMN_OPERATOR(x) ((x & 0x8000) >> 15) - -/* Allow location by LCS clients of a designated LCS service type */ -#define LCS_SERVICE_TYPE(x) ((x & 0x10000) >> 16) - -/* All Mobile Originating Location Request Classes */ -#define LCS_ALL_MOLR_SS(x) ((x & 0x20000) >> 17) - -/* Allow an MS to request its own location */ -#define LCS_BASIC_SELF_LOCATION(x) ((x & 0x40000) >> 18) - -/* Allow an MS to perform self location without interaction with the PLMN */ -#define LCS_AUTO_SELF_LOCATION(x) ((x & 0x80000) >> 19) - -/* Allow an MS to request transfer of its location to another LCS client */ -#define LCS_TRANSFER_TO_THIRD_PARTY(x) ((x & 0x100000) >> 20) - -/* Short Message MO-PP */ -#define SM_MO_PP(x) ((x & 0x200000) >> 21) - -/* Barring of Outgoing Calls */ -#define BARRING_OUTGOING_CALLS(x) ((x & 0x400000) >> 22) - -/* Barring of all outgoing calls */ -#define BAOC(x) ((x & 0x800000) >> 23) - -/* Barring of outgoing international calls */ -#define BOIC(x) ((x & 0x1000000) >> 24) - -/* Barring of outgoing international calls except those directed to the home PLMN - * Country - */ -#define BOIC_EXCEPT_HC(x) ((x & 0x2000000) >> 25) - -/* UE Reachability Notifcation */ -#define UE_REACH_NOTIF(x) ((x & 0x4000000) >> 26) - -/* Terminating Access Domain Selection Data Retrieval */ -#define T_ADS_DATA_RETR(x) ((x & 0x8000000) >> 27) - -/* State/Location Information Retrieval */ -#define STATE_LOCATION_INFO_RETR(x) ((x & 0x10000000) >> 28) - -/* Partial Purge from a Combined MME/SGSN */ -#define PARTIAL_PURGE(x) ((x & 0x20000000) >> 29) - -#define SUPP_FEAT_PAD_VALID(x) ((x & 0xfc000000) == 0) - -#endif /* S6A_SUPPORTED_FEATURES_H_ */ diff --git a/openair-cn/OPENAIRHSS/s6a/s6a_up_loc.c b/openair-cn/OPENAIRHSS/s6a/s6a_up_loc.c deleted file mode 100644 index 3c3b8519a8..0000000000 --- a/openair-cn/OPENAIRHSS/s6a/s6a_up_loc.c +++ /dev/null @@ -1,432 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -/*! \file s6a_up_loc.c - * \brief Handle an update location message and create the answer. - * \author Sebastien ROUX <sebastien.roux@eurecom.fr> - * \date 2013 - * \version 0.1 - */ - -#include <freeDiameter/freeDiameter-host.h> -#include <freeDiameter/libfdproto.h> -#include "hss_config.h" -#include "db_proto.h" -#include "s6a_proto.h" -#include "access_restriction.h" - -int s6a_up_loc_cb(struct msg **msg, struct avp *paramavp, - struct session *sess, void *opaque, - enum disp_action *act) -{ - struct msg *ans, *qry; - struct avp *avp, *origin_host, *origin_realm; - struct avp *failed_avp = NULL; - - struct avp_hdr *origin_host_hdr, *origin_realm_hdr; - struct avp_hdr *hdr; - - union avp_value value; - - int ret = 0; - int result_code = ER_DIAMETER_SUCCESS; - int experimental = 0; - uint32_t ulr_flags = 0; - - mysql_ul_ans_t mysql_ans; - mysql_ul_push_t mysql_push; - - if (msg == NULL) { - return EINVAL; - } - - memset(&mysql_push, 0, sizeof(mysql_ul_push_t)); - memset(&mysql_ans, 0, sizeof(mysql_ul_ans_t)); - - fprintf(stdout, "Received new update location request\n"); - - qry = *msg; - /* Create the answer */ - CHECK_FCT(fd_msg_new_answer_from_req(fd_g_config->cnf_dict, msg, 0)); - ans = *msg; - - /* Retrieving IMSI AVP */ - CHECK_FCT(fd_msg_search_avp(qry, s6a_cnf.dataobj_s6a_imsi, &avp)); - - if (avp) { - CHECK_FCT(fd_msg_avp_hdr(avp, &hdr)); - - if (hdr->avp_value->os.len > IMSI_LENGTH) { - fprintf(stdout, "IMSI_LENGTH ER_DIAMETER_INVALID_AVP_VALUE\n"); - result_code = ER_DIAMETER_INVALID_AVP_VALUE; - goto out; - } - - // 3GPP TS 29.272-910 / 5.2.1.1.3 Detailed behaviour of the HSS - // When receiving an Update Location request the HSS shall check whether the IMSI is known. - // If it is not known, a Result Code of DIAMETER_ERROR_USER_UNKNOWN shall be returned. - // If it is known, but the subscriber has no EPS subscription, the HSS may (as an operator option) - // return a Result Code of DIAMETER_ERROR_UNKNOWN_EPS_SUBSCRIPTION. - // If the Update Location Request is received over the S6a interface, and the subscriber has not - // any APN configuration, the HSS shall return a Result Code of DIAMETER_ERROR_UNKNOWN_EPS_SUBSCRIPTION. - // The HSS shall check whether the RAT type the UE is using is allowed. If it is not, - // a Result Code of DIAMETER_ERROR_RAT_NOT_ALLOWED shall be returned. - // ... - sprintf(mysql_push.imsi, "%*s", (int)hdr->avp_value->os.len, - (char*)hdr->avp_value->os.data); - - if ((ret = hss_mysql_update_loc(mysql_push.imsi, &mysql_ans)) != 0) { - /* We failed to find the IMSI in the database. Replying to the request - * with the user unknown cause. - */ - experimental = 1; - fprintf(stdout, "IMSI %s DIAMETER_ERROR_USER_UNKNOWN\n", mysql_push.imsi); - result_code = DIAMETER_ERROR_USER_UNKNOWN; - goto out; - } - } else { - fprintf(stderr, "Cannot get IMSI AVP which is mandatory\n"); - result_code = ER_DIAMETER_MISSING_AVP; - goto out; - } - - /* Retrieving Origin host AVP */ - CHECK_FCT(fd_msg_search_avp(qry, s6a_cnf.dataobj_s6a_origin_host, &origin_host)); - - if (!origin_host) { - fprintf(stderr, "origin_host ER_DIAMETER_MISSING_AVP\n"); - result_code = ER_DIAMETER_MISSING_AVP; - goto out; - } - - /* Retrieving Origin realm AVP */ - CHECK_FCT(fd_msg_search_avp(qry, s6a_cnf.dataobj_s6a_origin_realm, &origin_realm)); - - if (!origin_realm) { - fprintf(stderr, "origin_realm ER_DIAMETER_MISSING_AVP\n"); - result_code = ER_DIAMETER_MISSING_AVP; - goto out; - } - - /* Retrieve the header from origin host and realm avps */ - CHECK_FCT(fd_msg_avp_hdr(origin_host, &origin_host_hdr)); - CHECK_FCT(fd_msg_avp_hdr(origin_realm, &origin_realm_hdr)); - - sprintf(mysql_push.mme_identity.mme_host, "%*s", - (int)origin_host_hdr->avp_value->os.len, - (char*)origin_host_hdr->avp_value->os.data); - - sprintf(mysql_push.mme_identity.mme_realm, "%*s", - (int)origin_realm_hdr->avp_value->os.len, - (char*)origin_realm_hdr->avp_value->os.data); - - /* Retrieving RAT type AVP */ - CHECK_FCT(fd_msg_search_avp(qry, s6a_cnf.dataobj_s6a_rat_type, &avp)); - - if (avp) { - CHECK_FCT(fd_msg_avp_hdr(avp, &hdr)); - - /* As we are in E-UTRAN stand-alone HSS, we have to reject incoming - * location request with a RAT-Type != than E-UTRAN. - * The user may be disallowed to use the specified RAT, check the access - * restriction bit mask received from DB. - */ - if ((hdr->avp_value->u32 != 1004) || - (FLAG_IS_SET(mysql_ans.access_restriction, E_UTRAN_NOT_ALLOWED))) { - experimental = 1; - fprintf(stderr, "access_restriction DIAMETER_ERROR_RAT_NOT_ALLOWED\n"); - result_code = DIAMETER_ERROR_RAT_NOT_ALLOWED; - goto out; - } - } else { - fprintf(stderr, "rat_type ER_DIAMETER_MISSING_AVP\n"); - result_code = ER_DIAMETER_MISSING_AVP; - goto out; - } - - /* Retrieving ULR Flags AVP */ - CHECK_FCT(fd_msg_search_avp(qry, s6a_cnf.dataobj_s6a_ulr_flags, &avp)); - - if (avp) { - CHECK_FCT(fd_msg_avp_hdr(avp, &hdr)); - ulr_flags = hdr->avp_value->u32; - - /* Check the flags received */ - if (FLAG_IS_SET(ulr_flags, ULR_SINGLE_REGISTRATION_IND)) { - /* We don't handle cases where we have to inform SGSN */ - result_code = ER_DIAMETER_INVALID_AVP_VALUE; - - fprintf(stderr, "ULR single registration bit set (SGSN to MME): " - "not handled by standalone E-UTRAN HSS\n"); - goto out; - } - - if (!FLAG_IS_SET(ulr_flags, ULR_S6A_S6D_INDICATOR)) { - /* The request is coming from s6d interface (SGSN). */ - result_code = ER_DIAMETER_INVALID_AVP_VALUE; - - fprintf(stderr, "ULR S6D bit set: " - "not handled by standalone E-UTRAN HSS\n"); - goto out; - } - - if (FLAG_IS_SET(ulr_flags, ULR_NODE_TYPE_IND)) { - /* Request coming from combined SGSN/MME. */ - result_code = ER_DIAMETER_INVALID_AVP_VALUE; - fprintf(stderr, "ULR conbined SGSN/MME bit set: " - "not handled by standalone E-UTRAN HSS\n"); - goto out; - } - - if (FLAG_IS_SET(ulr_flags, ULR_INITIAL_ATTACH_IND)) { - /* This bit, when set, indicates that the HSS shall send Cancel - * Location to the MME or SGSN if there is the MME or SGSN - * registration. - */ - // TODO: check if an MME is already registered, serving the UE. - // If so, it should be informed. - - /* The identity of the MME will be added to db */ - mysql_push.mme_identity_present = MME_IDENTITY_PRESENT; - } else { - /* The bit is not set, we are expecting that the mme contained in db - * matches the original MME. - */ - if ((mysql_ans.mme_identity.mme_host != NULL) && - (mysql_ans.mme_identity.mme_realm != NULL)) { - /* Compare if values match expected */ - if (memcmp(mysql_ans.mme_identity.mme_host, origin_host_hdr->avp_value->os.data, - origin_host_hdr->avp_value->os.len > strlen(mysql_ans.mme_identity.mme_host) ? - strlen(mysql_ans.mme_identity.mme_host) : origin_host_hdr->avp_value->os.len) != 0) { - experimental = 1; - fprintf(stderr, "DIAMETER_ERROR_UNKOWN_SERVING_NODE (host)\n"); - result_code = DIAMETER_ERROR_UNKOWN_SERVING_NODE; - goto out; - } - - if (memcmp(mysql_ans.mme_identity.mme_realm, origin_realm_hdr->avp_value->os.data, - origin_realm_hdr->avp_value->os.len > strlen(mysql_ans.mme_identity.mme_realm) ? - strlen(mysql_ans.mme_identity.mme_realm) : origin_realm_hdr->avp_value->os.len) != 0) { - experimental = 1; - fprintf(stderr, "DIAMETER_ERROR_UNKOWN_SERVING_NODE (realm)\n"); - result_code = DIAMETER_ERROR_UNKOWN_SERVING_NODE; - goto out; - } - } else { - /* Failed to retrieve current serving MME and the ULR is not - * marked as an initial attach indication... - */ - experimental = 1; - fprintf(stderr, "DIAMETER_ERROR_UNKOWN_SERVING_NODE\n"); - result_code = DIAMETER_ERROR_UNKOWN_SERVING_NODE; - goto out; - } - } - - if (!ULR_PAD_VALID(ulr_flags)) { - /* Padding is not zero'ed, may be the MME/SGSN supports newer - * release. Inform it. - */ - fprintf(stderr, "ULR flags ER_DIAMETER_INVALID_AVP_VALUE\n"); - result_code = ER_DIAMETER_INVALID_AVP_VALUE; - goto out; - } - } else { - fprintf(stderr, "ULR flags ER_DIAMETER_MISSING_AVP\n"); - result_code = ER_DIAMETER_MISSING_AVP; - goto out; - } - - /* Retrieving Visited-PLMN-Id AVP */ - CHECK_FCT(fd_msg_search_avp(qry, s6a_cnf.dataobj_s6a_visited_plmn_id, &avp)); - - if (avp) { - CHECK_FCT(fd_msg_avp_hdr(avp, &hdr)); - - /* Roaming cases are not allowed for now. - * Reject the connectivity if PLMN visited and IMSI PLMN disagree. - */ - /* TODO */ - if (hdr->avp_value->os.len == 3) { - // if (apply_access_restriction(mysql_push.imsi, hdr->avp_value->os.data) != 0) { - // /* We found that user is roaming and has no right to do it -> - // * reject the connection - // */ - // result_code = DIAMETER_ERROR_ROAMING_NOT_ALLOWED; - // experimental = 1; - // goto out; - // } - } else { - fprintf(stderr, "PLMN ID ER_DIAMETER_INVALID_AVP_VALUE\n"); - result_code = ER_DIAMETER_INVALID_AVP_VALUE; - goto out; - } - } else { - fprintf(stderr, "PLMN ID ER_DIAMETER_MISSING_AVP\n"); - result_code = ER_DIAMETER_MISSING_AVP; - goto out; - } - - /* Retrieving Terminal-Information AVP */ - CHECK_FCT(fd_msg_search_avp(qry, s6a_cnf.dataobj_s6a_terminal_info, &avp)); - - if (avp) { - struct avp *child_avp; - - /* Walk through childs avp */ - CHECK_FCT(fd_msg_browse(avp, MSG_BRW_FIRST_CHILD, &child_avp, NULL)); - - while (child_avp) { - /* Retrieve the header of the child avp */ - CHECK_FCT(fd_msg_avp_hdr(child_avp, &hdr)); - - switch(hdr->avp_code) { - case AVP_CODE_IMEI: { - /* Check that we do not exceed the maximum size for IMEI */ - if (hdr->avp_value->os.len > IMEI_LENGTH) { - fprintf(stderr, "terminal info ER_DIAMETER_INVALID_AVP_VALUE\n"); - result_code = ER_DIAMETER_INVALID_AVP_VALUE; - failed_avp = child_avp; - goto out; - } - - sprintf(mysql_push.imei, "%*s", (int)hdr->avp_value->os.len, - hdr->avp_value->os.data); - mysql_push.imei_present = IMEI_PRESENT; - } - break; - - case AVP_CODE_SOFTWARE_VERSION: { - /* Check the size for SV */ - if (hdr->avp_value->os.len != SV_LENGTH) { - fprintf(stderr, "software version ER_DIAMETER_INVALID_AVP_VALUE\n"); - result_code = ER_DIAMETER_INVALID_AVP_VALUE; - failed_avp = child_avp; - goto out; - } - - mysql_push.software_version[0] = hdr->avp_value->os.data[0]; - mysql_push.software_version[1] = hdr->avp_value->os.data[1]; - mysql_push.sv_present = SV_PRESENT; - } - break; - - default: /* Fall through */ - case AVP_CODE_3GPP2_MEID: { - /* This AVP is not expected on s6a interface */ - fprintf(stderr, "AVP_CODE_3GPP2_MEID ER_DIAMETER_AVP_UNSUPPORTED\n"); - result_code = ER_DIAMETER_AVP_UNSUPPORTED; - failed_avp = child_avp; - goto out; - } - } - - /* Go to next AVP in the grouped AVP */ - CHECK_FCT(fd_msg_browse(child_avp, MSG_BRW_NEXT, &child_avp, NULL)); - } - } - - /* Retrieving UE-SRVCC AVP */ - CHECK_FCT(fd_msg_search_avp(qry, s6a_cnf.dataobj_s6a_ue_srvcc_cap, &avp)); - - if (avp) { - CHECK_FCT(fd_msg_avp_hdr(avp, &hdr)); - mysql_push.ue_srvcc_present = UE_SRVCC_PRESENT; - mysql_push.ue_srvcc = hdr->avp_value->u32; - } - - /* Retrieving Supported features list AVP */ - CHECK_FCT(fd_msg_search_avp(qry, s6a_cnf.dataobj_s6a_supported_features, &avp)); - - if (avp) { - struct avp *child_avp; - - /* Walk through childs avp */ - CHECK_FCT(fd_msg_browse(avp, MSG_BRW_FIRST_CHILD, &child_avp, NULL)); - - while (child_avp) { - /* Retrieve the header of the child avp */ - CHECK_FCT(fd_msg_avp_hdr(child_avp, &hdr)); - - switch(hdr->avp_code) { - case AVP_CODE_VENDOR_ID: { - if (hdr->avp_value->u32 != VENDOR_3GPP) { - /* features from a vendor other than 3GPP is not supported */ - fprintf(stderr, "Cannot interpret features list with vendor id " - "different than 3GPP(%d)\n", VENDOR_3GPP); - continue; - } - } - break; - - case AVP_CODE_FEATURE_LIST: { - mysql_push.mme_supported_features_present = MME_SUPPORTED_FEATURES_PRESENT; - mysql_push.mme_supported_features = hdr->avp_value->u32; - } - break; - } - - /* Go to next AVP in the grouped AVP */ - CHECK_FCT(fd_msg_browse(child_avp, MSG_BRW_NEXT, &child_avp, NULL)); - } - } - - mysql_push_up_loc(&mysql_push); - - /* ULA flags */ - CHECK_FCT(fd_msg_avp_new(s6a_cnf.dataobj_s6a_ula_flags, 0, &avp)); - value.u32 = 1; - CHECK_FCT(fd_msg_avp_setvalue(avp, &value)); - CHECK_FCT(fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp)); - - /* Only add the subscriber data if not marked as skipped by MME */ - if (!FLAG_IS_SET(ulr_flags, ULR_SKIP_SUBSCRIBER_DATA)) { - if (s6a_add_subscription_data_avp(ans, &mysql_ans) != 0) { - fprintf(stderr, "ULR_SKIP_SUBSCRIBER_DATA DIAMETER_ERROR_UNKNOWN_EPS_SUBSCRIPTION\n"); - result_code = DIAMETER_ERROR_UNKNOWN_EPS_SUBSCRIPTION; - experimental = 1; - goto out; - } - } - -out: - /* Add the Auth-Session-State AVP */ - CHECK_FCT(fd_msg_search_avp(qry, s6a_cnf.dataobj_s6a_auth_session_state, &avp)); - CHECK_FCT(fd_msg_avp_hdr(avp, &hdr)); - - CHECK_FCT(fd_msg_avp_new(s6a_cnf.dataobj_s6a_auth_session_state, 0, &avp)); - CHECK_FCT(fd_msg_avp_setvalue(avp, hdr->avp_value)); - CHECK_FCT(fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp)); - - /* Append the result code to the answer */ - CHECK_FCT(s6a_add_result_code(ans, failed_avp, result_code, experimental)); - - CHECK_FCT(fd_msg_send(msg, NULL, NULL )); - return 0; -} diff --git a/openair-cn/OPENAIRHSS/scripts/COPYING b/openair-cn/OPENAIRHSS/scripts/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair-cn/OPENAIRHSS/scripts/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program 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. - - This program 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 this program. If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - <program> Copyright (C) <year> <name of author> - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<http://www.gnu.org/licenses/>. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<http://www.gnu.org/philosophy/why-not-lgpl.html>. diff --git a/openair-cn/OPENAIRHSS/scripts/install_hss.sh b/openair-cn/OPENAIRHSS/scripts/install_hss.sh deleted file mode 100644 index c1b02c6315..0000000000 --- a/openair-cn/OPENAIRHSS/scripts/install_hss.sh +++ /dev/null @@ -1,145 +0,0 @@ -# !/bin/sh -################################################################################ -# 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@eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ - -CURRENT_PATH=`pwd` - -sudo apt-get install autoconf automake gawk cmake make gcc flex bison libsctp1 libsctp-dev libidn2-0-dev \ -libidn11-dev libmysqlclient-dev libxml2-dev swig python-dev cmake-curses-gui \ -valgrind guile-2.0-dev libgmp-dev libgcrypt11-dev gdb unzip libtasn1-3-dev g++ \ -linux-headers-`uname -r` build-essential -y - - -if [ -f install_log.txt ] - then - rm -f install_log.txt -fi - -if [ ! -d /usr/local/src/ ] - then - echo "/usr/local/src/ doesn't exist please create one" - exit -1 -fi - -if [ ! -w /usr/local/src/ ] - then - echo "You don't have permissions to write to /usr/local/src/" - exit -1 -fi - -cd /usr/local/src/ -echo "Downloading nettle archive" - -if [ -f nettle-2.5.tar.gz ] - then - rm -f nettle-2.5.tar.gz -fi -if [ -f nettle-2.5.tar ] - then - rm -f nettle-2.5.tar -fi -if [ -d nettle-2.5 ] - then - rm -rf nettle-2.5/ -fi - -wget ftp://ftp.lysator.liu.se/pub/security/lsh/nettle-2.5.tar.gz > install_log.txt -gunzip nettle-2.5.tar.gz > install_log.txt -echo "Uncompressing nettle archive" -tar -xf nettle-2.5.tar -cd nettle-2.5/ -./configure --disable-openssl --enable-shared --prefix=/usr > install_log.txt -if [ $? -ne 0 ] -then - exit -1 -fi -echo "Compiling nettle" -make -j2 > install_log.txt 2>&1 -make check > install_log.txt -sudo make install > install_log.txt -cd ../ - -echo "Downloading gnutls archive" - -if [ -f gnutls-3.1.0.tar.xz ] - then - rm -f gnutls-3.1.0.tar.xz -fi -if [ -d gnutls-3.1.0/ ] - then - rm -rf gnutls-3.1.0/ -fi - -wget ftp://ftp.gnutls.org/gcrypt/gnutls/v3.1/gnutls-3.1.0.tar.xz > install_log.txt -tar -xf gnutls-3.1.0.tar.xz -echo "Uncompressing gnutls archive" -cd gnutls-3.1.0/ -./configure --prefix=/usr -if [ $? -ne 0 ] -then - exit -1 -fi -echo "Compiling gnutls" -make -j2 > install_log.txt 2>&1 -sudo make install > install_log.txt -cd ../ - -echo "Downloading freeDiameter archive" - -if [ -f 1.1.5.tar.gz ] - then - rm -f 1.1.5.tar.gz -fi -if [ -d freeDiameter-1.1.5/ ] - then - rm -rf freeDiameter-1.1.5/ -fi - -wget http://www.freediameter.net/hg/freeDiameter/archive/1.1.5.tar.gz > install_log.txt -tar -xzf 1.1.5.tar.gz > install_log.txt -echo "Uncompressing freeDiameter archive" -cd freeDiameter-1.1.5 -echo "Patching freeDiameter" -patch -p1 < $OPENAIRCN_DIR/S6A/freediameter/freediameter-1.1.5.patch > install_log.txt -mkdir build -cd build -# optionaly if needed add -DCMAKE_BUILD_TYPE=debug -cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr ../ > install_log.txt -if [ $? -ne 0 ] -then - exit -1 -fi -echo "Compiling freeDiameter" -make -j2 > install_log.txt 2>&1 -#make help -make test > install_log.txt -sudo make install > install_log.txt - -cd $OPENAIRCN_DIR/OPENAIRHSS/conf -./make_certs.sh diff --git a/openair-cn/OPENAIRHSS/tests/COPYING b/openair-cn/OPENAIRHSS/tests/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair-cn/OPENAIRHSS/tests/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program 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. - - This program 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 this program. If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - <program> Copyright (C) <year> <name of author> - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<http://www.gnu.org/licenses/>. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<http://www.gnu.org/philosophy/why-not-lgpl.html>. diff --git a/openair-cn/OPENAIRHSS/tests/Makefile.am b/openair-cn/OPENAIRHSS/tests/Makefile.am deleted file mode 100644 index b149c8058c..0000000000 --- a/openair-cn/OPENAIRHSS/tests/Makefile.am +++ /dev/null @@ -1,88 +0,0 @@ -################################################################################ -# 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@eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ -# if HAVE_CHECK -# TESTS = up_loc_test -# else -# TESTS = -# endif -AM_CFLAGS = @CHECK_CFLAGS@ \ - -I$(top_srcdir)/auc - -if HAVE_CHECK -TESTS = up_loc_test test_security_f1 \ - test_security_f2_f3_f5 \ - test_security_f4_f5star \ - test_kdf \ - test_security_kasme -else -TESTS = -endif - -test_common = \ - $(top_builddir)/auc/libauc.la \ - libtest_utils.la \ - @CHECK_LIBS@ - -up_loc_test_LDADD = \ - libtest_utils.la \ - @CHECK_LIBS@ - -test_security_f1_LDADD = \ - $(test_common) - -test_security_f2_f3_f5_LDADD = \ - $(test_common) - -test_security_f4_f5star_LDADD = \ - $(test_common) - -test_security_kasme_LDADD = \ - $(test_common) - -test_kdf_LDADD = \ - $(test_common) - -noinst_LTLIBRARIES = libtest_utils.la -libtest_utils_la_SOURCES = \ - test_utils.h test_utils.c \ - test_fd.h test_fd.c - -check_PROGRAMS = \ - up_loc_test test_security_f1 \ - test_security_f2_f3_f5 \ - test_security_f4_f5star \ - test_security_kasme \ - test_kdf - -up_loc_test_SOURCES = up_loc_test.c -test_security_f1_SOURCE = test_security_f1.c -test_security_f2_f3_f5_SOURCE = test_security_f2_f3_f5.c -test_security_f4_f5star_SOURCE = test_security_f4_f5star.c -test_security_kasme_SOURCE = test_security_kasme.c -test_kdf_SOURCE = test_kdf.c \ No newline at end of file diff --git a/openair-cn/OPENAIRHSS/tests/test_fd.c b/openair-cn/OPENAIRHSS/tests/test_fd.c deleted file mode 100644 index e4961d6aa9..0000000000 --- a/openair-cn/OPENAIRHSS/tests/test_fd.c +++ /dev/null @@ -1,87 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -#include "config.h" - -#include <freeDiameter/freeDiameter-host.h> -#include <freeDiameter/libfdcore.h> - -#include "test_utils.h" -#include "test_fd.h" - -extern int fd_ext_add( char * filename, char * conffile ); - -void s6a_fd_init(void) -{ - struct peer_info peer; - - fd_g_debug_lvl = NONE; - - memset(&peer, 0, sizeof(struct peer_info)); - - peer.pi_diamid = "hss.test.fr"; - peer.pi_diamidlen = strlen(peer.pi_diamid); - - /* Only SCTP */ - peer.config.pic_flags.pro4 = PI_P4_SCTP; - peer.config.pic_flags.sec = PI_SEC_NONE; - peer.config.pic_flags.exp = PI_EXP_NONE; - - peer.config.pic_port = 18678; - - if (fd_core_initialize() != 0) { - fail("fd_core_initialize failed"); - } - - if (fd_core_start() != 0) { - fail("fd_core_start failed"); - } - - if (fd_core_parseconf("../../conf/hss_fd.conf") != 0) { - fail("fd_core_waitstartcomplete failed"); - } - - if (fd_core_waitstartcomplete() != 0) { - fail("fd_core_waitstartcomplete failed"); - } - - // if (fd_peer_add(&peer, NULL, NULL, NULL) != 0) { - // fail("fd_peer_add failed"); - // } -} - -void s6a_fd_stop(void) -{ - if (fd_core_shutdown() != 0) { - fail("fd_core_shutdown failed"); - } - - if (fd_core_wait_shutdown_complete() != 0) { - fail("fd_core_shutdown failed"); - } -} diff --git a/openair-cn/OPENAIRHSS/tests/test_fd.h b/openair-cn/OPENAIRHSS/tests/test_fd.h deleted file mode 100644 index fd38767995..0000000000 --- a/openair-cn/OPENAIRHSS/tests/test_fd.h +++ /dev/null @@ -1,36 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -#ifndef TEST_FD_H_ -#define TEST_FD_H_ - -void s6a_fd_init(void); - -void s6a_fd_stop(void); - -#endif /* TEST_FD_H_ */ diff --git a/openair-cn/OPENAIRHSS/tests/test_kdf.c b/openair-cn/OPENAIRHSS/tests/test_kdf.c deleted file mode 100644 index fbaa536431..0000000000 --- a/openair-cn/OPENAIRHSS/tests/test_kdf.c +++ /dev/null @@ -1,132 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -#include <stdio.h> -#include <stdint.h> -#include <unistd.h> -#include <string.h> - -#include "config.h" -#include "test_utils.h" -#include "test_fd.h" - -#include "auc.h" - -static -void do_kdf(uint8_t *key, unsigned key_length, uint8_t *data, unsigned data_length, - uint8_t *exp, unsigned exp_length) -{ - uint8_t result[32]; - - kdf(key, key_length, data, data_length, result, 32); - - if (compare_buffer(result, exp_length, exp, exp_length) != 0) { - fail("Fail: kdf\n"); - } -} - -void -doit (void) -{ - /* RFC 4231 */ - - /* Test case 1 #4.2 */ - do_kdf(HL("0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b" - "0b0b0b0b"), - HL("4869205468657265"), - HL("b0344c61d8db38535ca8afceaf0bf12b" - "881dc200c9833da726e9376c2e32cff7")); - /* Test case 2 #4.3 */ - do_kdf(HL("4a656665"), - HL("7768617420646f2079612077616e7420" - "666f72206e6f7468696e673f"), - HL("5bdcc146bf60754e6a042426089575c7" - "5a003f089d2739839dec58b964ec3843")); - /* Test case 3 #4.4 */ - do_kdf(HL("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" - "aaaaaaaa"), - HL("dddddddddddddddddddddddddddddddd" - "dddddddddddddddddddddddddddddddd" - "dddddddddddddddddddddddddddddddd" - "dddd"), - HL("773ea91e36800e46854db8ebd09181a7" - "2959098b3ef8c122d9635514ced565fe")); - /* Test case 4 #4.5 */ - do_kdf(HL("0102030405060708090a0b0c0d0e0f10" - "111213141516171819"), - HL("cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd" - "cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd" - "cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd" - "cdcd"), - HL("82558a389a443c0ea4cc819899f2083a" - "85f0faa3e578f8077a2e3ff46729665b")); - /* Test case 5 #4.6 */ - do_kdf(HL("0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c" - "0c0c0c0c"), - HL("546573742057697468205472756e6361" - "74696f6e"), - HL("a3b6167473100ee06e0c796c2955552b")); - /* Test case 6 #4.7 */ - do_kdf(HL("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" - "aaaaaa"), - HL("54657374205573696e67204c61726765" - "72205468616e20426c6f636b2d53697a" - "65204b6579202d2048617368204b6579" - "204669727374"), - HL("60e431591ee0b67f0d8a26aacbf5b77f" - "8e0bc6213728c5140546040f0ee37f54")); - /* Test case 6 #4.7 */ - do_kdf(HL("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" - "aaaaaa"), - HL("54686973206973206120746573742075" - "73696e672061206c6172676572207468" - "616e20626c6f636b2d73697a65206b65" - "7920616e642061206c61726765722074" - "68616e20626c6f636b2d73697a652064" - "6174612e20546865206b6579206e6565" - "647320746f2062652068617368656420" - "6265666f7265206265696e6720757365" - "642062792074686520484d414320616c" - "676f726974686d2e"), - HL("9b09ffa71b942fcb27635fbcd5b0e944" - "bfdc63644f0713938a7f51535c3a35e2")); -} diff --git a/openair-cn/OPENAIRHSS/tests/test_security.c b/openair-cn/OPENAIRHSS/tests/test_security.c deleted file mode 100644 index f319ae1f73..0000000000 --- a/openair-cn/OPENAIRHSS/tests/test_security.c +++ /dev/null @@ -1,119 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -#include <stdio.h> -#include <stdint.h> -#include <unistd.h> -#include <string.h> - -#include "config.h" -#include "test_utils.h" -#include "test_fd.h" - -#include "auc.h" - -typedef struct { - uint8_t key[16]; - uint8_t rand[16]; - uint8_t sqn[6]; - uint8_t amf[2]; - uint8_t op[16]; - uint8_t f1_exp[8]; - uint8_t f1_star_exp[8]; -} test_set_t; - -test_set_t test_set[] = { - /* 35.207 #4.3 */ - { - .key = { - 0x46, 0x5b, 0x5c, 0xe8, 0xb1, 0x99, 0xb4, 0x9f, 0xaa, 0x5f, 0x0a, - 0x2e, 0xe2, 0x38, 0xa6, 0xbc - }, - .rand = { - 0x23, 0x55, 0x3c, 0xbe, 0x96, 0x37, 0xa8, 0x9d, 0x21, 0x8a, 0xe6, - 0x4d, 0xae, 0x47, 0xbf, 0x35 - }, - .sqn = { 0xff, 0x9b, 0xb4, 0xd0, 0xb6, 0x07 }, - .amf = { 0xb9, 0xb9 }, - .op = { - 0xcd, 0xc2, 0x02, 0xd5, 0x12, 0x3e, 0x20, 0xf6, 0x2b, 0x6d, 0x67, - 0x6a, 0xc7, 0x2c, 0xb3, 0x18 - }, - .f1_exp = { 0x4a, 0x9f, 0xfa, 0xc3, 0x54, 0xdf, 0xaf, 0xb3 }, - .f1_star_exp = { 0x01, 0xcf, 0xaf, 0x9e, 0xc4, 0xe8, 0x71, 0xe9 }, - }, - { - .key = { - 0x03, 0x96, 0xeb, 0x31, 0x7b, 0x6d, 0x1c, 0x36, 0xf1, 0x9c, 0x1c, - 0x84, 0xcd, 0x6f, 0xfd, 0x16 - }, - .rand = { - 0xc0, 0x0d, 0x60, 0x31, 0x03, 0xdc, 0xee, 0x52, 0xc4, 0x47, 0x81, - 0x19, 0x49, 0x42, 0x02, 0xe8, - }, - .sqn = { 0xfd, 0x8e, 0xef, 0x40, 0xdf, 0x7d }, - .amf = { 0xaf, 0x17 }, - .op = { - 0xff, 0x53, 0xba, 0xde, 0x17, 0xdf, 0x5d, 0x4e, 0x79, 0x30, 0x73, - 0xce, 0x9d, 0x75, 0x79, 0xfa - }, - .f1_exp = { 0x5d, 0xf5, 0xb3, 0x18, 0x07, 0xe2, 0x58, 0xb0 }, - .f1_star_exp = { 0xa8, 0xc0, 0x16, 0xe5, 0x1e, 0xf4, 0xa3, 0x43 } - }, -}; - -void -doit (void) -{ - int i; - - for (i = 0; i < sizeof(test_set) / sizeof(test_set_t); i++) { - uint8_t res[8]; - - SetOPc(test_set[i].op); - f1(test_set[i].key, test_set[i].rand, test_set[i].sqn, test_set[i].amf, res); - - // printf("%02x%02x%02x%02x%02x%02x%02x%02x\n", res[0], res[1], res[2], - // res[3], res[4], res[5], res[6], res[7]); - if (memcmp(res, test_set[i].f1_exp, 8) != 0) { - fail("Test set %d (f1) : failed\n", i); - } else { - success("Test set %d (f1) : success\n", i); - } - - f1star(test_set[i].key, test_set[i].rand, test_set[i].sqn, test_set[i].amf, res); - - // printf("%02x%02x%02x%02x%02x%02x%02x%02x\n", res[0], res[1], res[2], - // res[3], res[4], res[5], res[6], res[7]); - if (memcmp(res, test_set[i].f1_star_exp, 8) != 0) { - fail("Test set %d (f1*): failed\n", i); - } else { - success("Test set %d (f1*): success\n", i); - } - } -} diff --git a/openair-cn/OPENAIRHSS/tests/test_security_f1.c b/openair-cn/OPENAIRHSS/tests/test_security_f1.c deleted file mode 100644 index 96527da7cf..0000000000 --- a/openair-cn/OPENAIRHSS/tests/test_security_f1.c +++ /dev/null @@ -1,121 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -#include <stdio.h> -#include <stdint.h> -#include <unistd.h> -#include <string.h> - -#include "config.h" -#include "test_utils.h" -#include "test_fd.h" - -#include "auc.h" - -static -void do_f1_f1star(uint8_t *key, uint8_t *rand, uint8_t *sqn, - uint8_t *amf, uint8_t *op, uint8_t *f1_exp, - uint8_t *f1star_exp) -{ - uint8_t res[8]; - - SetOPc(op); - - f1(key, rand, sqn, amf, res); - - if (compare_buffer(res, 8, f1_exp, 8) != 0) { - fail("Fail: f1"); - } - - f1star(key, rand, sqn, amf, res); - - if (compare_buffer(res, 8, f1star_exp, 8) != 0) { - fail("Fail: f1*"); - } -} - -void -doit (void) -{ - /* Test suite taken from 3GPP TS 35.207 */ - - /* Test set 1 #4.3 */ - do_f1_f1star( - H("465b5ce8 b199b49f aa5f0a2e e238a6bc"), - H("23553cbe 9637a89d 218ae64d ae47bf35"), - H("ff9bb4d0 b607"), - H("b9b9"), - H("cdc202d5 123e20f6 2b6d676a c72cb318"), - H("4a9ffac3 54dfafb3"), - H("01cfaf9e c4e871e9")); - /* Test set 2 #4.4 */ - do_f1_f1star( - H("0396eb31 7b6d1c36 f19c1c84 cd6ffd16"), - H("c00d6031 03dcee52 c4478119 494202e8"), - H("fd8eef40 df7d"), - H("af17"), - H("ff53bade 17df5d4e 793073ce 9d7579fa"), - H("5df5b318 07e258b0"), - H("a8c016e5 1ef4a343")); - /* Test set 3 #4.5 */ - do_f1_f1star( - H("fec86ba6 eb707ed0 8905757b 1bb44b8f"), - H("9f7c8d02 1accf4db 213ccff0 c7f71a6a"), - H("9d027759 5ffc"), - H("725c"), - H("dbc59adc b6f9a0ef 735477b7 fadf8374"), - H("9cabc3e9 9baf7281"), - H("95814ba2 b3044324")); - /* Test set 4 #4.5 */ - do_f1_f1star( - H("9e5944ae a94b8116 5c82fbf9 f32db751"), - H("ce83dbc5 4ac0274a 157c17f8 0d017bd6"), - H("0b604a81 eca8"), - H("9e09"), - H("223014c5 806694c0 07ca1eee f57f004f"), - H("74a58220 cba84c49"), - H("ac2cc74a 96871837")); - /* Test set 5 #4.6 */ - do_f1_f1star( - H("4ab1deb0 5ca6ceb0 51fc98e7 7d026a84"), - H("74b0cd60 31a1c833 9b2b6ce2 b8c4a186"), - H("e880a1b5 80b6"), - H("9f07"), - H("2d16c5cd 1fdf6b22 383584e3 bef2a8d8"), - H("49e785dd 12626ef2"), - H("9e857903 36bb3fa2")); - /* Test set 6 #4.7 */ - do_f1_f1star( - H("6c38a116 ac280c45 4f59332e e35c8c4f"), - H("ee6466bc 96202c5a 557abbef f8babf63"), - H("414b9822 2181"), - H("4464"), - H("1ba00a1a 7c6700ac 8c3ff3e9 6ad08725"), - H("078adfb4 88241a57"), - H("80246b8d 0186bcf1")); -} diff --git a/openair-cn/OPENAIRHSS/tests/test_security_f2_f3_f5.c b/openair-cn/OPENAIRHSS/tests/test_security_f2_f3_f5.c deleted file mode 100644 index 339e5602c4..0000000000 --- a/openair-cn/OPENAIRHSS/tests/test_security_f2_f3_f5.c +++ /dev/null @@ -1,110 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -#include <stdio.h> -#include <stdint.h> -#include <unistd.h> -#include <string.h> - -#include "config.h" -#include "test_utils.h" -#include "test_fd.h" - -#include "auc.h" - -static -void do_f2f3f5(uint8_t *key, uint8_t *rand, uint8_t *op, uint8_t *f2_exp, - uint8_t *f5_exp, uint8_t *f3_exp) -{ - uint8_t res_f2[8]; - uint8_t res_f5[6]; - uint8_t res_f3[16]; - uint8_t res_f4[16]; - - SetOPc(op); - - f2345(key, rand, res_f2, res_f3, res_f4, res_f5); - - if (compare_buffer(res_f2, 8, f2_exp, 8) != 0) { - fail("Fail: f2"); - } - - if (compare_buffer(res_f5, 6, f5_exp, 6) != 0) { - fail("Fail: f5"); - } - - if (compare_buffer(res_f3, 16, f3_exp, 16) != 0) { - fail("Fail: f3"); - } -} - -void -doit (void) -{ - /* Test set 1 #5.3 */ - do_f2f3f5(H("465b5ce8 b199b49f aa5f0a2e e238a6bc"), - H("23553cbe 9637a89d 218ae64d ae47bf35"), - H("cdc202d5 123e20f6 2b6d676a c72cb318"), - H("a54211d5 e3ba50bf"), H("aa689c64 8370"), - H("b40ba9a3 c58b2a05 bbf0d987 b21bf8cb")); - - /* Test set 2 #5.4 */ - do_f2f3f5(H("0396eb31 7b6d1c36 f19c1c84 cd6ffd16"), - H("c00d6031 03dcee52 c4478119 494202e8"), - H("ff53bade 17df5d4e 793073ce 9d7579fa"), - H("d3a628ed 988620f0"), H("c4778399 5f72"), - H("58c433ff 7a7082ac d424220f 2b67c556")); - - /* Test set 3 #5.5 */ - do_f2f3f5(H("fec86ba6 eb707ed0 8905757b 1bb44b8f"), - H("9f7c8d02 1accf4db 213ccff0 c7f71a6a"), - H("dbc59adc b6f9a0ef 735477b7 fadf8374"), - H("8011c48c 0c214ed2"), H("33484dc2 136b"), - H("5dbdbb29 54e8f3cd e665b046 179a5098")); - - /* Test set 4 #5.6 */ - do_f2f3f5(H("9e5944ae a94b8116 5c82fbf9 f32db751"), - H("ce83dbc5 4ac0274a 157c17f8 0d017bd6"), - H("223014c5 806694c0 07ca1eee f57f004f"), - H("f365cd68 3cd92e96"), H("f0b9c08a d02e"), - H("e203edb3 971574f5 a94b0d61 b816345d")); - - /* Test set 5 #5.7 */ - do_f2f3f5(H("4ab1deb0 5ca6ceb0 51fc98e7 7d026a84"), - H("74b0cd60 31a1c833 9b2b6ce2 b8c4a186"), - H("2d16c5cd 1fdf6b22 383584e3 bef2a8d8"), - H("5860fc1b ce351e7e"), H("31e11a60 9118"), - H("7657766b 373d1c21 38f307e3 de9242f9")); - - /* Test set 6 #5.8 */ - do_f2f3f5(H("6c38a116 ac280c45 4f59332e e35c8c4f"), - H("ee6466bc 96202c5a 557abbef f8babf63"), - H("1ba00a1a 7c6700ac 8c3ff3e9 6ad08725"), - H("16c8233f 05a0ac28"), H("45b0f69a b06c"), - H("3f8c7587 fe8e4b23 3af676ae de30ba3b")); -} diff --git a/openair-cn/OPENAIRHSS/tests/test_security_f4_f5star.c b/openair-cn/OPENAIRHSS/tests/test_security_f4_f5star.c deleted file mode 100644 index 26b43d7ffe..0000000000 --- a/openair-cn/OPENAIRHSS/tests/test_security_f4_f5star.c +++ /dev/null @@ -1,104 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -#include <stdio.h> -#include <stdint.h> -#include <unistd.h> -#include <string.h> - -#include "config.h" -#include "test_utils.h" -#include "test_fd.h" - -#include "auc.h" - -static -void do_f4f5star(uint8_t *key, uint8_t *rand, uint8_t *op, uint8_t *f4_exp, - uint8_t *f5star_exp) -{ - uint8_t res_f2[8]; - uint8_t res_f5[6]; - uint8_t res_f3[16]; - uint8_t res_f4[16]; - uint8_t res_f5star[6]; - - SetOPc(op); - - f2345(key, rand, res_f2, res_f3, res_f4, res_f5); - - if (compare_buffer(res_f4, 16, f4_exp, 16) != 0) { - fail("Fail: f4"); - } - - f5star(key, rand, res_f5star); - - if (compare_buffer(res_f5star, 6, f5star_exp, 6) != 0) { - fail("Fail: f5star"); - } -} - -void -doit (void) -{ - /* Test set 1 #6.3 */ - do_f4f5star(H("465b5ce8 b199b49f aa5f0a2e e238a6bc"), - H("23553cbe 9637a89d 218ae64d ae47bf35"), - H("cdc202d5 123e20f6 2b6d676a c72cb318"), - H("f769bcd7 51044604 12767271 1c6d3441"), - H("451e8bec a43b")); - /* Test set 2 #6.4 */ - do_f4f5star(H("0396eb31 7b6d1c36 f19c1c84 cd6ffd16"), - H("c00d6031 03dcee52 c4478119 494202e8"), - H("ff53bade 17df5d4e 793073ce 9d7579fa"), - H("21a8c1f9 29702adb 3e738488 b9f5c5da"), - H("30f11970 61c1")); - /* Test set 3 #6.5 */ - do_f4f5star(H("fec86ba6 eb707ed0 8905757b 1bb44b8f"), - H("9f7c8d02 1accf4db 213ccff0 c7f71a6a"), - H("dbc59adc b6f9a0ef 735477b7 fadf8374"), - H("59a92d3b 476a0443 487055cf 88b2307b"), - H("deacdd84 8cc6")); - /* Test set 4 #6.5 */ - do_f4f5star(H("9e5944ae a94b8116 5c82fbf9 f32db751"), - H("ce83dbc5 4ac0274a 157c17f8 0d017bd6"), - H("223014c5 806694c0 07ca1eee f57f004f"), - H("0c4524ad eac041c4 dd830d20 854fc46b"), - H("6085a86c 6f63")); - /* Test set 5 #6.6 */ - do_f4f5star(H("4ab1deb0 5ca6ceb0 51fc98e7 7d026a84"), - H("74b0cd60 31a1c833 9b2b6ce2 b8c4a186"), - H("2d16c5cd 1fdf6b22 383584e3 bef2a8d8"), - H("1c42e960 d89b8fa9 9f2744e0 708ccb53"), - H("fe2555e5 4aa9")); - /* Test set 6 #6.7 */ - do_f4f5star(H("6c38a116 ac280c45 4f59332e e35c8c4f"), - H("ee6466bc 96202c5a 557abbef f8babf63"), - H("1ba00a1a 7c6700ac 8c3ff3e9 6ad08725"), - H("a7466cc1 e6b2a133 7d49d3b6 6e95d7b4"), - H("1f53cd2b 1113")); -} diff --git a/openair-cn/OPENAIRHSS/tests/test_security_kasme.c b/openair-cn/OPENAIRHSS/tests/test_security_kasme.c deleted file mode 100644 index 7ab68b67a0..0000000000 --- a/openair-cn/OPENAIRHSS/tests/test_security_kasme.c +++ /dev/null @@ -1,87 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -#include <stdlib.h> -#include <stdio.h> -#include <stdint.h> -#include <unistd.h> -#include <string.h> - -#include "config.h" -#include "test_utils.h" -#include "test_fd.h" - -#include "auc.h" - -static -void do_derive_kasme(uint8_t *sn_id, uint8_t *sqn, uint8_t *ak, - uint8_t *ck, uint8_t *ik, uint8_t *kasme_exp) -{ - uint8_t kasme[32]; - derive_kasme(ck, ik, sn_id, sqn, ak, kasme); - - if (compare_buffer(kasme, 32, kasme_exp, 32) != 0) { - fail("Fail: derive_kasme\n"); - } -} - -void -doit (void) -{ - /* 20834 -> 024830 SNid */ - do_derive_kasme(H("024830"), H("FD8EEF40DF7D"), H("AA689C648370"), - H("B40BA9A3C58B2A05BBF0D987B21BF8CB"), - H("F769BCD751044604127672711C6D3441"), - H("238E457E0F758BADBCA8D34BB2612C10" - "428D426757CB5553B2B184FA64BFC549")); - do_derive_kasme(H("02F843"), H("FD8EEF40DF7D"), H("AA689C648370"), - H("B40BA9A3C58B2A05BBF0D987B21BF8CB"), - H("F769BCD751044604127672711C6D3441"), - H("BD7A0903A7D0F68767EE2F5C90CB7D7D" - "835998D940AFDBF73173E63567C5B894")); - do_derive_kasme(H("21F354"), H("FD8EEF40DF7D"), H("AA689C648370"), - H("B40BA9A3C58B2A05BBF0D987B21BF8CB"), - H("F769BCD751044604127672711C6D3441"), - H("546A79BC6D1613A72A4D631EE0351D66" - "036B2A0C44A3831BE6D365E24F023013")); - do_derive_kasme(H("024830"), H("FF9BB4D0B607"), H("AA689C648370"), - H("B40BA9A3C58B2A05BBF0D987B21BF8CB"), - H("F769BCD751044604127672711C6D3441"), - H("564CB4D2007E4F293B67D9B29392A64A" - "DD4C776B133D895AF6499AA6882AAB62")); - do_derive_kasme(H("02F843"), H("FF9BB4D0B607"), H("AA689C648370"), - H("B40BA9A3C58B2A05BBF0D987B21BF8CB"), - H("F769BCD751044604127672711C6D3441"), - H("34865EB0DC9A6D788A905C0514529BF5" - "88485DA817FFBE92E9A9B4D033B8CC6F")); - do_derive_kasme(H("21F354"), H("FF9BB4D0B607"), H("AA689C648370"), - H("B40BA9A3C58B2A05BBF0D987B21BF8CB"), - H("F769BCD751044604127672711C6D3441"), - H("9EA141DA4B24CDEBC8F5FB3F61A05112" - "16681F121199B23EBCFACC75B358BE43")); -} diff --git a/openair-cn/OPENAIRHSS/tests/test_utils.c b/openair-cn/OPENAIRHSS/tests/test_utils.c deleted file mode 100644 index a44aeb5c69..0000000000 --- a/openair-cn/OPENAIRHSS/tests/test_utils.c +++ /dev/null @@ -1,287 +0,0 @@ -/* - * Copyright (C) 2004-2012 Free Software Foundation, Inc. - * - * Author: Simon Josefsson - * - * This file is part of GnuTLS. - * - * GnuTLS 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. - * - * GnuTLS 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 GnuTLS; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <stdio.h> -#include <stdlib.h> -#include <stdint.h> -#include <stdarg.h> -#include <ctype.h> - -#include "test_utils.h" - -int debug = 0; -int error_count = 0; -int break_on_error = 0; - -/* -1 means invalid */ -static const signed char hex_digits[0x100] = { - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1, - -1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -}; - -unsigned -decode_hex_length(const char *h) -{ - const unsigned char *hex = (const unsigned char *) h; - unsigned count; - unsigned i; - - for (count = i = 0; hex[i]; i++) { - if (isspace(hex[i])) - continue; - - if (hex_digits[hex[i]] < 0) - abort(); - - count++; - } - - if (count % 2) - abort(); - - return count / 2; -} - -int -decode_hex(uint8_t *dst, const char *h) -{ - const unsigned char *hex = (const unsigned char *) h; - unsigned i = 0; - - for (;;) { - int high, low; - - while (*hex && isspace(*hex)) - hex++; - - if (!*hex) - return 1; - - high = hex_digits[*hex++]; - - if (high < 0) - return 0; - - while (*hex && isspace(*hex)) - hex++; - - if (!*hex) - return 0; - - low = hex_digits[*hex++]; - - if (low < 0) - return 0; - - dst[i++] = (high << 4) | low; - } -} - -uint8_t * -decode_hex_dup(const char *hex) -{ - uint8_t *p; - unsigned length = decode_hex_length(hex); - - p = malloc(length * sizeof(uint8_t)); - - if (decode_hex(p, hex)) - return p; - else { - free(p); - return NULL; - } -} - -void -fail (const char *format, ...) -{ - char str[1024]; - va_list arg_ptr; - - va_start (arg_ptr, format); - vsnprintf ( str, sizeof(str), format, arg_ptr); - va_end (arg_ptr); - fputs(str, stderr); - error_count++; - - if (break_on_error) - exit (1); -} - -void -success (const char *format, ...) -{ - char str[1024]; - va_list arg_ptr; - - va_start (arg_ptr, format); - vsnprintf ( str, sizeof(str), format, arg_ptr); - va_end (arg_ptr); - fputs(str, stderr); -} - -void -escapeprint (const char *str, size_t len) -{ - size_t i; - - printf (" (length %d bytes):\n\t", (int) len); - - for (i = 0; i < len; i++) { - if (((str[i] & 0xFF) >= 'A' && (str[i] & 0xFF) <= 'Z') || - ((str[i] & 0xFF) >= 'a' && (str[i] & 0xFF) <= 'z') || - ((str[i] & 0xFF) >= '0' && (str[i] & 0xFF) <= '9') - || (str[i] & 0xFF) == ' ' || (str[i] & 0xFF) == '.') - printf ("%c", (str[i] & 0xFF)); - else - printf ("\\x%02X", (str[i] & 0xFF)); - - if ((i + 1) % 16 == 0 && (i + 1) < len) - printf ("'\n\t'"); - } - - printf ("\n"); -} - -void -hexprint (const void *_str, size_t len) -{ - size_t i; - const char* str = _str; - - printf ("\t;; "); - - for (i = 0; i < len; i++) { - printf ("%02x ", (str[i] & 0xFF)); - - if ((i + 1) % 8 == 0) - printf (" "); - - if ((i + 1) % 16 == 0 && i + 1 < len) - printf ("\n\t;; "); - } - - printf ("\n"); -} - -void -binprint (const void *_str, size_t len) -{ - size_t i; - const char* str = _str; - - printf ("\t;; "); - - for (i = 0; i < len; i++) { - printf ("%d%d%d%d%d%d%d%d ", - (str[i] & 0xFF) & 0x80 ? 1 : 0, - (str[i] & 0xFF) & 0x40 ? 1 : 0, - (str[i] & 0xFF) & 0x20 ? 1 : 0, - (str[i] & 0xFF) & 0x10 ? 1 : 0, - (str[i] & 0xFF) & 0x08 ? 1 : 0, - (str[i] & 0xFF) & 0x04 ? 1 : 0, - (str[i] & 0xFF) & 0x02 ? 1 : 0, (str[i] & 0xFF) & 0x01 ? 1 : 0); - - if ((i + 1) % 3 == 0) - printf (" "); - - if ((i + 1) % 6 == 0 && i + 1 < len) - printf ("\n\t;; "); - } - - printf ("\n"); -} - -int -compare_buffer(uint8_t *buffer, uint32_t length_buffer, - uint8_t *pattern, uint32_t length_pattern) -{ - int i; - - if (length_buffer != length_pattern) { - printf("Length mismatch, expecting %d bytes, got %d bytes\n", length_pattern, - length_buffer); - hexprint(buffer, length_buffer); - return -1; - } - - for (i = 0; i < length_buffer; i++) { - if (pattern[i] != buffer[i]) { - printf("Expecting:\n"); - hexprint(pattern, length_pattern); - printf("Received:\n"); - hexprint(buffer, length_buffer); - printf("Mismatch fount in byte %d\nExpecting 0x%02x, got 0x%02x\n", - i, pattern[i], buffer[i]); - return -1; - } - } - - return 0; -} - -int -main (int argc, char *argv[]) -{ - do - if (strcmp (argv[argc - 1], "-v") == 0 || - strcmp (argv[argc - 1], "--verbose") == 0) - debug = 1; - else if (strcmp (argv[argc - 1], "-b") == 0 || - strcmp (argv[argc - 1], "--break-on-error") == 0) - break_on_error = 1; - else if (strcmp (argv[argc - 1], "-h") == 0 || - strcmp (argv[argc - 1], "-?") == 0 || - strcmp (argv[argc - 1], "--help") == 0) { - printf ("Usage: %s [-vbh?] [--verbose] [--break-on-error] [--help]\n", - argv[0]); - return 1; - } - - while (argc-- > 1); - - doit (); - - if (debug || error_count > 0) - printf ("Self test `%s' finished with %d errors\n", argv[0], error_count); - - return error_count ? 1 : 0; -} diff --git a/openair-cn/OPENAIRHSS/tests/test_utils.h b/openair-cn/OPENAIRHSS/tests/test_utils.h deleted file mode 100644 index 19e6caab66..0000000000 --- a/openair-cn/OPENAIRHSS/tests/test_utils.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (C) 2004-2012 Free Software Foundation, Inc. - * - * Author: Simon Josefsson - * - * This file is part of GnuTLS. - * - * GnuTLS 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. - * - * GnuTLS 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 GnuTLS; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#ifndef UTILS_H -#define UTILS_H - -#include <string.h> -#include <stdarg.h> - -#ifndef __attribute__ -#if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) -#define __attribute__(Spec) /* empty */ -#endif -#endif - -extern int debug; -extern int error_count; -extern int break_on_error; - -extern uint8_t * decode_hex_dup(const char *hex); -extern int decode_hex(uint8_t *dst, const char *h); -extern unsigned decode_hex_length(const char *h); - -#define H(x) decode_hex_dup(x) -#define HL(x) decode_hex_dup(x), decode_hex_length(x) - -extern void fail (const char *format, ...) -__attribute__ ((format (printf, 1, 2))); -extern void success (const char *format, ...) -__attribute__ ((format (printf, 1, 2))); - -extern void escapeprint (const char *str, size_t len); -extern void hexprint (const void *str, size_t len); -extern void binprint (const void *str, size_t len); - -extern int -compare_buffer(uint8_t *buffer, uint32_t length_buffer, - uint8_t *pattern, uint32_t length_pattern); - -/* This must be implemented elsewhere. */ -extern void doit (void); - -#endif /* UTILS_H */ diff --git a/openair-cn/OPENAIRHSS/tests/up_loc_test.c b/openair-cn/OPENAIRHSS/tests/up_loc_test.c deleted file mode 100644 index 83a56db738..0000000000 --- a/openair-cn/OPENAIRHSS/tests/up_loc_test.c +++ /dev/null @@ -1,47 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -#include <stdint.h> -#include <unistd.h> - -#include "config.h" -#include "test_utils.h" -#include "test_fd.h" - -void -doit (void) -{ - s6a_fd_init(); - - sleep(1); - - s6a_fd_stop(); - - success ("freediameter start/stop ok\n"); -} diff --git a/openair-cn/OPENAIRHSS/utils/COPYING b/openair-cn/OPENAIRHSS/utils/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair-cn/OPENAIRHSS/utils/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program 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. - - This program 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 this program. If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - <program> Copyright (C) <year> <name of author> - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<http://www.gnu.org/licenses/>. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<http://www.gnu.org/philosophy/why-not-lgpl.html>. diff --git a/openair-cn/OPENAIRHSS/utils/Makefile.am b/openair-cn/OPENAIRHSS/utils/Makefile.am deleted file mode 100644 index 42c9a412ef..0000000000 --- a/openair-cn/OPENAIRHSS/utils/Makefile.am +++ /dev/null @@ -1,40 +0,0 @@ -################################################################################ -# 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@eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ -AM_CFLAGS = @ADD_CFLAGS@ -AM_YFLAGS = -d -AM_LFLAGS = -o$(LEX_OUTPUT_ROOT).c - -BUILT_SOURCE = hss_parser.h - -noinst_LTLIBRARIES = libutils.la -libutils_la_LDFLAGS = -all-static -libutils_la_SOURCES = \ - hss_parser.y hss_scanner.l \ - hss_config.h hss_config.c \ - conversion.h conversion.c diff --git a/openair-cn/OPENAIRHSS/utils/conversion.c b/openair-cn/OPENAIRHSS/utils/conversion.c deleted file mode 100644 index 19347fc117..0000000000 --- a/openair-cn/OPENAIRHSS/utils/conversion.c +++ /dev/null @@ -1,144 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -#include <stdlib.h> -#include <stdint.h> -#include <ctype.h> - -#include "conversion.h" - -static const char hex_to_ascii_table[16] = { - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', -}; - -static const signed char ascii_to_hex_table[0x100] = { - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -}; - -static const signed char ascii_to_dec_table[0x100] = { - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -}; - -void hexa_to_ascii(uint8_t *from, char *to, size_t length) -{ - int i; - - for(i = 0; i < length; i++) { - uint8_t upper = (from[i] & 0xf0) >> 4; - uint8_t lower = from[i] & 0x0f; - to[2 * i] = hex_to_ascii_table[upper]; - to[2 * i + 1] = hex_to_ascii_table[lower]; - } -} - -int ascii_to_hex(uint8_t *dst, const char *h) -{ - const unsigned char *hex = (const unsigned char *) h; - unsigned i = 0; - - for (;;) { - int high, low; - - while (*hex && isspace(*hex)) { - hex++; - } - - if (!*hex) { - return 1; - } - - high = ascii_to_hex_table[*hex++]; - - if (high < 0) { - return 0; - } - - while (*hex && isspace(*hex)) { - hex++; - } - - if (!*hex) { - return 0; - } - - low = ascii_to_hex_table[*hex++]; - - if (low < 0) { - return 0; - } - - dst[i++] = (high << 4) | low; - } -} - -int bcd_to_hex(uint8_t *dst, const char *h, int h_length) -{ - const unsigned char *hex = (const unsigned char *) h; - unsigned i = 0; - - for (i = 0; i < h_length; i++) { - int value = ascii_to_dec_table[*hex++]; - - if (value < 0) - return -1; - - dst[i] = value; - } - - return 0; -} diff --git a/openair-cn/OPENAIRHSS/utils/conversion.h b/openair-cn/OPENAIRHSS/utils/conversion.h deleted file mode 100644 index c587020c98..0000000000 --- a/openair-cn/OPENAIRHSS/utils/conversion.h +++ /dev/null @@ -1,36 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -#ifndef CONVERSION_H_ -#define CONVERSION_H_ - -void hexa_to_ascii(uint8_t *from, char *to, size_t length); -int ascii_to_hex(uint8_t *dst, const char *h); -int bcd_to_hex(uint8_t *dst, const char *h, int h_length); - -#endif /* CONVERSION_H_ */ diff --git a/openair-cn/OPENAIRHSS/utils/hss_config.c b/openair-cn/OPENAIRHSS/utils/hss_config.c deleted file mode 100644 index 415504fc75..0000000000 --- a/openair-cn/OPENAIRHSS/utils/hss_config.c +++ /dev/null @@ -1,260 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -/*! \file hss_config.c - * \brief Base configuration for the HSS. Parse command line and configuration file - * \author Sebastien ROUX <sebastien.roux@eurecom.fr> - * \date 2013 - * \version 0.1 - */ - -#if HAVE_CONFIG_H -# include "config.h" -#endif - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <stdint.h> -#include <errno.h> -#include <getopt.h> - -#include "hss_config.h" -#include "hss_parser.h" - - -#ifndef PACKAGE_NAME -#define PACKAGE_NAME "OPENAIR-HSS" -#endif -#ifndef PACKAGE_VERSION -#define PACKAGE_VERSION "UNKNOWN-EXPERIMENTAL" -#endif -#ifndef PACKAGE_BUGREPORT -#define PACKAGE_BUGREPORT "openair4G-devel@eurecom.fr" -#endif - -// LG TODO fd_g_debug_lvl -int fd_g_debug_lvl = 1; - -/* YACC forward declarations */ -extern int yyparse (struct hss_config_s *hss_config_p); -static int config_parse_command_line(int argc, char *argv[], - hss_config_t *hss_config_p); -static int config_parse_file(hss_config_t *hss_config_p); -static void display_banner(void); -static void config_display(hss_config_t *hss_config_p); - -static struct option long_options[] = { - { "config", 1, 0, 'c' }, - { "help", 0, 0, 'h' }, - { "version", 0, 0, 'v' }, - { 0, 0, 0, 0 }, -}; - -static const char option_string[] = "c:vh"; - -int config_init(int argc, char *argv[], hss_config_t *hss_config_p) -{ - int ret = 0; - - if (hss_config_p == NULL) { - return EINVAL; - } - - hss_config_p->valid_op = 0; - - if ((ret = config_parse_command_line(argc, argv, hss_config_p)) != 0) { - return ret; - } - - display_banner(); - - if ((ret = config_parse_file(hss_config_p)) != 0) { - /* Parsing of the file failed. -> abort */ - abort(); - } - if (hss_config_p->random) { - if (strcasecmp(hss_config_p->random, "false") == 0) { - hss_config_p->random_bool = 0; - } else if (strcasecmp(hss_config_p->random, "true") == 0) { - hss_config_p->random_bool = 1; - } else { - fprintf(stderr, - "Error in configuration file: random: %s (allowed values {true,false})\n", - hss_config_p->random); - abort(); - } - } else { - hss_config_p->random = "true"; - hss_config_p->random_bool = 1; - fprintf(stderr, - "Default values for random: %s (allowed values {true,false})\n", - hss_config_p->random); - } - - // post processing for op key - if (hss_config_p->operator_key) { - if (strlen(hss_config_p->operator_key) == 32) { - ret = sscanf(hss_config_p->operator_key, - "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", - (unsigned int*)&hss_config_p->operator_key_bin[0],(unsigned int*)&hss_config_p->operator_key_bin[1], - (unsigned int*)&hss_config_p->operator_key_bin[2],(unsigned int*)&hss_config_p->operator_key_bin[3], - (unsigned int*)&hss_config_p->operator_key_bin[4],(unsigned int*)&hss_config_p->operator_key_bin[5], - (unsigned int*)&hss_config_p->operator_key_bin[6],(unsigned int*)&hss_config_p->operator_key_bin[7], - (unsigned int*)&hss_config_p->operator_key_bin[8],(unsigned int*)&hss_config_p->operator_key_bin[9], - (unsigned int*)&hss_config_p->operator_key_bin[10],(unsigned int*)&hss_config_p->operator_key_bin[11], - (unsigned int*)&hss_config_p->operator_key_bin[12],(unsigned int*)&hss_config_p->operator_key_bin[13], - (unsigned int*)&hss_config_p->operator_key_bin[14],(unsigned int*)&hss_config_p->operator_key_bin[15]); - - if (ret != 16) { - fprintf(stderr, - "Error in configuration file: operator key: %s\n", - hss_config_p->operator_key); - abort(); - } - hss_config_p->valid_op = 1; - } - } - config_display(hss_config_p); - - - return 0; -} - -static void display_banner(void) -{ - fprintf(stdout, "==== EURECOM %s v%s ====\n", PACKAGE_NAME, PACKAGE_VERSION); - fprintf(stdout, "Please report any bug to: %s\n\n", PACKAGE_BUGREPORT); -} - -static void usage(void) -{ - display_banner(); - fprintf(stdout, "Usage: openair_hss [options]\n\n"); - fprintf(stdout, "Available options:\n"); - fprintf(stdout, "\t--help\n\t-h\n"); - fprintf(stdout, "\t\tPrint this help and return\n\n"); - fprintf(stdout, "\t--config=<path>\n\t-c<path>\n"); - fprintf(stdout, "\t\tSet the configuration file for hss\n"); - fprintf(stdout, "\t\tSee template in conf dir\n\n"); - fprintf(stdout, "\t--version\n\t-v\n"); - fprintf(stdout, "\t\tPrint %s version and return\n", PACKAGE_NAME); -} - -static void config_display(hss_config_t *hss_config_p) -{ - fprintf(stdout, "Configuration\n"); - fprintf(stdout, "* Global:\n"); - fprintf(stdout, "\t- File .............: %s\n", hss_config_p->config); - fprintf(stdout, "* MYSQL:\n"); - fprintf(stdout, "\t- Server ...........: %s\n", hss_config_p->mysql_server); - fprintf(stdout, "\t- Database .........: %s\n", hss_config_p->mysql_database); - fprintf(stdout, "\t- User .............: %s\n", hss_config_p->mysql_user); - fprintf(stdout, "\t- Password .........: %s\n", - (hss_config_p->mysql_password == NULL) ? "None" : "*****"); - fprintf(stdout, "* FreeDiameter:\n"); - fprintf(stdout, "\t- Conf file ........: %s\n", - hss_config_p->freediameter_config); - fprintf(stdout, "* Security:\n"); - fprintf(stdout, "\t- Operator key......: %s\n", - hss_config_p->operator_key); - fprintf(stdout, "\t- Random ......: %s\n", - hss_config_p->random); -} - -static int config_parse_command_line(int argc, char *argv[], - hss_config_t *hss_config_p) -{ - int c; - int option_index = 0; - - while ((c = getopt_long (argc, argv, option_string, long_options, - &option_index)) != -1) { - switch(c) { - case 'c': { - hss_config_p->config = strdup(optarg); - } - break; - - case 'v': { - /* We display version and return immediately */ - display_banner(); - exit(0); - } - break; - - default: - case 'h': { - usage(); - exit(0); - } - break; - } - } - - return 0; -} - -static int config_parse_file(hss_config_t *hss_config_p) -{ - extern FILE *yyin; - int ret = -1; - - if (hss_config_p == NULL) { - return ret; - } - - if (hss_config_p->config == NULL) { - return ret; - } - - printf("Parsing configuration file: %s\n", hss_config_p->config); - - yyin = fopen(hss_config_p->config, "r"); - - if (!yyin) { - /* We failed to open the file */ - fprintf(stderr, "Unable to open the configuration file: %s (%d:%s)\n", - hss_config_p->config, errno, strerror(errno)); - return errno; - } - - /* Call the yacc parser */ - ret = yyparse(hss_config_p); - - /* Close the file descriptor */ - if (fclose(yyin) != 0) { - fprintf(stderr, "Unable to close the configuration file: %s (%d:%s)\n", - hss_config_p->config, errno, strerror(errno)); - return errno; - } - - return ret; -} diff --git a/openair-cn/OPENAIRHSS/utils/hss_config.h b/openair-cn/OPENAIRHSS/utils/hss_config.h deleted file mode 100644 index 6f3425c6d0..0000000000 --- a/openair-cn/OPENAIRHSS/utils/hss_config.h +++ /dev/null @@ -1,55 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -#ifndef HSS_CONFIG_H_ -#define HSS_CONFIG_H_ - -typedef struct hss_config_s { - char *mysql_server; - char *mysql_user; - char *mysql_password; - char *mysql_database; - - - char *operator_key; - unsigned char operator_key_bin[16]; - int valid_op; - - /* The freediameter configuration file */ - char *freediameter_config; - - /* THe HSS global configuration file */ - char *config; - - char *random; - char random_bool; -} hss_config_t; - -int config_init(int argc, char *argv[], hss_config_t *hss_config_p); - -#endif /* HSS_CONFIG_H_ */ diff --git a/openair-cn/OPENAIRHSS/utils/hss_parser.y b/openair-cn/OPENAIRHSS/utils/hss_parser.y deleted file mode 100644 index 5fb532dcdf..0000000000 --- a/openair-cn/OPENAIRHSS/utils/hss_parser.y +++ /dev/null @@ -1,144 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -/* For development only : */ -%debug -%error-verbose - -%parse-param {struct hss_config_s *hss_config_p} - -/* Keep track of location */ -%locations -%defines -%pure-parser - -%{ -#include <stdio.h> -#include <errno.h> - -#include "hss_config.h" -#include "hss_parser.h" - -void yyerror (YYLTYPE *llocp, struct hss_config_s *hss_config_p, const char *s); - -extern int yywrap(); -extern int yylex(); - -/* The Lex parser prototype */ -int fddlex(YYSTYPE *lvalp, YYLTYPE *llocp); -%} - -/* Values returned by lex for token */ -%union { - char *string; /* The string is allocated by strdup in lex.*/ - int integer; /* Store integer values */ -} - -%token <string> QSTRING -%token <integer> INTEGER - -%token LEX_ERROR -%token FDCONF -%token MYSQL_USER -%token MYSQL_SERVER -%token MYSQL_PASS -%token MYSQL_DB -%token OPERATOR_KEY -%token RANDOM - -%% -conffile: /* Empty is OK -- for simplicity here, we reject in daemon later */ - | conffile mysql_db - | conffile mysql_server - | conffile mysql_user - | conffile mysql_pass - | conffile operator_key - | conffile random - | conffile fdconf - | conffile errors - { - yyerror(&yylloc, hss_config_p, "An error occurred while parsing the configuration file"); - return EINVAL; - } - ; - -mysql_db: MYSQL_DB '=' QSTRING ';' - { - hss_config_p->mysql_database = $3; - } - ; - -mysql_pass: MYSQL_PASS '=' QSTRING ';' - { - hss_config_p->mysql_password = $3; - } - ; - -mysql_user: MYSQL_USER '=' QSTRING ';' - { - hss_config_p->mysql_user = $3; - } - ; - -mysql_server: MYSQL_SERVER '=' QSTRING ';' - { - hss_config_p->mysql_server = $3; - } - ; - -operator_key: OPERATOR_KEY '=' QSTRING ';' - { - hss_config_p->operator_key = $3; - } - ; - -random: RANDOM '=' QSTRING ';' - { - hss_config_p->random = $3; - } - ; - -fdconf: FDCONF '=' QSTRING ';' - { - hss_config_p->freediameter_config = $3; - } - ; - - /* Lexical or syntax error */ -errors: LEX_ERROR - | error - ; -%% - -void yyerror(YYLTYPE *llocp, struct hss_config_s *hss_config_p, const char *str) -{ - fprintf(stderr, "Error in %s ( on line %i column %i -> line %i column %i) : %s\n", - hss_config_p->freediameter_config, llocp->first_line, llocp->first_column, - llocp->last_line, llocp->last_column, str); -} diff --git a/openair-cn/OPENAIRHSS/utils/hss_scanner.l b/openair-cn/OPENAIRHSS/utils/hss_scanner.l deleted file mode 100644 index e9c43c9a2b..0000000000 --- a/openair-cn/OPENAIRHSS/utils/hss_scanner.l +++ /dev/null @@ -1,130 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -/* Lex configuration parser. - * - * This file defines the token for parsing the configuration file - * - * Note : This module is NOT thread-safe. All processing must be done from one thread only. - */ -%{ -#include <stdio.h> - -#include "hss_config.h" -/* Include yacc tokens definitions */ -#include "hss_parser.h" - -/* Update the column information */ -#ifdef DEBUG_LEX -#define YY_USER_ACTION { \ - yylloc->first_column = yylloc->last_column + 1; \ - yylloc->last_column = yylloc->first_column + yyleng - 1; \ - TRACE_DEBUG(FULL, \ - "(%d:%d-%d:%d) matched rule %d, length=%d, txt='%s'\n", \ - yylloc->first_line, yylloc->first_column, \ - yylloc->last_line, yylloc->last_column, \ - yy_act, yyleng, yytext); \ -} -#else /* DEBUG_LEX */ -#define YY_USER_ACTION { \ - yylloc->first_column = yylloc->last_column + 1; \ - yylloc->last_column = yylloc->first_column + yyleng - 1; \ -} -#endif - -#define YY_NO_INPUT -%} - -%option bison-bridge -%option bison-locations -%option noyywrap -%option nounput - -/* Quoted string. Multilines do not match. */ -qstring \"[^\"\n]*\" - -%% - - /* List of patterns and actions */ - -<*>\n { - /* Update the line count */ - yylloc->first_line++; - yylloc->last_line++; - yylloc->last_column=0; -} - -<*>([[:space:]]{-}[\n])+ ; /* Eat all spaces, not new lines */ -<*>#.*$ ; /* Eat all comments */ - -{qstring} { - /* First copy the string without the quotes for use in the yacc parser */ - if ((yylval->string = strdup(yytext+1)) == NULL) { /* This allocates one useless tail char but... it's easier :D */ - return LEX_ERROR;/* on error, trig an error in yacc parser */ - } - yylval->string[yyleng-2] = '\0'; - - /* the yacc parser will check the string is valid */ - return QSTRING; -} - -[[:digit:]]+ { - /* Convert this to an integer value */ - int ret = sscanf(yytext, "%i", &yylval->integer); - if (ret != 1) { - /* No matching: an error occurred */ - fprintf(stderr, "Unable to convert the value '%s' to a valid number: %s\n", - yytext, strerror(errno)); - return LEX_ERROR; /* trig an error in yacc parser */ - /* Maybe we could REJECT instead of failing here? */ - } - return INTEGER; -} - - /* Full words tokens (keywords) */ -(?i:"FD_conf") { return FDCONF; } -(?i:"MYSQL_server") { return MYSQL_SERVER; } -(?i:"MYSQL_user") { return MYSQL_USER; } -(?i:"MYSQL_pass") { return MYSQL_PASS; } -(?i:"MYSQL_db") { return MYSQL_DB; } -(?i:"OPERATOR_key") { return OPERATOR_KEY; } -(?i:"RANDOM") { return RANDOM; } - - /* Valid single characters for yyparse */ -<*>[=,:;{}] { return yytext[0]; } - -<*>[[:alnum:]]+ | /* This rule is only useful to print a complete token in error messages */ - /* Unrecognized character */ -<*>. { - fprintf(stderr, "Unrecognized text on line %d col %d: '%s'.\n", - yylloc->first_line, yylloc->first_column, yytext); - return LEX_ERROR; -} - -%% diff --git a/openair-cn/OPENAIRHSS/utils/queue.h b/openair-cn/OPENAIRHSS/utils/queue.h deleted file mode 100644 index 47f638b57c..0000000000 --- a/openair-cn/OPENAIRHSS/utils/queue.h +++ /dev/null @@ -1,592 +0,0 @@ -/* - * Copyright (c) 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)queue.h 8.5 (Berkeley) 8/20/94 - */ - -#ifndef _SYS_QUEUE_H_ -#define _SYS_QUEUE_H_ - -/* - * This file defines five types of data structures: singly-linked lists, - * lists, simple queues, tail queues, and circular queues. - * - * A singly-linked list is headed by a single forward pointer. The - * elements are singly linked for minimum space and pointer manipulation - * overhead at the expense of O(n) removal for arbitrary elements. New - * elements can be added to the list after an existing element or at the - * head of the list. Elements being removed from the head of the list - * should use the explicit macro for this purpose for optimum - * efficiency. A singly-linked list may only be traversed in the forward - * direction. Singly-linked lists are ideal for applications with large - * datasets and few or no removals or for implementing a LIFO queue. - * - * A list is headed by a single forward pointer (or an array of forward - * pointers for a hash table header). The elements are doubly linked - * so that an arbitrary element can be removed without a need to - * traverse the list. New elements can be added to the list before - * or after an existing element or at the head of the list. A list - * may only be traversed in the forward direction. - * - * A simple queue is headed by a pair of pointers, one the head of the - * list and the other to the tail of the list. The elements are singly - * linked to save space, so elements can only be removed from the - * head of the list. New elements can be added to the list after - * an existing element, at the head of the list, or at the end of the - * list. A simple queue may only be traversed in the forward direction. - * - * A tail queue is headed by a pair of pointers, one to the head of the - * list and the other to the tail of the list. The elements are doubly - * linked so that an arbitrary element can be removed without a need to - * traverse the list. New elements can be added to the list before or - * after an existing element, at the head of the list, or at the end of - * the list. A tail queue may be traversed in either direction. - * - * A circle queue is headed by a pair of pointers, one to the head of the - * list and the other to the tail of the list. The elements are doubly - * linked so that an arbitrary element can be removed without a need to - * traverse the list. New elements can be added to the list before or after - * an existing element, at the head of the list, or at the end of the list. - * A circle queue may be traversed in either direction, but has a more - * complex end of list detection. - * - * For details on the use of these macros, see the queue(3) manual page. - * SLIST LIST STAILQ TAILQ CIRCLEQ - * _HEAD + + + + + - * _HEAD_INITIALIZER + + + + + - * _ENTRY + + + + + - * _INIT + + + + + - * _EMPTY + + + + + - * _FIRST + + + + + - * _NEXT + + + + + - * _PREV - - - + + - * _LAST - - + + + - * _FOREACH + + + + + - * _FOREACH_REVERSE - - - + + - * _INSERT_HEAD + + + + + - * _INSERT_BEFORE - + - + + - * _INSERT_AFTER + + + + + - * _INSERT_TAIL - - + + + - * _REMOVE_HEAD + - + - - - * _REMOVE + + + + + - */ - -/* - * List definitions. - */ -#define LIST_HEAD(name, type) \ - struct name { \ - struct type *lh_first; /* first element */ \ - } - -#define LIST_HEAD_INITIALIZER(head) \ - { NULL } - -#define LIST_ENTRY(type) \ - struct { \ - struct type *le_next; /* next element */ \ - struct type **le_prev; /* address of previous next element */ \ - } - -/* - * List functions. - */ -#define LIST_INIT(head) do { \ - (head)->lh_first = NULL; \ - } while (/*CONSTCOND*/0) - -#define LIST_INSERT_AFTER(listelm, elm, field) do { \ - if (((elm)->field.le_next = (listelm)->field.le_next) != NULL) \ - (listelm)->field.le_next->field.le_prev = \ - &(elm)->field.le_next; \ - (listelm)->field.le_next = (elm); \ - (elm)->field.le_prev = &(listelm)->field.le_next; \ - } while (/*CONSTCOND*/0) - -#define LIST_INSERT_BEFORE(listelm, elm, field) do { \ - (elm)->field.le_prev = (listelm)->field.le_prev; \ - (elm)->field.le_next = (listelm); \ - *(listelm)->field.le_prev = (elm); \ - (listelm)->field.le_prev = &(elm)->field.le_next; \ - } while (/*CONSTCOND*/0) - -#define LIST_INSERT_HEAD(head, elm, field) do { \ - if (((elm)->field.le_next = (head)->lh_first) != NULL) \ - (head)->lh_first->field.le_prev = &(elm)->field.le_next;\ - (head)->lh_first = (elm); \ - (elm)->field.le_prev = &(head)->lh_first; \ - } while (/*CONSTCOND*/0) - -#define LIST_REMOVE(elm, field) do { \ - if ((elm)->field.le_next != NULL) \ - (elm)->field.le_next->field.le_prev = \ - (elm)->field.le_prev; \ - *(elm)->field.le_prev = (elm)->field.le_next; \ - } while (/*CONSTCOND*/0) - -#define LIST_FOREACH(var, head, field) \ - for ((var) = ((head)->lh_first); \ - (var); \ - (var) = ((var)->field.le_next)) - -/* - * List access methods. - */ -#define LIST_EMPTY(head) ((head)->lh_first == NULL) -#define LIST_FIRST(head) ((head)->lh_first) -#define LIST_NEXT(elm, field) ((elm)->field.le_next) - - -/* - * Singly-linked List definitions. - */ -#define SLIST_HEAD(name, type) \ - struct name { \ - struct type *slh_first; /* first element */ \ - } - -#define SLIST_HEAD_INITIALIZER(head) \ - { NULL } - -#define SLIST_ENTRY(type) \ - struct { \ - struct type *sle_next; /* next element */ \ - } - -/* - * Singly-linked List functions. - */ -#define SLIST_INIT(head) do { \ - (head)->slh_first = NULL; \ - } while (/*CONSTCOND*/0) - -#define SLIST_INSERT_AFTER(slistelm, elm, field) do { \ - (elm)->field.sle_next = (slistelm)->field.sle_next; \ - (slistelm)->field.sle_next = (elm); \ - } while (/*CONSTCOND*/0) - -#define SLIST_INSERT_HEAD(head, elm, field) do { \ - (elm)->field.sle_next = (head)->slh_first; \ - (head)->slh_first = (elm); \ - } while (/*CONSTCOND*/0) - -#define SLIST_REMOVE_HEAD(head, field) do { \ - (head)->slh_first = (head)->slh_first->field.sle_next; \ - } while (/*CONSTCOND*/0) - -#define SLIST_REMOVE(head, elm, type, field) do { \ - if ((head)->slh_first == (elm)) { \ - SLIST_REMOVE_HEAD((head), field); \ - } \ - else { \ - struct type *curelm = (head)->slh_first; \ - while(curelm->field.sle_next != (elm)) \ - curelm = curelm->field.sle_next; \ - curelm->field.sle_next = \ - curelm->field.sle_next->field.sle_next; \ - } \ - } while (/*CONSTCOND*/0) - -#define SLIST_FOREACH(var, head, field) \ - for((var) = (head)->slh_first; (var); (var) = (var)->field.sle_next) - -/* - * Singly-linked List access methods. - */ -#define SLIST_EMPTY(head) ((head)->slh_first == NULL) -#define SLIST_FIRST(head) ((head)->slh_first) -#define SLIST_NEXT(elm, field) ((elm)->field.sle_next) - - -/* - * Singly-linked Tail queue declarations. - */ -#define STAILQ_HEAD(name, type) \ - struct name { \ - struct type *stqh_first; /* first element */ \ - struct type **stqh_last; /* addr of last next element */ \ - } - -#define STAILQ_HEAD_INITIALIZER(head) \ - { NULL, &(head).stqh_first } - -#define STAILQ_ENTRY(type) \ - struct { \ - struct type *stqe_next; /* next element */ \ - } - -/* - * Singly-linked Tail queue functions. - */ -#define STAILQ_INIT(head) do { \ - (head)->stqh_first = NULL; \ - (head)->stqh_last = &(head)->stqh_first; \ - } while (/*CONSTCOND*/0) - -#define STAILQ_INSERT_HEAD(head, elm, field) do { \ - if (((elm)->field.stqe_next = (head)->stqh_first) == NULL) \ - (head)->stqh_last = &(elm)->field.stqe_next; \ - (head)->stqh_first = (elm); \ - } while (/*CONSTCOND*/0) - -#define STAILQ_INSERT_TAIL(head, elm, field) do { \ - (elm)->field.stqe_next = NULL; \ - *(head)->stqh_last = (elm); \ - (head)->stqh_last = &(elm)->field.stqe_next; \ - } while (/*CONSTCOND*/0) - -#define STAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ - if (((elm)->field.stqe_next = (listelm)->field.stqe_next) == NULL)\ - (head)->stqh_last = &(elm)->field.stqe_next; \ - (listelm)->field.stqe_next = (elm); \ - } while (/*CONSTCOND*/0) - -#define STAILQ_REMOVE_HEAD(head, field) do { \ - if (((head)->stqh_first = (head)->stqh_first->field.stqe_next) == NULL) \ - (head)->stqh_last = &(head)->stqh_first; \ - } while (/*CONSTCOND*/0) - -#define STAILQ_REMOVE(head, elm, type, field) do { \ - if ((head)->stqh_first == (elm)) { \ - STAILQ_REMOVE_HEAD((head), field); \ - } else { \ - struct type *curelm = (head)->stqh_first; \ - while (curelm->field.stqe_next != (elm)) \ - curelm = curelm->field.stqe_next; \ - if ((curelm->field.stqe_next = \ - curelm->field.stqe_next->field.stqe_next) == NULL) \ - (head)->stqh_last = &(curelm)->field.stqe_next; \ - } \ - } while (/*CONSTCOND*/0) - -#define STAILQ_FOREACH(var, head, field) \ - for ((var) = ((head)->stqh_first); \ - (var); \ - (var) = ((var)->field.stqe_next)) - -#define STAILQ_CONCAT(head1, head2) do { \ - if (!STAILQ_EMPTY((head2))) { \ - *(head1)->stqh_last = (head2)->stqh_first; \ - (head1)->stqh_last = (head2)->stqh_last; \ - STAILQ_INIT((head2)); \ - } \ - } while (/*CONSTCOND*/0) - -/* - * Singly-linked Tail queue access methods. - */ -#define STAILQ_EMPTY(head) ((head)->stqh_first == NULL) -#define STAILQ_FIRST(head) ((head)->stqh_first) -#define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next) - - -/* - * Simple queue definitions. - */ -#define SIMPLEQ_HEAD(name, type) \ - struct name { \ - struct type *sqh_first; /* first element */ \ - struct type **sqh_last; /* addr of last next element */ \ - } - -#define SIMPLEQ_HEAD_INITIALIZER(head) \ - { NULL, &(head).sqh_first } - -#define SIMPLEQ_ENTRY(type) \ - struct { \ - struct type *sqe_next; /* next element */ \ - } - -/* - * Simple queue functions. - */ -#define SIMPLEQ_INIT(head) do { \ - (head)->sqh_first = NULL; \ - (head)->sqh_last = &(head)->sqh_first; \ - } while (/*CONSTCOND*/0) - -#define SIMPLEQ_INSERT_HEAD(head, elm, field) do { \ - if (((elm)->field.sqe_next = (head)->sqh_first) == NULL) \ - (head)->sqh_last = &(elm)->field.sqe_next; \ - (head)->sqh_first = (elm); \ - } while (/*CONSTCOND*/0) - -#define SIMPLEQ_INSERT_TAIL(head, elm, field) do { \ - (elm)->field.sqe_next = NULL; \ - *(head)->sqh_last = (elm); \ - (head)->sqh_last = &(elm)->field.sqe_next; \ - } while (/*CONSTCOND*/0) - -#define SIMPLEQ_INSERT_AFTER(head, listelm, elm, field) do { \ - if (((elm)->field.sqe_next = (listelm)->field.sqe_next) == NULL)\ - (head)->sqh_last = &(elm)->field.sqe_next; \ - (listelm)->field.sqe_next = (elm); \ - } while (/*CONSTCOND*/0) - -#define SIMPLEQ_REMOVE_HEAD(head, field) do { \ - if (((head)->sqh_first = (head)->sqh_first->field.sqe_next) == NULL) \ - (head)->sqh_last = &(head)->sqh_first; \ - } while (/*CONSTCOND*/0) - -#define SIMPLEQ_REMOVE(head, elm, type, field) do { \ - if ((head)->sqh_first == (elm)) { \ - SIMPLEQ_REMOVE_HEAD((head), field); \ - } else { \ - struct type *curelm = (head)->sqh_first; \ - while (curelm->field.sqe_next != (elm)) \ - curelm = curelm->field.sqe_next; \ - if ((curelm->field.sqe_next = \ - curelm->field.sqe_next->field.sqe_next) == NULL) \ - (head)->sqh_last = &(curelm)->field.sqe_next; \ - } \ - } while (/*CONSTCOND*/0) - -#define SIMPLEQ_FOREACH(var, head, field) \ - for ((var) = ((head)->sqh_first); \ - (var); \ - (var) = ((var)->field.sqe_next)) - -/* - * Simple queue access methods. - */ -#define SIMPLEQ_EMPTY(head) ((head)->sqh_first == NULL) -#define SIMPLEQ_FIRST(head) ((head)->sqh_first) -#define SIMPLEQ_NEXT(elm, field) ((elm)->field.sqe_next) - - -/* - * Tail queue definitions. - */ -#define _TAILQ_HEAD(name, type, qual) \ - struct name { \ - qual type *tqh_first; /* first element */ \ - qual type *qual *tqh_last; /* addr of last next element */ \ - } -#define TAILQ_HEAD(name, type) _TAILQ_HEAD(name, struct type,) - -#define TAILQ_HEAD_INITIALIZER(head) \ - { NULL, &(head).tqh_first } - -#define _TAILQ_ENTRY(type, qual) \ - struct { \ - qual type *tqe_next; /* next element */ \ - qual type *qual *tqe_prev; /* address of previous next element */\ - } -#define TAILQ_ENTRY(type) _TAILQ_ENTRY(struct type,) - -/* - * Tail queue functions. - */ -#define TAILQ_INIT(head) do { \ - (head)->tqh_first = NULL; \ - (head)->tqh_last = &(head)->tqh_first; \ - } while (/*CONSTCOND*/0) - -#define TAILQ_INSERT_HEAD(head, elm, field) do { \ - if (((elm)->field.tqe_next = (head)->tqh_first) != NULL) \ - (head)->tqh_first->field.tqe_prev = \ - &(elm)->field.tqe_next; \ - else \ - (head)->tqh_last = &(elm)->field.tqe_next; \ - (head)->tqh_first = (elm); \ - (elm)->field.tqe_prev = &(head)->tqh_first; \ - } while (/*CONSTCOND*/0) - -#define TAILQ_INSERT_TAIL(head, elm, field) do { \ - (elm)->field.tqe_next = NULL; \ - (elm)->field.tqe_prev = (head)->tqh_last; \ - *(head)->tqh_last = (elm); \ - (head)->tqh_last = &(elm)->field.tqe_next; \ - } while (/*CONSTCOND*/0) - -#define TAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ - if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL)\ - (elm)->field.tqe_next->field.tqe_prev = \ - &(elm)->field.tqe_next; \ - else \ - (head)->tqh_last = &(elm)->field.tqe_next; \ - (listelm)->field.tqe_next = (elm); \ - (elm)->field.tqe_prev = &(listelm)->field.tqe_next; \ - } while (/*CONSTCOND*/0) - -#define TAILQ_INSERT_BEFORE(listelm, elm, field) do { \ - (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \ - (elm)->field.tqe_next = (listelm); \ - *(listelm)->field.tqe_prev = (elm); \ - (listelm)->field.tqe_prev = &(elm)->field.tqe_next; \ - } while (/*CONSTCOND*/0) - -#define TAILQ_REMOVE(head, elm, field) do { \ - if (((elm)->field.tqe_next) != NULL) \ - (elm)->field.tqe_next->field.tqe_prev = \ - (elm)->field.tqe_prev; \ - else \ - (head)->tqh_last = (elm)->field.tqe_prev; \ - *(elm)->field.tqe_prev = (elm)->field.tqe_next; \ - } while (/*CONSTCOND*/0) - -#define TAILQ_FOREACH(var, head, field) \ - for ((var) = ((head)->tqh_first); \ - (var); \ - (var) = ((var)->field.tqe_next)) - -#define TAILQ_FOREACH_REVERSE(var, head, headname, field) \ - for ((var) = (*(((struct headname *)((head)->tqh_last))->tqh_last)); \ - (var); \ - (var) = (*(((struct headname *)((var)->field.tqe_prev))->tqh_last))) - -#define TAILQ_CONCAT(head1, head2, field) do { \ - if (!TAILQ_EMPTY(head2)) { \ - *(head1)->tqh_last = (head2)->tqh_first; \ - (head2)->tqh_first->field.tqe_prev = (head1)->tqh_last; \ - (head1)->tqh_last = (head2)->tqh_last; \ - TAILQ_INIT((head2)); \ - } \ - } while (/*CONSTCOND*/0) - -/* - * Tail queue access methods. - */ -#define TAILQ_EMPTY(head) ((head)->tqh_first == NULL) -#define TAILQ_FIRST(head) ((head)->tqh_first) -#define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next) - -#define TAILQ_LAST(head, headname) \ - (*(((struct headname *)((head)->tqh_last))->tqh_last)) -#define TAILQ_PREV(elm, headname, field) \ - (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last)) - - -/* - * Circular queue definitions. - */ -#define CIRCLEQ_HEAD(name, type) \ - struct name { \ - struct type *cqh_first; /* first element */ \ - struct type *cqh_last; /* last element */ \ - } - -#define CIRCLEQ_HEAD_INITIALIZER(head) \ - { (void *)&head, (void *)&head } - -#define CIRCLEQ_ENTRY(type) \ - struct { \ - struct type *cqe_next; /* next element */ \ - struct type *cqe_prev; /* previous element */ \ - } - -/* - * Circular queue functions. - */ -#define CIRCLEQ_INIT(head) do { \ - (head)->cqh_first = (void *)(head); \ - (head)->cqh_last = (void *)(head); \ - } while (/*CONSTCOND*/0) - -#define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do { \ - (elm)->field.cqe_next = (listelm)->field.cqe_next; \ - (elm)->field.cqe_prev = (listelm); \ - if ((listelm)->field.cqe_next == (void *)(head)) \ - (head)->cqh_last = (elm); \ - else \ - (listelm)->field.cqe_next->field.cqe_prev = (elm); \ - (listelm)->field.cqe_next = (elm); \ - } while (/*CONSTCOND*/0) - -#define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do { \ - (elm)->field.cqe_next = (listelm); \ - (elm)->field.cqe_prev = (listelm)->field.cqe_prev; \ - if ((listelm)->field.cqe_prev == (void *)(head)) \ - (head)->cqh_first = (elm); \ - else \ - (listelm)->field.cqe_prev->field.cqe_next = (elm); \ - (listelm)->field.cqe_prev = (elm); \ - } while (/*CONSTCOND*/0) - -#define CIRCLEQ_INSERT_HEAD(head, elm, field) do { \ - (elm)->field.cqe_next = (head)->cqh_first; \ - (elm)->field.cqe_prev = (void *)(head); \ - if ((head)->cqh_last == (void *)(head)) \ - (head)->cqh_last = (elm); \ - else \ - (head)->cqh_first->field.cqe_prev = (elm); \ - (head)->cqh_first = (elm); \ - } while (/*CONSTCOND*/0) - -#define CIRCLEQ_INSERT_TAIL(head, elm, field) do { \ - (elm)->field.cqe_next = (void *)(head); \ - (elm)->field.cqe_prev = (head)->cqh_last; \ - if ((head)->cqh_first == (void *)(head)) \ - (head)->cqh_first = (elm); \ - else \ - (head)->cqh_last->field.cqe_next = (elm); \ - (head)->cqh_last = (elm); \ - } while (/*CONSTCOND*/0) - -#define CIRCLEQ_REMOVE(head, elm, field) do { \ - if ((elm)->field.cqe_next == (void *)(head)) \ - (head)->cqh_last = (elm)->field.cqe_prev; \ - else \ - (elm)->field.cqe_next->field.cqe_prev = \ - (elm)->field.cqe_prev; \ - if ((elm)->field.cqe_prev == (void *)(head)) \ - (head)->cqh_first = (elm)->field.cqe_next; \ - else \ - (elm)->field.cqe_prev->field.cqe_next = \ - (elm)->field.cqe_next; \ - } while (/*CONSTCOND*/0) - -#define CIRCLEQ_FOREACH(var, head, field) \ - for ((var) = ((head)->cqh_first); \ - (var) != (const void *)(head); \ - (var) = ((var)->field.cqe_next)) - -#define CIRCLEQ_FOREACH_REVERSE(var, head, field) \ - for ((var) = ((head)->cqh_last); \ - (var) != (const void *)(head); \ - (var) = ((var)->field.cqe_prev)) - -/* - * Circular queue access methods. - */ -#define CIRCLEQ_EMPTY(head) ((head)->cqh_first == (void *)(head)) -#define CIRCLEQ_FIRST(head) ((head)->cqh_first) -#define CIRCLEQ_LAST(head) ((head)->cqh_last) -#define CIRCLEQ_NEXT(elm, field) ((elm)->field.cqe_next) -#define CIRCLEQ_PREV(elm, field) ((elm)->field.cqe_prev) - -#define CIRCLEQ_LOOP_NEXT(head, elm, field) \ - (((elm)->field.cqe_next == (void *)(head)) \ - ? ((head)->cqh_first) \ - : (elm->field.cqe_next)) -#define CIRCLEQ_LOOP_PREV(head, elm, field) \ - (((elm)->field.cqe_prev == (void *)(head)) \ - ? ((head)->cqh_last) \ - : (elm->field.cqe_prev)) - -#endif /* sys/queue.h */ diff --git a/openair-cn/README b/openair-cn/README deleted file mode 100644 index 11ae2e631e..0000000000 --- a/openair-cn/README +++ /dev/null @@ -1,128 +0,0 @@ -=============================================================================== -***************************** OAISIM_MME v0.3 ********************************* -=============================================================================== - -MME + P-GW + S-GW implementation of 3GPP standard. - -|-----| |------| -| MME | ----- | eNBs | -|-----| |------| - -Controle plane: - - eNB MME HSS - - |----------------------------| - | MME Application layer | - |----------------------------| - |------------| |-------------| |-------------| |--------------| - | NAS | | AUC |--| Mysql | --- | Database | - |------------| |-------------| |-------------| |--------------| -|------------| |------------| |------------| |--------------| |------------------------------| -| RRC | - | S1AP layer | ------ | S1AP layer | | S6A/Diameter | ------ | S6A/Diameter | -|------------| |------------| |------------| |--------------| |------------------------------| - |------------| |------------------------------| |------------------------------| - | SCTP layer | ------ | SCTP layer | ------ | SCTP layer | - |------------| |------------------------------| |------------------------------| - - -Non-UE associated control plane goes directly from S1AP to MME application layer. - -User plane: - - eNB MME - -|------------| |------------| -| PDCP | | MAL | -|------------| |------------| -|------------| |------------| -| S1-U | ------ | S1-U | -|------------| |------------| -|------------| |------------| -| GTPV1-U | ------ | GTPV1-U | -|------------| |------------| -|------------| |------------| -| UDP layer | ------ | UDP layer | -|------------| |------------| - -Current development: - -- NAS layer: under development -- S1AP layer: compliant with 3GPP TS36.413-8a0 and TS36.413-980 and TS35.413-a50 -- SCTP layer: SEQ_PACKET socket types - -For now the MME is able to register new eNBs on SCTP layer, -and handles S1 Setup request, Initial UE message, UplinkNASTransport on -S1AP layer. - -The MME needs some libraries and tools: -- libsctp-dev (SCTP support) -- libpthread-dev -- asn1c utility (patched with Aligned PER support, see README in -S1AP/MESSAGES/ASN1) -- flex -- bison -To install the dependencies: -sudo apt-get install libsctp-dev libpthread-dev flex bison g++ gcc make -y - -A script is present in S6A/freediameter to install required packages for -S6A interface over diameter. Run it as a sudoer. - -install_openvswitch1.9.0.bash -cd S6A/freediameter/README - -Compilations steps for use with oaisim 4G emulation environment: -./autogen.sh or autoreconf -i --force --install -mkdir objs && cd objs -../configure [options] -make - -Compilations steps for oaisim_mme use alone: -./autogen.sh -./configure [options] -make - -Current options supported for configure: ---enable-r8: disable R9 and R10 S1AP messages updates ---enable-r9: disable R10 updates -code build switch: UPDATE_RELEASE_9 and UPDATE_RELEASE_10 -NOTE: Release 10 is enabled by default ---enable-standalone-epc: all-in-one package, MME, S-GW and P-GW are compiled in a single -executable and S11 interface is not used; messages are exchanged internally, -linking MME applicative layer to S+P-GW applicative layer - -How to run EPC environnement ? - -If you avec enabled the standalone option -the package is called oai_epc in the OAI_EPC directory. - -If you have decided to use the S11 interface, -two executables should be run on different machines - -* oai_sgw in OAI_SGW -* oaisim_mme in OAISIM_MME - -For example to rum mme: -./OAISIM_MME/oaisim_mme [options] -Avalaible options: --h: print help --v: enable verbosity level [1-2] --V: print current executable version and return - -Before any commit: -make maintainer-clean - -MME SCTP port for S1AP messages is 36412 -SGW and eNB GTP-u port is 2152 -SGW and MME GTP-c port is 2123 - --------- Adding new files to build system -------- -1) When adding a new file to compile, edit the Makefile.am of the corresponding - directory. -2) Execute ./autogen.sh -3) make -WARNING: do not edit directly Makefiles and Makefile.in, they are re-generated by - autoconf/automake. - -Bugs: -report any bug to openair_admin@eurecom.fr diff --git a/openair-cn/S11/COPYING b/openair-cn/S11/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair-cn/S11/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program 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. - - This program 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 this program. If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - <program> Copyright (C) <year> <name of author> - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<http://www.gnu.org/licenses/>. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<http://www.gnu.org/philosophy/why-not-lgpl.html>. diff --git a/openair-cn/S11/Makefile.am b/openair-cn/S11/Makefile.am deleted file mode 100644 index 7878e76f6a..0000000000 --- a/openair-cn/S11/Makefile.am +++ /dev/null @@ -1,54 +0,0 @@ -################################################################################ -# 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@eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ -noinst_LTLIBRARIES = libs11.la - -libs11_la_LDFLAGS = -all-static - -AM_CFLAGS = \ - @ADD_CFLAGS@ \ - -I$(top_srcdir)/COMMON \ - -I$(top_srcdir)/GTPV2-C/nwgtpv2c-0.11/shared \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/api/network \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/include \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/ies \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/emm/msg \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/esm/msg \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/util \ - -I$(top_srcdir)/INTERTASK_INTERFACE \ - -I$(top_srcdir)/SGW-LITE \ - -I$(top_srcdir)/UTILS - -libs11_la_SOURCES = \ - s11_common.c s11_common.h \ - s11_ie_formatter.c s11_ie_formatter.h \ - s11_mme_task.c s11_mme.h \ - s11_sgw.c s11_sgw.h \ - s11_mme_session_manager.c s11_mme_session_manager.h \ - s11_sgw_session_manager.c s11_sgw_session_manager.h \ - s11_sgw_bearer_manager.c s11_sgw_bearer_manager.h \ No newline at end of file diff --git a/openair-cn/S11/s11_common.c b/openair-cn/S11/s11_common.c deleted file mode 100644 index b24e82b586..0000000000 --- a/openair-cn/S11/s11_common.c +++ /dev/null @@ -1,46 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -#include <stdlib.h> -#include <stdio.h> -#include <string.h> - -#include "NwGtpv2c.h" - -#include "s11_common.h" - -NwRcT s11_ie_indication_generic(uint8_t ieType, - uint8_t ieLength, - uint8_t ieInstance, - uint8_t *ieValue, - void *arg) -{ - S11_DEBUG("Received IE Parse Indication for of type %u, length %u, " - "instance %u!\n", ieType, ieLength, ieInstance); - return NW_OK; -} diff --git a/openair-cn/S11/s11_common.h b/openair-cn/S11/s11_common.h deleted file mode 100644 index a1f59006b2..0000000000 --- a/openair-cn/S11/s11_common.h +++ /dev/null @@ -1,43 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -#ifndef S11_COMMON_H_ -#define S11_COMMON_H_ - -#define S11_DEBUG(x, args...) fprintf(stdout, "[S11] [D]"x, ##args) -#define S11_INFO(x, args...) fprintf(stdout, "[S11] [I]"x, ##args) -#define S11_WARN(x, args...) fprintf(stdout, "[S11] [W]"x, ##args) -#define S11_ERROR(x, args...) fprintf(stderr, "[S11] [E]"x, ##args) - -NwRcT s11_ie_indication_generic(uint8_t ieType, - uint8_t ieLength, - uint8_t ieInstance, - uint8_t *ieValue, - void *arg); - -#endif /* S11_COMMON_H_ */ diff --git a/openair-cn/S11/s11_ie_formatter.c b/openair-cn/S11/s11_ie_formatter.c deleted file mode 100644 index 1b3f85acf4..0000000000 --- a/openair-cn/S11/s11_ie_formatter.c +++ /dev/null @@ -1,1164 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -#include <stdio.h> -#include <stdint.h> -#include <inttypes.h> - -#include "assertions.h" -#include "conversions.h" - -#include "sgw_lite_messages_types.h" - -#include "NwGtpv2c.h" -#include "NwGtpv2cIe.h" -#include "NwGtpv2cMsg.h" -#include "NwGtpv2cMsgParser.h" - -#include "s11_common.h" -#include "s11_ie_formatter.h" - -NwRcT s11_imsi_ie_get( - uint8_t ieType, uint8_t ieLength, uint8_t ieInstance, uint8_t *ieValue, void *arg) -{ - Imsi_t *imsi; - uint8_t i; - uint8_t mask = 0x0F; - uint8_t imsi_length = 2 * ieLength; - - DevAssert(arg != NULL); - imsi = (Imsi_t *)arg; - - for (i = 0; i < ieLength * 2; i++) { - if (mask == 0x0F) { - imsi->digit[i] = (ieValue[i / 2] & (mask)); - } else { - imsi->digit[i] = (ieValue[i / 2] & (mask)) >> 4; - } - - imsi->digit[i] += '0'; - mask = ~mask; - } - - if (imsi->digit[imsi_length - 1] == (0x0f + '0')) { - imsi->digit[imsi_length - 1] = 0; - imsi_length--; - } - - imsi->length = imsi_length; - - S11_DEBUG("\t- IMSI length %d\n", imsi->length); - S11_DEBUG("\t- value %*s\n", imsi->length, imsi->digit); - - return NW_OK; -} - -int s11_imsi_ie_set(NwGtpv2cMsgHandleT *msg, const Imsi_t *imsi) -{ - uint8_t *temp = NULL; - uint8_t imsi_length, i; - NwRcT rc; - - DevAssert(msg != NULL); - DevAssert(imsi != NULL); - - /* In case of odd/even imsi */ - imsi_length = imsi->length % 2 == 0 ? imsi->length / 2 : imsi->length / 2 + 1; - - temp = calloc(imsi_length, sizeof(uint8_t)); - - DevAssert(temp != NULL); - - for (i = 0; i < imsi->length; i++) { - temp[i / 2] |= ((imsi->digit[i] - '0') & 0x0F) << (i % 2 ? 4 : 0); - } - - rc = nwGtpv2cMsgAddIe(*msg, NW_GTPV2C_IE_IMSI, imsi_length, 0, temp); - DevAssert(NW_OK == rc); - - free(temp); - - return 0; -} - -NwRcT s11_msisdn_ie_get( - uint8_t ieType, uint8_t ieLength, uint8_t ieInstance, uint8_t *ieValue, void *arg) -{ - Msisdn_t *msisdn; - uint8_t i; - uint8_t mask = 0x0F; - uint8_t msisdn_length = 2 * ieLength; - - DevAssert(arg != NULL); - msisdn = (Msisdn_t *)arg; - - for (i = 0; i < ieLength * 2; i++) { - if (mask == 0x0F) { - msisdn->digit[i] = (ieValue[i / 2] & (mask)); - } else { - msisdn->digit[i] = (ieValue[i / 2] & (mask)) >> 4; - } - - msisdn->digit[i] += '0'; - mask = ~mask; - } - - if (msisdn->digit[msisdn_length - 1] == (0x0f + '0')) { - msisdn->digit[msisdn_length - 1] = 0; - msisdn_length--; - } - - msisdn->length = msisdn_length; - - S11_DEBUG("\t- MSISDN length %d\n", msisdn->length); - S11_DEBUG("\t- value %*s\n", msisdn->length, (char *)msisdn->digit); - - return NW_OK; -} - -NwRcT s11_mei_ie_get( - uint8_t ieType, uint8_t ieLength, uint8_t ieInstance, uint8_t *ieValue, void *arg) -{ - Mei_t *mei = (Mei_t *)arg; - - DevAssert(mei != NULL); - - - - return NW_OK; -} - -NwRcT s11_pdn_type_ie_get( - uint8_t ieType, uint8_t ieLength, uint8_t ieInstance, uint8_t *ieValue, void *arg) -{ - pdn_type_t *pdn_type = (pdn_type_t *)arg; - - DevAssert(pdn_type != NULL); - - if (*ieValue == 1) { - /* Only IPv4 */ - *pdn_type = IPv4; - } else if (*ieValue == 2) { - /* Only IPv6 */ - *pdn_type = IPv6; - } else if (*ieValue == 3) { - /* IPv4 and/or IPv6 */ - *pdn_type = IPv4_AND_v6; - } else { - S11_ERROR("Received unknown value for PDN Type: %u\n", *ieValue); - return NW_GTPV2C_IE_INCORRECT; - } - - S11_DEBUG("\t- PDN type %u\n", *pdn_type); - - return NW_OK; -} - -int s11_pdn_type_ie_set(NwGtpv2cMsgHandleT *msg, const pdn_type_t *pdn_type) -{ - NwRcT rc; - uint8_t value; - - DevAssert(pdn_type != NULL); - DevAssert(msg != NULL); - - switch (*pdn_type) { - case IPv4: - value = 1; - break; - - case IPv6: - value = 2; - break; - - case IPv4_AND_v6: - case IPv4_OR_v6: - value = 3; - break; - - default: - S11_ERROR("Invalid PDN type received: %d\n", *pdn_type); - return -1; - } - - rc = nwGtpv2cMsgAddIe(*msg, NW_GTPV2C_IE_PDN_TYPE, 1, 0, (uint8_t*)&value); - DevAssert(NW_OK == rc); - - return 0; -} - -NwRcT s11_rat_type_ie_get( - uint8_t ieType, uint8_t ieLength, uint8_t ieInstance, uint8_t *ieValue, void *arg) -{ - rat_type_t *rat_type = (rat_type_t *)arg; - - DevAssert(rat_type != NULL); - - switch (*ieValue) { - case 1: - *rat_type = RAT_UTRAN; - break; - - case 2: - *rat_type = RAT_GERAN; - break; - - case 3: - *rat_type = RAT_WLAN; - break; - - case 4: - *rat_type = RAT_GAN; - break; - - case 5: - *rat_type = RAT_HSPA_EVOLUTION; - break; - - case 6: - *rat_type = RAT_EUTRAN; - break; - - default: - S11_ERROR("Can't map GTP RAT type %u to EPC definition\n" - "\tCheck TS.29.274 #8.17 for possible values\n", *ieValue); - return NW_GTPV2C_IE_INCORRECT; - } - - S11_DEBUG("\t- RAT type (%d): %d\n", *ieValue, *rat_type); - - return NW_OK; -} - -int s11_rat_type_ie_set(NwGtpv2cMsgHandleT *msg, const rat_type_t *rat_type) -{ - NwRcT rc; - uint8_t value; - - DevAssert(rat_type != NULL); - DevAssert(msg != NULL); - - switch (*rat_type) { - case RAT_UTRAN: - value = 1; - break; - - case RAT_GERAN: - value = 2; - break; - - case RAT_WLAN: - value = 3; - break; - - case RAT_GAN: - value = 4; - break; - - case RAT_HSPA_EVOLUTION: - value = 5; - break; - - case RAT_EUTRAN: - value = 6; - break; - - default: - S11_ERROR("Can't map RAT type %d to GTP RAT type\n" - "\tCheck TS.29.274 #8.17 for possible values\n", *rat_type); - return -1; - } - - rc = nwGtpv2cMsgAddIe(*msg, NW_GTPV2C_IE_RAT_TYPE, 1, 0, (uint8_t*)&value); - DevAssert(NW_OK == rc); - - return 0; -} - -int s11_ebi_ie_set(NwGtpv2cMsgHandleT *msg, const unsigned ebi) -{ - NwRcT rc; - uint8_t value = 0; - - value = ebi & 0x0F; - - rc = nwGtpv2cMsgAddIe(*msg, NW_GTPV2C_IE_EBI, 1, 0, - &value); - DevAssert(NW_OK == rc); - - return 0; -} - -NwRcT s11_ebi_ie_get( - uint8_t ieType, uint8_t ieLength, uint8_t ieInstance, uint8_t *ieValue, void *arg) -{ - uint8_t *ebi = (uint8_t *)arg; - - DevAssert(ebi != NULL); - - *ebi = ieValue[0] & 0x0F; - - S11_DEBUG("\t- EBI %u\n", *ebi); - - return NW_OK; -} - -NwRcT s11_cause_ie_get( - uint8_t ieType, uint8_t ieLength, uint8_t ieInstance, uint8_t *ieValue, void *arg) -{ - SGWCause_t *cause = (SGWCause_t *)arg; - - DevAssert(cause != NULL); - - *cause = ieValue[0]; - - S11_DEBUG("\t- Cause %u\n", *cause); - - return NW_OK; -} - -int s11_cause_ie_set(NwGtpv2cMsgHandleT *msg, - const gtp_cause_t *cause) -{ - NwRcT rc; - uint8_t value[6]; - - DevAssert(msg != NULL); - DevAssert(cause != NULL); - - value[0] = cause->cause_value; - value[1] = ((cause->pce & 0x1) << 2) | ((cause->bce & 0x1) << 1) | (cause->cs & 0x1); - - if (cause->offending_ie_type != 0) { - value[2] = cause->offending_ie_type; - value[3] = (cause->offending_ie_length & 0xFF00) >> 8; - value[4] = cause->offending_ie_length & 0x00FF; - value[5] = cause->offending_ie_instance & 0x0F; - rc = nwGtpv2cMsgAddIe(*msg, NW_GTPV2C_IE_CAUSE, 6, 0, value); - } else { - rc = nwGtpv2cMsgAddIe(*msg, NW_GTPV2C_IE_CAUSE, 2, 0, value); - } - - DevAssert(NW_OK == rc); - - return rc == NW_OK ? 0 : -1; -} - -NwRcT s11_bearer_context_ie_get( - uint8_t ieType, uint8_t ieLength, uint8_t ieInstance, uint8_t *ieValue, void *arg) -{ - bearer_to_create_t *bearer_to_create = (bearer_to_create_t *)arg; - uint8_t read = 0; - NwRcT rc; - - DevAssert(bearer_to_create != NULL); - - while (ieLength > read) { - NwGtpv2cIeTlvT *ie_p; - - ie_p = (NwGtpv2cIeTlvT*)&ieValue[read]; - - switch (ie_p->t) { - case NW_GTPV2C_IE_EBI: - rc = s11_ebi_ie_get(ie_p->t, ie_p->l, ie_p->i, - &ieValue[read + sizeof(NwGtpv2cIeTlvT)], - &bearer_to_create->eps_bearer_id); - DevAssert(NW_OK == rc); - break; - - case NW_GTPV2C_IE_BEARER_LEVEL_QOS: - break; - - default: - S11_ERROR("Received unexpected IE %u\n", ie_p->t); - return NW_GTPV2C_IE_INCORRECT; - } - - read += (ntohs(ie_p->l) + sizeof(NwGtpv2cIeTlvT)); - } - - return NW_OK; -} - -int s11_bearer_context_to_create_ie_set( - NwGtpv2cMsgHandleT *msg, const bearer_to_create_t *bearer_to_create) -{ - NwRcT rc; - - DevAssert(msg != NULL); - DevAssert(bearer_to_create != NULL); - - /* Start section for grouped IE: bearer context to create */ - rc = nwGtpv2cMsgGroupedIeStart(*msg, NW_GTPV2C_IE_BEARER_CONTEXT, - NW_GTPV2C_IE_INSTANCE_ZERO); - DevAssert(NW_OK == rc); - - s11_ebi_ie_set(msg, bearer_to_create->eps_bearer_id); - - /* End section for grouped IE: bearer context to create */ - rc = nwGtpv2cMsgGroupedIeEnd(*msg); - DevAssert(NW_OK == rc); - return 0; -} - -NwRcT s11_bearer_context_to_modifiy_ie_get( - uint8_t ieType, uint8_t ieLength, uint8_t ieInstance, uint8_t *ieValue, void *arg) -{ - bearer_context_to_modify_t *bearer_to_modify = (bearer_context_to_modify_t *)arg; - uint8_t read = 0; - NwRcT rc; - - DevAssert(bearer_to_modify != NULL); - - while (ieLength > read) { - NwGtpv2cIeTlvT *ie_p; - - ie_p = (NwGtpv2cIeTlvT*)&ieValue[read]; - - switch (ie_p->t) { - case NW_GTPV2C_IE_EBI: - rc = s11_ebi_ie_get(ie_p->t, ie_p->l, ie_p->i, - &ieValue[read + sizeof(NwGtpv2cIeTlvT)], - &bearer_to_modify->eps_bearer_id); - DevAssert(NW_OK == rc); - break; - - case NW_GTPV2C_IE_FTEID: - rc = s11_fteid_ie_get(ie_p->t, ie_p->l, ie_p->i, - &ieValue[read + sizeof(NwGtpv2cIeTlvT)], - &bearer_to_modify->s1_eNB_fteid); - break; - - default: - S11_ERROR("Received unexpected IE %u\n", ie_p->t); - return NW_GTPV2C_IE_INCORRECT; - } - - read += (ntohs(ie_p->l) + sizeof(NwGtpv2cIeTlvT)); - } - - return NW_OK; -} - -NwRcT s11_bearer_context_created_ie_get( - uint8_t ieType, uint8_t ieLength, uint8_t ieInstance, uint8_t *ieValue, void *arg) -{ - bearer_context_created_t *bearer_created = (bearer_context_created_t *)arg; - uint8_t read = 0; - NwRcT rc; - - DevAssert(bearer_created != NULL); - - while (ieLength > read) { - NwGtpv2cIeTlvT *ie_p; - - ie_p = (NwGtpv2cIeTlvT*)&ieValue[read]; - - switch (ie_p->t) { - case NW_GTPV2C_IE_EBI: - rc = s11_ebi_ie_get(ie_p->t, ie_p->l, ie_p->i, - &ieValue[read + sizeof(NwGtpv2cIeTlvT)], - &bearer_created->eps_bearer_id); - DevAssert(NW_OK == rc); - break; - - case NW_GTPV2C_IE_FTEID: - rc = s11_fteid_ie_get(ie_p->t, ie_p->l, ie_p->i, - &ieValue[read + sizeof(NwGtpv2cIeTlvT)], - &bearer_created->s1u_sgw_fteid); - break; - - case NW_GTPV2C_IE_CAUSE: - rc = s11_cause_ie_get(ie_p->t, ie_p->l, ie_p->i, - &ieValue[read + sizeof(NwGtpv2cIeTlvT)], - &bearer_created->cause); - break; - - default: - S11_ERROR("Received unexpected IE %u\n", ie_p->t); - return NW_GTPV2C_IE_INCORRECT; - } - - read += (ntohs(ie_p->l) + sizeof(NwGtpv2cIeTlvT)); - } - - return NW_OK; -} - -int s11_bearer_context_created_ie_set( - NwGtpv2cMsgHandleT *msg, const bearer_context_created_t *bearer) -{ - NwRcT rc; - - DevAssert(msg != NULL); - DevAssert(bearer != NULL); - - /* Start section for grouped IE: bearer context created */ - rc = nwGtpv2cMsgGroupedIeStart(*msg, NW_GTPV2C_IE_BEARER_CONTEXT, - NW_GTPV2C_IE_INSTANCE_ZERO); - DevAssert(NW_OK == rc); - - s11_ebi_ie_set(msg, bearer->eps_bearer_id); - - rc = nwGtpv2cMsgAddIeCause(*msg, NW_GTPV2C_IE_INSTANCE_ZERO, bearer->cause, - 0, 0, 0); - DevAssert(NW_OK == rc); - - rc = nwGtpv2cMsgAddIeFteid(*msg, NW_GTPV2C_IE_INSTANCE_ZERO, - bearer->s1u_sgw_fteid.interface_type, - bearer->s1u_sgw_fteid.teid, - bearer->s1u_sgw_fteid.ipv4 ? htonl(bearer->s1u_sgw_fteid.ipv4_address) : 0, - bearer->s1u_sgw_fteid.ipv6 ? (uint8_t*)bearer->s1u_sgw_fteid.ipv6_address : NULL); - DevAssert(NW_OK == rc); - - /* End section for grouped IE: bearer context created */ - rc = nwGtpv2cMsgGroupedIeEnd(*msg); - DevAssert(NW_OK == rc); - - return 0; -} - -/* This IE shall be included in the E-UTRAN initial attach, - * PDP Context Activation and UE Requested PDN connectivity procedures. - * This IE denotes the most stringent restriction as required - * by any already active bearer context. If there are no already active bearer - * contexts, this value is set to the least restrictive type. - */ -int s11_apn_restriction_ie_set( - NwGtpv2cMsgHandleT *msg, const uint8_t apn_restriction) -{ - NwRcT rc; - - DevAssert(msg != NULL); - - rc = nwGtpv2cMsgAddIe(*msg, NW_GTPV2C_IE_APN_RESTRICTION, 1, 0, - (uint8_t *)&apn_restriction); - DevAssert(NW_OK == rc); - - return 0; -} - -NwRcT s11_serving_network_ie_get( - uint8_t ieType, uint8_t ieLength, uint8_t ieInstance, uint8_t *ieValue, void *arg) -{ - ServingNetwork_t *serving_net = (ServingNetwork_t *)arg; - - DevAssert(serving_net != NULL); - - serving_net->mcc[1] = (ieValue[0] & 0xF0) >> 4; - serving_net->mcc[0] = (ieValue[0] & 0x0F); - serving_net->mcc[2] = (ieValue[1] & 0x0F); - - if ((ieValue[1] & 0xF0) == 0xF0) { - /* Two digits MNC */ - serving_net->mnc[0] = 0; - serving_net->mnc[2] = (ieValue[2] & 0xF0) >> 4; - serving_net->mnc[1] = (ieValue[2] & 0x0F); - } else { - serving_net->mnc[0] = (ieValue[1] & 0xF0) >> 4; - serving_net->mnc[2] = (ieValue[2] & 0xF0) >> 4; - serving_net->mnc[1] = (ieValue[2] & 0x0F); - } - - S11_DEBUG("\t- Serving network %d.%d\n", - serving_net->mcc[0] * 100 + serving_net->mcc[1] * 10 - + serving_net->mcc[2], - serving_net->mnc[0] * 100 + serving_net->mnc[1] * 10 - + serving_net->mnc[2]); - - return NW_OK; -} - -int s11_serving_network_ie_set( - NwGtpv2cMsgHandleT *msg, - const ServingNetwork_t *serving_network) -{ - NwRcT rc; - uint8_t value[3]; - - DevAssert(msg != NULL); - DevAssert(serving_network != NULL); - - /* MCC Decimal | MCC Hundreds */ - value[0] = ((serving_network->mcc[1] & 0x0F) << 4) | - (serving_network->mcc[2] & 0x0F); - value[1] = serving_network->mcc[0] & 0x0F; - - if ((serving_network->mnc[0] & 0xF) == 0xF) { - /* Only two digits */ - value[1] |= 0xF0; - value[2] = ((serving_network->mnc[2] & 0x0F) << 4) | - (serving_network->mnc[1] & 0x0F); - } else { - value[1] |= (serving_network->mnc[2] & 0x0F) << 4; - value[2] = ((serving_network->mnc[1] & 0x0F) << 4) | - (serving_network->mnc[0] & 0x0F); - } - - rc = nwGtpv2cMsgAddIe(*msg, NW_GTPV2C_IE_SERVING_NETWORK, 3, 0, value); - DevAssert(NW_OK == rc); - - return 0; -} - -NwRcT s11_fteid_ie_get( - uint8_t ieType, uint8_t ieLength, uint8_t ieInstance, uint8_t *ieValue, void *arg) -{ - uint8_t offset = 0; - FTeid_t *fteid = (FTeid_t *)arg; - - DevAssert(fteid != NULL); - - fteid->ipv4 = (ieValue[0] & 0x80) >> 7; - fteid->ipv6 = (ieValue[0] & 0x40) >> 6; - - fteid->interface_type = ieValue[0] & 0x1F; - S11_DEBUG("\t- F-TEID type %d\n", fteid->interface_type); - - /* Copy the TEID or GRE key */ - fteid->teid = ntoh_int32_buf(&ieValue[1]); - - S11_DEBUG("\t- TEID/GRE %08x\n", fteid->teid); - - if (fteid->ipv4 == 1) { - /* IPv4 present: copy the 4 bytes */ - memcpy(&fteid->ipv4_address, &ieValue[5], 4); - offset = 4; - - S11_DEBUG("\t- IPv4 addr "IPV4_ADDR"\n", - IPV4_ADDR_FORMAT(fteid->ipv4_address)); - } - - if (fteid->ipv6 == 1) { - char ipv6_ascii[40]; - /* IPv6 present: copy the 16 bytes - * WARNING: if Ipv4 is present, 4 bytes of offset should be applied - */ - memcpy(fteid->ipv6_address, &ieValue[5 + offset], 16); - - inet_ntop(AF_INET6, fteid->ipv6_address, ipv6_ascii, 40); - S11_DEBUG("\t- IPv6 addr %s\n", ipv6_ascii); - } - - return NW_OK; -} - -NwRcT s11_paa_ie_get( - uint8_t ieType, uint8_t ieLength, uint8_t ieInstance, uint8_t *ieValue, void *arg) -{ - uint8_t offset = 0; - PAA_t *paa = (PAA_t *)arg; - - DevAssert(paa != NULL); - - paa->pdn_type = ieValue[0] & 0x07; - S11_DEBUG("\t- PAA type %d\n", paa->pdn_type); - - if (paa->pdn_type & 0x2) { - char ipv6_ascii[40]; - /* IPv6 present: copy the 16 bytes - * WARNING: if both ipv4 and ipv6 are present, - * 17 bytes of offset should be applied for ipv4 - * NOTE: an ipv6 prefix length is prepend - * NOTE: in Rel.8 the prefix length has a default value of /64 - */ - paa->ipv6_prefix_length = ieValue[1]; - memcpy(paa->ipv6_address, &ieValue[2], 16); - - inet_ntop(AF_INET6, paa->ipv6_address, ipv6_ascii, 40); - S11_DEBUG("\t- IPv6 addr %s/%u\n", ipv6_ascii, paa->ipv6_prefix_length); - } - - if (paa->pdn_type == 3) { - offset = 17; - } - - if (paa->pdn_type & 0x1) { - memcpy(paa->ipv4_address, &ieValue[1 + offset], 4); - - S11_DEBUG("\t- IPv4 addr "IPV4_ADDR"\n", - paa->ipv4_address[0], paa->ipv4_address[1], - paa->ipv4_address[2], paa->ipv4_address[3]); - } - - paa->pdn_type -= 1; - return NW_OK; -} - -int s11_paa_ie_set(NwGtpv2cMsgHandleT *msg, const PAA_t *paa) -{ - /* ipv4 address = 4 + ipv6 address = 16 + ipv6 prefix length = 1 - * + pdn_type = 1 - * = maximum of 22 bytes - */ - uint8_t temp[22]; - uint8_t pdn_type; - uint8_t offset = 0; - NwRcT rc; - - DevAssert(paa != NULL); - - pdn_type = paa->pdn_type + 1; - - temp[offset] = pdn_type; - offset++; - - if (pdn_type & 0x2) { - /* If ipv6 or ipv4v6 present */ - temp[1] = paa->ipv6_prefix_length; - memcpy(&temp[2], paa->ipv6_address, 16); - offset += 17; - } - - if (pdn_type & 0x1) { - memcpy(&temp[offset], paa->ipv4_address, 4); - offset += 4; - } - - rc = nwGtpv2cMsgAddIe(*msg, NW_GTPV2C_IE_PAA, offset, 0, - temp); - DevAssert(NW_OK == rc); - - return 0; -} - -/* The encoding of the APN shall follow the Name Syntax defined in RFC 2181, - * RFC 1035 and RFC 1123. The APN consists of one or more labels. Each label - * is coded as a one octet length field followed by that number of octets - * coded as 8 bit ASCII characters. Following RFC 1035 the labels shall consist - * only of the alphabetic characters (A-Z and a-z), digits (0-9) - * and the hyphen (-). - */ -NwRcT s11_apn_ie_get( - uint8_t ieType, uint8_t ieLength, uint8_t ieInstance, uint8_t *ieValue, void *arg) -{ - uint8_t read = 1; - uint8_t word_length; - char *apn = (char *)arg; - - DevAssert(apn != NULL); - - DevCheck(ieLength <= APN_MAX_LENGTH, ieLength, APN_MAX_LENGTH, 0); - - word_length = ieValue[0]; - - while (read < ieLength) { - if (word_length > 0) { - apn[read - 1] = ieValue[read]; - word_length--; - } else { - /* This is not an alphanumeric character */ - word_length = ieValue[read]; - /* Replace the length attribute by '.' */ - apn[read - 1] = '.'; - } - - read ++; - } - - apn[read - 1] = '\0'; - - S11_DEBUG("\t- APN %s\n", apn); - - return NW_OK; -} - -int s11_apn_ie_set(NwGtpv2cMsgHandleT *msg, const char *apn) -{ - NwRcT rc; - uint8_t *value; - uint8_t apn_length; - uint8_t offset = 0; - uint8_t *last_size; - uint8_t word_length = 0; - - DevAssert(apn != NULL); - DevAssert(msg != NULL); - - apn_length = strlen(apn); - - value = calloc(apn_length + 1, sizeof(uint8_t)); - last_size = &value[0]; - - while (apn[offset]) { - /* We replace the . by the length of the word */ - if (apn[offset] == '.') { - *last_size = word_length; - word_length = 0; - last_size = &value[offset + 1]; - } else { - word_length++; - value[offset + 1] = apn[offset]; - } - - offset++; - } - - *last_size = word_length; - - rc = nwGtpv2cMsgAddIe(*msg, NW_GTPV2C_IE_APN, apn_length + 1, 0, value); - DevAssert(NW_OK == rc); - - free(value); - - return 0; -} - -NwRcT s11_ambr_ie_get( - uint8_t ieType, uint8_t ieLength, uint8_t ieInstance, uint8_t *ieValue, void *arg) -{ - ambr_t *ambr = (ambr_t *)arg; - - DevAssert(ambr != NULL); - - ambr->br_ul = ntoh_int32_buf(&ieValue[0]); - ambr->br_dl = ntoh_int32_buf(&ieValue[4]); - - S11_DEBUG("\t- AMBR UL %"PRIu64"\n", ambr->br_ul); - S11_DEBUG("\t- AMBR DL %"PRIu64"\n", ambr->br_dl); - - return NW_OK; -} - -NwRcT s11_uli_ie_get( - uint8_t ieType, uint8_t ieLength, uint8_t ieInstance, uint8_t *ieValue, void *arg) -{ - Uli_t *uli = (Uli_t *)arg; - - DevAssert(uli != NULL); - - uli->present = ieValue[0]; - - if (uli->present & ULI_CGI) { - - } - - return NW_OK; -} - -int s11_bearer_qos_ie_set(NwGtpv2cMsgHandleT *msg, const BearerQOS_t *bearer_qos) -{ - NwRcT rc; - uint8_t value[18]; - - DevAssert(msg != NULL); - DevAssert(bearer_qos != NULL); - - value[0] = (bearer_qos->pci << 6) | (bearer_qos->pl << 2) | (bearer_qos->pvi); - value[1] = bearer_qos->qci; - - /* TODO: check endianness */ - memcpy(&value[2], &bearer_qos->mbr.br_ul, 4); - memcpy(&value[6], &bearer_qos->mbr.br_dl, 4); - memcpy(&value[10], &bearer_qos->gbr.br_ul, 4); - memcpy(&value[14], &bearer_qos->gbr.br_dl, 4); - - rc = nwGtpv2cMsgAddIe(*msg, NW_GTPV2C_IE_BEARER_LEVEL_QOS, 18, 0, value); - DevAssert(NW_OK == rc); - - return 0; -} - -NwRcT s11_ip_address_ie_get( - uint8_t ieType, uint8_t ieLength, uint8_t ieInstance, uint8_t *ieValue, void *arg) -{ - gtp_ip_address_t *ip_address = (gtp_ip_address_t *)arg; - - DevAssert(ip_address != NULL); - - if (ieLength == 4) { - /* This is an IPv4 Address */ - ip_address->present = GTP_IP_ADDR_v4; - memcpy(ip_address->address.v4, ieValue, 4); - } else if (ieLength == 16) { - /* This is an IPv6 Address */ - ip_address->present = GTP_IP_ADDR_v6; - memcpy(ip_address->address.v6, ieValue, 16); - } else { - /* Length doesn't lie in possible values */ - return NW_GTPV2C_IE_INCORRECT; - } - - return NW_OK; -} - -int s11_ip_address_ie_set(NwGtpv2cMsgHandleT *msg, - const gtp_ip_address_t *ip_address) -{ - return 0; -} - -NwRcT s11_delay_value_ie_get( - uint8_t ieType, uint8_t ieLength, uint8_t ieInstance, uint8_t *ieValue, void *arg) -{ - DelayValue_t *delay_value = (DelayValue_t *)arg; - - DevAssert(arg != NULL); - - if (ieLength != 1) { - return NW_GTPV2C_IE_INCORRECT; - } - - *delay_value = ieValue[0]; - - S11_DEBUG("\t - Delay Value %u\n", *delay_value); - - return NW_OK; -} - -int s11_delay_value_ie_set(NwGtpv2cMsgHandleT *msg, - const DelayValue_t *delay_value) -{ - uint8_t value; - NwRcT rc; - - DevAssert(msg != NULL); - DevAssert(delay_value != NULL); - - value = *delay_value; - - rc = nwGtpv2cMsgAddIe(*msg, NW_GTPV2C_IE_DELAY_VALUE, 1, 0, (uint8_t*)&value); - DevAssert(NW_OK == rc); - - return 0; -} - -NwRcT s11_ue_time_zone_ie_get( - uint8_t ieType, uint8_t ieLength, uint8_t ieInstance, uint8_t *ieValue, void *arg) -{ - UETimeZone_t *ue_time_zone = (UETimeZone_t *)arg; - - DevAssert(ue_time_zone != NULL); - - if (ieLength != 2) { - return NW_GTPV2C_IE_INCORRECT; - } - - ue_time_zone->time_zone = ieValue[0]; - ue_time_zone->daylight_saving_time = ieValue[1] & 0x03; - - S11_DEBUG("\t - Time Zone %u\n", ue_time_zone->time_zone); - S11_DEBUG("\t - Daylight SVT %u\n", ue_time_zone->daylight_saving_time); - - return NW_OK; -} - -int s11_ue_time_zone_ie_set(NwGtpv2cMsgHandleT *msg, - const UETimeZone_t *ue_time_zone) -{ - uint8_t value[2]; - NwRcT rc; - - DevAssert(msg != NULL); - DevAssert(ue_time_zone != NULL); - - value[0] = ue_time_zone->time_zone; - value[1] = ue_time_zone->daylight_saving_time; - - rc = nwGtpv2cMsgAddIe(*msg, NW_GTPV2C_IE_UE_TIME_ZONE, 2, 0, value); - DevAssert(NW_OK == rc); - - return 0; -} - -NwRcT s11_target_identification_ie_get( - uint8_t ieType, uint8_t ieLength, uint8_t ieInstance, uint8_t *ieValue, void *arg) -{ - target_identification_t *target_identification = (target_identification_t *)arg; - - DevAssert(target_identification != NULL); - - target_identification->target_type = ieValue[0]; - - switch (target_identification->target_type) { - case TARGET_ID_RNC_ID: { - target_identification->target_id.rnc_id.lac = (ieValue[4] << 8) | - ieValue[5]; - target_identification->target_id.rnc_id.rac = ieValue[6]; - - if (ieLength == 11) { - /* Extended RNC id */ - target_identification->target_id.rnc_id.rnc_id = (ieValue[7] << 24) | - (ieValue[8] << 16) | (ieValue[9] << 8) | (ieValue[10]); - } else if (ieLength == 9) { - /* Normal RNC id */ - target_identification->target_id.rnc_id.rnc_id = (ieValue[7] << 8) | - ieValue[8]; - } else { - /* This case is not possible */ - return NW_GTPV2C_IE_INCORRECT; - } - - S11_DEBUG("\t\t- LAC 0x%04x\n", target_identification->target_id.rnc_id.lac); - S11_DEBUG("\t\t- RAC 0x%02x\n", target_identification->target_id.rnc_id.rac); - S11_DEBUG("\t\t- RNC 0x%08x\n", target_identification->target_id.rnc_id.rnc_id); - } - break; - - case TARGET_ID_MACRO_ENB_ID: { - if (ieLength != 9) { - return NW_GTPV2C_IE_INCORRECT; - } - - target_identification->target_id.macro_enb_id.enb_id = ((ieValue[4] & 0x0F) << 16) | - (ieValue[5] << 8) | ieValue[6]; - target_identification->target_id.macro_enb_id.tac = (ieValue[7] << 8) | ieValue[8]; - S11_DEBUG("\t\t- ENB Id 0x%06x\n", target_identification->target_id.macro_enb_id.enb_id); - S11_DEBUG("\t\t- TAC 0x%04x\n", target_identification->target_id.macro_enb_id.tac); - } - break; - - case TARGET_ID_HOME_ENB_ID: { - if (ieLength != 10) { - return NW_GTPV2C_IE_INCORRECT; - } - - target_identification->target_id.home_enb_id.enb_id = ((ieValue[4] & 0x0F) << 14) | - (ieValue[5] << 16) | (ieValue[6] << 8) | ieValue[7]; - target_identification->target_id.home_enb_id.tac = (ieValue[8] << 8) | ieValue[9]; - S11_DEBUG("\t\t- ENB Id 0x%07x\n", target_identification->target_id.home_enb_id.enb_id); - S11_DEBUG("\t\t- TAC 0x%04x\n", target_identification->target_id.home_enb_id.tac); - } - break; - - default: - return NW_GTPV2C_IE_INCORRECT; - } - - return NW_OK; -} - -NwRcT s11_bearer_flags_ie_get( - uint8_t ieType, uint8_t ieLength, uint8_t ieInstance, uint8_t *ieValue, void *arg) -{ - bearer_flags_t *bearer_flags = (bearer_flags_t *)arg; - - DevAssert(arg != NULL); - - if (ieLength != 1) { - return NW_GTPV2C_IE_INCORRECT; - } - - bearer_flags->ppc = ieValue[0] & 0x01; - bearer_flags->vb = ieValue[0] & 0x02; - - return NW_OK; -} - -int s11_bearer_flags_ie_set(NwGtpv2cMsgHandleT *msg, - const bearer_flags_t *bearer_flags) -{ - NwRcT rc; - uint8_t value; - - DevAssert(msg != NULL); - DevAssert(bearer_flags != NULL); - - value = (bearer_flags->vb << 1) | bearer_flags->ppc; - - rc = nwGtpv2cMsgAddIe(*msg, NW_GTPV2C_IE_BEARER_FLAGS, 1, 0, (uint8_t*)&value); - DevAssert(NW_OK == rc); - - return 0; -} - -NwRcT s11_indication_flags_ie_get( - uint8_t ieType, uint8_t ieLength, uint8_t ieInstance, uint8_t *ieValue, void *arg) -{ - indication_flags_t *indication_flags = (indication_flags_t*)arg; - - DevAssert(indication_flags != NULL); - - if (ieLength < 3) { - return NW_GTPV2C_IE_INCORRECT; - } - - *indication_flags = ieValue[0] | (ieValue[1] << 8) | (ieValue[2] << 16); - - S11_DEBUG("\t- Indication Flags %06x\n", *indication_flags); - - return NW_OK; -} - -NwRcT s11_fqcsid_ie_get( - uint8_t ieType, uint8_t ieLength, uint8_t ieInstance, uint8_t *ieValue, void *arg) -{ - FQ_CSID_t *fq_csid = (FQ_CSID_t *)arg; - - DevAssert(fq_csid != NULL); - - fq_csid->node_id_type = (ieValue[0] & 0xF0) >> 4; - S11_DEBUG("\t- FQ-CSID type %u\n", fq_csid->node_id_type); - - /* NOTE: Values of Number of CSID other than 1 are only employed in the - * Delete PDN Connection Set Request and Response. - */ - if ((ieValue[0] & 0x0F) != 1) { - return NW_GTPV2C_IE_INCORRECT; - } - - switch (fq_csid->node_id_type) { - case GLOBAL_UNICAST_IPv4: { - if (ieLength != 7) { - return NW_GTPV2C_IE_INCORRECT; - } - - fq_csid->node_id.unicast_ipv4 = (ieValue[1] << 24) | - (ieValue[2] << 16) | (ieValue[3] << 8) | (ieValue[4]); - fq_csid->csid = (ieValue[5] << 8) | ieValue[6]; - - S11_DEBUG("\t- v4 address ["IPV4_ADDR"]\n", - IPV4_ADDR_FORMAT(fq_csid->node_id.unicast_ipv4)); - } - break; - - case GLOBAL_UNICAST_IPv6: { - char ipv6[40]; - - if (ieLength != 19) { - return NW_GTPV2C_IE_INCORRECT; - } - - memcpy(fq_csid->node_id.unicast_ipv6, &ieValue[1], 16); - fq_csid->csid = (ieValue[17] << 8) | ieValue[18]; - - /* Convert the ipv6 to printable string */ - inet_ntop(AF_INET6, fq_csid->node_id.unicast_ipv6, ipv6, 40); - - S11_DEBUG("\t- v6 address [%s]\n", fq_csid->node_id.unicast_ipv6); - } - break; - - default: - return NW_GTPV2C_IE_INCORRECT; - } - - S11_DEBUG("\t- CSID 0x%04x\n", fq_csid->csid); - return NW_OK; -} diff --git a/openair-cn/S11/s11_ie_formatter.h b/openair-cn/S11/s11_ie_formatter.h deleted file mode 100644 index 0d820b3462..0000000000 --- a/openair-cn/S11/s11_ie_formatter.h +++ /dev/null @@ -1,208 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -#ifndef S11_IE_FORMATTER_H_ -#define S11_IE_FORMATTER_H_ - -/* Imsi Information Element - * 3GPP TS.29.274 #8.3 - * NOTE: Imsi is TBCD coded - * octet 5 | Number digit 2 | Number digit 1 | - * octet n+4 | Number digit m | Number digit m-1 | - */ -NwRcT s11_imsi_ie_get( - uint8_t ieType, uint8_t ieLength, uint8_t ieInstance, uint8_t *ieValue, void *arg); - -int s11_imsi_ie_set(NwGtpv2cMsgHandleT *msg, const Imsi_t *imsi); - -NwRcT s11_msisdn_ie_get( - uint8_t ieType, uint8_t ieLength, uint8_t ieInstance, uint8_t *ieValue, void *arg); - -/* PDN Type Information Element - * 3GPP TS 29.274 #8.34 - * PDN type: - * * 1 = IPv4 - * * 2 = IPv6 - * * 3 = IPv4v6 - */ -NwRcT s11_pdn_type_ie_get( - uint8_t ieType, uint8_t ieLength, uint8_t ieInstance, uint8_t *ieValue, void *arg); - -int s11_pdn_type_ie_set(NwGtpv2cMsgHandleT *msg, const pdn_type_t *pdn_type); - -/* RAT type Information Element - * WARNING: the RAT type used in MME and S/P-GW is not the same as the one - * for S11 interface defined in 3GPP TS 29.274 #8.17. - */ -NwRcT s11_rat_type_ie_get( - uint8_t ieType, uint8_t ieLength, uint8_t ieInstance, uint8_t *ieValue, void *arg); - -int s11_rat_type_ie_set(NwGtpv2cMsgHandleT *msg, const rat_type_t *rat_type); - -/* EPS Bearer Id Information Element - * 3GPP TS 29.274 #8.8 - */ -NwRcT s11_ebi_ie_get( - uint8_t ieType, uint8_t ieLength, uint8_t ieInstance, uint8_t *ieValue, void *arg); - -int s11_ebi_ie_set(NwGtpv2cMsgHandleT *msg, const unsigned ebi); - -/* Bearer Contexts to Create Information Element as part of Create Session Request - * 3GPP TS 29.274 Table 7.2.1-2. - */ -NwRcT s11_bearer_context_ie_get( - uint8_t ieType, uint8_t ieLength, uint8_t ieInstance, uint8_t *ieValue, void *arg); - -int s11_bearer_context_to_create_ie_set( - NwGtpv2cMsgHandleT *msg, const bearer_to_create_t *bearer_to_create); - -NwRcT s11_bearer_context_to_modifiy_ie_get( - uint8_t ieType, uint8_t ieLength, uint8_t ieInstance, uint8_t *ieValue, void *arg); - -/* EPS Bearer Id Information Element - * 3GPP TS 29.274 #8.8 - * ebi is 4 bits long - */ -int s11_ebi_ie_set(NwGtpv2cMsgHandleT *msg, const unsigned ebi); - -/* Cause Information Element */ -NwRcT s11_cause_ie_get( - uint8_t ieType, uint8_t ieLength, uint8_t ieInstance, uint8_t *ieValue, void *arg); - -int s11_cause_ie_set(NwGtpv2cMsgHandleT *msg, - const gtp_cause_t *cause); - -/* Bearer Context Created grouped Information Element */ -NwRcT s11_bearer_context_created_ie_get( - uint8_t ieType, uint8_t ieLength, uint8_t ieInstance, uint8_t *ieValue, void *arg); - -int s11_bearer_context_created_ie_set( - NwGtpv2cMsgHandleT *msg, const bearer_context_created_t *bearer); - -/* Serving Network Information Element - * 3GPP TS 29.274 #8.18 - */ -NwRcT s11_serving_network_ie_get( - uint8_t ieType, uint8_t ieLength, uint8_t ieInstance, uint8_t *ieValue, void *arg); - -int s11_serving_network_ie_set( - NwGtpv2cMsgHandleT *msg, - const ServingNetwork_t *serving_network); - -NwRcT s11_fteid_ie_get( - uint8_t ieType, uint8_t ieLength, uint8_t ieInstance, uint8_t *ieValue, void *arg); - -/* PDN Address Allocation Information Element */ -NwRcT s11_paa_ie_get( - uint8_t ieType, uint8_t ieLength, uint8_t ieInstance, uint8_t *ieValue, void *arg); - -int s11_paa_ie_set(NwGtpv2cMsgHandleT *msg, const PAA_t *paa); - -/* Access Point Name Information Element - * 3GPP TS 29.274 #8.6 - * NOTE: The APN field is not encoded as a dotted string as commonly used in - * documentation. - * The encoding of the APN field follows 3GPP TS 23.003 subclause 9.1 - */ -NwRcT s11_apn_ie_get( - uint8_t ieType, uint8_t ieLength, uint8_t ieInstance, uint8_t *ieValue, void *arg); - -int s11_apn_ie_set(NwGtpv2cMsgHandleT *msg, const char *apn); - -NwRcT s11_ambr_ie_get( - uint8_t ieType, uint8_t ieLength, uint8_t ieInstance, uint8_t *ieValue, void *arg); - -NwRcT s11_mei_ie_get( - uint8_t ieType, uint8_t ieLength, uint8_t ieInstance, uint8_t *ieValue, void *arg); - -NwRcT s11_uli_ie_get( - uint8_t ieType, uint8_t ieLength, uint8_t ieInstance, uint8_t *ieValue, void *arg); - -/* APN restrtiction Information Element */ -int s11_apn_restriction_ie_set( - NwGtpv2cMsgHandleT *msg, const uint8_t apn_restriction); - -/* Bearer level Qos Information Element - * 3GPP TS 29.274 #8.15 - */ -int s11_bearer_qos_ie_set(NwGtpv2cMsgHandleT *msg, const BearerQOS_t *bearer_qos); - -/* IP address Information Element - * 3GPP TS 29.274 #8.9 - */ -NwRcT s11_ip_address_ie_get( - uint8_t ieType, uint8_t ieLength, uint8_t ieInstance, uint8_t *ieValue, void *arg); - -int s11_ip_address_ie_set(NwGtpv2cMsgHandleT *msg, - const gtp_ip_address_t *ip_address); - -/* Delay Value Information Element - * 3GPP TS 29.274 #8.27 - */ -NwRcT s11_delay_value_ie_get( - uint8_t ieType, uint8_t ieLength, uint8_t ieInstance, uint8_t *ieValue, void *arg); - -int s11_delay_value_ie_set(NwGtpv2cMsgHandleT *msg, - const DelayValue_t *delay_value); - -/* UE Time Zone Information Element - * 3GPP TS 29.274 #8.44 - */ -NwRcT s11_ue_time_zone_ie_get( - uint8_t ieType, uint8_t ieLength, uint8_t ieInstance, uint8_t *ieValue, void *arg); - -int s11_ue_time_zone_ie_set(NwGtpv2cMsgHandleT *msg, - const UETimeZone_t *ue_time_zone); - -/* Target Identification Information Element - * 3GPP TS 29.274 #8.51 - */ -NwRcT s11_target_identification_ie_get( - uint8_t ieType, uint8_t ieLength, uint8_t ieInstance, uint8_t *ieValue, void *arg); - -/* Bearer Flags Information Element - * 3GPP TS 29.274 #8.32 - */ -NwRcT s11_bearer_flags_ie_get( - uint8_t ieType, uint8_t ieLength, uint8_t ieInstance, uint8_t *ieValue, void *arg); - -int s11_bearer_flags_ie_set(NwGtpv2cMsgHandleT *msg, - const bearer_flags_t *bearer_flags); - -NwRcT s11_indication_flags_ie_get( - uint8_t ieType, uint8_t ieLength, uint8_t ieInstance, uint8_t *ieValue, void *arg); - -/* FQ-CSID Information Element - * 3GPP TS 29.274 #8.62 - */ - -NwRcT s11_fqcsid_ie_get( - uint8_t ieType, uint8_t ieLength, uint8_t ieInstance, uint8_t *ieValue, void *arg); - -#endif /* S11_IE_FORMATTER_H_ */ diff --git a/openair-cn/S11/s11_mme.h b/openair-cn/S11/s11_mme.h deleted file mode 100644 index 0d5f817fae..0000000000 --- a/openair-cn/S11/s11_mme.h +++ /dev/null @@ -1,34 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -#ifndef S11_MME_H_ -#define S11_MME_H_ - -int s11_mme_init(const mme_config_t *mme_config); - -#endif /* S11_MME_H_ */ diff --git a/openair-cn/S11/s11_mme_peer_manager.c b/openair-cn/S11/s11_mme_peer_manager.c deleted file mode 100644 index 5355a8adbf..0000000000 --- a/openair-cn/S11/s11_mme_peer_manager.c +++ /dev/null @@ -1,32 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -#include <stdlib.h> -#include <stdio.h> - - diff --git a/openair-cn/S11/s11_mme_session_manager.c b/openair-cn/S11/s11_mme_session_manager.c deleted file mode 100644 index 5adf2c492b..0000000000 --- a/openair-cn/S11/s11_mme_session_manager.c +++ /dev/null @@ -1,223 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -#include <stdlib.h> -#include <stdio.h> -#include <string.h> - -#include "assertions.h" -#include "intertask_interface.h" - -#include "NwGtpv2c.h" -#include "NwGtpv2cIe.h" -#include "NwGtpv2cMsg.h" -#include "NwGtpv2cMsgParser.h" - -#include "s11_common.h" -#include "s11_mme_session_manager.h" -#include "s11_ie_formatter.h" - -int s11_mme_create_session_request(NwGtpv2cStackHandleT *stack_p, - SgwCreateSessionRequest *create_session_p) -{ - NwGtpv2cUlpApiT ulp_req; - - NwRcT rc; - uint8_t restart_counter = 0; - - DevAssert(stack_p != NULL); - DevAssert(create_session_p != NULL); - - memset(&ulp_req, 0, sizeof(NwGtpv2cUlpApiT)); - - ulp_req.apiType = NW_GTPV2C_ULP_API_INITIAL_REQ; - - /* Prepare a new Create Session Request msg */ - rc = nwGtpv2cMsgNew(*stack_p, - NW_TRUE, - NW_GTP_CREATE_SESSION_REQ, - create_session_p->teid, - 0, - &(ulp_req.hMsg)); - - ulp_req.apiInfo.initialReqInfo.peerIp = create_session_p->peer_ip; - ulp_req.apiInfo.initialReqInfo.teidLocal = create_session_p->sender_fteid_for_cp.teid; - - /* Add recovery if contacting the peer for the first time */ - rc = nwGtpv2cMsgAddIe((ulp_req.hMsg), NW_GTPV2C_IE_RECOVERY, 1, 0, - (uint8_t*)&restart_counter); - DevAssert(NW_OK == rc); - - /* Putting the information Elements */ - s11_imsi_ie_set(&(ulp_req.hMsg), &create_session_p->imsi); - s11_rat_type_ie_set(&(ulp_req.hMsg), &create_session_p->rat_type); - s11_pdn_type_ie_set(&(ulp_req.hMsg), &create_session_p->pdn_type); - - /* Sender F-TEID for Control Plane (MME S11) */ - rc = nwGtpv2cMsgAddIeFteid((ulp_req.hMsg), NW_GTPV2C_IE_INSTANCE_ZERO, - S11_MME_GTP_C, - create_session_p->sender_fteid_for_cp.teid, - create_session_p->sender_fteid_for_cp.ipv4 ? - create_session_p->sender_fteid_for_cp.ipv4_address : 0, - create_session_p->sender_fteid_for_cp.ipv6 ? - create_session_p->sender_fteid_for_cp.ipv6_address : NULL); - /* The P-GW TEID should be present on the S11 interface. - * In case of an initial attach it should be set to 0... - */ - rc = nwGtpv2cMsgAddIeFteid((ulp_req.hMsg), NW_GTPV2C_IE_INSTANCE_ONE, - S5_S8_PGW_GTP_C, - create_session_p->pgw_address_for_cp.teid, - create_session_p->pgw_address_for_cp.ipv4 ? - create_session_p->pgw_address_for_cp.ipv4_address : 0, - create_session_p->pgw_address_for_cp.ipv6 ? - create_session_p->pgw_address_for_cp.ipv6_address : NULL); - - s11_apn_ie_set(&(ulp_req.hMsg), create_session_p->apn); - - s11_serving_network_ie_set(&(ulp_req.hMsg), &create_session_p->serving_network); - - s11_bearer_context_to_create_ie_set( - &(ulp_req.hMsg), &create_session_p->bearer_to_create); - - rc = nwGtpv2cProcessUlpReq(*stack_p, &ulp_req); - DevAssert(NW_OK == rc); - - return 0; -} - -int s11_mme_handle_create_session_response(NwGtpv2cStackHandleT *stack_p, - NwGtpv2cUlpApiT *pUlpApi) -{ - NwRcT rc = NW_OK; - uint8_t offendingIeType, offendingIeInstance; - uint16_t offendingIeLength; - - SgwCreateSessionResponse *create_session_resp_p; - MessageDef *message_p; - - NwGtpv2cMsgParserT *pMsgParser; - - DevAssert(stack_p != NULL); - - message_p = itti_alloc_new_message(TASK_S11, SGW_CREATE_SESSION_RESPONSE); - - create_session_resp_p = &message_p->ittiMsg.sgwCreateSessionResponse; - - /* Create a new message parser */ - rc = nwGtpv2cMsgParserNew(*stack_p, NW_GTP_CREATE_SESSION_RSP, - s11_ie_indication_generic, - NULL, &pMsgParser); - DevAssert(NW_OK == rc); - - /* Cause IE */ - rc = nwGtpv2cMsgParserAddIe(pMsgParser, - NW_GTPV2C_IE_CAUSE, - NW_GTPV2C_IE_INSTANCE_ZERO, - NW_GTPV2C_IE_PRESENCE_MANDATORY, - s11_cause_ie_get, - &create_session_resp_p->cause); - DevAssert(NW_OK == rc); - - /* Sender FTEID for CP IE */ - rc = nwGtpv2cMsgParserAddIe(pMsgParser, NW_GTPV2C_IE_FTEID, - NW_GTPV2C_IE_INSTANCE_ZERO, - NW_GTPV2C_IE_PRESENCE_CONDITIONAL, - s11_fteid_ie_get, - &create_session_resp_p->s11_sgw_teid); - DevAssert(NW_OK == rc); - - /* Sender FTEID for PGW S5/S8 IE */ - rc = nwGtpv2cMsgParserAddIe(pMsgParser, NW_GTPV2C_IE_FTEID, - NW_GTPV2C_IE_INSTANCE_ONE, - NW_GTPV2C_IE_PRESENCE_CONDITIONAL, - s11_fteid_ie_get, - &create_session_resp_p->s5_s8_pgw_teid); - DevAssert(NW_OK == rc); - - /* PAA IE */ - rc = nwGtpv2cMsgParserAddIe(pMsgParser, NW_GTPV2C_IE_PAA, - NW_GTPV2C_IE_INSTANCE_ZERO, - NW_GTPV2C_IE_PRESENCE_CONDITIONAL, - s11_paa_ie_get, - &create_session_resp_p->paa); - DevAssert(NW_OK == rc); - - /* Bearer Contexts Created IE */ - rc = nwGtpv2cMsgParserAddIe(pMsgParser, NW_GTPV2C_IE_BEARER_CONTEXT, - NW_GTPV2C_IE_INSTANCE_ZERO, - NW_GTPV2C_IE_PRESENCE_CONDITIONAL, - s11_bearer_context_created_ie_get, - &create_session_resp_p->bearer_context_created); - DevAssert(NW_OK == rc); - - /* Run the parser */ - rc = nwGtpv2cMsgParserRun(pMsgParser, - (pUlpApi->hMsg), - &offendingIeType, - &offendingIeInstance, - &offendingIeLength); - - if (rc != NW_OK) { - /* TODO: handle this case */ - itti_free(ITTI_MSG_ORIGIN_ID(message_p), message_p); - message_p = NULL; - - rc = nwGtpv2cMsgParserDelete(*stack_p, pMsgParser); - DevAssert(NW_OK == rc); - - rc = nwGtpv2cMsgDelete(*stack_p, (pUlpApi->hMsg)); - DevAssert(NW_OK == rc); - - return -1; - } - - rc = nwGtpv2cMsgParserDelete(*stack_p, pMsgParser); - DevAssert(NW_OK == rc); - - rc = nwGtpv2cMsgDelete(*stack_p, (pUlpApi->hMsg)); - DevAssert(NW_OK == rc); - - return itti_send_msg_to_task(TASK_MME_APP, INSTANCE_DEFAULT, message_p); -} - - -int s11_mme_release_access_bearers_request(NwGtpv2cStackHandleT *stack_p, - SgwReleaseAccessBearersRequest *release_access_bearers_p) -{ - NwGtpv2cUlpApiT ulp_req; - - NwRcT rc; - uint8_t restart_counter = 0; - - DevAssert(stack_p != NULL); - DevAssert(release_access_bearers_p != NULL); - - memset(&ulp_req, 0, sizeof(NwGtpv2cUlpApiT)); - - AssertFatal(0 == 1, "TODO s11_mme_release_access_bearers_request()"); -} diff --git a/openair-cn/S11/s11_mme_session_manager.h b/openair-cn/S11/s11_mme_session_manager.h deleted file mode 100644 index dd11f859bc..0000000000 --- a/openair-cn/S11/s11_mme_session_manager.h +++ /dev/null @@ -1,49 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -#ifndef S11_MME_SESSION_MANAGER_H_ -#define S11_MME_SESSION_MANAGER_H_ - -/* @brief Create a new Create Session Request and send it to provided S-GW. - */ -int s11_mme_create_session_request(NwGtpv2cStackHandleT *stack_p, - SgwCreateSessionRequest *create_session_p); - - -/* @brief Create a new Release Access Bearers Request and send it to provided S-GW. - */ -int s11_mme_release_access_bearers_request(NwGtpv2cStackHandleT *stack_p, - SgwReleaseAccessBearersRequest *release_access_bearers_p); - -/* @brief Handle a Create Session Response received from S-GW. - */ -int s11_mme_handle_create_session_response(NwGtpv2cStackHandleT *stack_p, - NwGtpv2cUlpApiT *pUlpApi); - -#endif /* S11_MME_SESSION_MANAGER_H_ */ diff --git a/openair-cn/S11/s11_mme_task.c b/openair-cn/S11/s11_mme_task.c deleted file mode 100644 index d2a52aff96..0000000000 --- a/openair-cn/S11/s11_mme_task.c +++ /dev/null @@ -1,322 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -#include <stdio.h> -#include <string.h> -#include <unistd.h> -#include <errno.h> -#include <assert.h> - -#include "assertions.h" - -#include "mme_config.h" -#include "intertask_interface.h" - -#include "timer.h" - -#include "NwLog.h" -#include "NwGtpv2c.h" -#include "NwGtpv2cMsg.h" - -#include "s11_mme.h" -#include "s11_mme_session_manager.h" - -#define S11_DEBUG(x, args...) fprintf(stdout, "[S11] [D]"x, ##args) -#define S11_INFO(x, args...) fprintf(stdout, "[S11] [I]"x, ##args) -#define S11_WARN(x, args...) fprintf(stdout, "[S11] [W]"x, ##args) -#define S11_ERROR(x, args...) fprintf(stderr, "[S11] [E]"x, ##args) - -static NwGtpv2cStackHandleT s11_mme_stack_handle; - -static -NwRcT s11_mme_log_wrapper(NwGtpv2cLogMgrHandleT hLogMgr, - uint32_t logLevel, - NwCharT* file, - uint32_t line, - NwCharT* logStr) -{ - S11_DEBUG("%s\n", logStr); - return NW_OK; -} - -static -NwRcT s11_mme_ulp_process_stack_req_cb( - NwGtpv2cUlpHandleT hUlp, NwGtpv2cUlpApiT *pUlpApi) -{ - // NwRcT rc = NW_OK; - int ret = 0; - - DevAssert(pUlpApi != NULL); - - switch(pUlpApi->apiType) { - case NW_GTPV2C_ULP_API_TRIGGERED_RSP_IND: - S11_DEBUG("Received triggered response indication\n"); - - switch (pUlpApi->apiInfo.triggeredRspIndInfo.msgType) { - case NW_GTP_CREATE_SESSION_RSP: - ret = s11_mme_handle_create_session_response( - &s11_mme_stack_handle, pUlpApi); - break; - - default: - S11_WARN("Received unhandled message type %d\n", - pUlpApi->apiInfo.triggeredRspIndInfo.msgType); - break; - } - - break; - - default: - break; - } - - return ret == 0 ? NW_OK : NW_FAILURE; -} - -static -NwRcT s11_mme_send_udp_msg( - NwGtpv2cUdpHandleT udpHandle, - uint8_t *buffer, - uint32_t buffer_len, - uint32_t peerIpAddr, - uint32_t peerPort) -{ - // Create and alloc new message - MessageDef *message_p; - udp_data_req_t *udp_data_req_p; - int ret = 0; - - message_p = itti_alloc_new_message(TASK_S11, UDP_DATA_REQ); - - udp_data_req_p = &message_p->ittiMsg.udp_data_req; - - udp_data_req_p->peer_address = peerIpAddr; - udp_data_req_p->peer_port = peerPort; - udp_data_req_p->buffer = buffer; - udp_data_req_p->buffer_length = buffer_len; - - ret = itti_send_msg_to_task(TASK_UDP, INSTANCE_DEFAULT, message_p); - - return ((ret == 0) ? NW_OK : NW_FAILURE); -} - -static -NwRcT s11_mme_start_timer_wrapper( - NwGtpv2cTimerMgrHandleT tmrMgrHandle, - uint32_t timeoutSec, - uint32_t timeoutUsec, - uint32_t tmrType, - void *timeoutArg, - NwGtpv2cTimerHandleT *hTmr) -{ - long timer_id; - int ret = 0; - - if (tmrType == NW_GTPV2C_TMR_TYPE_REPETITIVE) { - ret = timer_setup(timeoutSec, - timeoutUsec, - TASK_S11, - INSTANCE_DEFAULT, - TIMER_PERIODIC, - timeoutArg, - &timer_id); - } else { - ret = timer_setup(timeoutSec, - timeoutUsec, - TASK_S11, - INSTANCE_DEFAULT, - TIMER_ONE_SHOT, - timeoutArg, - &timer_id); - } - - *hTmr = (NwGtpv2cTimerHandleT)timer_id; - - return ((ret == 0) ? NW_OK : NW_FAILURE); -} - -static -NwRcT s11_mme_stop_timer_wrapper( - NwGtpv2cTimerMgrHandleT tmrMgrHandle, - NwGtpv2cTimerHandleT tmrHandle) -{ - long timer_id; - - timer_id = (long)tmrHandle; - - return ((timer_remove(timer_id) == 0) ? NW_OK : NW_FAILURE); -} - -static void *s11_mme_thread(void *args) -{ - itti_mark_task_ready(TASK_S11); - - while(1) { - MessageDef *received_message_p = NULL; - itti_receive_msg(TASK_S11, &received_message_p); - assert(received_message_p != NULL); - - switch (ITTI_MSG_ID(received_message_p)) { - case SGW_CREATE_SESSION_REQUEST: { - s11_mme_create_session_request( - &s11_mme_stack_handle, - &received_message_p->ittiMsg.sgwCreateSessionRequest); - } - break; - - case SGW_RELEASE_ACCESS_BEARERS_REQUEST: { - s11_mme_release_access_bearers_request( - &s11_mme_stack_handle, - &received_message_p->ittiMsg.sgwReleaseAccessBearersRequest); - } - break; - - case UDP_DATA_IND: { - /* We received new data to handle from the UDP layer */ - NwRcT rc; - udp_data_ind_t *udp_data_ind; - - udp_data_ind = &received_message_p->ittiMsg.udp_data_ind; - - rc = nwGtpv2cProcessUdpReq(s11_mme_stack_handle, - udp_data_ind->buffer, - udp_data_ind->buffer_length, - udp_data_ind->peer_port, - udp_data_ind->peer_address); - - DevAssert(rc == NW_OK); - } - break; - - case TIMER_HAS_EXPIRED: { - S11_DEBUG("Processing timeout for timer_id 0x%lx and arg %p\n", - received_message_p->ittiMsg.timer_has_expired.timer_id, - received_message_p->ittiMsg.timer_has_expired.arg); - DevAssert(nwGtpv2cProcessTimeout( - received_message_p->ittiMsg.timer_has_expired.arg) == NW_OK); - } - break; - - default: { - S11_ERROR("Unkwnon message ID %d:%s\n", - ITTI_MSG_ID(received_message_p), - ITTI_MSG_NAME(received_message_p)); - } - break; - } - - itti_free(ITTI_MSG_ORIGIN_ID(received_message_p), received_message_p); - received_message_p = NULL; - } - - return NULL; -} - -static int s11_send_init_udp(char *address, uint16_t port_number) -{ - MessageDef *message_p; - - message_p = itti_alloc_new_message(TASK_S11, UDP_INIT); - - if (message_p == NULL) { - return -1; - } - - message_p->ittiMsg.udp_init.port = port_number; - //LG message_p->ittiMsg.udpInit.address = "0.0.0.0"; //ANY address - message_p->ittiMsg.udp_init.address = address; - - S11_DEBUG("Tx UDP_INIT IP addr %s\n", message_p->ittiMsg.udp_init.address); - - return itti_send_msg_to_task(TASK_UDP, INSTANCE_DEFAULT, message_p); -} - -int s11_mme_init(const mme_config_t *mme_config_p) -{ - int ret = 0; - NwGtpv2cUlpEntityT ulp; - NwGtpv2cUdpEntityT udp; - NwGtpv2cTimerMgrEntityT tmrMgr; - NwGtpv2cLogMgrEntityT logMgr; - - struct in_addr addr; - char *s11_address_str = NULL; - - S11_DEBUG("Initializing S11 interface\n"); - - if (nwGtpv2cInitialize(&s11_mme_stack_handle) != NW_OK) { - S11_ERROR("Failed to initialize gtpv2-c stack\n"); - goto fail; - } - - /* Set ULP entity */ - ulp.hUlp = (NwGtpv2cUlpHandleT)NULL; - ulp.ulpReqCallback = s11_mme_ulp_process_stack_req_cb; - DevAssert(NW_OK == nwGtpv2cSetUlpEntity(s11_mme_stack_handle, &ulp)); - - /* Set UDP entity */ - udp.hUdp = (NwGtpv2cUdpHandleT)NULL; - udp.udpDataReqCallback = s11_mme_send_udp_msg; - DevAssert(NW_OK == nwGtpv2cSetUdpEntity(s11_mme_stack_handle, &udp)); - - /* Set Timer entity */ - tmrMgr.tmrMgrHandle = (NwGtpv2cTimerMgrHandleT)NULL; - tmrMgr.tmrStartCallback = s11_mme_start_timer_wrapper; - tmrMgr.tmrStopCallback = s11_mme_stop_timer_wrapper; - DevAssert(NW_OK == nwGtpv2cSetTimerMgrEntity(s11_mme_stack_handle, &tmrMgr)); - - logMgr.logMgrHandle = 0; - logMgr.logReqCallback = s11_mme_log_wrapper; - DevAssert(NW_OK == nwGtpv2cSetLogMgrEntity(s11_mme_stack_handle, &logMgr)); - - if (itti_create_task(TASK_S11, &s11_mme_thread, NULL) < 0) { - S11_ERROR("gtpv1u phtread_create: %s\n", strerror(errno)); - goto fail; - } - - DevAssert(NW_OK == nwGtpv2cSetLogLevel(s11_mme_stack_handle, - NW_LOG_LEVEL_DEBG)); - - config_read_lock(&mme_config); - addr.s_addr = mme_config.ipv4.mme_ip_address_for_S11; - config_unlock(&mme_config); - - s11_address_str = inet_ntoa(addr); - - DevAssert(s11_address_str != NULL); - - s11_send_init_udp(s11_address_str, 2123); - - S11_DEBUG("Initializing S11 interface: DONE\n"); - - return ret; - -fail: - S11_DEBUG("Initializing S11 interface: FAILURE\n"); - return -1; -} diff --git a/openair-cn/S11/s11_sgw.c b/openair-cn/S11/s11_sgw.c deleted file mode 100644 index ae62a1334a..0000000000 --- a/openair-cn/S11/s11_sgw.c +++ /dev/null @@ -1,347 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -#include <stdio.h> -#include <string.h> -#include <unistd.h> -#include <errno.h> -#include <assert.h> - -#include "assertions.h" -#include "queue.h" - -#include "mme_config.h" -#include "intertask_interface.h" - -#include "timer.h" - -#include "NwLog.h" -#include "NwGtpv2c.h" -#include "NwGtpv2cIe.h" -#include "NwGtpv2cMsg.h" - -#include "sgw_lite_ie_defs.h" - -#include "s11_common.h" -#include "s11_sgw.h" -#include "s11_sgw_bearer_manager.h" -#include "s11_sgw_session_manager.h" - -static NwGtpv2cStackHandleT s11_sgw_stack_handle; - -/* ULP callback for the GTPv2-C stack */ -static -NwRcT s11_sgw_ulp_process_stack_req_cb( - NwGtpv2cUlpHandleT hUlp, NwGtpv2cUlpApiT *pUlpApi) -{ - int ret = 0; - - DevAssert(pUlpApi != NULL); - - switch (pUlpApi->apiType) { - case NW_GTPV2C_ULP_API_INITIAL_REQ_IND: - S11_DEBUG("Received initial req indication\n"); - - switch (pUlpApi->apiInfo.initialReqIndInfo.msgType) { - case NW_GTP_CREATE_SESSION_REQ: - ret = s11_sgw_handle_create_session_request( - &s11_sgw_stack_handle, pUlpApi); - break; - - case NW_GTP_MODIFY_BEARER_REQ: - ret = s11_sgw_handle_modify_bearer_request( - &s11_sgw_stack_handle, pUlpApi); - break; - - case NW_GTP_DELETE_SESSION_REQ: - ret = s11_sgw_handle_delete_session_request( - &s11_sgw_stack_handle, pUlpApi); - break; - - default: - S11_WARN("Received unhandled message type %d\n", - pUlpApi->apiInfo.initialReqIndInfo.msgType); - break; - } - - break; - - default: - S11_ERROR("Received unknown stack req message %d\n", - pUlpApi->apiType); - break; - } - - return ret == -1 ? NW_FAILURE : NW_OK; -} - -static -NwRcT s11_sgw_send_udp_msg( - NwGtpv2cUdpHandleT udpHandle, - uint8_t *buffer, - uint32_t buffer_len, - uint32_t peerIpAddr, - uint32_t peerPort) -{ - // Create and alloc new message - MessageDef *message_p; - udp_data_req_t *udp_data_req_p; - int ret = 0; - - message_p = itti_alloc_new_message(TASK_S11, UDP_DATA_REQ); - - udp_data_req_p = &message_p->ittiMsg.udp_data_req; - - udp_data_req_p->peer_address = peerIpAddr; - udp_data_req_p->peer_port = peerPort; - udp_data_req_p->buffer = buffer; - udp_data_req_p->buffer_length = buffer_len; - - ret = itti_send_msg_to_task(TASK_UDP, INSTANCE_DEFAULT, message_p); - - return ret == 0 ? NW_OK : NW_FAILURE; -} - -static -NwRcT s11_sgw_log_wrapper(NwGtpv2cLogMgrHandleT hLogMgr, - uint32_t logLevel, - NwCharT* file, - uint32_t line, - NwCharT* logStr) -{ - S11_DEBUG("%s\n", logStr); - return NW_OK; -} - -static -NwRcT s11_sgw_start_timer_wrapper( - NwGtpv2cTimerMgrHandleT tmrMgrHandle, - uint32_t timeoutSec, - uint32_t timeoutUsec, - uint32_t tmrType, - void *timeoutArg, - NwGtpv2cTimerHandleT *hTmr) -{ - long timer_id; - int ret = 0; - - if (tmrType == NW_GTPV2C_TMR_TYPE_REPETITIVE) { - ret = timer_setup(timeoutSec, - timeoutUsec, - TASK_S11, - INSTANCE_DEFAULT, - TIMER_PERIODIC, - timeoutArg, - &timer_id); - } else { - ret = timer_setup(timeoutSec, - timeoutUsec, - TASK_S11, - INSTANCE_DEFAULT, - TIMER_ONE_SHOT, - timeoutArg, - &timer_id); - } - - return ret == 0 ? NW_OK : NW_FAILURE; -} - -static -NwRcT s11_sgw_stop_timer_wrapper( - NwGtpv2cTimerMgrHandleT tmrMgrHandle, - NwGtpv2cTimerHandleT tmrHandle) -{ - int ret; - long timer_id; - - timer_id = (long)tmrHandle; - - ret = timer_remove(timer_id); //TODO - - return ret == 0 ? NW_OK : NW_FAILURE; -} - -static void *s11_sgw_thread(void *args) -{ - itti_mark_task_ready(TASK_S11); - - while(1) { - MessageDef *received_message_p = NULL; - itti_receive_msg(TASK_S11, &received_message_p); - assert(received_message_p != NULL); - - switch (ITTI_MSG_ID(received_message_p)) { - case UDP_DATA_IND: { - /* We received new data to handle from the UDP layer */ - NwRcT rc; - udp_data_ind_t *udp_data_ind; - - udp_data_ind = &received_message_p->ittiMsg.udp_data_ind; - - S11_DEBUG("Processing new data indication from UDP\n"); - - rc = nwGtpv2cProcessUdpReq(s11_sgw_stack_handle, - udp_data_ind->buffer, - udp_data_ind->buffer_length, - udp_data_ind->peer_port, - udp_data_ind->peer_address); - - DevAssert(rc == NW_OK); - } - break; - - case SGW_CREATE_SESSION_RESPONSE: { - S11_DEBUG("Received create session response from S-PGW APP\n"); - s11_sgw_handle_create_session_response( - &s11_sgw_stack_handle, - &received_message_p->ittiMsg.sgwCreateSessionResponse); - } - break; - - case SGW_MODIFY_BEARER_RESPONSE: { - S11_DEBUG("Received modify bearer response from S-PGW APP\n"); - s11_sgw_handle_modify_bearer_response( - &s11_sgw_stack_handle, - &received_message_p->ittiMsg.sgwModifyBearerResponse); - } - break; - - case SGW_DELETE_SESSION_RESPONSE: { - S11_DEBUG("Received delete session response from S-PGW APP\n"); - s11_sgw_handle_delete_session_response( - &s11_sgw_stack_handle, - &received_message_p->ittiMsg.sgwDeleteSessionResponse); - } - break; - - case TIMER_HAS_EXPIRED: { - S11_DEBUG("Processing timeout for timer_id 0x%lx and arg %p\n", - received_message_p->ittiMsg.timer_has_expired.timer_id, - received_message_p->ittiMsg.timer_has_expired.arg); - DevAssert(nwGtpv2cProcessTimeout(received_message_p->ittiMsg.timer_has_expired.arg) == NW_OK); - } - break; - - default: { - S11_ERROR("Unkwnon message ID %d:%s\n", - ITTI_MSG_ID(received_message_p), ITTI_MSG_NAME(received_message_p)); - } - break; - } - - itti_free(ITTI_MSG_ORIGIN_ID(received_message_p), received_message_p); - received_message_p = NULL; - } - - return NULL; -} - -static int s11_send_init_udp(char *address, uint16_t port_number) -{ - MessageDef *message_p; - - message_p = itti_alloc_new_message(TASK_S11, UDP_INIT); - - if (message_p == NULL) { - return -1; - } - - message_p->ittiMsg.udp_init.port = port_number; - //LG message_p->ittiMsg.udpInit.address = "0.0.0.0"; //ANY address - message_p->ittiMsg.udp_init.address = address; - - S11_DEBUG("Tx UDP_INIT IP addr %s\n", message_p->ittiMsg.udp_init.address); - - return itti_send_msg_to_task(TASK_UDP, INSTANCE_DEFAULT, message_p); -} - -int s11_sgw_init(const mme_config_t *mme_config_p) -{ - int ret = 0; - NwGtpv2cUlpEntityT ulp; - NwGtpv2cUdpEntityT udp; - NwGtpv2cTimerMgrEntityT tmrMgr; - NwGtpv2cLogMgrEntityT logMgr; - struct in_addr addr; - char *s11_address_str = NULL; - - S11_DEBUG("Initializing S11 interface\n"); - - if (nwGtpv2cInitialize(&s11_sgw_stack_handle) != NW_OK) { - S11_ERROR("Failed to initialize gtpv2-c stack\n"); - goto fail; - } - - /* Set ULP entity */ - ulp.hUlp = (NwGtpv2cUlpHandleT)NULL; - ulp.ulpReqCallback = s11_sgw_ulp_process_stack_req_cb; - DevAssert(NW_OK == nwGtpv2cSetUlpEntity(s11_sgw_stack_handle, &ulp)); - - /* Set UDP entity */ - udp.hUdp = (NwGtpv2cUdpHandleT)NULL; - udp.udpDataReqCallback = s11_sgw_send_udp_msg; - DevAssert(NW_OK == nwGtpv2cSetUdpEntity(s11_sgw_stack_handle, &udp)); - - /* Set Timer entity */ - tmrMgr.tmrMgrHandle = (NwGtpv2cTimerMgrHandleT)NULL; - tmrMgr.tmrStartCallback = s11_sgw_start_timer_wrapper; - tmrMgr.tmrStopCallback = s11_sgw_stop_timer_wrapper; - DevAssert(NW_OK == nwGtpv2cSetTimerMgrEntity(s11_sgw_stack_handle, &tmrMgr)); - - logMgr.logMgrHandle = 0; - logMgr.logReqCallback = s11_sgw_log_wrapper; - - DevAssert(NW_OK == nwGtpv2cSetLogMgrEntity(s11_sgw_stack_handle, &logMgr)); - - if (itti_create_task(TASK_S11, &s11_sgw_thread, NULL) < 0) { - S11_ERROR("gtpv1u phtread_create: %s\n", strerror(errno)); - goto fail; - } - - DevAssert(NW_OK == nwGtpv2cSetLogLevel(s11_sgw_stack_handle, - NW_LOG_LEVEL_DEBG)); - - config_read_lock(&mme_config); - addr.s_addr = mme_config.ipv4.sgw_ip_address_for_S11; - config_unlock(&mme_config); - - s11_address_str = inet_ntoa(addr); - - DevAssert(s11_address_str != NULL); - - s11_send_init_udp(s11_address_str, 2123); - - S11_DEBUG("Initializing S11 interface: DONE\n"); - - return ret; - -fail: - S11_DEBUG("Initializing S11 interface: FAILURE\n"); - return -1; -} diff --git a/openair-cn/S11/s11_sgw.h b/openair-cn/S11/s11_sgw.h deleted file mode 100644 index ed98169f8b..0000000000 --- a/openair-cn/S11/s11_sgw.h +++ /dev/null @@ -1,34 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -#ifndef S11_SGW_H_ -#define S11_SGW_H_ - -int s11_sgw_init(const mme_config_t *mme_config); - -#endif /* S11_SGW_H_ */ diff --git a/openair-cn/S11/s11_sgw_bearer_manager.c b/openair-cn/S11/s11_sgw_bearer_manager.c deleted file mode 100644 index 27337a25f3..0000000000 --- a/openair-cn/S11/s11_sgw_bearer_manager.c +++ /dev/null @@ -1,237 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -#include <stdlib.h> -#include <stdio.h> -#include <string.h> - -#include "assertions.h" -#include "intertask_interface.h" -#include "queue.h" - -#include "NwLog.h" -#include "NwGtpv2c.h" -#include "NwGtpv2cIe.h" -#include "NwGtpv2cMsg.h" -#include "NwGtpv2cMsgParser.h" - -#include "sgw_lite_ie_defs.h" - -#include "s11_common.h" -#include "s11_sgw_bearer_manager.h" -#include "s11_ie_formatter.h" - -int s11_sgw_handle_modify_bearer_request(NwGtpv2cStackHandleT *stack_p, - NwGtpv2cUlpApiT *pUlpApi) -{ - NwRcT rc = NW_OK; - uint8_t offendingIeType, offendingIeInstance; - uint16_t offendingIeLength; - - SgwModifyBearerRequest *modify_bearer_request_p; - MessageDef *message_p; - - NwGtpv2cMsgParserT *pMsgParser; - - DevAssert(stack_p != NULL); - - message_p = itti_alloc_new_message(TASK_S11, SGW_MODIFY_BEARER_REQUEST); - - modify_bearer_request_p = &message_p->ittiMsg.sgwModifyBearerRequest; - - modify_bearer_request_p->trxn = (void *)pUlpApi->apiInfo.initialReqIndInfo.hTrxn; - modify_bearer_request_p->teid = nwGtpv2cMsgGetTeid(pUlpApi->hMsg); - - /* Create a new message parser */ - rc = nwGtpv2cMsgParserNew(*stack_p, - NW_GTP_MODIFY_BEARER_REQ, - s11_ie_indication_generic, - NULL, - &pMsgParser); - DevAssert(NW_OK == rc); - - /* Indication Flags IE */ - rc = nwGtpv2cMsgParserAddIe(pMsgParser, - NW_GTPV2C_IE_INDICATION, - NW_GTPV2C_IE_INSTANCE_ZERO, - NW_GTPV2C_IE_PRESENCE_CONDITIONAL, - s11_indication_flags_ie_get, - &modify_bearer_request_p->indication_flags); - DevAssert(NW_OK == rc); - - /* MME-FQ-CSID IE */ - rc = nwGtpv2cMsgParserAddIe(pMsgParser, - NW_GTPV2C_IE_FQ_CSID, - NW_GTPV2C_IE_INSTANCE_ZERO, - NW_GTPV2C_IE_PRESENCE_CONDITIONAL, - s11_fqcsid_ie_get, - &modify_bearer_request_p->mme_fq_csid); - DevAssert(NW_OK == rc); - - /* RAT Type IE */ - rc = nwGtpv2cMsgParserAddIe(pMsgParser, - NW_GTPV2C_IE_RAT_TYPE, - NW_GTPV2C_IE_INSTANCE_ZERO, - NW_GTPV2C_IE_PRESENCE_CONDITIONAL, - s11_rat_type_ie_get, - &modify_bearer_request_p->rat_type); - DevAssert(NW_OK == rc); - - /* Delay Value IE */ - rc = nwGtpv2cMsgParserAddIe(pMsgParser, - NW_GTPV2C_IE_DELAY_VALUE, - NW_GTPV2C_IE_INSTANCE_ZERO, - NW_GTPV2C_IE_PRESENCE_CONDITIONAL, - s11_delay_value_ie_get, - &modify_bearer_request_p->delay_dl_packet_notif_req); - DevAssert(NW_OK == rc); - - /* Bearer Context to be modified IE */ - rc = nwGtpv2cMsgParserAddIe(pMsgParser, - NW_GTPV2C_IE_BEARER_CONTEXT, - NW_GTPV2C_IE_INSTANCE_ZERO, - NW_GTPV2C_IE_PRESENCE_CONDITIONAL, - s11_bearer_context_to_modifiy_ie_get, - &modify_bearer_request_p->bearer_context_to_modify); - DevAssert(NW_OK == rc); - - rc = nwGtpv2cMsgParserRun(pMsgParser, - pUlpApi->hMsg, - &offendingIeType, - &offendingIeInstance, - &offendingIeLength); - - if (rc != NW_OK) { - gtp_cause_t cause; - NwGtpv2cUlpApiT ulp_req; - - memset(&ulp_req, 0, sizeof(NwGtpv2cUlpApiT)); - memset(&cause , 0, sizeof(gtp_cause_t)); - - cause.offending_ie_type = offendingIeType; - cause.offending_ie_length = offendingIeLength; - cause.offending_ie_instance = offendingIeInstance; - - switch (rc) { - case NW_GTPV2C_MANDATORY_IE_MISSING: - S11_DEBUG("Mandatory IE type '%u' of instance '%u' missing!\n", - offendingIeType, offendingIeLength); - cause.cause_value = NW_GTPV2C_CAUSE_MANDATORY_IE_MISSING; - break; - - default: - S11_DEBUG("Unknown message parse error!\n"); - cause.cause_value = 0; - break; - } - - /* - * Send Create session response with failure to Gtpv2c Stack Instance - */ - ulp_req.apiType = NW_GTPV2C_ULP_API_TRIGGERED_RSP; - - ulp_req.apiInfo.triggeredRspInfo.hTrxn = pUlpApi->apiInfo.initialReqIndInfo.hTrxn; - - rc = nwGtpv2cMsgNew(*stack_p, - NW_TRUE, - NW_GTP_CREATE_SESSION_RSP, - 0, - nwGtpv2cMsgGetSeqNumber(pUlpApi->hMsg), - &(ulp_req.hMsg)); - - s11_cause_ie_set(&(ulp_req.hMsg), &cause); - - S11_DEBUG("Received NW_GTP_CREATE_SESSION_REQ, Sending NW_GTP_CREATE_SESSION_RSP!\n"); - rc = nwGtpv2cProcessUlpReq(*stack_p, &ulp_req); - DevAssert(NW_OK == rc); - - itti_free(ITTI_MSG_ORIGIN_ID(message_p), message_p); - message_p = NULL; - - rc = nwGtpv2cMsgParserDelete(*stack_p, pMsgParser); - DevAssert(NW_OK == rc); - - rc = nwGtpv2cMsgDelete(*stack_p, (pUlpApi->hMsg)); - DevAssert(NW_OK == rc); - - return 0; - } - - rc = nwGtpv2cMsgParserDelete(*stack_p, pMsgParser); - DevAssert(NW_OK == rc); - - rc = nwGtpv2cMsgDelete(*stack_p, (pUlpApi->hMsg)); - DevAssert(NW_OK == rc); - - return itti_send_msg_to_task(TASK_SPGW_APP, INSTANCE_DEFAULT, message_p); -} - -int s11_sgw_handle_modify_bearer_response( - NwGtpv2cStackHandleT *stack_p, - SgwModifyBearerResponse *modify_bearer_response_p) -{ - gtp_cause_t cause; - NwRcT rc; - NwGtpv2cUlpApiT ulp_req; - NwGtpv2cTrxnHandleT trxn; - - DevAssert(stack_p != NULL); - DevAssert(modify_bearer_response_p != NULL); - - trxn = (NwGtpv2cTrxnHandleT)modify_bearer_response_p->trxn; - - /* Prepare a modify bearer response to send to MME. - */ - memset(&ulp_req, 0, sizeof(NwGtpv2cUlpApiT)); - memset(&cause , 0, sizeof(gtp_cause_t)); - - ulp_req.apiType = NW_GTPV2C_ULP_API_TRIGGERED_RSP; - - ulp_req.apiInfo.triggeredRspInfo.hTrxn = trxn; - - rc = nwGtpv2cMsgNew(*stack_p, - NW_TRUE, - NW_GTP_MODIFY_BEARER_RSP, - 0, - 0, - &(ulp_req.hMsg)); - DevAssert(NW_OK == rc); - - /* Set the remote TEID */ - rc = nwGtpv2cMsgSetTeid(ulp_req.hMsg, modify_bearer_response_p->teid); - DevAssert(NW_OK == rc); - - cause.cause_value = (uint8_t)modify_bearer_response_p->cause; - - s11_cause_ie_set(&(ulp_req.hMsg), &cause); - - rc = nwGtpv2cProcessUlpReq(*stack_p, &ulp_req); - DevAssert(NW_OK == rc); - - return 0; -} diff --git a/openair-cn/S11/s11_sgw_bearer_manager.h b/openair-cn/S11/s11_sgw_bearer_manager.h deleted file mode 100644 index cfbbd389fc..0000000000 --- a/openair-cn/S11/s11_sgw_bearer_manager.h +++ /dev/null @@ -1,40 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -#ifndef S11_SGW_BEARER_MANAGER_H_ -#define S11_SGW_BEARER_MANAGER_H_ - -int s11_sgw_handle_modify_bearer_request( - NwGtpv2cStackHandleT *stack_p, - NwGtpv2cUlpApiT *pUlpApi); - -int s11_sgw_handle_modify_bearer_response( - NwGtpv2cStackHandleT *stack_p, - SgwModifyBearerResponse *modify_bearer_response_p); - -#endif /* S11_SGW_BEARER_MANAGER_H_ */ diff --git a/openair-cn/S11/s11_sgw_session_manager.c b/openair-cn/S11/s11_sgw_session_manager.c deleted file mode 100644 index dc313c7935..0000000000 --- a/openair-cn/S11/s11_sgw_session_manager.c +++ /dev/null @@ -1,526 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -#include <stdlib.h> -#include <stdio.h> -#include <string.h> - -#include "assertions.h" -#include "intertask_interface.h" -#include "queue.h" - -#include "NwLog.h" -#include "NwGtpv2c.h" -#include "NwGtpv2cIe.h" -#include "NwGtpv2cMsg.h" -#include "NwGtpv2cMsgParser.h" - -#include "sgw_lite_ie_defs.h" - -#include "s11_common.h" -#include "s11_sgw_session_manager.h" -#include "s11_ie_formatter.h" - -int s11_sgw_handle_create_session_request(NwGtpv2cStackHandleT *stack_p, - NwGtpv2cUlpApiT *pUlpApi) -{ - NwRcT rc = NW_OK; - uint8_t offendingIeType, offendingIeInstance; - uint16_t offendingIeLength; - - SgwCreateSessionRequest *create_session_request_p; - MessageDef *message_p; - - NwGtpv2cMsgParserT *pMsgParser; - - DevAssert(stack_p != NULL); - - message_p = itti_alloc_new_message(TASK_S11, SGW_CREATE_SESSION_REQUEST); - - create_session_request_p = &message_p->ittiMsg.sgwCreateSessionRequest; - - /* Create a new message parser */ - rc = nwGtpv2cMsgParserNew(*stack_p, NW_GTP_CREATE_SESSION_REQ, - s11_ie_indication_generic, - NULL, &pMsgParser); - DevAssert(NW_OK == rc); - - /* Imsi IE */ - rc = nwGtpv2cMsgParserAddIe(pMsgParser, NW_GTPV2C_IE_IMSI, - NW_GTPV2C_IE_INSTANCE_ZERO, - NW_GTPV2C_IE_PRESENCE_CONDITIONAL, - s11_imsi_ie_get, - &create_session_request_p->imsi); - DevAssert(NW_OK == rc); - - /* MSISDN IE */ - rc = nwGtpv2cMsgParserAddIe(pMsgParser, NW_GTPV2C_IE_MSISDN, - NW_GTPV2C_IE_INSTANCE_ZERO, - NW_GTPV2C_IE_PRESENCE_CONDITIONAL, - s11_msisdn_ie_get, - &create_session_request_p->msisdn); - DevAssert(NW_OK == rc); - - /* MEI IE */ - rc = nwGtpv2cMsgParserAddIe(pMsgParser, NW_GTPV2C_IE_MEI, - NW_GTPV2C_IE_INSTANCE_ZERO, - NW_GTPV2C_IE_PRESENCE_CONDITIONAL, - s11_mei_ie_get, - &create_session_request_p->mei); - DevAssert(NW_OK == rc); - - /* ULI IE */ - rc = nwGtpv2cMsgParserAddIe(pMsgParser, NW_GTPV2C_IE_ULI, - NW_GTPV2C_IE_INSTANCE_ZERO, - NW_GTPV2C_IE_PRESENCE_CONDITIONAL, - s11_uli_ie_get, - &create_session_request_p->uli); - DevAssert(NW_OK == rc); - - /* Serving Network IE */ - rc = nwGtpv2cMsgParserAddIe(pMsgParser, NW_GTPV2C_IE_SERVING_NETWORK, - NW_GTPV2C_IE_INSTANCE_ZERO, - NW_GTPV2C_IE_PRESENCE_CONDITIONAL, - s11_serving_network_ie_get, - &create_session_request_p->serving_network); - DevAssert(NW_OK == rc); - - /* RAT Type IE */ - rc = nwGtpv2cMsgParserAddIe(pMsgParser, NW_GTPV2C_IE_RAT_TYPE, - NW_GTPV2C_IE_INSTANCE_ZERO, - NW_GTPV2C_IE_PRESENCE_MANDATORY, - s11_rat_type_ie_get, - &create_session_request_p->rat_type); - DevAssert(NW_OK == rc); - - /* Indication Flags IE */ - rc = nwGtpv2cMsgParserAddIe(pMsgParser, NW_GTPV2C_IE_INDICATION, - NW_GTPV2C_IE_INSTANCE_ZERO, - NW_GTPV2C_IE_PRESENCE_CONDITIONAL, - s11_indication_flags_ie_get, - &create_session_request_p->indication_flags); - DevAssert(NW_OK == rc); - - /* APN IE */ - rc = nwGtpv2cMsgParserAddIe(pMsgParser, NW_GTPV2C_IE_APN, - NW_GTPV2C_IE_INSTANCE_ZERO, - NW_GTPV2C_IE_PRESENCE_MANDATORY, - s11_apn_ie_get, &create_session_request_p->apn); - DevAssert(NW_OK == rc); - - /* Selection Mode IE */ - rc = nwGtpv2cMsgParserAddIe(pMsgParser, NW_GTPV2C_IE_SELECTION_MODE, - NW_GTPV2C_IE_INSTANCE_ZERO, - NW_GTPV2C_IE_PRESENCE_CONDITIONAL, - s11_ie_indication_generic, NULL); - DevAssert(NW_OK == rc); - - /* PDN Type IE */ - rc = nwGtpv2cMsgParserAddIe(pMsgParser, NW_GTPV2C_IE_PDN_TYPE, - NW_GTPV2C_IE_INSTANCE_ZERO, - NW_GTPV2C_IE_PRESENCE_CONDITIONAL, - s11_pdn_type_ie_get, &create_session_request_p->pdn_type); - DevAssert(NW_OK == rc); - - /* PAA IE */ - rc = nwGtpv2cMsgParserAddIe(pMsgParser, NW_GTPV2C_IE_PAA, - NW_GTPV2C_IE_INSTANCE_ZERO, - NW_GTPV2C_IE_PRESENCE_CONDITIONAL, - s11_paa_ie_get, &create_session_request_p->paa); - DevAssert(NW_OK == rc); - - /* Sender FTEID for CP IE */ - rc = nwGtpv2cMsgParserAddIe(pMsgParser, NW_GTPV2C_IE_FTEID, - NW_GTPV2C_IE_INSTANCE_ZERO, - NW_GTPV2C_IE_PRESENCE_MANDATORY, - s11_fteid_ie_get, - &create_session_request_p->sender_fteid_for_cp); - DevAssert(NW_OK == rc); - - /* PGW FTEID for CP IE */ - rc = nwGtpv2cMsgParserAddIe(pMsgParser, NW_GTPV2C_IE_FTEID, - NW_GTPV2C_IE_INSTANCE_ONE, - NW_GTPV2C_IE_PRESENCE_CONDITIONAL, - s11_fteid_ie_get, - &create_session_request_p->pgw_address_for_cp); - DevAssert(NW_OK == rc); - - /* APN Restriction IE */ - rc = nwGtpv2cMsgParserAddIe(pMsgParser, NW_GTPV2C_IE_APN_RESTRICTION, - NW_GTPV2C_IE_INSTANCE_ZERO, - NW_GTPV2C_IE_PRESENCE_CONDITIONAL, - s11_ie_indication_generic, NULL); - DevAssert(NW_OK == rc); - - /* Bearer Context IE */ - rc = nwGtpv2cMsgParserAddIe(pMsgParser, NW_GTPV2C_IE_BEARER_CONTEXT, - NW_GTPV2C_IE_INSTANCE_ZERO, - NW_GTPV2C_IE_PRESENCE_MANDATORY, - s11_bearer_context_ie_get, - &create_session_request_p->bearer_to_create); - DevAssert(NW_OK == rc); - - /* AMBR IE */ - rc = nwGtpv2cMsgParserAddIe(pMsgParser, NW_GTPV2C_IE_AMBR, - NW_GTPV2C_IE_INSTANCE_ZERO, - NW_GTPV2C_IE_PRESENCE_CONDITIONAL, - s11_ambr_ie_get, - &create_session_request_p->ambr); - DevAssert(NW_OK == rc); - - /* Recovery IE */ - rc = nwGtpv2cMsgParserAddIe(pMsgParser, NW_GTPV2C_IE_RECOVERY, - NW_GTPV2C_IE_INSTANCE_ZERO, - NW_GTPV2C_IE_PRESENCE_MANDATORY, - s11_ie_indication_generic, NULL); - DevAssert(NW_OK == rc); - - create_session_request_p->teid = nwGtpv2cMsgGetTeid(pUlpApi->hMsg); - create_session_request_p->trxn = (void*)pUlpApi->apiInfo.initialReqIndInfo.hTrxn; - create_session_request_p->peer_ip = pUlpApi->apiInfo.initialReqIndInfo.peerIp; - - rc = nwGtpv2cMsgParserRun(pMsgParser, - pUlpApi->hMsg, - &offendingIeType, - &offendingIeInstance, - &offendingIeLength); - - if (rc != NW_OK) { - gtp_cause_t cause; - - NwGtpv2cUlpApiT ulp_req; - - memset(&ulp_req, 0, sizeof(NwGtpv2cUlpApiT)); - memset(&cause , 0, sizeof(gtp_cause_t)); - - cause.offending_ie_type = offendingIeType; - cause.offending_ie_length = offendingIeLength; - cause.offending_ie_instance = offendingIeInstance; - - switch (rc) { - case NW_GTPV2C_MANDATORY_IE_MISSING: - S11_DEBUG("Mandatory IE type '%u' of instance '%u' missing!\n", - offendingIeType, offendingIeLength); - cause.cause_value = NW_GTPV2C_CAUSE_MANDATORY_IE_MISSING; - break; - - default: - S11_DEBUG("Unknown message parse error!\n"); - cause.cause_value = 0; - break; - } - - /* - * Send Create session response with failure to Gtpv2c Stack Instance - */ - ulp_req.apiType = NW_GTPV2C_ULP_API_TRIGGERED_RSP; - - ulp_req.apiInfo.triggeredRspInfo.hTrxn = pUlpApi->apiInfo.initialReqIndInfo.hTrxn; - - rc = nwGtpv2cMsgNew(*stack_p, - NW_TRUE, - NW_GTP_CREATE_SESSION_RSP, - 0, - nwGtpv2cMsgGetSeqNumber(pUlpApi->hMsg), - &(ulp_req.hMsg)); - - s11_cause_ie_set(&(ulp_req.hMsg), &cause); - - S11_DEBUG("Received NW_GTP_CREATE_SESSION_REQ, Sending NW_GTP_CREATE_SESSION_RSP!\n"); - rc = nwGtpv2cProcessUlpReq(*stack_p, &ulp_req); - DevAssert(NW_OK == rc); - - itti_free(ITTI_MSG_ORIGIN_ID(message_p), message_p); - message_p = NULL; - - rc = nwGtpv2cMsgParserDelete(*stack_p, pMsgParser); - DevAssert(NW_OK == rc); - - rc = nwGtpv2cMsgDelete(*stack_p, (pUlpApi->hMsg)); - DevAssert(NW_OK == rc); - - return 0; - } - - rc = nwGtpv2cMsgParserDelete(*stack_p, pMsgParser); - DevAssert(NW_OK == rc); - - rc = nwGtpv2cMsgDelete(*stack_p, (pUlpApi->hMsg)); - DevAssert(NW_OK == rc); - - return itti_send_msg_to_task(TASK_SPGW_APP, INSTANCE_DEFAULT, message_p); -} - -int s11_sgw_handle_create_session_response( - NwGtpv2cStackHandleT *stack_p, - SgwCreateSessionResponse *create_session_response_p) -{ - NwRcT rc; - NwGtpv2cUlpApiT ulp_req; - NwGtpv2cTrxnHandleT trxn; - - gtp_cause_t cause; - - DevAssert(create_session_response_p != NULL); - DevAssert(stack_p != NULL); - - trxn = (NwGtpv2cTrxnHandleT)create_session_response_p->trxn; - - DevAssert(trxn != 0); - - /* Create a tunnel for the GTPv2-C stack */ - memset(&ulp_req, 0, sizeof(NwGtpv2cUlpApiT)); - - ulp_req.apiType = NW_GTPV2C_ULP_CREATE_LOCAL_TUNNEL; - ulp_req.apiInfo.createLocalTunnelInfo.teidLocal = create_session_response_p->s11_sgw_teid.teid; - ulp_req.apiInfo.createLocalTunnelInfo.peerIp = create_session_response_p->peer_ip; - - rc = nwGtpv2cProcessUlpReq(*stack_p, &ulp_req); - DevAssert(NW_OK == rc); - - /* Prepare a create session response to send to MME. - */ - memset(&ulp_req, 0, sizeof(NwGtpv2cUlpApiT)); - memset(&cause , 0, sizeof(gtp_cause_t)); - - ulp_req.apiType = NW_GTPV2C_ULP_API_TRIGGERED_RSP; - - ulp_req.apiInfo.triggeredRspInfo.hTrxn = trxn; - - rc = nwGtpv2cMsgNew(*stack_p, - NW_TRUE, - NW_GTP_CREATE_SESSION_RSP, - 0, - 0, - &(ulp_req.hMsg)); - DevAssert(NW_OK == rc); - - /* Set the remote TEID */ - rc = nwGtpv2cMsgSetTeid(ulp_req.hMsg, create_session_response_p->teid); - DevAssert(NW_OK == rc); - - cause.cause_value = (uint8_t)create_session_response_p->cause; - - s11_cause_ie_set(&(ulp_req.hMsg), &cause); - - rc = nwGtpv2cMsgAddIeFteid((ulp_req.hMsg), - NW_GTPV2C_IE_INSTANCE_ZERO, - S1_U_SGW_GTP_U, - create_session_response_p->s11_sgw_teid.teid, - 0xC0A80EA2, - NULL); - - s11_paa_ie_set(&(ulp_req.hMsg), &create_session_response_p->paa); - /* Put 0 for now i.e. no existing context or restriction */ - s11_apn_restriction_ie_set(&(ulp_req.hMsg), 0); - s11_bearer_context_created_ie_set( - &(ulp_req.hMsg), - &create_session_response_p->bearer_context_created); - - rc = nwGtpv2cProcessUlpReq(*stack_p, &ulp_req); - DevAssert(NW_OK == rc); - - return 0; -} - -int s11_sgw_handle_delete_session_request(NwGtpv2cStackHandleT *stack_p, - NwGtpv2cUlpApiT *pUlpApi) -{ - NwRcT rc = NW_OK; - uint8_t offendingIeType, offendingIeInstance; - uint16_t offendingIeLength; - - SgwDeleteSessionRequest *delete_session_request_p; - MessageDef *message_p; - - NwGtpv2cMsgParserT *pMsgParser; - - DevAssert(stack_p != NULL); - - message_p = itti_alloc_new_message(TASK_S11, SGW_DELETE_SESSION_REQUEST); - - delete_session_request_p = &message_p->ittiMsg.sgwDeleteSessionRequest; - - /* Create a new message parser */ - rc = nwGtpv2cMsgParserNew(*stack_p, NW_GTP_DELETE_SESSION_REQ, - s11_ie_indication_generic, - NULL, &pMsgParser); - DevAssert(NW_OK == rc); - - /* MME FTEID for CP IE */ - rc = nwGtpv2cMsgParserAddIe(pMsgParser, NW_GTPV2C_IE_FTEID, - NW_GTPV2C_IE_INSTANCE_ZERO, - NW_GTPV2C_IE_PRESENCE_OPTIONAL, - s11_fteid_ie_get, - &delete_session_request_p->sender_fteid_for_cp); - DevAssert(NW_OK == rc); - - /* Linked EPS Bearer Id IE - * This information element shall not be present for TAU/RAU/Handover with - * S-GW relocation procedures. - */ - rc = nwGtpv2cMsgParserAddIe(pMsgParser, NW_GTPV2C_IE_EBI, - NW_GTPV2C_IE_INSTANCE_ZERO, - NW_GTPV2C_IE_PRESENCE_OPTIONAL, - s11_ebi_ie_get, - &delete_session_request_p->lbi); - DevAssert(NW_OK == rc); - - /* Indication Flags IE - * For a Delete Session Request on S11 interface, - * only the Operation Indication flag might be present. - */ - rc = nwGtpv2cMsgParserAddIe(pMsgParser, NW_GTPV2C_IE_INDICATION, - NW_GTPV2C_IE_INSTANCE_ZERO, - NW_GTPV2C_IE_PRESENCE_CONDITIONAL, - s11_indication_flags_ie_get, - &delete_session_request_p->indication_flags); - DevAssert(NW_OK == rc); - - delete_session_request_p->teid = nwGtpv2cMsgGetTeid(pUlpApi->hMsg); - delete_session_request_p->trxn = (void*)pUlpApi->apiInfo.initialReqIndInfo.hTrxn; - delete_session_request_p->peer_ip = pUlpApi->apiInfo.initialReqIndInfo.peerIp; - - rc = nwGtpv2cMsgParserRun(pMsgParser, - pUlpApi->hMsg, - &offendingIeType, - &offendingIeInstance, - &offendingIeLength); - - if (rc != NW_OK) { - NwGtpv2cUlpApiT ulp_req; - gtp_cause_t cause; - - memset(&ulp_req, 0, sizeof(NwGtpv2cUlpApiT)); - memset(&cause , 0, sizeof(gtp_cause_t)); - - cause.offending_ie_type = offendingIeType; - cause.offending_ie_length = offendingIeLength; - cause.offending_ie_instance = offendingIeInstance; - - switch (rc) { - case NW_GTPV2C_MANDATORY_IE_MISSING: - S11_DEBUG("Mandatory IE type '%u' of instance '%u' missing!\n", - offendingIeType, offendingIeLength); - cause.cause_value = NW_GTPV2C_CAUSE_MANDATORY_IE_MISSING; - break; - - default: - S11_DEBUG("Unknown message parse error!\n"); - cause.cause_value = 0; - break; - } - - /* - * Send Create session response with failure to Gtpv2c Stack Instance - */ - ulp_req.apiType = NW_GTPV2C_ULP_API_TRIGGERED_RSP; - - ulp_req.apiInfo.triggeredRspInfo.hTrxn = pUlpApi->apiInfo.initialReqIndInfo.hTrxn; - - rc = nwGtpv2cMsgNew(*stack_p, - NW_TRUE, - NW_GTP_DELETE_SESSION_RSP, - 0, - nwGtpv2cMsgGetSeqNumber(pUlpApi->hMsg), - &(ulp_req.hMsg)); - - /* Adding the cause */ - s11_cause_ie_set(&(ulp_req.hMsg), &cause); - - S11_DEBUG("Received NW_GTP_DELETE_SESSION_REQ, Sending NW_GTP_DELETE_SESSION_RSP!\n"); - rc = nwGtpv2cProcessUlpReq(*stack_p, &ulp_req); - DevAssert(NW_OK == rc); - - itti_free(ITTI_MSG_ORIGIN_ID(message_p), message_p); - message_p = NULL; - - rc = nwGtpv2cMsgParserDelete(*stack_p, pMsgParser); - DevAssert(NW_OK == rc); - - rc = nwGtpv2cMsgDelete(*stack_p, (pUlpApi->hMsg)); - DevAssert(NW_OK == rc); - - return 0; - } - - rc = nwGtpv2cMsgParserDelete(*stack_p, pMsgParser); - DevAssert(NW_OK == rc); - - rc = nwGtpv2cMsgDelete(*stack_p, (pUlpApi->hMsg)); - DevAssert(NW_OK == rc); - - return itti_send_msg_to_task(TASK_SPGW_APP, INSTANCE_DEFAULT, message_p); -} - -int s11_sgw_handle_delete_session_response( - NwGtpv2cStackHandleT *stack_p, - SgwDeleteSessionResponse *delete_session_response_p) -{ - NwRcT rc; - NwGtpv2cUlpApiT ulp_req; - NwGtpv2cTrxnHandleT trxn; - gtp_cause_t cause; - - DevAssert(delete_session_response_p != NULL); - DevAssert(stack_p != NULL); - - trxn = (NwGtpv2cTrxnHandleT)delete_session_response_p->trxn; - - DevAssert(trxn != 0); - - /* Prepare a create session response to send to MME. - */ - memset(&ulp_req, 0, sizeof(NwGtpv2cUlpApiT)); - memset(&cause, 0, sizeof(gtp_cause_t)); - - ulp_req.apiType = NW_GTPV2C_ULP_API_TRIGGERED_RSP; - - ulp_req.apiInfo.triggeredRspInfo.hTrxn = trxn; - - rc = nwGtpv2cMsgNew(*stack_p, - NW_TRUE, - NW_GTP_DELETE_SESSION_RSP, - 0, - 0, - &(ulp_req.hMsg)); - DevAssert(NW_OK == rc); - - /* Set the remote TEID */ - rc = nwGtpv2cMsgSetTeid(ulp_req.hMsg, delete_session_response_p->teid); - DevAssert(NW_OK == rc); - - cause.cause_value = delete_session_response_p->cause; - - s11_cause_ie_set(&(ulp_req.hMsg), &cause); - - rc = nwGtpv2cProcessUlpReq(*stack_p, &ulp_req); - DevAssert(NW_OK == rc); - - return 0; -} diff --git a/openair-cn/S11/s11_sgw_session_manager.h b/openair-cn/S11/s11_sgw_session_manager.h deleted file mode 100644 index 2c920fb75e..0000000000 --- a/openair-cn/S11/s11_sgw_session_manager.h +++ /dev/null @@ -1,48 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -#ifndef S11_SGW_SESSION_MANAGER_H_ -#define S11_SGW_SESSION_MANAGER_H_ - -int s11_sgw_handle_create_session_request( - NwGtpv2cStackHandleT *stack_p, - NwGtpv2cUlpApiT *pUlpApi); - -int s11_sgw_handle_create_session_response( - NwGtpv2cStackHandleT *stack_p, - SgwCreateSessionResponse *create_session_response_p); - -int s11_sgw_handle_delete_session_request( - NwGtpv2cStackHandleT *stack_p, - NwGtpv2cUlpApiT *pUlpApi); - -int s11_sgw_handle_delete_session_response( - NwGtpv2cStackHandleT *stack_p, - SgwDeleteSessionResponse *delete_session_response_p); - -#endif /* S11_SGW_SESSION_MANAGER_H_ */ diff --git a/openair-cn/S1AP/MESSAGES/ASN1/Makefile.am b/openair-cn/S1AP/MESSAGES/ASN1/Makefile.am deleted file mode 100644 index 818775406c..0000000000 --- a/openair-cn/S1AP/MESSAGES/ASN1/Makefile.am +++ /dev/null @@ -1,8 +0,0 @@ -BUILT_SOURCES=ieregen.stamp - -ieregen.stamp: $(top_srcdir)/S1AP/MESSAGES/ASN1/$(ASN1DIR)/S1AP-PDU-Contents.asn $(top_srcdir)/S1AP/MESSAGES/ASN1/asn1tostruct.py $(top_srcdir)/configure - echo Timestamp > $@ - python $(top_srcdir)/S1AP/MESSAGES/ASN1/asn1tostruct.py -f$(top_srcdir)/S1AP/MESSAGES/ASN1/$(ASN1DIR)/S1AP-PDU-Contents.asn -o$(top_builddir)/S1AP - -clean-local: - rm -f ieregen.stamp \ No newline at end of file diff --git a/openair-cn/S1AP/MESSAGES/Makefile.am b/openair-cn/S1AP/MESSAGES/Makefile.am deleted file mode 100644 index 765f972ab8..0000000000 --- a/openair-cn/S1AP/MESSAGES/Makefile.am +++ /dev/null @@ -1,805 +0,0 @@ -################################################################################ -# 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@eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ -SUBDIRS= ASN1/ . -ASN_MODULEdir=. -libs1apmessagesdir=. - -ASN_MODULE_SOURCES= \ - S1ap-Criticality.c \ - S1ap-Presence.c \ - S1ap-PrivateIE-ID.c \ - S1ap-ProcedureCode.c \ - S1ap-ProtocolExtensionID.c \ - S1ap-ProtocolIE-ID.c \ - S1ap-TriggeringMessage.c \ - S1ap-IE-Extensions.c \ - S1ap-AllocationAndRetentionPriority.c \ - S1ap-Bearers-SubjectToStatusTransfer-List.c \ - S1ap-Bearers-SubjectToStatusTransfer-Item.c \ - S1ap-BitRate.c \ - S1ap-BPLMNs.c \ - S1ap-BroadcastCompletedAreaList.c \ - S1ap-Cause.c \ - S1ap-CauseMisc.c \ - S1ap-CauseProtocol.c \ - S1ap-CauseRadioNetwork.c \ - S1ap-CauseTransport.c \ - S1ap-CauseNas.c \ - S1ap-CellIdentity.c \ - S1ap-CellID-Broadcast.c \ - S1ap-CellID-Broadcast-Item.c \ - S1ap-Cdma2000PDU.c \ - S1ap-Cdma2000RATType.c \ - S1ap-Cdma2000SectorID.c \ - S1ap-Cdma2000HOStatus.c \ - S1ap-Cdma2000HORequiredIndication.c \ - S1ap-Cdma2000OneXSRVCCInfo.c \ - S1ap-Cdma2000OneXMEID.c \ - S1ap-Cdma2000OneXMSI.c \ - S1ap-Cdma2000OneXPilot.c \ - S1ap-Cdma2000OneXRAND.c \ - S1ap-Cell-Size.c \ - S1ap-CellType.c \ - S1ap-CGI.c \ - S1ap-CI.c \ - S1ap-CNDomain.c \ - S1ap-CSFallbackIndicator.c \ - S1ap-CSG-Id.c \ - S1ap-CSG-IdList.c \ - S1ap-CSG-IdList-Item.c \ - S1ap-COUNTvalue.c \ - S1ap-CriticalityDiagnostics.c \ - S1ap-CriticalityDiagnostics-IE-List.c \ - S1ap-CriticalityDiagnostics-IE-Item.c \ - S1ap-DataCodingScheme.c \ - S1ap-DL-Forwarding.c \ - S1ap-Direct-Forwarding-Path-Availability.c \ - S1ap-E-RABToBeModifiedListBearerModReq.c \ - S1ap-E-RABToBeModifiedItemBearerModReq.c \ - S1ap-E-RABReleaseListBearerRelComp.c \ - S1ap-E-RABReleaseItemBearerRelComp.c \ - S1ap-E-RABDataForwardingList.c \ - S1ap-E-RABDataForwardingItem.c \ - S1ap-E-RABToBeSetupListCtxtSUReq.c \ - S1ap-E-RABToBeSetupItemCtxtSUReq.c \ - S1ap-E-RABSetupListBearerSURes.c \ - S1ap-E-RABSetupItemBearerSURes.c \ - S1ap-E-RABFailedToSetupListHOReqAck.c \ - S1ap-E-RABFailedToSetupItemHOReqAck.c \ - S1ap-E-RABToBeSetupListBearerSUReq.c \ - S1ap-E-RABToBeSetupItemBearerSUReq.c \ - S1ap-E-RABAdmittedList.c \ - S1ap-E-RABAdmittedItem.c \ - S1ap-E-RABToBeSwitchedDLList.c \ - S1ap-E-RABToBeSwitchedDLItem.c \ - S1ap-E-RABToBeSwitchedULList.c \ - S1ap-E-RABToBeSwitchedULItem.c \ - S1ap-E-RABModifyListBearerModRes.c \ - S1ap-E-RABModifyItemBearerModRes.c \ - S1ap-E-RABSetupListCtxtSURes.c \ - S1ap-E-RABSetupItemCtxtSURes.c \ - S1ap-E-RABToBeSetupListHOReq.c \ - S1ap-E-RABToBeSetupItemHOReq.c \ - S1ap-ECGIList.c \ - S1ap-EmergencyAreaIDList.c \ - S1ap-EmergencyAreaID.c \ - S1ap-EmergencyAreaID-Broadcast.c \ - S1ap-EmergencyAreaID-Broadcast-Item.c \ - S1ap-CompletedCellinEAI.c \ - S1ap-CompletedCellinEAI-Item.c \ - S1ap-ENB-ID.c \ - S1ap-GERAN-Cell-ID.c \ - S1ap-Global-ENB-ID.c \ - S1ap-ENB-StatusTransfer-TransparentContainer.c \ - S1ap-ENB-UE-S1AP-ID.c \ - S1ap-ENBname.c \ - S1ap-ENBX2TLAs.c \ - S1ap-EncryptionAlgorithms.c \ - S1ap-EPLMNs.c \ - S1ap-EventType.c \ - S1ap-E-RAB-ID.c \ - S1ap-E-RABInformationList.c \ - S1ap-E-RABInformationListItem.c \ - S1ap-E-RABList.c \ - S1ap-E-RABItem.c \ - S1ap-E-RABLevelQoSParameters.c \ - S1ap-EUTRAN-CGI.c \ - S1ap-ExtendedRNC-ID.c \ - S1ap-ForbiddenInterRATs.c \ - S1ap-ForbiddenTAs.c \ - S1ap-ForbiddenTAs-Item.c \ - S1ap-ForbiddenTACs.c \ - S1ap-ForbiddenLAs.c \ - S1ap-ForbiddenLAs-Item.c \ - S1ap-ForbiddenLACs.c \ - S1ap-GBR-QosInformation.c \ - S1ap-GTP-TEID.c \ - S1ap-GUMMEI.c \ - S1ap-HandoverRestrictionList.c \ - S1ap-HandoverType.c \ - S1ap-HFN.c \ - S1ap-HandoverNotify.c \ - S1ap-Inter-SystemInformationTransferType.c \ - S1ap-IMSI.c \ - S1ap-IntegrityProtectionAlgorithms.c \ - S1ap-InterfacesToTrace.c \ - S1ap-LAC.c \ - S1ap-LAI.c \ - S1ap-LastVisitedCell-Item.c \ - S1ap-LastVisitedEUTRANCellInformation.c \ - S1ap-LastVisitedUTRANCellInformation.c \ - S1ap-LastVisitedGERANCellInformation.c \ - S1ap-L3-Information.c \ - S1ap-MessageIdentifier.c \ - S1ap-MMEname.c \ - S1ap-MME-Group-ID.c \ - S1ap-MME-Code.c \ - S1ap-MME-UE-S1AP-ID.c \ - S1ap-M-TMSI.c \ - S1ap-MSClassmark2.c \ - S1ap-MSClassmark3.c \ - S1ap-NAS-PDU.c \ - S1ap-NASSecurityParametersfromE-UTRAN.c \ - S1ap-NASSecurityParameterstoE-UTRAN.c \ - S1ap-NumberofBroadcastRequest.c \ - S1ap-NumberOfBroadcasts.c \ - S1ap-OldBSS-ToNewBSS-Information.c \ - S1ap-OverloadAction.c \ - S1ap-OverloadResponse.c \ - S1ap-PagingDRX.c \ - S1ap-PDCP-SN.c \ - S1ap-PLMNidentity.c \ - S1ap-Pre-emptionCapability.c \ - S1ap-Pre-emptionVulnerability.c \ - S1ap-PriorityLevel.c \ - S1ap-QCI.c \ - S1ap-ReceiveStatusofULPDCPSDUs.c \ - S1ap-RelativeMMECapacity.c \ - S1ap-RAC.c \ - S1ap-RequestType.c \ - S1ap-ResetType.c \ - S1ap-ResetAll.c \ - S1ap-RIMTransfer.c \ - S1ap-RIMInformation.c \ - S1ap-RIMRoutingAddress.c \ - S1ap-ReportArea.c \ - S1ap-RepetitionPeriod.c \ - S1ap-RNC-ID.c \ - S1ap-RRC-Container.c \ - S1ap-RRC-Establishment-Cause.c \ - S1ap-SecurityKey.c \ - S1ap-SecurityContext.c \ - S1ap-SerialNumber.c \ - S1ap-SONInformation.c \ - S1ap-SONInformationRequest.c \ - S1ap-SONInformationReply.c \ - S1ap-SONConfigurationTransfer.c \ - S1ap-Source-ToTarget-TransparentContainer.c \ - S1ap-SourceBSS-ToTargetBSS-TransparentContainer.c \ - S1ap-SourceeNB-ID.c \ - S1ap-SRVCCOperationPossible.c \ - S1ap-SRVCCHOIndication.c \ - S1ap-SourceeNB-ToTargeteNB-TransparentContainer.c \ - S1ap-SourceRNC-ToTargetRNC-TransparentContainer.c \ - S1ap-ServedGUMMEIs.c \ - S1ap-ServedGUMMEIsItem.c \ - S1ap-ServedGroupIDs.c \ - S1ap-ServedMMECs.c \ - S1ap-ServedPLMNs.c \ - S1ap-SubscriberProfileIDforRFP.c \ - S1ap-SupportedTAs.c \ - S1ap-SupportedTAs-Item.c \ - S1ap-S-TMSI.c \ - S1ap-TAC.c \ - S1ap-TAIListforWarning.c \ - S1ap-TAIList.c \ - S1ap-TAIItem.c \ - S1ap-TAI.c \ - S1ap-TAI-Broadcast.c \ - S1ap-TAI-Broadcast-Item.c \ - S1ap-CompletedCellinTAI.c \ - S1ap-CompletedCellinTAI-Item.c \ - S1ap-TBCD-STRING.c \ - S1ap-TargetID.c \ - S1ap-TargeteNB-ID.c \ - S1ap-TargetRNC-ID.c \ - S1ap-TargeteNB-ToSourceeNB-TransparentContainer.c \ - S1ap-Target-ToSource-TransparentContainer.c \ - S1ap-TargetRNC-ToSourceRNC-TransparentContainer.c \ - S1ap-TargetBSS-ToSourceBSS-TransparentContainer.c \ - S1ap-TimeToWait.c \ - S1ap-Time-UE-StayedInCell.c \ - S1ap-TransportLayerAddress.c \ - S1ap-TraceActivation.c \ - S1ap-TraceDepth.c \ - S1ap-E-UTRAN-Trace-ID.c \ - S1ap-TypeOfError.c \ - S1ap-UEAggregateMaximumBitrate.c \ - S1ap-UE-S1AP-IDs.c \ - S1ap-UE-S1AP-ID-pair.c \ - S1ap-UE-associatedLogicalS1-ConnectionListRes.c \ - S1ap-UE-associatedLogicalS1-ConnectionListResAck.c \ - S1ap-UE-associatedLogicalS1-ConnectionItem.c \ - S1ap-UEIdentityIndexValue.c \ - S1ap-UE-HistoryInformation.c \ - S1ap-UEPagingID.c \ - S1ap-UERadioCapability.c \ - S1ap-UESecurityCapabilities.c \ - S1ap-WarningAreaList.c \ - S1ap-WarningType.c \ - S1ap-WarningSecurityInfo.c \ - S1ap-WarningMessageContents.c \ - S1ap-X2TNLConfigurationInfo.c \ - S1AP-PDU.c \ - S1ap-InitiatingMessage.c \ - S1ap-SuccessfulOutcome.c \ - S1ap-UnsuccessfulOutcome.c \ - S1ap-HandoverRequired.c \ - S1ap-HandoverCommand.c \ - S1ap-HandoverPreparationFailure.c \ - S1ap-HandoverRequest.c \ - S1ap-HandoverRequestAcknowledge.c \ - S1ap-HandoverFailure.c \ - S1ap-HandoverNotify.c \ - S1ap-PathSwitchRequest.c \ - S1ap-PathSwitchRequestAcknowledge.c \ - S1ap-PathSwitchRequestFailure.c \ - S1ap-E-RABSetupRequest.c \ - S1ap-E-RABSetupResponse.c \ - S1ap-E-RABModifyRequest.c \ - S1ap-E-RABModifyResponse.c \ - S1ap-E-RABReleaseIndication.c \ - S1ap-E-RABReleaseCommand.c \ - S1ap-E-RABReleaseResponse.c \ - S1ap-InitialContextSetupRequest.c \ - S1ap-InitialContextSetupResponse.c \ - S1ap-InitialContextSetupFailure.c \ - S1ap-UEContextReleaseRequest.c \ - S1ap-Paging.c \ - S1ap-DownlinkNASTransport.c \ - S1ap-InitialUEMessage.c \ - S1ap-UplinkNASTransport.c \ - S1ap-NASNonDeliveryIndication.c \ - S1ap-HandoverCancel.c \ - S1ap-HandoverCancelAcknowledge.c \ - S1ap-Reset.c \ - S1ap-ResetAcknowledge.c \ - S1ap-S1SetupResponse.c \ - S1ap-S1SetupRequest.c \ - S1ap-S1SetupFailure.c \ - S1ap-ErrorIndication.c \ - S1ap-ENBConfigurationUpdate.c \ - S1ap-ENBConfigurationUpdateAcknowledge.c \ - S1ap-ENBConfigurationUpdateFailure.c \ - S1ap-MMEConfigurationUpdate.c \ - S1ap-MMEConfigurationUpdateAcknowledge.c \ - S1ap-MMEConfigurationUpdateFailure.c \ - S1ap-DownlinkS1cdma2000tunneling.c \ - S1ap-UplinkS1cdma2000tunneling.c \ - S1ap-UEContextModificationRequest.c \ - S1ap-UEContextModificationResponse.c \ - S1ap-UEContextModificationFailure.c \ - S1ap-UECapabilityInfoIndication.c \ - S1ap-UEContextReleaseCommand.c \ - S1ap-UEContextReleaseComplete.c \ - S1ap-ENBStatusTransfer.c \ - S1ap-MMEStatusTransfer.c \ - S1ap-DeactivateTrace.c \ - S1ap-TraceStart.c \ - S1ap-TraceFailureIndication.c \ - S1ap-CellTrafficTrace.c \ - S1ap-LocationReportingControl.c \ - S1ap-LocationReportingFailureIndication.c \ - S1ap-LocationReport.c \ - S1ap-OverloadStart.c \ - S1ap-OverloadStop.c \ - S1ap-WriteReplaceWarningRequest.c \ - S1ap-WriteReplaceWarningResponse.c \ - S1ap-ENBDirectInformationTransfer.c \ - S1ap-MMEDirectInformationTransfer.c \ - S1ap-ENBConfigurationTransfer.c \ - S1ap-MMEConfigurationTransfer.c \ - S1ap-PrivateMessage.c \ - S1ap-IE.c \ - S1ap-IE-Extensions.c - -ASN_MODULE_HEADERS= \ - S1ap-Criticality.h \ - S1ap-Presence.h \ - S1ap-PrivateIE-ID.h \ - S1ap-ProcedureCode.h \ - S1ap-ProtocolExtensionID.h \ - S1ap-ProtocolIE-ID.h \ - S1ap-TriggeringMessage.h \ - S1ap-AllocationAndRetentionPriority.h \ - S1ap-Bearers-SubjectToStatusTransfer-List.h \ - S1ap-Bearers-SubjectToStatusTransfer-Item.h \ - S1ap-BitRate.h \ - S1ap-BPLMNs.h \ - S1ap-BroadcastCompletedAreaList.h \ - S1ap-Cause.h \ - S1ap-CauseMisc.h \ - S1ap-CauseProtocol.h \ - S1ap-CauseRadioNetwork.h \ - S1ap-CauseTransport.h \ - S1ap-CauseNas.h \ - S1ap-CellIdentity.h \ - S1ap-CellID-Broadcast.h \ - S1ap-CellID-Broadcast-Item.h \ - S1ap-Cdma2000PDU.h \ - S1ap-Cdma2000RATType.h \ - S1ap-Cdma2000SectorID.h \ - S1ap-Cdma2000HOStatus.h \ - S1ap-Cdma2000HORequiredIndication.h \ - S1ap-Cdma2000OneXSRVCCInfo.h \ - S1ap-Cdma2000OneXMEID.h \ - S1ap-Cdma2000OneXMSI.h \ - S1ap-Cdma2000OneXPilot.h \ - S1ap-Cdma2000OneXRAND.h \ - S1ap-Cell-Size.h \ - S1ap-CellType.h \ - S1ap-CGI.h \ - S1ap-CI.h \ - S1ap-CNDomain.h \ - S1ap-CSFallbackIndicator.h \ - S1ap-CSG-Id.h \ - S1ap-CSG-IdList.h \ - S1ap-CSG-IdList-Item.h \ - S1ap-COUNTvalue.h \ - S1ap-CriticalityDiagnostics.h \ - S1ap-CriticalityDiagnostics-IE-List.h \ - S1ap-CriticalityDiagnostics-IE-Item.h \ - S1ap-DataCodingScheme.h \ - S1ap-DL-Forwarding.h \ - S1ap-Direct-Forwarding-Path-Availability.h \ - S1ap-E-RABToBeModifiedListBearerModReq.h \ - S1ap-E-RABToBeModifiedItemBearerModReq.h \ - S1ap-E-RABReleaseListBearerRelComp.h \ - S1ap-E-RABReleaseItemBearerRelComp.h \ - S1ap-E-RABDataForwardingList.h \ - S1ap-E-RABDataForwardingItem.h \ - S1ap-E-RABToBeSetupListCtxtSUReq.h \ - S1ap-E-RABToBeSetupItemCtxtSUReq.h \ - S1ap-E-RABSetupListBearerSURes.h \ - S1ap-E-RABSetupItemBearerSURes.h \ - S1ap-E-RABFailedToSetupListHOReqAck.h \ - S1ap-E-RABFailedToSetupItemHOReqAck.h \ - S1ap-E-RABToBeSetupListBearerSUReq.h \ - S1ap-E-RABToBeSetupItemBearerSUReq.h \ - S1ap-E-RABAdmittedList.h \ - S1ap-E-RABAdmittedItem.h \ - S1ap-E-RABToBeSwitchedDLList.h \ - S1ap-E-RABToBeSwitchedDLItem.h \ - S1ap-E-RABToBeSwitchedULList.h \ - S1ap-E-RABToBeSwitchedULItem.h \ - S1ap-E-RABModifyListBearerModRes.h \ - S1ap-E-RABModifyItemBearerModRes.h \ - S1ap-E-RABSetupListCtxtSURes.h \ - S1ap-E-RABSetupItemCtxtSURes.h \ - S1ap-E-RABToBeSetupListHOReq.h \ - S1ap-E-RABToBeSetupItemHOReq.h \ - S1ap-ECGIList.h \ - S1ap-EmergencyAreaIDList.h \ - S1ap-EmergencyAreaID.h \ - S1ap-EmergencyAreaID-Broadcast.h \ - S1ap-EmergencyAreaID-Broadcast-Item.h \ - S1ap-CompletedCellinEAI.h \ - S1ap-CompletedCellinEAI-Item.h \ - S1ap-ENB-ID.h \ - S1ap-GERAN-Cell-ID.h \ - S1ap-Global-ENB-ID.h \ - S1ap-ENB-StatusTransfer-TransparentContainer.h \ - S1ap-ENB-UE-S1AP-ID.h \ - S1ap-ENBname.h \ - S1ap-ENBX2TLAs.h \ - S1ap-EncryptionAlgorithms.h \ - S1ap-EPLMNs.h \ - S1ap-EventType.h \ - S1ap-E-RAB-ID.h \ - S1ap-E-RABInformationList.h \ - S1ap-E-RABInformationListItem.h \ - S1ap-E-RABList.h \ - S1ap-E-RABItem.h \ - S1ap-E-RABLevelQoSParameters.h \ - S1ap-EUTRAN-CGI.h \ - S1ap-ExtendedRNC-ID.h \ - S1ap-ForbiddenInterRATs.h \ - S1ap-ForbiddenTAs.h \ - S1ap-ForbiddenTAs-Item.h \ - S1ap-ForbiddenTACs.h \ - S1ap-ForbiddenLAs.h \ - S1ap-ForbiddenLAs-Item.h \ - S1ap-ForbiddenLACs.h \ - S1ap-GBR-QosInformation.h \ - S1ap-GTP-TEID.h \ - S1ap-GUMMEI.h \ - S1ap-HandoverRestrictionList.h \ - S1ap-HandoverType.h \ - S1ap-HFN.h \ - S1ap-HandoverNotify.h \ - S1ap-Inter-SystemInformationTransferType.h \ - S1ap-IMSI.h \ - S1ap-IntegrityProtectionAlgorithms.h \ - S1ap-InterfacesToTrace.h \ - S1ap-LAC.h \ - S1ap-LAI.h \ - S1ap-LastVisitedCell-Item.h \ - S1ap-LastVisitedEUTRANCellInformation.h \ - S1ap-LastVisitedUTRANCellInformation.h \ - S1ap-LastVisitedGERANCellInformation.h \ - S1ap-L3-Information.h \ - S1ap-MessageIdentifier.h \ - S1ap-MMEname.h \ - S1ap-MME-Group-ID.h \ - S1ap-MME-Code.h \ - S1ap-MME-UE-S1AP-ID.h \ - S1ap-M-TMSI.h \ - S1ap-MSClassmark2.h \ - S1ap-MSClassmark3.h \ - S1ap-NAS-PDU.h \ - S1ap-NASSecurityParametersfromE-UTRAN.h \ - S1ap-NASSecurityParameterstoE-UTRAN.h \ - S1ap-NumberofBroadcastRequest.h \ - S1ap-NumberOfBroadcasts.h \ - S1ap-OldBSS-ToNewBSS-Information.h \ - S1ap-OverloadAction.h \ - S1ap-OverloadResponse.h \ - S1ap-PagingDRX.h \ - S1ap-PDCP-SN.h \ - S1ap-PLMNidentity.h \ - S1ap-Pre-emptionCapability.h \ - S1ap-Pre-emptionVulnerability.h \ - S1ap-PriorityLevel.h \ - S1ap-QCI.h \ - S1ap-ReceiveStatusofULPDCPSDUs.h \ - S1ap-RelativeMMECapacity.h \ - S1ap-RAC.h \ - S1ap-RequestType.h \ - S1ap-ResetType.h \ - S1ap-ResetAll.h \ - S1ap-RIMTransfer.h \ - S1ap-RIMInformation.h \ - S1ap-RIMRoutingAddress.h \ - S1ap-ReportArea.h \ - S1ap-RepetitionPeriod.h \ - S1ap-RNC-ID.h \ - S1ap-RRC-Container.h \ - S1ap-RRC-Establishment-Cause.h \ - S1ap-SecurityKey.h \ - S1ap-SecurityContext.h \ - S1ap-SerialNumber.h \ - S1ap-SONInformation.h \ - S1ap-SONInformationRequest.h \ - S1ap-SONInformationReply.h \ - S1ap-SONConfigurationTransfer.h \ - S1ap-Source-ToTarget-TransparentContainer.h \ - S1ap-SourceBSS-ToTargetBSS-TransparentContainer.h \ - S1ap-SourceeNB-ID.h \ - S1ap-SRVCCOperationPossible.h \ - S1ap-SRVCCHOIndication.h \ - S1ap-SourceeNB-ToTargeteNB-TransparentContainer.h \ - S1ap-SourceRNC-ToTargetRNC-TransparentContainer.h \ - S1ap-ServedGUMMEIs.h \ - S1ap-ServedGUMMEIsItem.h \ - S1ap-ServedGroupIDs.h \ - S1ap-ServedMMECs.h \ - S1ap-ServedPLMNs.h \ - S1ap-SubscriberProfileIDforRFP.h \ - S1ap-SupportedTAs.h \ - S1ap-SupportedTAs-Item.h \ - S1ap-S-TMSI.h \ - S1ap-TAC.h \ - S1ap-TAIListforWarning.h \ - S1ap-TAIList.h \ - S1ap-TAIItem.h \ - S1ap-TAI.h \ - S1ap-TAI-Broadcast.h \ - S1ap-TAI-Broadcast-Item.h \ - S1ap-CompletedCellinTAI.h \ - S1ap-CompletedCellinTAI-Item.h \ - S1ap-TBCD-STRING.h \ - S1ap-TargetID.h \ - S1ap-TargeteNB-ID.h \ - S1ap-TargetRNC-ID.h \ - S1ap-TargeteNB-ToSourceeNB-TransparentContainer.h \ - S1ap-Target-ToSource-TransparentContainer.h \ - S1ap-TargetRNC-ToSourceRNC-TransparentContainer.h \ - S1ap-TargetBSS-ToSourceBSS-TransparentContainer.h \ - S1ap-TimeToWait.h \ - S1ap-Time-UE-StayedInCell.h \ - S1ap-TransportLayerAddress.h \ - S1ap-TraceActivation.h \ - S1ap-TraceDepth.h \ - S1ap-E-UTRAN-Trace-ID.h \ - S1ap-TypeOfError.h \ - S1ap-UEAggregateMaximumBitrate.h \ - S1ap-UE-S1AP-IDs.h \ - S1ap-UE-S1AP-ID-pair.h \ - S1ap-UE-associatedLogicalS1-ConnectionListRes.h \ - S1ap-UE-associatedLogicalS1-ConnectionListResAck.h \ - S1ap-UE-associatedLogicalS1-ConnectionItem.h \ - S1ap-UEIdentityIndexValue.h \ - S1ap-UE-HistoryInformation.h \ - S1ap-UEPagingID.h \ - S1ap-UERadioCapability.h \ - S1ap-UESecurityCapabilities.h \ - S1ap-WarningAreaList.h \ - S1ap-WarningType.h \ - S1ap-WarningSecurityInfo.h \ - S1ap-WarningMessageContents.h \ - S1ap-X2TNLConfigurationInfo.h \ - S1AP-PDU.h \ - S1ap-InitiatingMessage.h \ - S1ap-SuccessfulOutcome.h \ - S1ap-UnsuccessfulOutcome.h \ - S1ap-HandoverRequired.h \ - S1ap-HandoverCommand.h \ - S1ap-HandoverPreparationFailure.h \ - S1ap-HandoverRequest.h \ - S1ap-HandoverRequestAcknowledge.h \ - S1ap-HandoverFailure.h \ - S1ap-PathSwitchRequest.h \ - S1ap-PathSwitchRequestAcknowledge.h \ - S1ap-PathSwitchRequestFailure.h \ - S1ap-E-RABSetupRequest.h \ - S1ap-E-RABSetupResponse.h \ - S1ap-E-RABModifyRequest.h \ - S1ap-E-RABModifyResponse.h \ - S1ap-E-RABReleaseIndication.h \ - S1ap-E-RABReleaseCommand.h \ - S1ap-E-RABReleaseResponse.h \ - S1ap-InitialContextSetupRequest.h \ - S1ap-InitialContextSetupResponse.h \ - S1ap-InitialContextSetupFailure.h \ - S1ap-UEContextReleaseRequest.h \ - S1ap-Paging.h \ - S1ap-DownlinkNASTransport.h \ - S1ap-InitialUEMessage.h \ - S1ap-UplinkNASTransport.h \ - S1ap-NASNonDeliveryIndication.h \ - S1ap-HandoverCancel.h \ - S1ap-HandoverCancelAcknowledge.h \ - S1ap-Reset.h \ - S1ap-ResetAcknowledge.h \ - S1ap-S1SetupResponse.h \ - S1ap-S1SetupRequest.h \ - S1ap-S1SetupFailure.h \ - S1ap-ErrorIndication.h \ - S1ap-ENBConfigurationUpdate.h \ - S1ap-ENBConfigurationUpdateAcknowledge.h \ - S1ap-ENBConfigurationUpdateFailure.h \ - S1ap-MMEConfigurationUpdate.h \ - S1ap-MMEConfigurationUpdateAcknowledge.h \ - S1ap-MMEConfigurationUpdateFailure.h \ - S1ap-DownlinkS1cdma2000tunneling.h \ - S1ap-UplinkS1cdma2000tunneling.h \ - S1ap-UEContextModificationRequest.h \ - S1ap-UEContextModificationResponse.h \ - S1ap-UEContextModificationFailure.h \ - S1ap-UECapabilityInfoIndication.h \ - S1ap-UEContextReleaseCommand.h \ - S1ap-UEContextReleaseComplete.h \ - S1ap-ENBStatusTransfer.h \ - S1ap-MMEStatusTransfer.h \ - S1ap-DeactivateTrace.h \ - S1ap-TraceStart.h \ - S1ap-TraceFailureIndication.h \ - S1ap-CellTrafficTrace.h \ - S1ap-LocationReportingControl.h \ - S1ap-LocationReportingFailureIndication.h \ - S1ap-LocationReport.h \ - S1ap-OverloadStart.h \ - S1ap-OverloadStop.h \ - S1ap-WriteReplaceWarningRequest.h \ - S1ap-WriteReplaceWarningResponse.h \ - S1ap-ENBDirectInformationTransfer.h \ - S1ap-MMEDirectInformationTransfer.h \ - S1ap-ENBConfigurationTransfer.h \ - S1ap-MMEConfigurationTransfer.h \ - S1ap-PrivateMessage.h \ - S1ap-IE.h \ - S1ap-IE-Extensions.h - -ASN_MODULE_HEADERS+=ANY.h -ASN_MODULE_SOURCES+=ANY.c -ASN_MODULE_HEADERS+=BOOLEAN.h -ASN_MODULE_SOURCES+=BOOLEAN.c -ASN_MODULE_HEADERS+=INTEGER.h -ASN_MODULE_HEADERS+=NativeEnumerated.h -ASN_MODULE_SOURCES+=INTEGER.c -ASN_MODULE_HEADERS+=NULL.h -ASN_MODULE_SOURCES+=NULL.c -ASN_MODULE_SOURCES+=NativeEnumerated.c -ASN_MODULE_HEADERS+=NativeInteger.h -ASN_MODULE_SOURCES+=NativeInteger.c -ASN_MODULE_HEADERS+=OBJECT_IDENTIFIER.h -ASN_MODULE_SOURCES+=OBJECT_IDENTIFIER.c -ASN_MODULE_HEADERS+=PrintableString.h -ASN_MODULE_SOURCES+=PrintableString.c -ASN_MODULE_HEADERS+=asn_SEQUENCE_OF.h -ASN_MODULE_SOURCES+=asn_SEQUENCE_OF.c -ASN_MODULE_HEADERS+=asn_SET_OF.h -ASN_MODULE_SOURCES+=asn_SET_OF.c -ASN_MODULE_HEADERS+=constr_CHOICE.h -ASN_MODULE_SOURCES+=constr_CHOICE.c -ASN_MODULE_HEADERS+=constr_SEQUENCE.h -ASN_MODULE_SOURCES+=constr_SEQUENCE.c -ASN_MODULE_HEADERS+=constr_SEQUENCE_OF.h -ASN_MODULE_SOURCES+=constr_SEQUENCE_OF.c -ASN_MODULE_HEADERS+=constr_SET_OF.h -ASN_MODULE_SOURCES+=constr_SET_OF.c -ASN_MODULE_HEADERS+=asn_application.h -ASN_MODULE_HEADERS+=asn_system.h -ASN_MODULE_HEADERS+=asn_codecs.h -ASN_MODULE_HEADERS+=asn_internal.h -ASN_MODULE_HEADERS+=OCTET_STRING.h -ASN_MODULE_SOURCES+=OCTET_STRING.c -ASN_MODULE_HEADERS+=BIT_STRING.h -ASN_MODULE_SOURCES+=BIT_STRING.c -ASN_MODULE_SOURCES+=asn_codecs_prim.c -ASN_MODULE_HEADERS+=asn_codecs_prim.h -ASN_MODULE_HEADERS+=ber_tlv_length.h -ASN_MODULE_SOURCES+=ber_tlv_length.c -ASN_MODULE_HEADERS+=ber_tlv_tag.h -ASN_MODULE_SOURCES+=ber_tlv_tag.c -ASN_MODULE_HEADERS+=ber_decoder.h -ASN_MODULE_SOURCES+=ber_decoder.c -ASN_MODULE_HEADERS+=der_encoder.h -ASN_MODULE_SOURCES+=der_encoder.c -ASN_MODULE_HEADERS+=constr_TYPE.h -ASN_MODULE_SOURCES+=constr_TYPE.c -ASN_MODULE_HEADERS+=constraints.h -ASN_MODULE_SOURCES+=constraints.c -ASN_MODULE_HEADERS+=xer_support.h -ASN_MODULE_SOURCES+=xer_support.c -ASN_MODULE_HEADERS+=xer_decoder.h -ASN_MODULE_SOURCES+=xer_decoder.c -ASN_MODULE_HEADERS+=xer_encoder.h -ASN_MODULE_SOURCES+=xer_encoder.c -ASN_MODULE_HEADERS+=per_support.h -ASN_MODULE_SOURCES+=per_support.c -ASN_MODULE_HEADERS+=per_decoder.h -ASN_MODULE_SOURCES+=per_decoder.c -ASN_MODULE_HEADERS+=per_encoder.h -ASN_MODULE_SOURCES+=per_encoder.c -ASN_MODULE_HEADERS+=per_opentype.h -ASN_MODULE_SOURCES+=per_opentype.c - -if UPDATE_RELEASE_9 -ASN_MODULE_SOURCES += \ - S1ap-KillResponse.c \ - S1ap-KillRequest.c \ - S1ap-Data-Forwarding-Not-Possible.c \ - S1ap-DownlinkUEAssociatedLPPaTransport.c \ - S1ap-UplinkUEAssociatedLPPaTransport.c \ - S1ap-DownlinkNonUEAssociatedLPPaTransport.c \ - S1ap-UplinkNonUEAssociatedLPPaTransport.c \ - S1ap-TAI-Cancelled.c \ - S1ap-TAI-Cancelled-Item.c \ - S1ap-StratumLevel.c \ - S1ap-SynchronizationStatus.c \ - S1ap-TimeSynchronizationInfo.c \ - S1ap-Routing-ID.c \ - S1ap-PS-ServiceNotAvailable.c \ - S1ap-LPPa-PDU.c \ - S1ap-ExtendedRepetitionPeriod.c \ - S1ap-EUTRANRoundTripDelayEstimationInfo.c \ - S1ap-EmergencyAreaID-Cancelled.c \ - S1ap-EmergencyAreaID-Cancelled-Item.c \ - S1ap-CSGMembershipStatus.c \ - S1ap-ConcurrentWarningMessageIndicator.c \ - S1ap-CellID-Cancelled.c \ - S1ap-CellID-Cancelled-Item.c \ - S1ap-CellAccessMode.c \ - S1ap-CancelledCellinEAI.c \ - S1ap-CancelledCellinEAI-Item.c \ - S1ap-CancelledCellinTAI.c \ - S1ap-CancelledCellinTAI-Item.c \ - S1ap-BroadcastCancelledAreaList.c - -ASN_MODULE_HEADERS += \ - S1ap-BroadcastCancelledAreaList.h \ - S1ap-CancelledCellinEAI.h \ - S1ap-CancelledCellinEAI-Item.h \ - S1ap-CancelledCellinTAI.h \ - S1ap-CancelledCellinTAI-Item.h \ - S1ap-CellAccessMode.h \ - S1ap-CellID-Cancelled.h \ - S1ap-CellID-Cancelled-Item.h \ - S1ap-ConcurrentWarningMessageIndicator.h \ - S1ap-CSGMembershipStatus.h \ - S1ap-Data-Forwarding-Not-Possible.h \ - S1ap-EmergencyAreaID-Cancelled.h \ - S1ap-EmergencyAreaID-Cancelled-Item.h \ - S1ap-E-RABList.h \ - S1ap-EUTRANRoundTripDelayEstimationInfo.h \ - S1ap-ExtendedRepetitionPeriod.h \ - S1ap-LPPa-PDU.h \ - S1ap-PS-ServiceNotAvailable.h \ - S1ap-Routing-ID.h \ - S1ap-StratumLevel.h \ - S1ap-SynchronizationStatus.h \ - S1ap-TimeSynchronizationInfo.h \ - S1ap-TAI-Cancelled.h \ - S1ap-TAI-Cancelled-Item.h \ - S1ap-KillResponse.h \ - S1ap-KillRequest.h \ - S1ap-DownlinkUEAssociatedLPPaTransport.h \ - S1ap-UplinkUEAssociatedLPPaTransport.h \ - S1ap-DownlinkNonUEAssociatedLPPaTransport.h \ - S1ap-UplinkNonUEAssociatedLPPaTransport.h -endif - -if UPDATE_RELEASE_10 -ASN_MODULE_SOURCES += \ - S1ap-PagingPriority.c \ - S1ap-RelayNode-Indicator.c \ - S1ap-GWContextReleaseIndication.c \ - S1ap-MMERelaySupportIndicator.c \ - S1ap-ManagementBasedMDTAllowed.c \ - S1ap-PrivacyIndicator.c \ - S1ap-TrafficLoadReductionIndication.c \ - S1ap-GUMMEIList.c - -ASN_MODULE_HEADERS += \ - S1ap-PagingPriority.h \ - S1ap-RelayNode-Indicator.h \ - S1ap-GWContextReleaseIndication.h \ - S1ap-MMERelaySupportIndicator.h \ - S1ap-ManagementBasedMDTAllowed.h \ - S1ap-PrivacyIndicator.h \ - S1ap-TrafficLoadReductionIndication.h \ - S1ap-GUMMEIList.h -endif - -noinst_LTLIBRARIES = libs1apmessages.la -libs1apmessages_la_LDFLAGS = -all-static - -BUILT_SOURCES = asn1regen.stamp - -AM_CFLAGS = \ - @ADD_CFLAGS@ \ - -DEMIT_ASN_DEBUG_EXTERN - -libs1apmessages_la_SOURCES=$(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) - -asn1regen.stamp: ASN1/$(ASN1DIR)/S1AP-CommonDataTypes.asn ASN1/$(ASN1DIR)/S1AP-Constants.asn ASN1/$(ASN1DIR)/S1AP-IEs.asn ASN1/$(ASN1DIR)/S1AP-PDU.asn - asn1c -gen-PER -fhave_native64 $^ - echo Timestamp > $@ - -clean-messages: - rm -f *.lo - -clean-local: - rm -f asn1regen.stamp - rm -f Makefile.am.sample - rm -f converter-sample.c - rm -f $(ASN_MODULE_SOURCES) - rm -f $(ASN_MODULE_HEADERS) - rm -f $(ASN_MODULE_HEADERS_IES) diff --git a/openair-cn/S1AP/MESSAGES/Makefile.inc b/openair-cn/S1AP/MESSAGES/Makefile.inc deleted file mode 100644 index e0a780d541..0000000000 --- a/openair-cn/S1AP/MESSAGES/Makefile.inc +++ /dev/null @@ -1,784 +0,0 @@ -################################################################################ -# 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@eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ -S1AP_ASN_MODULE_SOURCES= \ - S1ap-Criticality.o \ - S1ap-Presence.o \ - S1ap-PrivateIE-ID.o \ - S1ap-ProcedureCode.o \ - S1ap-ProtocolExtensionID.o \ - S1ap-ProtocolIE-ID.o \ - S1ap-TriggeringMessage.o \ - S1ap-IE-Extensions.o \ - S1ap-AllocationAndRetentionPriority.o \ - S1ap-Bearers-SubjectToStatusTransfer-List.o \ - S1ap-Bearers-SubjectToStatusTransfer-Item.o \ - S1ap-BitRate.o \ - S1ap-BPLMNs.o \ - S1ap-BroadcastCompletedAreaList.o \ - S1ap-Cause.o \ - S1ap-CauseMisc.o \ - S1ap-CauseProtocol.o \ - S1ap-CauseRadioNetwork.o \ - S1ap-CauseTransport.o \ - S1ap-CauseNas.o \ - S1ap-CellIdentity.o \ - S1ap-CellID-Broadcast.o \ - S1ap-CellID-Broadcast-Item.o \ - S1ap-Cdma2000PDU.o \ - S1ap-Cdma2000RATType.o \ - S1ap-Cdma2000SectorID.o \ - S1ap-Cdma2000HOStatus.o \ - S1ap-Cdma2000HORequiredIndication.o \ - S1ap-Cdma2000OneXSRVCCInfo.o \ - S1ap-Cdma2000OneXMEID.o \ - S1ap-Cdma2000OneXMSI.o \ - S1ap-Cdma2000OneXPilot.o \ - S1ap-Cdma2000OneXRAND.o \ - S1ap-Cell-Size.o \ - S1ap-CellType.o \ - S1ap-CGI.o \ - S1ap-CI.o \ - S1ap-CNDomain.o \ - S1ap-CSFallbackIndicator.o \ - S1ap-CSG-Id.o \ - S1ap-CSG-IdList.o \ - S1ap-CSG-IdList-Item.o \ - S1ap-COUNTvalue.o \ - S1ap-CriticalityDiagnostics.o \ - S1ap-CriticalityDiagnostics-IE-List.o \ - S1ap-CriticalityDiagnostics-IE-Item.o \ - S1ap-DataCodingScheme.o \ - S1ap-DL-Forwarding.o \ - S1ap-Direct-Forwarding-Path-Availability.o \ - S1ap-E-RABToBeModifiedListBearerModReq.o \ - S1ap-E-RABToBeModifiedItemBearerModReq.o \ - S1ap-E-RABReleaseListBearerRelComp.o \ - S1ap-E-RABReleaseItemBearerRelComp.o \ - S1ap-E-RABDataForwardingList.o \ - S1ap-E-RABDataForwardingItem.o \ - S1ap-E-RABToBeSetupListCtxtSUReq.o \ - S1ap-E-RABToBeSetupItemCtxtSUReq.o \ - S1ap-E-RABSetupListBearerSURes.o \ - S1ap-E-RABSetupItemBearerSURes.o \ - S1ap-E-RABFailedToSetupListHOReqAck.o \ - S1ap-E-RABFailedToSetupItemHOReqAck.o \ - S1ap-E-RABToBeSetupListBearerSUReq.o \ - S1ap-E-RABToBeSetupItemBearerSUReq.o \ - S1ap-E-RABAdmittedList.o \ - S1ap-E-RABAdmittedItem.o \ - S1ap-E-RABToBeSwitchedDLList.o \ - S1ap-E-RABToBeSwitchedDLItem.o \ - S1ap-E-RABToBeSwitchedULList.o \ - S1ap-E-RABToBeSwitchedULItem.o \ - S1ap-E-RABModifyListBearerModRes.o \ - S1ap-E-RABModifyItemBearerModRes.o \ - S1ap-E-RABSetupListCtxtSURes.o \ - S1ap-E-RABSetupItemCtxtSURes.o \ - S1ap-E-RABToBeSetupListHOReq.o \ - S1ap-E-RABToBeSetupItemHOReq.o \ - S1ap-ECGIList.o \ - S1ap-EmergencyAreaIDList.o \ - S1ap-EmergencyAreaID.o \ - S1ap-EmergencyAreaID-Broadcast.o \ - S1ap-EmergencyAreaID-Broadcast-Item.o \ - S1ap-CompletedCellinEAI.o \ - S1ap-CompletedCellinEAI-Item.o \ - S1ap-ENB-ID.o \ - S1ap-GERAN-Cell-ID.o \ - S1ap-Global-ENB-ID.o \ - S1ap-ENB-StatusTransfer-TransparentContainer.o \ - S1ap-ENB-UE-S1AP-ID.o \ - S1ap-ENBname.o \ - S1ap-ENBX2TLAs.o \ - S1ap-EncryptionAlgorithms.o \ - S1ap-EPLMNs.o \ - S1ap-EventType.o \ - S1ap-E-RAB-ID.o \ - S1ap-E-RABInformationList.o \ - S1ap-E-RABInformationListItem.o \ - S1ap-E-RABList.o \ - S1ap-E-RABItem.o \ - S1ap-E-RABLevelQoSParameters.o \ - S1ap-EUTRAN-CGI.o \ - S1ap-ExtendedRNC-ID.o \ - S1ap-ForbiddenInterRATs.o \ - S1ap-ForbiddenTAs.o \ - S1ap-ForbiddenTAs-Item.o \ - S1ap-ForbiddenTACs.o \ - S1ap-ForbiddenLAs.o \ - S1ap-ForbiddenLAs-Item.o \ - S1ap-ForbiddenLACs.o \ - S1ap-GBR-QosInformation.o \ - S1ap-GTP-TEID.o \ - S1ap-GUMMEI.o \ - S1ap-HandoverRestrictionList.o \ - S1ap-HandoverType.o \ - S1ap-HFN.o \ - S1ap-Inter-SystemInformationTransferType.o \ - S1ap-IMSI.o \ - S1ap-IntegrityProtectionAlgorithms.o \ - S1ap-InterfacesToTrace.o \ - S1ap-LAC.o \ - S1ap-LAI.o \ - S1ap-LastVisitedCell-Item.o \ - S1ap-LastVisitedEUTRANCellInformation.o \ - S1ap-LastVisitedUTRANCellInformation.o \ - S1ap-LastVisitedGERANCellInformation.o \ - S1ap-L3-Information.o \ - S1ap-MessageIdentifier.o \ - S1ap-MMEname.o \ - S1ap-MME-Group-ID.o \ - S1ap-MME-Code.o \ - S1ap-MME-UE-S1AP-ID.o \ - S1ap-M-TMSI.o \ - S1ap-MSClassmark2.o \ - S1ap-MSClassmark3.o \ - S1ap-NAS-PDU.o \ - S1ap-NASSecurityParametersfromE-UTRAN.o \ - S1ap-NASSecurityParameterstoE-UTRAN.o \ - S1ap-NumberofBroadcastRequest.o \ - S1ap-NumberOfBroadcasts.o \ - S1ap-OldBSS-ToNewBSS-Information.o \ - S1ap-OverloadAction.o \ - S1ap-OverloadResponse.o \ - S1ap-PagingDRX.o \ - S1ap-PDCP-SN.o \ - S1ap-PLMNidentity.o \ - S1ap-Pre-emptionCapability.o \ - S1ap-Pre-emptionVulnerability.o \ - S1ap-PriorityLevel.o \ - S1ap-QCI.o \ - S1ap-ReceiveStatusofULPDCPSDUs.o \ - S1ap-RelativeMMECapacity.o \ - S1ap-RAC.o \ - S1ap-RequestType.o \ - S1ap-ResetType.o \ - S1ap-ResetAll.o \ - S1ap-RIMTransfer.o \ - S1ap-RIMInformation.o \ - S1ap-RIMRoutingAddress.o \ - S1ap-ReportArea.o \ - S1ap-RepetitionPeriod.o \ - S1ap-RNC-ID.o \ - S1ap-RRC-Container.o \ - S1ap-RRC-Establishment-Cause.o \ - S1ap-SecurityKey.o \ - S1ap-SecurityContext.o \ - S1ap-SerialNumber.o \ - S1ap-SONInformation.o \ - S1ap-SONInformationRequest.o \ - S1ap-SONInformationReply.o \ - S1ap-SONConfigurationTransfer.o \ - S1ap-Source-ToTarget-TransparentContainer.o \ - S1ap-SourceBSS-ToTargetBSS-TransparentContainer.o \ - S1ap-SourceeNB-ID.o \ - S1ap-SRVCCOperationPossible.o \ - S1ap-SRVCCHOIndication.o \ - S1ap-SourceeNB-ToTargeteNB-TransparentContainer.o \ - S1ap-SourceRNC-ToTargetRNC-TransparentContainer.o \ - S1ap-ServedGUMMEIs.o \ - S1ap-ServedGUMMEIsItem.o \ - S1ap-ServedGroupIDs.o \ - S1ap-ServedMMECs.o \ - S1ap-ServedPLMNs.o \ - S1ap-SubscriberProfileIDforRFP.o \ - S1ap-SupportedTAs.o \ - S1ap-SupportedTAs-Item.o \ - S1ap-S-TMSI.o \ - S1ap-TAC.o \ - S1ap-TAIListforWarning.o \ - S1ap-TAIList.o \ - S1ap-TAIItem.o \ - S1ap-TAI.o \ - S1ap-TAI-Broadcast.o \ - S1ap-TAI-Broadcast-Item.o \ - S1ap-CompletedCellinTAI.o \ - S1ap-CompletedCellinTAI-Item.o \ - S1ap-TBCD-STRING.o \ - S1ap-TargetID.o \ - S1ap-TargeteNB-ID.o \ - S1ap-TargetRNC-ID.o \ - S1ap-TargeteNB-ToSourceeNB-TransparentContainer.o \ - S1ap-Target-ToSource-TransparentContainer.o \ - S1ap-TargetRNC-ToSourceRNC-TransparentContainer.o \ - S1ap-TargetBSS-ToSourceBSS-TransparentContainer.o \ - S1ap-TimeToWait.o \ - S1ap-Time-UE-StayedInCell.o \ - S1ap-TransportLayerAddress.o \ - S1ap-TraceActivation.o \ - S1ap-TraceDepth.o \ - S1ap-E-UTRAN-Trace-ID.o \ - S1ap-TypeOfError.o \ - S1ap-UEAggregateMaximumBitrate.o \ - S1ap-UE-S1AP-IDs.o \ - S1ap-UE-S1AP-ID-pair.o \ - S1ap-UE-associatedLogicalS1-ConnectionListRes.o \ - S1ap-UE-associatedLogicalS1-ConnectionListResAck.o \ - S1ap-UE-associatedLogicalS1-ConnectionItem.o \ - S1ap-UEIdentityIndexValue.o \ - S1ap-UE-HistoryInformation.o \ - S1ap-UEPagingID.o \ - S1ap-UERadioCapability.o \ - S1ap-UESecurityCapabilities.o \ - S1ap-WarningAreaList.o \ - S1ap-WarningType.o \ - S1ap-WarningSecurityInfo.o \ - S1ap-WarningMessageContents.o \ - S1ap-X2TNLConfigurationInfo.o \ - S1AP-PDU.o \ - S1ap-InitiatingMessage.o \ - S1ap-SuccessfulOutcome.o \ - S1ap-UnsuccessfulOutcome.o \ - S1ap-HandoverRequired.o \ - S1ap-HandoverCommand.o \ - S1ap-HandoverPreparationFailure.o \ - S1ap-HandoverRequest.o \ - S1ap-HandoverRequestAcknowledge.o \ - S1ap-HandoverFailure.o \ - S1ap-HandoverNotify.o \ - S1ap-PathSwitchRequest.o \ - S1ap-PathSwitchRequestAcknowledge.o \ - S1ap-PathSwitchRequestFailure.o \ - S1ap-E-RABSetupRequest.o \ - S1ap-E-RABSetupResponse.o \ - S1ap-E-RABModifyRequest.o \ - S1ap-E-RABModifyResponse.o \ - S1ap-E-RABReleaseIndication.o \ - S1ap-E-RABReleaseCommand.o \ - S1ap-E-RABReleaseResponse.o \ - S1ap-InitialContextSetupRequest.o \ - S1ap-InitialContextSetupResponse.o \ - S1ap-InitialContextSetupFailure.o \ - S1ap-UEContextReleaseRequest.o \ - S1ap-Paging.o \ - S1ap-DownlinkNASTransport.o \ - S1ap-InitialUEMessage.o \ - S1ap-UplinkNASTransport.o \ - S1ap-NASNonDeliveryIndication.o \ - S1ap-HandoverCancel.o \ - S1ap-HandoverCancelAcknowledge.o \ - S1ap-Reset.o \ - S1ap-ResetAcknowledge.o \ - S1ap-S1SetupResponse.o \ - S1ap-S1SetupRequest.o \ - S1ap-S1SetupFailure.o \ - S1ap-ErrorIndication.o \ - S1ap-ENBConfigurationUpdate.o \ - S1ap-ENBConfigurationUpdateAcknowledge.o \ - S1ap-ENBConfigurationUpdateFailure.o \ - S1ap-MMEConfigurationUpdate.o \ - S1ap-MMEConfigurationUpdateAcknowledge.o \ - S1ap-MMEConfigurationUpdateFailure.o \ - S1ap-DownlinkS1cdma2000tunneling.o \ - S1ap-UplinkS1cdma2000tunneling.o \ - S1ap-UEContextModificationRequest.o \ - S1ap-UEContextModificationResponse.o \ - S1ap-UEContextModificationFailure.o \ - S1ap-UECapabilityInfoIndication.o \ - S1ap-UEContextReleaseCommand.o \ - S1ap-UEContextReleaseComplete.o \ - S1ap-ENBStatusTransfer.o \ - S1ap-MMEStatusTransfer.o \ - S1ap-DeactivateTrace.o \ - S1ap-TraceStart.o \ - S1ap-TraceFailureIndication.o \ - S1ap-CellTrafficTrace.o \ - S1ap-LocationReportingControl.o \ - S1ap-LocationReportingFailureIndication.o \ - S1ap-LocationReport.o \ - S1ap-OverloadStart.o \ - S1ap-OverloadStop.o \ - S1ap-WriteReplaceWarningRequest.o \ - S1ap-WriteReplaceWarningResponse.o \ - S1ap-ENBDirectInformationTransfer.o \ - S1ap-MMEDirectInformationTransfer.o \ - S1ap-ENBConfigurationTransfer.o \ - S1ap-MMEConfigurationTransfer.o \ - S1ap-PrivateMessage.o \ - S1ap-IE.o - -S1AP_ASN_MODULE_HEADERS= \ - S1ap-Criticality.h \ - S1ap-Presence.h \ - S1ap-PrivateIE-ID.h \ - S1ap-ProcedureCode.h \ - S1ap-ProtocolExtensionID.h \ - S1ap-ProtocolIE-ID.h \ - S1ap-TriggeringMessage.h \ - S1ap-IE-Extensions.h \ - S1ap-AllocationAndRetentionPriority.h \ - S1ap-Bearers-SubjectToStatusTransfer-List.h \ - S1ap-Bearers-SubjectToStatusTransfer-Item.h \ - S1ap-BitRate.h \ - S1ap-BPLMNs.h \ - S1ap-BroadcastCompletedAreaList.h \ - S1ap-Cause.h \ - S1ap-CauseMisc.h \ - S1ap-CauseProtocol.h \ - S1ap-CauseRadioNetwork.h \ - S1ap-CauseTransport.h \ - S1ap-CauseNas.h \ - S1ap-CellIdentity.h \ - S1ap-CellID-Broadcast.h \ - S1ap-CellID-Broadcast-Item.h \ - S1ap-Cdma2000PDU.h \ - S1ap-Cdma2000RATType.h \ - S1ap-Cdma2000SectorID.h \ - S1ap-Cdma2000HOStatus.h \ - S1ap-Cdma2000HORequiredIndication.h \ - S1ap-Cdma2000OneXSRVCCInfo.h \ - S1ap-Cdma2000OneXMEID.h \ - S1ap-Cdma2000OneXMSI.h \ - S1ap-Cdma2000OneXPilot.h \ - S1ap-Cdma2000OneXRAND.h \ - S1ap-Cell-Size.h \ - S1ap-CellType.h \ - S1ap-CGI.h \ - S1ap-CI.h \ - S1ap-CNDomain.h \ - S1ap-CSFallbackIndicator.h \ - S1ap-CSG-Id.h \ - S1ap-CSG-IdList.h \ - S1ap-CSG-IdList-Item.h \ - S1ap-COUNTvalue.h \ - S1ap-CriticalityDiagnostics.h \ - S1ap-CriticalityDiagnostics-IE-List.h \ - S1ap-CriticalityDiagnostics-IE-Item.h \ - S1ap-DataCodingScheme.h \ - S1ap-DL-Forwarding.h \ - S1ap-Direct-Forwarding-Path-Availability.h \ - S1ap-E-RABToBeModifiedListBearerModReq.h \ - S1ap-E-RABToBeModifiedItemBearerModReqIEs.h \ - S1ap-E-RABToBeModifiedItemBearerModReq.h \ - S1ap-E-RABReleaseListBearerRelComp.h \ - S1ap-E-RABReleaseItemBearerRelCompIEs.h \ - S1ap-E-RABReleaseItemBearerRelComp.h \ - S1ap-E-RABSubjecttoDataForwardingList.h \ - S1ap-E-RABDataForwardingList.h \ - S1ap-E-RABDataForwardingItemIEs.h \ - S1ap-E-RABDataForwardingItem.h \ - S1ap-E-RABToBeSetupListCtxtSUReq.h \ - S1ap-E-RABToBeSetupItemCtxtSUReqIEs.h \ - S1ap-E-RABToBeSetupItemCtxtSUReq.h \ - S1ap-E-RABSetupListBearerSURes.h \ - S1ap-E-RABSetupItemBearerSUResIEs.h \ - S1ap-E-RABSetupItemBearerSURes.h \ - S1ap-E-RABFailedToSetupListHOReqAck.h \ - S1ap-E-RABFailedToSetupItemHOReqAckIEs.h \ - S1ap-E-RABFailedToSetupItemHOReqAck.h \ - S1ap-E-RABToBeSetupListBearerSUReq.h \ - S1ap-E-RABToBeSetupItemBearerSUReqIEs.h \ - S1ap-E-RABToBeSetupItemBearerSUReq.h \ - S1ap-E-RABAdmittedList.h \ - S1ap-E-RABAdmittedItemIEs.h \ - S1ap-E-RABAdmittedItem.h \ - S1ap-E-RABToBeSwitchedDLList.h \ - S1ap-E-RABToBeSwitchedDLListIEs.h \ - S1ap-E-RABToBeSwitchedDLItem.h \ - S1ap-E-RABToBeSwitchedULList.h \ - S1ap-E-RABToBeSwitchedULItemIEs.h \ - S1ap-E-RABToBeSwitchedULItem.h \ - S1ap-E-RABModifyListBearerModRes.h \ - S1ap-E-RABModifyItemBearerModResIEs.h \ - S1ap-E-RABModifyItemBearerModRes.h \ - S1ap-E-RABSetupListCtxtSURes.h \ - S1ap-E-RABSetupListCtxtSUResIEs.h \ - S1ap-E-RABSetupItemCtxtSURes.h \ - S1ap-E-RABToBeSetupListHOReq.h \ - S1ap-E-RABToBeSetupListHOReqIEs.h \ - S1ap-E-RABToBeSetupItemHOReq.h \ - S1ap-ECGIList.h \ - S1ap-EmergencyAreaIDList.h \ - S1ap-EmergencyAreaID.h \ - S1ap-EmergencyAreaID-Broadcast.h \ - S1ap-EmergencyAreaID-Broadcast-Item.h \ - S1ap-CompletedCellinEAI.h \ - S1ap-CompletedCellinEAI-Item.h \ - S1ap-ENB-ID.h \ - S1ap-GERAN-Cell-ID.h \ - S1ap-Global-ENB-ID.h \ - S1ap-ENB-StatusTransfer-TransparentContainer.h \ - S1ap-ENB-UE-S1AP-ID.h \ - S1ap-ENBname.h \ - S1ap-ENBX2TLAs.h \ - S1ap-EncryptionAlgorithms.h \ - S1ap-EPLMNs.h \ - S1ap-EventType.h \ - S1ap-E-RAB-ID.h \ - S1ap-E-RABInformationList.h \ - S1ap-E-RABInformationListItem.h \ - S1ap-E-RABList.h \ - S1ap-E-RABItem.h \ - S1ap-E-RABLevelQoSParameters.h \ - S1ap-EUTRAN-CGI.h \ - S1ap-ExtendedRNC-ID.h \ - S1ap-ForbiddenInterRATs.h \ - S1ap-ForbiddenTAs.h \ - S1ap-ForbiddenTAs-Item.h \ - S1ap-ForbiddenTACs.h \ - S1ap-ForbiddenLAs.h \ - S1ap-ForbiddenLAs-Item.h \ - S1ap-ForbiddenLACs.h \ - S1ap-GBR-QosInformation.h \ - S1ap-GTP-TEID.h \ - S1ap-GUMMEI.h \ - S1ap-HandoverRestrictionList.h \ - S1ap-HandoverType.h \ - S1ap-HFN.h \ - S1ap-HandoverNotify.h \ - S1ap-Inter-SystemInformationTransferType.h \ - S1ap-IMSI.h \ - S1ap-IntegrityProtectionAlgorithms.h \ - S1ap-InterfacesToTrace.h \ - S1ap-LAC.h \ - S1ap-LAI.h \ - S1ap-LastVisitedCell-Item.h \ - S1ap-LastVisitedEUTRANCellInformation.h \ - S1ap-LastVisitedUTRANCellInformation.h \ - S1ap-LastVisitedGERANCellInformation.h \ - S1ap-L3-Information.h \ - S1ap-MessageIdentifier.h \ - S1ap-MMEname.h \ - S1ap-MME-Group-ID.h \ - S1ap-MME-Code.h \ - S1ap-MME-UE-S1AP-ID.h \ - S1ap-M-TMSI.h \ - S1ap-MSClassmark2.h \ - S1ap-MSClassmark3.h \ - S1ap-NAS-PDU.h \ - S1ap-NASSecurityParametersfromE-UTRAN.h \ - S1ap-NASSecurityParameterstoE-UTRAN.h \ - S1ap-NumberofBroadcastRequest.h \ - S1ap-NumberOfBroadcasts.h \ - S1ap-OldBSS-ToNewBSS-Information.h \ - S1ap-OverloadAction.h \ - S1ap-OverloadResponse.h \ - S1ap-PagingDRX.h \ - S1ap-PDCP-SN.h \ - S1ap-PLMNidentity.h \ - S1ap-Pre-emptionCapability.h \ - S1ap-Pre-emptionVulnerability.h \ - S1ap-PriorityLevel.h \ - S1ap-QCI.h \ - S1ap-ReceiveStatusofULPDCPSDUs.h \ - S1ap-RelativeMMECapacity.h \ - S1ap-RAC.h \ - S1ap-RequestType.h \ - S1ap-ResetType.h \ - S1ap-ResetAll.h \ - S1ap-RIMTransfer.h \ - S1ap-RIMInformation.h \ - S1ap-RIMRoutingAddress.h \ - S1ap-ReportArea.h \ - S1ap-RepetitionPeriod.h \ - S1ap-RNC-ID.h \ - S1ap-RRC-Container.h \ - S1ap-RRC-Establishment-Cause.h \ - S1ap-SecurityKey.h \ - S1ap-SecurityContext.h \ - S1ap-SerialNumber.h \ - S1ap-SONInformation.h \ - S1ap-SONInformationRequest.h \ - S1ap-SONInformationReply.h \ - S1ap-SONConfigurationTransfer.h \ - S1ap-Source-ToTarget-TransparentContainer.h \ - S1ap-SourceBSS-ToTargetBSS-TransparentContainer.h \ - S1ap-SourceeNB-ID.h \ - S1ap-SRVCCOperationPossible.h \ - S1ap-SRVCCHOIndication.h \ - S1ap-SourceeNB-ToTargeteNB-TransparentContainer.h \ - S1ap-SourceRNC-ToTargetRNC-TransparentContainer.h \ - S1ap-ServedGUMMEIs.h \ - S1ap-ServedGUMMEIsItem.h \ - S1ap-ServedGroupIDs.h \ - S1ap-ServedMMECs.h \ - S1ap-ServedPLMNs.h \ - S1ap-SubscriberProfileIDforRFP.h \ - S1ap-SupportedTAs.h \ - S1ap-SupportedTAs-Item.h \ - S1ap-S-TMSI.h \ - S1ap-TAC.h \ - S1ap-TAIListforWarning.h \ - S1ap-TAIList.h \ - S1ap-TAIItem.h \ - S1ap-TAI.h \ - S1ap-TAI-Broadcast.h \ - S1ap-TAI-Broadcast-Item.h \ - S1ap-CompletedCellinTAI.h \ - S1ap-CompletedCellinTAI-Item.h \ - S1ap-TBCD-STRING.h \ - S1ap-TargetID.h \ - S1ap-TargeteNB-ID.h \ - S1ap-TargetRNC-ID.h \ - S1ap-TargeteNB-ToSourceeNB-TransparentContainer.h \ - S1ap-Target-ToSource-TransparentContainer.h \ - S1ap-TargetRNC-ToSourceRNC-TransparentContainer.h \ - S1ap-TargetBSS-ToSourceBSS-TransparentContainer.h \ - S1ap-TimeToWait.h \ - S1ap-Time-UE-StayedInCell.h \ - S1ap-TransportLayerAddress.h \ - S1ap-TraceActivation.h \ - S1ap-TraceDepth.h \ - S1ap-E-UTRAN-Trace-ID.h \ - S1ap-TypeOfError.h \ - S1ap-UEAggregateMaximumBitrate.h \ - S1ap-UE-S1AP-IDs.h \ - S1ap-UE-S1AP-ID-pair.h \ - S1ap-UE-associatedLogicalS1-ConnectionListRes.h \ - S1ap-UE-associatedLogicalS1-ConnectionListResAck.h \ - S1ap-UE-associatedLogicalS1-ConnectionItem.h \ - S1ap-UEIdentityIndexValue.h \ - S1ap-UE-HistoryInformation.h \ - S1ap-UEPagingID.h \ - S1ap-UERadioCapability.h \ - S1ap-UESecurityCapabilities.h \ - S1ap-WarningAreaList.h \ - S1ap-WarningType.h \ - S1ap-WarningSecurityInfo.h \ - S1ap-WarningMessageContents.h \ - S1ap-X2TNLConfigurationInfo.h \ - S1AP-PDU.h \ - S1ap-InitiatingMessage.h \ - S1ap-SuccessfulOutcome.h \ - S1ap-UnsuccessfulOutcome.h \ - S1ap-HandoverRequired.h \ - S1ap-HandoverCommand.h \ - S1ap-HandoverPreparationFailure.h \ - S1ap-HandoverRequest.h \ - S1ap-HandoverRequestAcknowledge.h \ - S1ap-HandoverFailure.h \ - S1ap-HandoverNotify.h \ - S1ap-PathSwitchRequest.h \ - S1ap-PathSwitchRequestAcknowledge.h \ - S1ap-PathSwitchRequestFailure.h \ - S1ap-E-RABSetupRequest.h \ - S1ap-E-RABSetupResponse.h \ - S1ap-E-RABModifyRequest.h \ - S1ap-E-RABModifyResponse.h \ - S1ap-E-RABReleaseIndication.h \ - S1ap-E-RABReleaseCommand.h \ - S1ap-E-RABReleaseResponse.h \ - S1ap-InitialContextSetupRequest.h \ - S1ap-InitialContextSetupResponse.h \ - S1ap-InitialContextSetupFailure.h \ - S1ap-UEContextReleaseRequest.h \ - S1ap-Paging.h \ - S1ap-DownlinkNASTransport.h \ - S1ap-InitialUEMessage.h \ - S1ap-UplinkNASTransport.h \ - S1ap-NASNonDeliveryIndication.h \ - S1ap-HandoverCancel.h \ - S1ap-HandoverCancelAcknowledge.h \ - S1ap-Reset.h \ - S1ap-ResetAcknowledge.h \ - S1ap-S1SetupResponse.h \ - S1ap-S1SetupRequest.h \ - S1ap-S1SetupFailure.h \ - S1ap-ErrorIndication.h \ - S1ap-ENBConfigurationUpdate.h \ - S1ap-ENBConfigurationUpdateAcknowledge.h \ - S1ap-ENBConfigurationUpdateFailure.h \ - S1ap-MMEConfigurationUpdate.h \ - S1ap-MMEConfigurationUpdateAcknowledge.h \ - S1ap-MMEConfigurationUpdateFailure.h \ - S1ap-DownlinkS1cdma2000tunneling.h \ - S1ap-UplinkS1cdma2000tunneling.h \ - S1ap-UEContextModificationRequest.h \ - S1ap-UEContextModificationResponse.h \ - S1ap-UEContextModificationFailure.h \ - S1ap-UECapabilityInfoIndication.h \ - S1ap-UEContextReleaseCommand.h \ - S1ap-UEContextReleaseComplete.h \ - S1ap-ENBStatusTransfer.h \ - S1ap-MMEStatusTransfer.h \ - S1ap-DeactivateTrace.h \ - S1ap-TraceStart.h \ - S1ap-TraceFailureIndication.h \ - S1ap-CellTrafficTrace.h \ - S1ap-LocationReportingControl.h \ - S1ap-LocationReportingFailureIndication.h \ - S1ap-LocationReport.h \ - S1ap-OverloadStart.h \ - S1ap-OverloadStop.h \ - S1ap-WriteReplaceWarningRequest.h \ - S1ap-WriteReplaceWarningResponse.h \ - S1ap-ENBDirectInformationTransfer.h \ - S1ap-MMEDirectInformationTransfer.h \ - S1ap-ENBConfigurationTransfer.h \ - S1ap-MMEConfigurationTransfer.h \ - S1ap-PrivateMessage.h \ - S1ap-IE.h - -S1AP_ASN_MODULE_SOURCES_R9 = \ - S1ap-KillResponse.o \ - S1ap-KillRequest.o \ - S1ap-Data-Forwarding-Not-Possible.o \ - S1ap-DownlinkUEAssociatedLPPaTransport.o \ - S1ap-UplinkUEAssociatedLPPaTransport.o \ - S1ap-DownlinkNonUEAssociatedLPPaTransport.o \ - S1ap-UplinkNonUEAssociatedLPPaTransport.o \ - S1ap-TAI-Cancelled.o \ - S1ap-TAI-Cancelled-Item.o \ - S1ap-StratumLevel.o \ - S1ap-SynchronizationStatus.o \ - S1ap-TimeSynchronizationInfo.o \ - S1ap-Routing-ID.o \ - S1ap-PS-ServiceNotAvailable.o \ - S1ap-LPPa-PDU.o \ - S1ap-ExtendedRepetitionPeriod.o \ - S1ap-EUTRANRoundTripDelayEstimationInfo.o \ - S1ap-EmergencyAreaID-Cancelled.o \ - S1ap-EmergencyAreaID-Cancelled-Item.o \ - S1ap-CSGMembershipStatus.o \ - S1ap-ConcurrentWarningMessageIndicator.o \ - S1ap-CellID-Cancelled.o \ - S1ap-CellID-Cancelled-Item.o \ - S1ap-CellAccessMode.o \ - S1ap-CancelledCellinEAI.o \ - S1ap-CancelledCellinEAI-Item.o \ - S1ap-CancelledCellinTAI.o \ - S1ap-CancelledCellinTAI-Item.o \ - S1ap-BroadcastCancelledAreaList.o - -S1AP_ASN_MODULE_HEADERS_R9 = \ - S1ap-BroadcastCancelledAreaList.h \ - S1ap-CancelledCellinEAI.h \ - S1ap-CancelledCellinEAI-Item.h \ - S1ap-CancelledCellinTAI.h \ - S1ap-CancelledCellinTAI-Item.h \ - S1ap-CellAccessMode.h \ - S1ap-CellID-Cancelled.h \ - S1ap-CellID-Cancelled-Item.h \ - S1ap-ConcurrentWarningMessageIndicator.h \ - S1ap-CSGMembershipStatus.h \ - S1ap-Data-Forwarding-Not-Possible.h \ - S1ap-EmergencyAreaID-Cancelled.h \ - S1ap-EmergencyAreaID-Cancelled-Item.h \ - S1ap-E-RABList.h \ - S1ap-EUTRANRoundTripDelayEstimationInfo.h \ - S1ap-ExtendedRepetitionPeriod.h \ - S1ap-LPPa-PDU.h \ - S1ap-PS-ServiceNotAvailable.h \ - S1ap-Routing-ID.h \ - S1ap-StratumLevel.h \ - S1ap-SynchronizationStatus.h \ - S1ap-TimeSynchronizationInfo.h \ - S1ap-TAI-Cancelled.h \ - S1ap-TAI-Cancelled-Item.h \ - S1ap-KillResponse.h \ - S1ap-KillRequest.h \ - S1ap-DownlinkUEAssociatedLPPaTransport.h \ - S1ap-UplinkUEAssociatedLPPaTransport.h \ - S1ap-DownlinkNonUEAssociatedLPPaTransport.h \ - S1ap-UplinkNonUEAssociatedLPPaTransport.h - -S1AP_ASN_MODULE_SOURCES_R10 = \ - S1ap-PagingPriority.o \ - S1ap-RelayNode-Indicator.o \ - S1ap-GWContextReleaseIndication.o \ - S1ap-MMERelaySupportIndicator.o \ - S1ap-ManagementBasedMDTAllowed.o \ - S1ap-PrivacyIndicator.o \ - S1ap-TrafficLoadReductionIndication.o \ - S1ap-GUMMEIList.o - -S1AP_ASN_MODULE_HEADERS_R10 = \ - S1ap-PagingPriority.h \ - S1ap-RelayNode-Indicator.h \ - S1ap-GWContextReleaseIndication.h \ - S1ap-MMERelaySupportIndicator.h \ - S1ap-ManagementBasedMDTAllowed.h \ - S1ap-PrivacyIndicator.h \ - S1ap-TrafficLoadReductionIndication.h \ - S1ap-GUMMEIList.h - -S1AP_ASN_MODULE_HEADERS+=ANY.h -S1AP_ASN_MODULE_SOURCES+=ANY.o -S1AP_ASN_MODULE_HEADERS+=BOOLEAN.h -S1AP_ASN_MODULE_SOURCES+=BOOLEAN.o -S1AP_ASN_MODULE_HEADERS+=INTEGER.h -S1AP_ASN_MODULE_HEADERS+=NativeEnumerated.h -S1AP_ASN_MODULE_SOURCES+=INTEGER.o -S1AP_ASN_MODULE_HEADERS+=NULL.h -S1AP_ASN_MODULE_SOURCES+=NULL.o -S1AP_ASN_MODULE_SOURCES+=NativeEnumerated.o -S1AP_ASN_MODULE_HEADERS+=NativeInteger.h -S1AP_ASN_MODULE_SOURCES+=NativeInteger.o -S1AP_ASN_MODULE_HEADERS+=OBJECT_IDENTIFIER.h -S1AP_ASN_MODULE_SOURCES+=OBJECT_IDENTIFIER.o -S1AP_ASN_MODULE_HEADERS+=PrintableString.h -S1AP_ASN_MODULE_SOURCES+=PrintableString.o -S1AP_ASN_MODULE_HEADERS+=asn_SEQUENCE_OF.h -S1AP_ASN_MODULE_SOURCES+=asn_SEQUENCE_OF.o -S1AP_ASN_MODULE_HEADERS+=asn_SET_OF.h -S1AP_ASN_MODULE_SOURCES+=asn_SET_OF.o -S1AP_ASN_MODULE_HEADERS+=constr_CHOICE.h -S1AP_ASN_MODULE_SOURCES+=constr_CHOICE.o -S1AP_ASN_MODULE_HEADERS+=constr_SEQUENCE.h -S1AP_ASN_MODULE_SOURCES+=constr_SEQUENCE.o -S1AP_ASN_MODULE_HEADERS+=constr_SEQUENCE_OF.h -S1AP_ASN_MODULE_SOURCES+=constr_SEQUENCE_OF.o -S1AP_ASN_MODULE_HEADERS+=constr_SET_OF.h -S1AP_ASN_MODULE_SOURCES+=constr_SET_OF.o -S1AP_ASN_MODULE_HEADERS+=asn_application.h -S1AP_ASN_MODULE_HEADERS+=asn_system.h -S1AP_ASN_MODULE_HEADERS+=asn_codecs.h -S1AP_ASN_MODULE_HEADERS+=asn_internal.h -S1AP_ASN_MODULE_HEADERS+=OCTET_STRING.h -S1AP_ASN_MODULE_SOURCES+=OCTET_STRING.o -S1AP_ASN_MODULE_HEADERS+=BIT_STRING.h -S1AP_ASN_MODULE_SOURCES+=BIT_STRING.o -S1AP_ASN_MODULE_SOURCES+=asn_codecs_prim.o -S1AP_ASN_MODULE_HEADERS+=asn_codecs_prim.h -S1AP_ASN_MODULE_HEADERS+=ber_tlv_length.h -S1AP_ASN_MODULE_SOURCES+=ber_tlv_length.o -S1AP_ASN_MODULE_HEADERS+=ber_tlv_tag.h -S1AP_ASN_MODULE_SOURCES+=ber_tlv_tag.o -S1AP_ASN_MODULE_HEADERS+=ber_decoder.h -S1AP_ASN_MODULE_SOURCES+=ber_decoder.o -S1AP_ASN_MODULE_HEADERS+=der_encoder.h -S1AP_ASN_MODULE_SOURCES+=der_encoder.o -S1AP_ASN_MODULE_HEADERS+=constr_TYPE.h -S1AP_ASN_MODULE_SOURCES+=constr_TYPE.o -S1AP_ASN_MODULE_HEADERS+=constraints.h -S1AP_ASN_MODULE_SOURCES+=constraints.o -S1AP_ASN_MODULE_HEADERS+=xer_support.h -S1AP_ASN_MODULE_SOURCES+=xer_support.o -S1AP_ASN_MODULE_HEADERS+=xer_decoder.h -S1AP_ASN_MODULE_SOURCES+=xer_decoder.o -S1AP_ASN_MODULE_HEADERS+=xer_encoder.h -S1AP_ASN_MODULE_SOURCES+=xer_encoder.o -S1AP_ASN_MODULE_HEADERS+=per_support.h -S1AP_ASN_MODULE_SOURCES+=per_support.o -S1AP_ASN_MODULE_HEADERS+=per_decoder.h -S1AP_ASN_MODULE_SOURCES+=per_decoder.o -S1AP_ASN_MODULE_HEADERS+=per_encoder.h -S1AP_ASN_MODULE_SOURCES+=per_encoder.o -S1AP_ASN_MODULE_HEADERS+=per_opentype.h -S1AP_ASN_MODULE_SOURCES+=per_opentype.o \ No newline at end of file diff --git a/openair-cn/S1AP/Makefile.am b/openair-cn/S1AP/Makefile.am deleted file mode 100644 index b957c18137..0000000000 --- a/openair-cn/S1AP/Makefile.am +++ /dev/null @@ -1,70 +0,0 @@ -################################################################################ -# 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@eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ -SUBDIRS = ./MESSAGES/ . - -AM_CFLAGS = \ - @ADD_CFLAGS@ \ - -I$(top_srcdir)/COMMON \ - -I$(top_builddir)/S1AP \ - -I$(top_builddir)/S1AP/MESSAGES \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/api/network \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/include \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/ies \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/emm/msg \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/esm/msg \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/util \ - -I$(top_srcdir)/INTERTASK_INTERFACE \ - -I$(top_srcdir)/SCTP \ - -I$(top_srcdir)/UTILS \ - -DEMIT_ASN_DEBUG_EXTERN - -noinst_LTLIBRARIES = libs1ap.la -libs1ap_la_LDFLAGS = -all-static -libs1ap_la_LIBADD = ./MESSAGES/libs1apmessages.la - -libs1ap_la_SOURCES = \ - s1ap_common.h s1ap_common.c \ - s1ap_mme_encoder.h s1ap_mme_encoder.c \ - s1ap_mme_decoder.h s1ap_mme_decoder.c \ - s1ap_mme_handlers.h s1ap_mme_handlers.c \ - s1ap_mme_nas_procedures.c s1ap_mme_nas_procedures.h \ - s1ap_mme.h s1ap_mme.c \ - s1ap_mme_itti_messaging.c s1ap_mme_itti_messaging.h \ - s1ap_mme_retransmission.c s1ap_mme_retransmission.h \ - s1ap_mme_ta.c s1ap_mme_ta.h \ - $(top_builddir)/S1AP/s1ap_decoder.c \ - $(top_builddir)/S1AP/s1ap_encoder.c \ - $(top_builddir)/S1AP/s1ap_xer_print.c \ - $(top_builddir)/S1AP/s1ap_ies_defs.h - -clean-local: - rm -f $(top_builddir)/S1AP/s1ap_ies_defs.h - rm -f $(top_builddir)/S1AP/s1ap_decoder.c - rm -f $(top_builddir)/S1AP/s1ap_encoder.c - rm -f $(top_builddir)/S1AP/s1ap_xer_print.c diff --git a/openair-cn/S1AP/Makefile.eNB b/openair-cn/S1AP/Makefile.eNB deleted file mode 100644 index 4547fdbaea..0000000000 --- a/openair-cn/S1AP/Makefile.eNB +++ /dev/null @@ -1,163 +0,0 @@ -################################################################################ -# 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@eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ -# include $(OPENAIR_TARGETS)/SIMU/USER/Makerules - -OUTDIR = $(S1AP_DIR)/enb_objs - -ASN1MESSAGESDIR=$(S1AP_DIR)/MESSAGES -ASN1DIR=$(ASN1MESSAGESDIR)/ASN1 - -ifeq ($(USE_MME), R10) - ASN1RELDIR=R10.5 - UPDATE_RELEASE_9=1 - UPDATE_RELEASE_10=1 - ADD_CFLAGS=-DUPDATE_RELEASE_9 -DUPDATE_RELEASE_10 -else - ifeq ($(USE_MME), R9) - UPDATE_RELEASE_9=1 - ASN1RELDIR=R9.8 - ADD_CFLAGS=-DUPDATE_RELEASE_9 - else - ASN1RELDIR=R8.10 - endif -endif - -include $(ASN1MESSAGESDIR)/Makefile.inc - -libs1ap_OBJECTS = \ - s1ap_common.o \ - s1ap_eNB.o \ - s1ap_eNB_context_management_procedures.o \ - s1ap_eNB_decoder.o \ - s1ap_eNB_encoder.o \ - s1ap_eNB_handlers.o \ - s1ap_eNB_itti_messaging.o \ - s1ap_eNB_management_procedures.o \ - s1ap_eNB_nas_procedures.o \ - s1ap_eNB_nnsf.o \ - s1ap_eNB_overload.o \ - s1ap_eNB_trace.o \ - s1ap_eNB_ue_context.o \ - $(addprefix MESSAGES/, $(S1AP_ASN_MODULE_SOURCES)) - -ifeq ($(USE_MME), R10) - libs1ap_OBJECTS += $(addprefix MESSAGES/, $(S1AP_ASN_MODULE_SOURCES_R9)) - libs1ap_OBJECTS += $(addprefix MESSAGES/, $(S1AP_ASN_MODULE_SOURCES_R10)) -else - ifeq ($(USE_MME), R9) - libs1ap_OBJECTS += $(addprefix MESSAGES/, $(S1AP_ASN_MODULE_SOURCES_R9)) - endif -endif - -# pull in dependency info for *existing* .o files --include $(OUTDIR)/*.d - -CFLAGS = \ - -Wall \ - -DENB_MODE \ - -DENABLE_USE_MME \ - -DUSER_MODE \ - -I./MESSAGES \ - -I$(OUTDIR) \ - -I../UTILS \ - $(ADD_CFLAGS) \ - -DENB_MODE \ - $(S1AP_CFLAGS) \ - -Wuninitialized \ - -Werror=implicit-function-declaration - -S1AP_GENERATED = \ - $(OUTDIR)/s1ap_encoder.o \ - $(OUTDIR)/s1ap_decoder.o \ - $(OUTDIR)/s1ap_xer_print.o - -$(OUTDIR)/%.o : %.c - @echo "Compiling $<" - @if [ ! -d $(dir $@) ]; then mkdir -p $(dir $@); fi; - @$(CC) -c $(CFLAGS) -o $@ $< - @$(CC) -MM $(CFLAGS) $< > $(basename $@).d - @mv -f $(basename $@).d $(basename $@).d.tmp - @sed -e 's|.*:|$@:|' < $(basename $@).d.tmp > $(basename $@).d - @sed -e 's/.*://' -e 's/\\$$//' < $(basename $@).d.tmp | fmt -1 | \ - sed -e 's/^ *//' -e 's/$$/:/' >> $(basename $@).d - @rm -f $(basename $@).d.tmp - -$(S1AP_GENERATED): %.o : %.c - @echo "Compiling $<" - @if [ ! -d $(dir $@) ]; then mkdir -p $(dir $@); fi; - @$(CC) -c $(CFLAGS) -o $@ $< - @$(CC) -MM $(CFLAGS) $< > $(basename $@).d - @mv -f $(basename $@).d $(basename $@).d.tmp - @sed -e 's|.*:|$@:|' < $(basename $@).d.tmp > $(basename $@).d - @sed -e 's/.*://' -e 's/\\$$//' < $(basename $@).d.tmp | fmt -1 | \ - sed -e 's/^ *//' -e 's/$$/:/' >> $(basename $@).d - @rm -f $(basename $@).d.tmp - -#$(OUTDIR)/%.c : $(OUTDIR)/s1ap_ieregen.stamp $(OUTDIR)/s1ap_asn1regen.stamp - #@if [ -f $< ] ; then touch $<; else echo "ERROR: " $< "not generated" ; exit 1 ; fi; - -$(OUTDIR)/s1ap_ieregen.stamp: $(ASN1DIR)/$(ASN1RELDIR)/S1AP-PDU-Contents.asn $(ASN1DIR)/asn1tostruct.py - @if [ ! -d $(OUTDIR) ]; then mkdir -p $(OUTDIR); fi; - @python $(ASN1DIR)/asn1tostruct.py -f$< -o$(OUTDIR) - @echo Timestamp > $@ - -$(OUTDIR)/s1ap_asn1regen.stamp: $(ASN1DIR)/$(ASN1RELDIR)/S1AP-CommonDataTypes.asn \ - $(ASN1DIR)/$(ASN1RELDIR)/S1AP-Constants.asn $(ASN1DIR)/$(ASN1RELDIR)/S1AP-IEs.asn $(ASN1DIR)/$(ASN1RELDIR)/S1AP-PDU.asn - (cd $(ASN1MESSAGESDIR) && asn1c -fhave_native64 -gen-PER $^) - @echo Timestamp > $@ - -$(OUTDIR)/libs1ap.a: $(OUTDIR)/s1ap_ieregen.stamp $(OUTDIR)/s1ap_asn1regen.stamp $(S1AP_GENERATED) $(addprefix $(OUTDIR)/,$(libs1ap_OBJECTS)) - @echo Creating S1AP archive - @$(AR) rcs $@ $(S1AP_GENERATED) $(addprefix $(OUTDIR)/,$(libs1ap_OBJECTS)) - -clean: - @$(RM_F_V) $(OUTDIR)/*.o - @$(RM_F_V) $(OUTDIR)/*.d - @$(RM_F_V) $(addprefix $(OUTDIR)/MESSAGES/, $(S1AP_ASN_MODULE_SOURCES)) - @$(RM_F_V) $(addprefix $(OUTDIR)/MESSAGES/, $(S1AP_ASN_MODULE_SOURCES_R9)) - @$(RM_F_V) $(addprefix $(OUTDIR)/MESSAGES/, $(S1AP_ASN_MODULE_SOURCES_R10)) - @$(RM_F_V) $(addprefix $(OUTDIR)/MESSAGES/, $(S1AP_ASN_MODULE_SOURCES:.o=.d)) - @$(RM_F_V) $(addprefix $(OUTDIR)/MESSAGES/, $(S1AP_ASN_MODULE_SOURCES_R9:.o=.d)) - @$(RM_F_V) $(addprefix $(OUTDIR)/MESSAGES/, $(S1AP_ASN_MODULE_SOURCES_R10:.o=.d)) - @$(RM_F_V) $(OUTDIR)/libs1ap.a - @$(RM_F_V) $(OUTDIR)/s1ap_asn1regen.stamp - @$(RM_F_V) $(OUTDIR)/s1ap_ieregen.stamp - @$(RM_F_V) $(OUTDIR)/s1ap_decoder.c $(OUTDIR)/s1ap_encoder.c - @$(RM_F_V) $(OUTDIR)/s1ap_xer_print.c $(OUTDIR)/s1ap_ies_defs.h - -cleanall: clean - @$(RM_F_V) $(addprefix $(OUTDIR)/MESSAGES/, $(S1AP_ASN_MODULE_SOURCES:.o=.c)) - @$(RM_F_V) $(addprefix $(OUTDIR)/MESSAGES/, $(S1AP_ASN_MODULE_SOURCES:.o=.h)) - @$(RM_F_V) $(addprefix $(OUTDIR)/MESSAGES/, $(S1AP_ASN_MODULE_SOURCES_R9:.o=.c)) - @$(RM_F_V) $(addprefix $(OUTDIR)/MESSAGES/, $(S1AP_ASN_MODULE_SOURCES_R9:.o=.h)) - @$(RM_F_V) $(addprefix $(OUTDIR)/MESSAGES/, $(S1AP_ASN_MODULE_SOURCES_R10:.o=.c)) - @$(RM_F_V) $(addprefix $(OUTDIR)/MESSAGES/, $(S1AP_ASN_MODULE_SOURCES_R10:.o=.h)) - -showcflags: - @echo s1ap cflags: $(CFLAGS) diff --git a/openair-cn/S1AP/Makefile.inc b/openair-cn/S1AP/Makefile.inc deleted file mode 100644 index 8bca6ba59c..0000000000 --- a/openair-cn/S1AP/Makefile.inc +++ /dev/null @@ -1,37 +0,0 @@ -################################################################################ -# 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@eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ -S1AP_OBJS = $(OPENAIR2_DIR)/S1AP/s1ap_eNB.o -S1AP_OBJS += $(OPENAIR2_DIR)/S1AP/s1ap_common.o -S1AP_OBJS += $(OPENAIR2_DIR)/S1AP/s1ap_encoder.o -S1AP_OBJS += $(OPENAIR2_DIR)/S1AP/s1ap_decoder.o -S1AP_OBJS += $(OPENAIR2_DIR)/S1AP/s1ap_eNB_decoder.o -S1AP_OBJS += $(OPENAIR2_DIR)/S1AP/s1ap_eNB_encoder.o -S1AP_OBJS += $(OPENAIR2_DIR)/S1AP/s1ap_eNB_handlers.o - -S1AP_Incl = -I$(OPENAIR2_DIR)/S1AP -I$(OPENAIR2_DIR)/S1AP/MESSAGES diff --git a/openair-cn/S1AP/s1ap_common.c b/openair-cn/S1AP/s1ap_common.c index 948f199c0c..055641d12e 100644 --- a/openair-cn/S1AP/s1ap_common.c +++ b/openair-cn/S1AP/s1ap_common.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ /*! \file s1ap_common.c * \brief s1ap procedures for both eNB and MME diff --git a/openair-cn/S1AP/s1ap_common.h b/openair-cn/S1AP/s1ap_common.h index 0024812fd2..3631535903 100644 --- a/openair-cn/S1AP/s1ap_common.h +++ b/openair-cn/S1AP/s1ap_common.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ /** @defgroup _s1ap_impl_ S1AP Layer Reference Implementation * @ingroup _ref_implementation_ diff --git a/openair-cn/S1AP/s1ap_eNB.c b/openair-cn/S1AP/s1ap_eNB.c index da11f2893f..c880c3f3b4 100644 --- a/openair-cn/S1AP/s1ap_eNB.c +++ b/openair-cn/S1AP/s1ap_eNB.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/S1AP/s1ap_eNB.h b/openair-cn/S1AP/s1ap_eNB.h index ac454be1ad..9c372493e9 100644 --- a/openair-cn/S1AP/s1ap_eNB.h +++ b/openair-cn/S1AP/s1ap_eNB.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/S1AP/s1ap_eNB_context_management_procedures.c b/openair-cn/S1AP/s1ap_eNB_context_management_procedures.c index 0e6de0b0f2..801dfd8780 100755 --- a/openair-cn/S1AP/s1ap_eNB_context_management_procedures.c +++ b/openair-cn/S1AP/s1ap_eNB_context_management_procedures.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/S1AP/s1ap_eNB_context_management_procedures.h b/openair-cn/S1AP/s1ap_eNB_context_management_procedures.h index 96b0938609..be9e0b24b4 100755 --- a/openair-cn/S1AP/s1ap_eNB_context_management_procedures.h +++ b/openair-cn/S1AP/s1ap_eNB_context_management_procedures.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/S1AP/s1ap_eNB_decoder.c b/openair-cn/S1AP/s1ap_eNB_decoder.c index 70d4eece32..f8230520ce 100644 --- a/openair-cn/S1AP/s1ap_eNB_decoder.c +++ b/openair-cn/S1AP/s1ap_eNB_decoder.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/S1AP/s1ap_eNB_decoder.h b/openair-cn/S1AP/s1ap_eNB_decoder.h index 76c47b0de7..4c3f5f4327 100644 --- a/openair-cn/S1AP/s1ap_eNB_decoder.h +++ b/openair-cn/S1AP/s1ap_eNB_decoder.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/S1AP/s1ap_eNB_default_values.h b/openair-cn/S1AP/s1ap_eNB_default_values.h index 42731cf5a6..c0fde9f6eb 100644 --- a/openair-cn/S1AP/s1ap_eNB_default_values.h +++ b/openair-cn/S1AP/s1ap_eNB_default_values.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/S1AP/s1ap_eNB_defs.h b/openair-cn/S1AP/s1ap_eNB_defs.h index 3474f9e7f6..2bf2758b89 100644 --- a/openair-cn/S1AP/s1ap_eNB_defs.h +++ b/openair-cn/S1AP/s1ap_eNB_defs.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/S1AP/s1ap_eNB_encoder.c b/openair-cn/S1AP/s1ap_eNB_encoder.c index 5ec2f21613..a93bdc68f2 100644 --- a/openair-cn/S1AP/s1ap_eNB_encoder.c +++ b/openair-cn/S1AP/s1ap_eNB_encoder.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/S1AP/s1ap_eNB_encoder.h b/openair-cn/S1AP/s1ap_eNB_encoder.h index a1ffc57e3a..b55cf2c261 100644 --- a/openair-cn/S1AP/s1ap_eNB_encoder.h +++ b/openair-cn/S1AP/s1ap_eNB_encoder.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/S1AP/s1ap_eNB_handlers.c b/openair-cn/S1AP/s1ap_eNB_handlers.c index 7469e83ac2..6f0d4128c7 100644 --- a/openair-cn/S1AP/s1ap_eNB_handlers.c +++ b/openair-cn/S1AP/s1ap_eNB_handlers.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/S1AP/s1ap_eNB_handlers.h b/openair-cn/S1AP/s1ap_eNB_handlers.h index db0b2115ce..145fd04721 100644 --- a/openair-cn/S1AP/s1ap_eNB_handlers.h +++ b/openair-cn/S1AP/s1ap_eNB_handlers.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/S1AP/s1ap_eNB_itti_messaging.c b/openair-cn/S1AP/s1ap_eNB_itti_messaging.c index 849bd09ab2..b6cdf368f4 100644 --- a/openair-cn/S1AP/s1ap_eNB_itti_messaging.c +++ b/openair-cn/S1AP/s1ap_eNB_itti_messaging.c @@ -1,3 +1,31 @@ +/******************************************************************************* + 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, Compus SophiaTech 450, route des chappes, 06451 Biot, France. + + *******************************************************************************/ #include "intertask_interface.h" #include "s1ap_eNB_itti_messaging.h" diff --git a/openair-cn/S1AP/s1ap_eNB_itti_messaging.h b/openair-cn/S1AP/s1ap_eNB_itti_messaging.h index d294a7d6ac..4021d623c4 100644 --- a/openair-cn/S1AP/s1ap_eNB_itti_messaging.h +++ b/openair-cn/S1AP/s1ap_eNB_itti_messaging.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/S1AP/s1ap_eNB_management_procedures.c b/openair-cn/S1AP/s1ap_eNB_management_procedures.c index d14ccc107b..eb30a8dada 100644 --- a/openair-cn/S1AP/s1ap_eNB_management_procedures.c +++ b/openair-cn/S1AP/s1ap_eNB_management_procedures.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/S1AP/s1ap_eNB_management_procedures.h b/openair-cn/S1AP/s1ap_eNB_management_procedures.h index 2709765df0..2e00add882 100644 --- a/openair-cn/S1AP/s1ap_eNB_management_procedures.h +++ b/openair-cn/S1AP/s1ap_eNB_management_procedures.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/S1AP/s1ap_eNB_nas_procedures.c b/openair-cn/S1AP/s1ap_eNB_nas_procedures.c index 612d6dfc7e..0cd4c08cb1 100644 --- a/openair-cn/S1AP/s1ap_eNB_nas_procedures.c +++ b/openair-cn/S1AP/s1ap_eNB_nas_procedures.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/S1AP/s1ap_eNB_nas_procedures.h b/openair-cn/S1AP/s1ap_eNB_nas_procedures.h index 8085cce35a..552726e8ed 100644 --- a/openair-cn/S1AP/s1ap_eNB_nas_procedures.h +++ b/openair-cn/S1AP/s1ap_eNB_nas_procedures.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/S1AP/s1ap_eNB_nnsf.c b/openair-cn/S1AP/s1ap_eNB_nnsf.c index afb39a8a44..cf3d4436ed 100644 --- a/openair-cn/S1AP/s1ap_eNB_nnsf.c +++ b/openair-cn/S1AP/s1ap_eNB_nnsf.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/S1AP/s1ap_eNB_nnsf.h b/openair-cn/S1AP/s1ap_eNB_nnsf.h index fd51f4a323..687f40dd1d 100644 --- a/openair-cn/S1AP/s1ap_eNB_nnsf.h +++ b/openair-cn/S1AP/s1ap_eNB_nnsf.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/S1AP/s1ap_eNB_overload.c b/openair-cn/S1AP/s1ap_eNB_overload.c index 7ecc8f42c7..2c32f4f9de 100644 --- a/openair-cn/S1AP/s1ap_eNB_overload.c +++ b/openair-cn/S1AP/s1ap_eNB_overload.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/S1AP/s1ap_eNB_overload.h b/openair-cn/S1AP/s1ap_eNB_overload.h index ed6e59bc90..baa1ad1232 100644 --- a/openair-cn/S1AP/s1ap_eNB_overload.h +++ b/openair-cn/S1AP/s1ap_eNB_overload.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/S1AP/s1ap_eNB_trace.c b/openair-cn/S1AP/s1ap_eNB_trace.c index e792c81120..fd192d7320 100644 --- a/openair-cn/S1AP/s1ap_eNB_trace.c +++ b/openair-cn/S1AP/s1ap_eNB_trace.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/S1AP/s1ap_eNB_ue_context.c b/openair-cn/S1AP/s1ap_eNB_ue_context.c index 4588c4ade2..50df294dce 100644 --- a/openair-cn/S1AP/s1ap_eNB_ue_context.c +++ b/openair-cn/S1AP/s1ap_eNB_ue_context.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/S1AP/s1ap_eNB_ue_context.h b/openair-cn/S1AP/s1ap_eNB_ue_context.h index a153fa1952..43c9d0e2c2 100644 --- a/openair-cn/S1AP/s1ap_eNB_ue_context.h +++ b/openair-cn/S1AP/s1ap_eNB_ue_context.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/S1AP/s1ap_mme.c b/openair-cn/S1AP/s1ap_mme.c deleted file mode 100644 index a599d32c68..0000000000 --- a/openair-cn/S1AP/s1ap_mme.c +++ /dev/null @@ -1,474 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -#if HAVE_CONFIG_H -# include "config.h" -#endif - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> - -#if !defined(MME_CLIENT_TEST) -# include "intertask_interface.h" -#endif - -#include "assertions.h" -#include "queue.h" - -#include "s1ap_mme.h" -#include "s1ap_mme_decoder.h" -#include "s1ap_mme_handlers.h" -#include "s1ap_ies_defs.h" - -#include "s1ap_mme_nas_procedures.h" -#include "s1ap_mme_retransmission.h" -#include "msc.h" - -#define S1AP_DEBUG_LIST -#ifdef S1AP_DEBUG_LIST -# define eNB_LIST_OUT(x, args...) S1AP_DEBUG("[eNB]%*s"x"\n", 4*indent, "", ##args) -# define UE_LIST_OUT(x, args...) S1AP_DEBUG("[UE] %*s"x"\n", 4*indent, "", ##args) -#else -# define eNB_LIST_OUT(x, args...) -# define UE_LIST_OUT(x, args...) -#endif - -#if !defined(MME_CLIENT_TEST) -// static pthread_t s1ap_task_thread; - -int hss_associated = 0; -uint32_t nb_eNB_associated = 0; -STAILQ_HEAD(eNB_list_s, eNB_description_s) -eNB_list_head; - -static int indent = 0; - -void *s1ap_mme_thread(void *args); - -static int s1ap_send_init_sctp(void) -{ - // Create and alloc new message - MessageDef *message_p; - message_p = itti_alloc_new_message(TASK_S1AP, SCTP_INIT_MSG); - message_p->ittiMsg.sctpInit.port = S1AP_PORT_NUMBER; - message_p->ittiMsg.sctpInit.ppid = S1AP_SCTP_PPID; - message_p->ittiMsg.sctpInit.ipv4 = 1; - message_p->ittiMsg.sctpInit.ipv6 = 0; - message_p->ittiMsg.sctpInit.nb_ipv4_addr = 1; - message_p->ittiMsg.sctpInit.ipv4_address[0] - = mme_config.ipv4.mme_ip_address_for_S1_MME; - /* SR WARNING: ipv6 multi-homing fails sometimes for localhost. - * Disable it for now.*/ - message_p->ittiMsg.sctpInit.nb_ipv6_addr = 0; - message_p->ittiMsg.sctpInit.ipv6_address[0] = "0:0:0:0:0:0:0:1"; - - return itti_send_msg_to_task(TASK_SCTP, INSTANCE_DEFAULT, message_p); -} - -void *s1ap_mme_thread(void *args) -{ - MessageDef *received_message_p; - - itti_mark_task_ready(TASK_S1AP); - MSC_START_USE(); - - while(1) { - /* Trying to fetch a message from the message queue. - * If the queue is empty, this function will block till a - * message is sent to the task. - */ - itti_receive_msg(TASK_S1AP, &received_message_p); - DevAssert(received_message_p != NULL); - - switch (ITTI_MSG_ID(received_message_p)) { - case ACTIVATE_MESSAGE: { - hss_associated = 1; - } - break; - - case SCTP_DATA_IND: { - /* New message received from SCTP layer. - * Decode and handle it. - */ - s1ap_message message; - - memset((void *)&message, 0, sizeof(s1ap_message)); - - /* Invoke S1AP message decoder */ - if (s1ap_mme_decode_pdu(&message, - SCTP_DATA_IND(received_message_p).buffer, - SCTP_DATA_IND(received_message_p).buf_length) < 0) { - // TODO: Notify eNB of failure with right cause - S1AP_ERROR("Failed to decode new buffer\n"); - } else { - s1ap_mme_handle_message(SCTP_DATA_IND(received_message_p).assoc_id, - SCTP_DATA_IND(received_message_p).stream, - &message); - } - - /* Free received PDU array */ - free(SCTP_DATA_IND(received_message_p).buffer); - } - break; - - /* SCTP layer notifies S1AP of disconnection of a peer. */ - case SCTP_CLOSE_ASSOCIATION: { - s1ap_handle_sctp_deconnection(SCTP_CLOSE_ASSOCIATION(received_message_p).assoc_id); - } - break; - - case SCTP_NEW_ASSOCIATION: { - s1ap_handle_new_association(&received_message_p->ittiMsg.sctp_new_peer); - } - break; - - case NAS_DOWNLINK_DATA_REQ: { - /* New message received from NAS task. - * This corresponds to a S1AP downlink nas transport message. - */ - s1ap_generate_downlink_nas_transport(NAS_DL_DATA_REQ(received_message_p).UEid, - NAS_DL_DATA_REQ(received_message_p).nasMsg.data, - NAS_DL_DATA_REQ(received_message_p).nasMsg.length); - } - break; - - case S1AP_UE_CONTEXT_RELEASE_COMMAND: { - s1ap_handle_ue_context_release_command(&received_message_p->ittiMsg.s1ap_ue_context_release_command); - } - break; - -#if defined(DISABLE_USE_NAS) - - case NAS_ATTACH_ACCEPT: { - s1ap_handle_attach_accepted(&received_message_p->ittiMsg.nas_attach_accept); - } - break; -#else - // handled by MME_APP know - //case NAS_CONNECTION_ESTABLISHMENT_CNF: { - // s1ap_handle_conn_est_cnf(&NAS_CONNECTION_ESTABLISHMENT_CNF(received_message_p)); - //} break; - - case MME_APP_CONNECTION_ESTABLISHMENT_CNF: { - s1ap_handle_conn_est_cnf(&MME_APP_CONNECTION_ESTABLISHMENT_CNF(received_message_p)); - } - break; -#endif - - case TIMER_HAS_EXPIRED: { - s1ap_handle_timer_expiry(&received_message_p->ittiMsg.timer_has_expired); - } - break; - - case TERMINATE_MESSAGE: { - itti_exit_task(); - } - break; - - default: { - S1AP_DEBUG("Unkwnon message ID %d:%s\n", - ITTI_MSG_ID(received_message_p), ITTI_MSG_NAME(received_message_p)); - } - break; - } - - itti_free(ITTI_MSG_ORIGIN_ID(received_message_p), received_message_p); - received_message_p = NULL; - } - - return NULL; -} - -int s1ap_mme_init(const mme_config_t *mme_config_p) -{ - S1AP_DEBUG("Initializing S1AP interface\n"); - - if (get_asn1c_environment_version() < ASN1_MINIMUM_VERSION) { - S1AP_ERROR("ASN1C version %d fount, expecting at least %d\n", - get_asn1c_environment_version(), ASN1_MINIMUM_VERSION); - return -1; - } else { - S1AP_DEBUG("ASN1C version %d\n", get_asn1c_environment_version()); - } - -#if defined(UPDATE_RELEASE_10) - S1AP_DEBUG("S1AP Release v10.5\n"); -#else -# if defined(UPDATE_RELEASE_9) - S1AP_DEBUG("S1AP Release v9.8\n"); -# else - S1AP_DEBUG("S1AP Release v8.10\n"); -# endif -#endif - - STAILQ_INIT(&eNB_list_head); - - if (itti_create_task(TASK_S1AP, &s1ap_mme_thread, NULL) < 0) { - S1AP_ERROR("Error while creating S1AP task\n"); - return -1; - } - - if (s1ap_send_init_sctp() < 0) { - S1AP_ERROR("Error while sendind SCTP_INIT_MSG to SCTP \n"); - return -1; - } - - S1AP_DEBUG("Initializing S1AP interface: DONE\n"); - return 0; -} - -void s1ap_dump_eNB_list(void) -{ - eNB_description_t *eNB_ref; - - STAILQ_FOREACH(eNB_ref, &eNB_list_head, eNB_entries) { - s1ap_dump_eNB(eNB_ref); - } -} - -void s1ap_dump_eNB(eNB_description_t *eNB_ref) -{ -#ifdef S1AP_DEBUG_LIST - ue_description_t *ue_ref; - //Reset indentation - indent = 0; - - if (eNB_ref == NULL) { - return; - } - - eNB_LIST_OUT(""); - eNB_LIST_OUT("eNB name: %s", eNB_ref->eNB_name == NULL ? "not present" : eNB_ref->eNB_name); - eNB_LIST_OUT("eNB ID: %07x", eNB_ref->eNB_id); - eNB_LIST_OUT("SCTP assoc id: %d", eNB_ref->sctp_assoc_id); - eNB_LIST_OUT("SCTP instreams: %d", eNB_ref->instreams); - eNB_LIST_OUT("SCTP outstreams: %d", eNB_ref->outstreams); - eNB_LIST_OUT("UE attache to eNB: %d", eNB_ref->nb_ue_associated); - - indent++; - - STAILQ_FOREACH(ue_ref, &eNB_ref->ue_list_head, ue_entries) { - s1ap_dump_ue(ue_ref); - } - indent--; - eNB_LIST_OUT(""); -#else - s1ap_dump_ue(NULL); -#endif -} - -void s1ap_dump_ue(ue_description_t *ue_ref) -{ -#ifdef S1AP_DEBUG_LIST - - if (ue_ref == NULL) return; - - UE_LIST_OUT("eNB UE s1ap id: 0x%06x", ue_ref->eNB_ue_s1ap_id); - UE_LIST_OUT("MME UE s1ap id: 0x%08x", ue_ref->mme_ue_s1ap_id); - UE_LIST_OUT("SCTP stream recv: 0x%04x", ue_ref->sctp_stream_recv); - UE_LIST_OUT("SCTP stream send: 0x%04x", ue_ref->sctp_stream_send); -#else - ue_ref = ue_ref; -#endif -} - -eNB_description_t* s1ap_is_eNB_id_in_list(const uint32_t eNB_id) -{ - - eNB_description_t *eNB_ref; - - STAILQ_FOREACH(eNB_ref, &eNB_list_head, eNB_entries) { - if (eNB_ref->eNB_id == eNB_id) { - /* We found a matching reference, return it */ - return eNB_ref; - } - } - /* No matching eNB, return NULL */ - return eNB_ref; -} - -eNB_description_t* s1ap_is_eNB_assoc_id_in_list(const uint32_t sctp_assoc_id) -{ - - eNB_description_t *eNB_ref; - - STAILQ_FOREACH(eNB_ref, &eNB_list_head, eNB_entries) { - if (eNB_ref->sctp_assoc_id == sctp_assoc_id) { - /* We found a matching reference, return it */ - return eNB_ref; - } - } - /* No matching eNB or no eNB in list, return NULL */ - return NULL; -} - -ue_description_t *s1ap_is_ue_eNB_id_in_list(eNB_description_t *eNB_ref, - const uint32_t eNB_ue_s1ap_id) -{ - ue_description_t *ue_ref; - - DevAssert(eNB_ref != NULL); - - STAILQ_FOREACH(ue_ref, &eNB_ref->ue_list_head, ue_entries) { - if (ue_ref->eNB_ue_s1ap_id == eNB_ue_s1ap_id) { - return ue_ref; - } - } - - return NULL; -} - -ue_description_t* s1ap_is_ue_mme_id_in_list(const uint32_t mme_ue_s1ap_id) -{ - - ue_description_t *ue_ref; - eNB_description_t *eNB_ref; - - STAILQ_FOREACH(eNB_ref, &eNB_list_head, eNB_entries) { - STAILQ_FOREACH(ue_ref, &eNB_ref->ue_list_head, ue_entries) { - // We found a matching reference, return it - if (ue_ref->mme_ue_s1ap_id == mme_ue_s1ap_id) { - return ue_ref; - } - } - } - - return NULL; -} - -ue_description_t* s1ap_is_teid_in_list(const uint32_t teid) -{ - - ue_description_t *ue_ref; - eNB_description_t *eNB_ref; - - STAILQ_FOREACH(eNB_ref, &eNB_list_head, eNB_entries) { - STAILQ_FOREACH(ue_ref, &eNB_ref->ue_list_head, ue_entries) { - // We found a matching reference, return it - if (ue_ref->teid == teid) { - return ue_ref; - } - } - } - - return NULL; -} - -eNB_description_t* s1ap_new_eNB(void) -{ - - eNB_description_t *eNB_ref = NULL; - - eNB_ref = calloc(1, sizeof(eNB_description_t)); - /* Something bad happened during malloc... - * May be we are running out of memory. - * TODO: Notify eNB with a cause like Hardware Failure. - */ - DevAssert(eNB_ref != NULL); - - // Update number of eNB associated - nb_eNB_associated++; - - STAILQ_INIT(&eNB_ref->ue_list_head); - - eNB_ref->nb_ue_associated = 0; - - STAILQ_INSERT_TAIL(&eNB_list_head, eNB_ref, eNB_entries); - - return eNB_ref; -} - -ue_description_t* s1ap_new_ue(const uint32_t sctp_assoc_id) -{ - - eNB_description_t *eNB_ref = NULL; - ue_description_t *ue_ref = NULL; - - eNB_ref = s1ap_is_eNB_assoc_id_in_list(sctp_assoc_id); - DevAssert(eNB_ref != NULL); - - ue_ref = calloc(1, sizeof(ue_description_t)); - /* Something bad happened during malloc... - * May be we are running out of memory. - * TODO: Notify eNB with a cause like Hardware Failure. - */ - DevAssert(ue_ref != NULL); - - ue_ref->eNB = eNB_ref; - - // Increment number of UE - eNB_ref->nb_ue_associated++; - STAILQ_INSERT_TAIL(&eNB_ref->ue_list_head, ue_ref, ue_entries); - - return ue_ref; -} - -void s1ap_remove_ue(ue_description_t *ue_ref) -{ - eNB_description_t *eNB_ref; - - /* NULL reference... */ - if (ue_ref == NULL) return; - - eNB_ref = ue_ref->eNB; - - /* Updating number of UE */ - eNB_ref->nb_ue_associated--; - /* Remove any attached timer */ - // s1ap_timer_remove_ue(ue_ref->mme_ue_s1ap_id); - - STAILQ_REMOVE(&eNB_ref->ue_list_head, ue_ref, ue_description_s, ue_entries); - eNB_ref->nb_ue_associated--; - - /* Freeing memory */ - free(ue_ref); - ue_ref = NULL; -} - -void s1ap_remove_eNB(eNB_description_t *eNB_ref) -{ - ue_description_t *ue_ref; - - if (eNB_ref == NULL) return; - - while (!STAILQ_EMPTY(&eNB_ref->ue_list_head)) { - ue_ref = STAILQ_FIRST(&eNB_ref->ue_list_head); - eNB_ref->nb_ue_associated--; - STAILQ_REMOVE_HEAD(&eNB_ref->ue_list_head, ue_entries); - free(ue_ref); - } - - STAILQ_REMOVE(&eNB_list_head, eNB_ref, eNB_description_s, eNB_entries); - - free(eNB_ref); - eNB_ref = NULL; - nb_eNB_associated--; -} - -#endif diff --git a/openair-cn/S1AP/s1ap_mme.h b/openair-cn/S1AP/s1ap_mme.h deleted file mode 100644 index 1b33ec297d..0000000000 --- a/openair-cn/S1AP/s1ap_mme.h +++ /dev/null @@ -1,185 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -#if !defined(MME_CLIENT_TEST) -# include "intertask_interface.h" -#endif - -#include "mme_config.h" - -#ifndef S1AP_MME_H_ -#define S1AP_MME_H_ - -// Forward declarations -struct eNB_description_s; - -enum s1_eNB_state_s { - S1AP_RESETING, ///< After a reset request (eNB or MME initiated) - S1AP_READY ///< MME and eNB are S1 associated, UE contexts can be added -}; - -enum s1_ue_state_s { - S1AP_UE_WAITING_CSR, ///< Waiting for Initial Context Setup Response - S1AP_UE_HANDOVER, ///< Handover procedure triggered - S1AP_UE_CONNECTED, ///< UE context ready -}; - -/** Main structure representing UE association over s1ap - * Generated every time a new InitialUEMessage is received - **/ -typedef struct ue_description_s { - STAILQ_ENTRY(ue_description_s) ue_entries; - - struct eNB_description_s *eNB; ///< Which eNB this UE is attached to - - enum s1_ue_state_s s1_ue_state; ///< S1AP UE state - - unsigned eNB_ue_s1ap_id:24; ///< Unique UE id over eNB (24 bits wide) - uint32_t mme_ue_s1ap_id; ///< Unique UE id over MME (32 bits wide) - - /** SCTP stream on which S1 message will be sent/received. - * During an UE S1 connection, a pair of streams is - * allocated and is used during all the connection. - * Stream 0 is reserved for non UE signalling. - * @name sctp stream identifier - **/ - /*@{*/ - uint16_t sctp_stream_recv; ///< eNB -> MME stream - uint16_t sctp_stream_send; ///< MME -> eNB stream - /*@}*/ - - uint32_t teid; - - /* Timer for procedure outcume issued by MME that should be answered */ - long outcome_response_timer_id; -} ue_description_t; - -/* Main structure representing eNB association over s1ap - * Generated (or updated) every time a new S1SetupRequest is received. - */ -typedef struct eNB_description_s { - STAILQ_ENTRY(eNB_description_s) eNB_entries; - - enum s1_eNB_state_s s1_state; ///< State of the eNB S1AP association over MME - - /** eNB related parameters **/ - /*@{*/ - char eNB_name[150]; ///< Printable eNB Name - uint32_t eNB_id; ///< Unique eNB ID - uint8_t default_paging_drx; ///< Default paging DRX interval for eNB - /*@}*/ - - /** UE list for this eNB **/ - /*@{*/ - uint32_t nb_ue_associated; ///< Number of NAS associated UE on this eNB - STAILQ_HEAD(ue_list_s, ue_description_s) ue_list_head; - /*@}*/ - - /** SCTP stuff **/ - /*@{*/ - uint32_t sctp_assoc_id; ///< SCTP association id on this machine - uint16_t next_sctp_stream; ///< Next SCTP stream - uint16_t instreams; ///< Number of streams avalaible on eNB -> MME - uint16_t outstreams; ///< Number of streams avalaible on MME -> eNB - /*@}*/ -} eNB_description_t; - -extern int hss_associated; -extern uint32_t nb_eNB_associated; -extern mme_config_t *global_mme_config_p; - -/** \brief S1AP layer top init - * @returns -1 in case of failure - **/ -int s1ap_mme_init(const mme_config_t *mme_config); - -/** \brief Look for given eNB id in the list - * \param eNB_id The unique eNB id to search in list - * @returns NULL if no eNB matchs the eNB id, or reference to the eNB element in list if matches - **/ -eNB_description_t* s1ap_is_eNB_id_in_list(const uint32_t eNB_id); - -/** \brief Look for given eNB SCTP assoc id in the list - * \param eNB_id The unique sctp assoc id to search in list - * @returns NULL if no eNB matchs the sctp assoc id, or reference to the eNB element in list if matches - **/ -eNB_description_t* s1ap_is_eNB_assoc_id_in_list(const uint32_t sctp_assoc_id); - -/** \brief Look for given ue eNB id in the list - * \param eNB_id The unique ue_eNB_id to search in list - * @returns NULL if no UE matchs the ue_eNB_id, or reference to the ue element in list if matches - **/ -ue_description_t* s1ap_is_ue_eNB_id_in_list(eNB_description_t *eNB_ref, - const uint32_t eNB_ue_s1ap_id); - -/** \brief Look for given ue mme id in the list - * \param eNB_id The unique ue_mme_id to search in list - * @returns NULL if no UE matchs the ue_mme_id, or reference to the ue element in list if matches - **/ -ue_description_t* s1ap_is_ue_mme_id_in_list(const uint32_t ue_mme_id); -ue_description_t* s1ap_is_teid_in_list(const uint32_t teid); - -/** \brief Allocate and add to the list a new eNB descriptor - * @returns Reference to the new eNB element in list - **/ -eNB_description_t* s1ap_new_eNB(void); - -/** \brief Allocate and add to the right eNB list a new UE descriptor - * \param sctp_assoc_id association ID over SCTP - * @returns Reference to the new UE element in list - **/ -ue_description_t* s1ap_new_ue(const uint32_t sctp_assoc_id); - -/** \brief Dump the eNB list - * Calls dump_eNB for each eNB in list - **/ -void s1ap_dump_eNB_list(void); - -/** \brief Dump eNB related information. - * Calls dump_ue for each UE in list - * \param eNB_ref eNB structure reference to dump - **/ -void s1ap_dump_eNB(eNB_description_t *eNB_ref); - -/** \brief Dump UE related information. - * \param ue_ref ue structure reference to dump - **/ -void s1ap_dump_ue(ue_description_t *ue_ref); - -/** \brief Remove target UE from the list - * \param ue_ref UE structure reference to remove - **/ -void s1ap_remove_ue(ue_description_t *ue_ref); - -/** \brief Remove target eNB from the list and remove any UE associated - * \param eNB_ref eNB structure reference to remove - **/ -void s1ap_remove_eNB(eNB_description_t *eNB_ref); - -#endif /* S1AP_MME_H_ */ diff --git a/openair-cn/S1AP/s1ap_mme_decoder.c b/openair-cn/S1AP/s1ap_mme_decoder.c deleted file mode 100644 index 4ee8aca34b..0000000000 --- a/openair-cn/S1AP/s1ap_mme_decoder.c +++ /dev/null @@ -1,297 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -/*! \file s1ap_mme_decoder.c - * \brief s1ap decode procedures for MME - * \author Sebastien ROUX <sebastien.roux@eurecom.fr> - * \date 2012 - * \version 0.1 - */ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> - -#include "assertions.h" -#include "s1ap_common.h" -#include "s1ap_ies_defs.h" -#include "s1ap_mme_decoder.h" -#include "s1ap_mme_handlers.h" - -#if !defined(MME_CLIENT_TEST) -# include "intertask_interface.h" -#endif - -#include "assertions.h" - -static int s1ap_mme_decode_initiating( - s1ap_message *message, S1ap_InitiatingMessage_t *initiating_p) -{ - int ret = -1; - - MessageDef *message_p; - char *message_string = NULL; - size_t message_string_size; - MessagesIds message_id; - - DevAssert(initiating_p != NULL); - - message_string = calloc(10000, sizeof(char)); - s1ap_string_total_size = 0; - - message->procedureCode = initiating_p->procedureCode; - message->criticality = initiating_p->criticality; - - switch(initiating_p->procedureCode) { - case S1ap_ProcedureCode_id_uplinkNASTransport: { - ret = s1ap_decode_s1ap_uplinknastransporties( - &message->msg.s1ap_UplinkNASTransportIEs, &initiating_p->value); - s1ap_xer_print_s1ap_uplinknastransport(s1ap_xer__print2sp, message_string, - message); - message_id = S1AP_UPLINK_NAS_LOG; - } - break; - - case S1ap_ProcedureCode_id_S1Setup: { - ret = s1ap_decode_s1ap_s1setuprequesties(&message->msg.s1ap_S1SetupRequestIEs, - &initiating_p->value); - s1ap_xer_print_s1ap_s1setuprequest(s1ap_xer__print2sp, message_string, message); - message_id = S1AP_S1_SETUP_LOG; - } - break; - - case S1ap_ProcedureCode_id_initialUEMessage: { - ret = s1ap_decode_s1ap_initialuemessageies( - &message->msg.s1ap_InitialUEMessageIEs, - &initiating_p->value); - s1ap_xer_print_s1ap_initialuemessage(s1ap_xer__print2sp, message_string, - message); - message_id = S1AP_INITIAL_UE_MESSAGE_LOG; - } - break; - - case S1ap_ProcedureCode_id_UEContextReleaseRequest: { - ret = s1ap_decode_s1ap_uecontextreleaserequesties( - &message->msg.s1ap_UEContextReleaseRequestIEs, &initiating_p->value); - s1ap_xer_print_s1ap_uecontextreleaserequest(s1ap_xer__print2sp, message_string, - message); - message_id = S1AP_UE_CONTEXT_RELEASE_REQ_LOG; - } - break; - - case S1ap_ProcedureCode_id_UECapabilityInfoIndication: { - ret = s1ap_decode_s1ap_uecapabilityinfoindicationies( - &message->msg.s1ap_UECapabilityInfoIndicationIEs, &initiating_p->value); - s1ap_xer_print_s1ap_uecapabilityinfoindication(s1ap_xer__print2sp, - message_string, message); - message_id = S1AP_UE_CAPABILITY_IND_LOG; - } - break; - - case S1ap_ProcedureCode_id_NASNonDeliveryIndication: { - ret = s1ap_decode_s1ap_nasnondeliveryindication_ies( - &message->msg.s1ap_NASNonDeliveryIndication_IEs, &initiating_p->value); - s1ap_xer_print_s1ap_nasnondeliveryindication_(s1ap_xer__print2sp, - message_string, message); - message_id = S1AP_NAS_NON_DELIVERY_IND_LOG; - } - break; - - default: { - S1AP_ERROR("Unknown procedure ID (%d) for initiating message\n", - (int)initiating_p->procedureCode); - AssertFatal(0, "Unknown procedure ID (%d) for initiating message\n", - (int)initiating_p->procedureCode); - } - break; - } - - message_string_size = strlen(message_string); - - message_p = itti_alloc_new_message_sized(TASK_S1AP, message_id, message_string_size + sizeof (IttiMsgText)); - message_p->ittiMsg.s1ap_uplink_nas_log.size = message_string_size; - memcpy(&message_p->ittiMsg.s1ap_uplink_nas_log.text, message_string, message_string_size); - - itti_send_msg_to_task(TASK_UNKNOWN, INSTANCE_DEFAULT, message_p); - - free(message_string); - - return ret; -} - -static int s1ap_mme_decode_successfull_outcome( - s1ap_message *message, S1ap_SuccessfulOutcome_t *successfullOutcome_p) -{ - int ret = -1; - MessageDef *message_p = NULL; - char *message_string = NULL; - size_t message_string_size = 0; - MessagesIds message_id = MESSAGES_ID_MAX; - - DevAssert(successfullOutcome_p != NULL); - - message_string = calloc(10000, sizeof(char)); - s1ap_string_total_size = 0; - - message->procedureCode = successfullOutcome_p->procedureCode; - message->criticality = successfullOutcome_p->criticality; - - switch(successfullOutcome_p->procedureCode) { - case S1ap_ProcedureCode_id_InitialContextSetup: { - ret = s1ap_decode_s1ap_initialcontextsetupresponseies( - &message->msg.s1ap_InitialContextSetupResponseIEs, - &successfullOutcome_p->value); - s1ap_xer_print_s1ap_initialcontextsetupresponse(s1ap_xer__print2sp, - message_string, message); - message_id = S1AP_INITIAL_CONTEXT_SETUP_LOG; - } - break; - - case S1ap_ProcedureCode_id_UEContextRelease: { - ret = s1ap_decode_s1ap_uecontextreleasecompleteies( - &message->msg.s1ap_UEContextReleaseCompleteIEs, &successfullOutcome_p->value); - s1ap_xer_print_s1ap_uecontextreleasecomplete(s1ap_xer__print2sp, - message_string, message); - message_id = S1AP_UE_CONTEXT_RELEASE_LOG; - } - break; - - default: { - S1AP_ERROR("Unknown procedure ID (%ld) for successfull outcome message\n", - successfullOutcome_p->procedureCode); - } - break; - } - - message_string_size = strlen(message_string); - - message_p = itti_alloc_new_message_sized(TASK_S1AP, message_id, message_string_size + sizeof (IttiMsgText)); - message_p->ittiMsg.s1ap_initial_context_setup_log.size = message_string_size; - memcpy(&message_p->ittiMsg.s1ap_initial_context_setup_log.text, message_string, message_string_size); - - itti_send_msg_to_task(TASK_UNKNOWN, INSTANCE_DEFAULT, message_p); - - free(message_string); - - return ret; -} - -static int s1ap_mme_decode_unsuccessfull_outcome( - s1ap_message *message, S1ap_UnsuccessfulOutcome_t *unSuccessfulOutcome_p) -{ - int ret = -1; - - MessageDef *message_p; - char *message_string = NULL; - size_t message_string_size; - MessagesIds message_id; - - DevAssert(unSuccessfulOutcome_p != NULL); - - message_string = calloc(10000, sizeof(char)); - s1ap_string_total_size = 0; - - message->procedureCode = unSuccessfulOutcome_p->procedureCode; - message->criticality = unSuccessfulOutcome_p->criticality; - - switch(unSuccessfulOutcome_p->procedureCode) { - case S1ap_ProcedureCode_id_InitialContextSetup: { - ret = s1ap_decode_s1ap_initialcontextsetupfailureies( - &message->msg.s1ap_InitialContextSetupFailureIEs, &unSuccessfulOutcome_p->value); - s1ap_xer_print_s1ap_initialcontextsetupfailure(s1ap_xer__print2sp, - message_string, message); - message_id = S1AP_INITIAL_CONTEXT_SETUP_LOG; - } - break; - - default: { - S1AP_ERROR("Unknown procedure ID (%d) for unsuccessfull outcome message\n", - (int)unSuccessfulOutcome_p->procedureCode); - } - break; - } - - message_string_size = strlen(message_string); - - message_p = itti_alloc_new_message_sized(TASK_S1AP, message_id, message_string_size + sizeof (IttiMsgText)); - message_p->ittiMsg.s1ap_initial_context_setup_log.size = message_string_size; - memcpy(&message_p->ittiMsg.s1ap_initial_context_setup_log.text, message_string, message_string_size); - - itti_send_msg_to_task(TASK_UNKNOWN, INSTANCE_DEFAULT, message_p); - - free(message_string); - - return ret; -} - -int s1ap_mme_decode_pdu(s1ap_message *message, uint8_t *buffer, uint32_t len) -{ - S1AP_PDU_t pdu; - S1AP_PDU_t *pdu_p = &pdu; - asn_dec_rval_t dec_ret; - - DevAssert(buffer != NULL); - - memset((void *)pdu_p, 0, sizeof(S1AP_PDU_t)); - - dec_ret = aper_decode(NULL, - &asn_DEF_S1AP_PDU, - (void **)&pdu_p, - buffer, - len, - 0, - 0); - - if (dec_ret.code != RC_OK) { - S1AP_ERROR("Failed to decode PDU\n"); - return -1; - } - - message->direction = pdu_p->present; - - switch(pdu_p->present) { - case S1AP_PDU_PR_initiatingMessage: - return s1ap_mme_decode_initiating(message, &pdu_p->choice.initiatingMessage); - - case S1AP_PDU_PR_successfulOutcome: - return s1ap_mme_decode_successfull_outcome(message, - &pdu_p->choice.successfulOutcome); - - case S1AP_PDU_PR_unsuccessfulOutcome: - return s1ap_mme_decode_unsuccessfull_outcome(message, - &pdu_p->choice.unsuccessfulOutcome); - - default: - S1AP_ERROR("Unknown message outcome (%d) or not implemented", - (int)pdu_p->present); - break; - } - - return -1; -} diff --git a/openair-cn/S1AP/s1ap_mme_decoder.h b/openair-cn/S1AP/s1ap_mme_decoder.h deleted file mode 100644 index 4f5e13c373..0000000000 --- a/openair-cn/S1AP/s1ap_mme_decoder.h +++ /dev/null @@ -1,39 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -#include "s1ap_common.h" -#include "s1ap_ies_defs.h" - -#ifndef S1AP_MME_DECODER_H_ -#define S1AP_MME_DECODER_H_ - -int s1ap_mme_decode_pdu(s1ap_message *message, uint8_t *buffer, uint32_t len) -__attribute__ ((warn_unused_result)); - -#endif /* S1AP_MME_DECODER_H_ */ diff --git a/openair-cn/S1AP/s1ap_mme_encoder.c b/openair-cn/S1AP/s1ap_mme_encoder.c deleted file mode 100644 index 6209a93334..0000000000 --- a/openair-cn/S1AP/s1ap_mme_encoder.c +++ /dev/null @@ -1,266 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -/*! \file s1ap_mme_encoder.c - * \brief s1ap encode procedures for MME - * \author Sebastien ROUX <sebastien.roux@eurecom.fr> - * \date 2012 - * \version 0.1 - */ - -#include "intertask_interface.h" - -#include "s1ap_common.h" -#include "s1ap_ies_defs.h" -#include "s1ap_mme_encoder.h" -#include "s1ap_mme.h" - -#include "assertions.h" - -static inline -int s1ap_mme_encode_initial_context_setup_request(s1ap_message *message_p, - uint8_t **buffer, uint32_t *length); -static inline -int s1ap_mme_encode_s1setupresponse(s1ap_message *message_p, - uint8_t **buffer, uint32_t *length); -static inline -int s1ap_mme_encode_s1setupfailure(s1ap_message *message_p, - uint8_t **buffer, uint32_t *length); -static inline -int s1ap_mme_encode_ue_context_release_command(s1ap_message *message_p, - uint8_t **buffer, uint32_t *length); -static inline -int s1ap_mme_encode_downlink_nas_transport( - s1ap_message *message_p, uint8_t **buffer, uint32_t *length); - -static inline -int s1ap_mme_encode_initiating(s1ap_message *message_p, - uint8_t **buffer, - uint32_t *length); -static inline -int s1ap_mme_encode_successfull_outcome(s1ap_message *message_p, - uint8_t **buffer, uint32_t *len); -static inline -int s1ap_mme_encode_unsuccessfull_outcome(s1ap_message *message_p, - uint8_t **buffer, uint32_t *len); - -static inline -int s1ap_mme_encode_initial_context_setup_request(s1ap_message *message_p, - uint8_t **buffer, uint32_t *length) -{ - S1ap_InitialContextSetupRequest_t initialContextSetupRequest; - S1ap_InitialContextSetupRequest_t *initialContextSetupRequest_p = - &initialContextSetupRequest; - - memset(initialContextSetupRequest_p, 0, sizeof(S1ap_InitialContextSetupRequest_t)); - - if (s1ap_encode_s1ap_initialcontextsetuprequesties(initialContextSetupRequest_p, - &message_p->msg.s1ap_InitialContextSetupRequestIEs) < 0) { - return -1; - } - - return s1ap_generate_initiating_message(buffer, - length, - S1ap_ProcedureCode_id_InitialContextSetup, - S1ap_Criticality_reject, - &asn_DEF_S1ap_InitialContextSetupRequest, - initialContextSetupRequest_p); -} - -int s1ap_mme_encode_pdu(s1ap_message *message_p, uint8_t **buffer, uint32_t *length) -{ - DevAssert(message_p != NULL); - DevAssert(buffer != NULL); - DevAssert(length != NULL); - - switch(message_p->direction) { - case S1AP_PDU_PR_initiatingMessage: - return s1ap_mme_encode_initiating(message_p, buffer, length); - - case S1AP_PDU_PR_successfulOutcome: - return s1ap_mme_encode_successfull_outcome(message_p, buffer, length); - - case S1AP_PDU_PR_unsuccessfulOutcome: - return s1ap_mme_encode_unsuccessfull_outcome(message_p, buffer, length); - - default: - S1AP_DEBUG("Unknown message outcome (%d) or not implemented", - (int)message_p->direction); - break; - } - - return -1; -} - -static inline -int s1ap_mme_encode_initiating(s1ap_message *message_p, - uint8_t **buffer, - uint32_t *length) -{ - switch(message_p->procedureCode) { - case S1ap_ProcedureCode_id_downlinkNASTransport: - return s1ap_mme_encode_downlink_nas_transport(message_p, buffer, length); - - case S1ap_ProcedureCode_id_InitialContextSetup: - return s1ap_mme_encode_initial_context_setup_request(message_p, buffer, length); - - case S1ap_ProcedureCode_id_UEContextRelease: - return s1ap_mme_encode_ue_context_release_command(message_p, buffer, length); - - default: - S1AP_DEBUG("Unknown procedure ID (%d) for initiating message_p\n", - (int)message_p->procedureCode); - break; - } - - return -1; -} - -static inline -int s1ap_mme_encode_successfull_outcome(s1ap_message *message_p, - uint8_t **buffer, uint32_t *length) -{ - switch(message_p->procedureCode) { - case S1ap_ProcedureCode_id_S1Setup: - return s1ap_mme_encode_s1setupresponse(message_p, buffer, length); - - default: - S1AP_DEBUG("Unknown procedure ID (%d) for successfull outcome message\n", - (int)message_p->procedureCode); - break; - } - - return -1; -} - -static inline -int s1ap_mme_encode_unsuccessfull_outcome(s1ap_message *message_p, - uint8_t **buffer, uint32_t *length) -{ - switch(message_p->procedureCode) { - case S1ap_ProcedureCode_id_S1Setup: - return s1ap_mme_encode_s1setupfailure(message_p, buffer, length); - - default: - S1AP_DEBUG("Unknown procedure ID (%d) for unsuccessfull outcome message\n", - (int)message_p->procedureCode); - break; - } - - return -1; -} - -static inline -int s1ap_mme_encode_s1setupresponse(s1ap_message *message_p, - uint8_t **buffer, uint32_t *length) -{ - S1ap_S1SetupResponse_t s1SetupResponse; - S1ap_S1SetupResponse_t *s1SetupResponse_p = &s1SetupResponse; - - memset(s1SetupResponse_p, 0, sizeof(S1ap_S1SetupResponse_t)); - - if (s1ap_encode_s1ap_s1setupresponseies(s1SetupResponse_p, &message_p->msg.s1ap_S1SetupResponseIEs) < 0) { - return -1; - } - - return s1ap_generate_successfull_outcome(buffer, - length, - S1ap_ProcedureCode_id_S1Setup, - message_p->criticality, - &asn_DEF_S1ap_S1SetupResponse, - s1SetupResponse_p); -} - -static inline -int s1ap_mme_encode_s1setupfailure(s1ap_message *message_p, - uint8_t **buffer, uint32_t *length) -{ - S1ap_S1SetupFailure_t s1SetupFailure; - S1ap_S1SetupFailure_t *s1SetupFailure_p = &s1SetupFailure; - - memset(s1SetupFailure_p, 0, sizeof(S1ap_S1SetupFailure_t)); - - if (s1ap_encode_s1ap_s1setupfailureies(s1SetupFailure_p, &message_p->msg.s1ap_S1SetupFailureIEs) < 0) { - return -1; - } - - return s1ap_generate_unsuccessfull_outcome(buffer, - length, - S1ap_ProcedureCode_id_S1Setup, - message_p->criticality, - &asn_DEF_S1ap_S1SetupFailure, - s1SetupFailure_p); -} - -static inline -int s1ap_mme_encode_downlink_nas_transport( - s1ap_message *message_p, uint8_t **buffer, uint32_t *length) -{ - S1ap_DownlinkNASTransport_t downlinkNasTransport; - S1ap_DownlinkNASTransport_t *downlinkNasTransport_p = &downlinkNasTransport; - - memset(downlinkNasTransport_p, 0, sizeof(S1ap_DownlinkNASTransport_t)); - - /* Convert IE structure into asn1 message_p */ - if (s1ap_encode_s1ap_downlinknastransporties(downlinkNasTransport_p, - &message_p->msg.s1ap_DownlinkNASTransportIEs) < 0) { - return -1; - } - - /* Generate Initiating message_p for the list of IEs */ - return s1ap_generate_initiating_message(buffer, - length, - S1ap_ProcedureCode_id_downlinkNASTransport, - message_p->criticality, - &asn_DEF_S1ap_DownlinkNASTransport, - downlinkNasTransport_p); -} - -static inline -int s1ap_mme_encode_ue_context_release_command(s1ap_message *message_p, - uint8_t **buffer, uint32_t *length) -{ - S1ap_UEContextReleaseCommand_t ueContextReleaseCommand; - S1ap_UEContextReleaseCommand_t *ueContextReleaseCommand_p = &ueContextReleaseCommand; - - memset(ueContextReleaseCommand_p, 0, sizeof(S1ap_UEContextReleaseCommand_t)); - - /* Convert IE structure into asn1 message_p */ - if (s1ap_encode_s1ap_uecontextreleasecommandies(ueContextReleaseCommand_p, - &message_p->msg.s1ap_UEContextReleaseCommandIEs) < 0) { - return -1; - } - - return s1ap_generate_initiating_message(buffer, - length, - S1ap_ProcedureCode_id_UEContextRelease, - message_p->criticality, - &asn_DEF_S1ap_UEContextReleaseCommand, - ueContextReleaseCommand_p); -} diff --git a/openair-cn/S1AP/s1ap_mme_encoder.h b/openair-cn/S1AP/s1ap_mme_encoder.h deleted file mode 100644 index fb8c6adf89..0000000000 --- a/openair-cn/S1AP/s1ap_mme_encoder.h +++ /dev/null @@ -1,38 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -#include <stdint.h> - -#ifndef S1AP_MME_ENCODER_H_ -#define S1AP_MME_ENCODER_H_ - -int s1ap_mme_encode_pdu(s1ap_message *message, uint8_t **buffer, uint32_t *len) -__attribute__ ((warn_unused_result)); - -#endif /* S1AP_MME_ENCODER_H_ */ diff --git a/openair-cn/S1AP/s1ap_mme_handlers.c b/openair-cn/S1AP/s1ap_mme_handlers.c deleted file mode 100644 index e1a9d48059..0000000000 --- a/openair-cn/S1AP/s1ap_mme_handlers.c +++ /dev/null @@ -1,1212 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -#include <stdlib.h> -#include <stdio.h> -#include <stdint.h> - -#include "mme_config.h" -#include "assertions.h" -#include "conversions.h" - -#include "s1ap_common.h" -#include "s1ap_ies_defs.h" -#include "s1ap_mme_encoder.h" -#include "s1ap_mme_handlers.h" -#include "s1ap_mme_nas_procedures.h" - -#include "s1ap_mme_itti_messaging.h" - -#include "s1ap_mme.h" -#include "s1ap_mme_ta.h" -#include "msc.h" - -static int s1ap_generate_s1_setup_response(eNB_description_t *eNB_association); -static int s1ap_mme_generate_ue_context_release_command( - ue_description_t *ue_ref); - -//Forward declaration -struct s1ap_message_s; - -/* Handlers matrix. Only mme related procedures present here. - */ -s1ap_message_decoded_callback messages_callback[][3] = { - { 0, 0, 0 }, /* HandoverPreparation */ - { 0, 0, 0 }, /* HandoverResourceAllocation */ - { 0, 0, 0 }, /* HandoverNotification */ - { s1ap_mme_handle_path_switch_request, 0, 0 }, /* PathSwitchRequest */ - { 0, 0, 0 }, /* HandoverCancel */ - { 0, 0, 0 }, /* E_RABSetup */ - { 0, 0, 0 }, /* E_RABModify */ - { 0, 0, 0 }, /* E_RABRelease */ - { 0, 0, 0 }, /* E_RABReleaseIndication */ - { - 0, s1ap_mme_handle_initial_context_setup_response, - s1ap_mme_handle_initial_context_setup_failure - }, /* InitialContextSetup */ - { 0, 0, 0 }, /* Paging */ - { 0, 0, 0 }, /* downlinkNASTransport */ - { s1ap_mme_handle_initial_ue_message, 0, 0 }, /* initialUEMessage */ - { s1ap_mme_handle_uplink_nas_transport, 0, 0 }, /* uplinkNASTransport */ - { 0, 0, 0 }, /* Reset */ - { 0, 0, 0 }, /* ErrorIndication */ - { s1ap_mme_handle_nas_non_delivery, 0, 0 }, /* NASNonDeliveryIndication */ - { s1ap_mme_handle_s1_setup_request, 0, 0 }, /* S1Setup */ - { s1ap_mme_handle_ue_context_release_request, 0, 0 }, /* UEContextReleaseRequest */ - { 0, 0, 0 }, /* DownlinkS1cdma2000tunneling */ - { 0, 0, 0 }, /* UplinkS1cdma2000tunneling */ - { 0, 0, 0 }, /* UEContextModification */ - { s1ap_mme_handle_ue_cap_indication, 0, 0 }, /* UECapabilityInfoIndication*/ - { - s1ap_mme_handle_ue_context_release_request, - s1ap_mme_handle_ue_context_release_complete, 0 - }, /* UEContextRelease*/ - { 0, 0, 0 }, /* eNBStatusTransfer*/ - { 0, 0, 0 }, /* MMEStatusTransfer*/ - { 0, 0, 0 }, /* DeactivateTrace*/ - { 0, 0, 0 }, /* TraceStart*/ - { 0, 0, 0 }, /* TraceFailureIndication*/ - { 0, 0, 0 }, /* ENBConfigurationUpdate*/ - { 0, 0, 0 }, /* MMEConfigurationUpdate*/ - { 0, 0, 0 }, /* LocationReportingControl*/ - { 0, 0, 0 }, /* LocationReportingFailureIndication*/ - { 0, 0, 0 }, /* LocationReport*/ - { 0, 0, 0 }, /* OverloadStart*/ - { 0, 0, 0 }, /* OverloadStop*/ - { 0, 0, 0 }, /* WriteReplaceWarning*/ - { 0, 0, 0 }, /* eNBDirectInformationTransfer*/ - { 0, 0, 0 }, /* MMEDirectInformationTransfer*/ - { 0, 0, 0 }, /* PrivateMessage*/ - { 0, 0, 0 }, /* eNBConfigurationTransfer*/ - { 0, 0, 0 }, /* MMEConfigurationTransfer*/ - { 0, 0, 0 }, /* CellTrafficTrace */ -#if defined(UPDATE_RELEASE_9) - { 0, 0, 0 }, /* Kill */ - { 0, 0, 0 }, /* DownlinkUEAssociatedLPPaTransport */ - { 0, 0, 0 }, /* UplinkUEAssociatedLPPaTransport */ - { 0, 0, 0 }, /* DownlinkNonUEAssociatedLPPaTransport */ - { 0, 0, 0 }, /* UplinkNonUEAssociatedLPPaTransport */ -#endif -}; - -const char *s1ap_direction2String[] = { - "", /* Nothing */ - "Originating message", /* originating message */ - "Successfull outcome", /* successfull outcome */ - "UnSuccessfull outcome", /* successfull outcome */ -}; - -//------------------------------------------------------------------------------ -int s1ap_mme_handle_message(uint32_t assoc_id, uint32_t stream, - struct s1ap_message_s *message) -//------------------------------------------------------------------------------ -{ - /* Checking procedure Code and direction of message */ - if ((message->procedureCode > (sizeof(messages_callback) / (3 * sizeof( - s1ap_message_decoded_callback)))) || - (message->direction > S1AP_PDU_PR_unsuccessfulOutcome)) { - - S1AP_DEBUG("[SCTP %d] Either procedureCode %d or direction %d exceed expected\n", - assoc_id, (int)message->procedureCode, (int)message->direction); - return -1; - } - - /* No handler present. - * This can mean not implemented or no procedure for eNB (wrong message). - */ - if (messages_callback[message->procedureCode][message->direction-1] == NULL) { - S1AP_DEBUG("[SCTP %d] No handler for procedureCode %d in %s\n", assoc_id, - (int)message->procedureCode, - s1ap_direction2String[(int)message->direction]); - return -2; - } - - /* Calling the right handler */ - return (*messages_callback[message->procedureCode][message->direction-1])( - assoc_id, stream, message); -} - -//------------------------------------------------------------------------------ -int s1ap_mme_set_cause(S1ap_Cause_t *cause_p, S1ap_Cause_PR cause_type, long cause_value) -//------------------------------------------------------------------------------ -{ - DevAssert(cause_p != NULL); - - cause_p->present = cause_type; - - switch(cause_type) { - case S1ap_Cause_PR_radioNetwork: - cause_p->choice.misc = cause_value; - break; - - case S1ap_Cause_PR_transport: - cause_p->choice.transport = cause_value; - break; - - case S1ap_Cause_PR_nas: - cause_p->choice.nas = cause_value; - break; - - case S1ap_Cause_PR_protocol: - cause_p->choice.protocol = cause_value; - break; - - case S1ap_Cause_PR_misc: - cause_p->choice.misc = cause_value; - break; - - default: - return -1; - } - - return 0; -} - -//------------------------------------------------------------------------------ -int s1ap_mme_generate_s1_setup_failure( - uint32_t assoc_id, S1ap_Cause_PR cause_type, long cause_value, - long time_to_wait) -//------------------------------------------------------------------------------ -{ - uint8_t *buffer_p; - uint32_t length; - s1ap_message message; - S1ap_S1SetupFailureIEs_t *s1_setup_failure_p; - - memset(&message, 0, sizeof(s1ap_message)); - - s1_setup_failure_p = &message.msg.s1ap_S1SetupFailureIEs; - - message.procedureCode = S1ap_ProcedureCode_id_S1Setup; - message.direction = S1AP_PDU_PR_unsuccessfulOutcome; - - s1ap_mme_set_cause(&s1_setup_failure_p->cause, cause_type, cause_value); - - /* Include the optional field time to wait only if the value is > -1 */ - if (time_to_wait > -1) { - s1_setup_failure_p->presenceMask |= S1AP_S1SETUPFAILUREIES_TIMETOWAIT_PRESENT; - s1_setup_failure_p->timeToWait = time_to_wait; - } - - if (s1ap_mme_encode_pdu(&message, &buffer_p, &length) < 0) { - S1AP_ERROR("Failed to encode s1 setup failure\n"); - return -1; - } - MSC_LOG_TX_MESSAGE( - MSC_S1AP_MME, - MSC_S1AP_ENB, - NULL,0, - "0 S1Setup/unsuccessfulOutcome assoc_id %u cause %u value %u", - assoc_id, cause_type, cause_value); - return s1ap_mme_itti_send_sctp_request(buffer_p, length, assoc_id, 0); -} - -//////////////////////////////////////////////////////////////////////////////// -//************************** Management procedures ***************************// -//////////////////////////////////////////////////////////////////////////////// - -//------------------------------------------------------------------------------ -int s1ap_mme_handle_s1_setup_request(uint32_t assoc_id, uint32_t stream, - struct s1ap_message_s *message) -//------------------------------------------------------------------------------ -{ - if (hss_associated) { - S1ap_S1SetupRequestIEs_t *s1SetupRequest_p; - eNB_description_t *eNB_association; - uint32_t eNB_id = 0; - char *eNB_name = NULL; - int ta_ret; - uint16_t max_enb_connected; - - DevAssert(message != NULL); - - s1SetupRequest_p = &message->msg.s1ap_S1SetupRequestIEs; - - /* We received a new valid S1 Setup Request on a stream != 0. - * This should not happen -> reject eNB s1 setup request. - */ - MSC_LOG_RX_MESSAGE( - MSC_S1AP_MME, - MSC_S1AP_ENB, - NULL,0, - "0 S1Setup/%s assoc_id %u stream %u", - s1ap_direction2String[message->direction], - assoc_id, stream); - - if (stream != 0) { - S1AP_ERROR("Received new s1 setup request on stream != 0\n"); - /* Send a s1 setup failure with protocol cause unspecified */ - return s1ap_mme_generate_s1_setup_failure(assoc_id, S1ap_Cause_PR_protocol, - S1ap_CauseProtocol_unspecified, -1); - } - - S1AP_DEBUG("New s1 setup request incoming from "); - - if (s1SetupRequest_p->presenceMask & S1AP_S1SETUPREQUESTIES_ENBNAME_PRESENT) { - S1AP_DEBUG("%*s ", s1SetupRequest_p->eNBname.size, s1SetupRequest_p->eNBname.buf); - eNB_name = (char *)s1SetupRequest_p->eNBname.buf; - } - - if (s1SetupRequest_p->global_ENB_ID.eNB_ID.present == S1ap_ENB_ID_PR_homeENB_ID) { - // Home eNB ID = 28 bits - uint8_t *eNB_id_buf = - s1SetupRequest_p->global_ENB_ID.eNB_ID.choice.homeENB_ID.buf; - - if (s1SetupRequest_p->global_ENB_ID.eNB_ID.choice.macroENB_ID.size != 28) { - //TODO: handle case were size != 28 -> notify ? reject ? - } - - eNB_id = (eNB_id_buf[0] << 20) + (eNB_id_buf[1] << 12) + - (eNB_id_buf[2] << 4) + ((eNB_id_buf[3] & 0xf0) >> 4); - S1AP_DEBUG("home eNB id: %07x\n", eNB_id); - } else { - // Macro eNB = 20 bits - uint8_t *eNB_id_buf = - s1SetupRequest_p->global_ENB_ID.eNB_ID.choice.macroENB_ID.buf; - - if (s1SetupRequest_p->global_ENB_ID.eNB_ID.choice.macroENB_ID.size != 20) { - //TODO: handle case were size != 20 -> notify ? reject ? - } - - eNB_id = (eNB_id_buf[0] << 12) + (eNB_id_buf[1] << 4) + (( - eNB_id_buf[2] & 0xf0) >> 4); - S1AP_DEBUG("macro eNB id: %05x\n", eNB_id); - } - - config_read_lock(&mme_config); - max_enb_connected = mme_config.max_eNBs; - config_unlock(&mme_config); - - if (nb_eNB_associated == max_enb_connected) { - S1AP_ERROR("There is too much eNB connected to MME, rejecting the association\n"); - S1AP_DEBUG("Connected = %d, maximum allowed = %d\n", nb_eNB_associated, - max_enb_connected); - - /* Send an overload cause... */ - return s1ap_mme_generate_s1_setup_failure(assoc_id, S1ap_Cause_PR_misc, - S1ap_CauseMisc_control_processing_overload, - S1ap_TimeToWait_v20s); - } - - /* If none of the provided PLMNs/TAC match the one configured in MME, - * the s1 setup should be rejected with a cause set to Unknown PLMN. - */ - ta_ret = s1ap_mme_compare_ta_lists(&s1SetupRequest_p->supportedTAs); - - /* eNB and MME have no common PLMN */ - if (ta_ret != TA_LIST_RET_OK) { - S1AP_ERROR("No Common PLMN with eNB, generate_s1_setup_failure\n"); - return s1ap_mme_generate_s1_setup_failure(assoc_id, S1ap_Cause_PR_misc, - S1ap_CauseMisc_unknown_PLMN, - S1ap_TimeToWait_v20s); - } - - S1AP_DEBUG("Adding eNB to the list of served eNBs\n"); - - if ((eNB_association = s1ap_is_eNB_id_in_list(eNB_id)) == NULL) { - /* eNB has not been fount in list of associated eNB, - * Add it to the tail of list and initialize data */ - if ((eNB_association = s1ap_is_eNB_assoc_id_in_list(assoc_id)) == NULL) { - /* ?? */ - return -1; - } else { - eNB_association->s1_state = S1AP_RESETING; - eNB_association->eNB_id = eNB_id; - eNB_association->default_paging_drx = s1SetupRequest_p->defaultPagingDRX; - - if (eNB_name != NULL) { - memcpy(eNB_association->eNB_name, s1SetupRequest_p->eNBname.buf, - s1SetupRequest_p->eNBname.size); - eNB_association->eNB_name[s1SetupRequest_p->eNBname.size] = '\0'; - } - } - } else { - eNB_association->s1_state = S1AP_RESETING; - - /* eNB has been fount in list, consider the s1 setup request as a reset connection, - * reseting any previous UE state if sctp association is != than the previous one */ - if (eNB_association->sctp_assoc_id != assoc_id) { - S1ap_S1SetupFailureIEs_t s1SetupFailure; - - memset(&s1SetupFailure, 0, sizeof(s1SetupFailure)); - - /* Send an overload cause... */ - s1SetupFailure.cause.present = S1ap_Cause_PR_misc; //TODO: send the right cause - s1SetupFailure.cause.choice.misc = S1ap_CauseMisc_control_processing_overload; - S1AP_ERROR("Rejeting s1 setup request as eNB id %d is already associated to an active sctp association" - "Previous known: %d, new one: %d\n", - eNB_id, eNB_association->sctp_assoc_id, assoc_id); - // s1ap_mme_encode_s1setupfailure(&s1SetupFailure, - // receivedMessage->msg.s1ap_sctp_new_msg_ind.assocId); - return -1; - } - - /* TODO: call the reset procedure */ - } - - s1ap_dump_eNB(eNB_association); - return s1ap_generate_s1_setup_response(eNB_association); - } else { - /* Can not process the request, MME is not connected to HSS */ - S1AP_ERROR("Rejecting s1 setup request Can not process the request, MME is not connected to HSS\n"); - return s1ap_mme_generate_s1_setup_failure(assoc_id, S1ap_Cause_PR_misc, - S1ap_CauseMisc_unspecified, -1); - } -} - -//------------------------------------------------------------------------------ -static -int s1ap_generate_s1_setup_response(eNB_description_t *eNB_association) -//------------------------------------------------------------------------------ -{ - int i; - int enc_rval = 0; - S1ap_S1SetupResponseIEs_t *s1_setup_response_p; - S1ap_ServedGUMMEIsItem_t servedGUMMEI; - s1ap_message message; - uint8_t *buffer; - uint32_t length; - - DevAssert(eNB_association != NULL); - - // Generating response - memset(&message, 0, sizeof(s1ap_message)); - memset(&servedGUMMEI, 0, sizeof(servedGUMMEI)); - - s1_setup_response_p = &message.msg.s1ap_S1SetupResponseIEs; - - config_read_lock(&mme_config); - - s1_setup_response_p->relativeMMECapacity = mme_config.relative_capacity; - - /* Use the gummei parameters provided by configuration */ - for (i = 0; i < mme_config.gummei.nb_plmns; i++) { - S1ap_PLMNidentity_t *plmn; - - /* FIXME: free object from list once encoded */ - plmn = calloc(1, sizeof(*plmn)); - MCC_MNC_TO_PLMNID( - mme_config.gummei.plmn_mcc[i], - mme_config.gummei.plmn_mnc[i], - mme_config.gummei.plmn_mnc_len[i], - plmn); - ASN_SEQUENCE_ADD(&servedGUMMEI.servedPLMNs.list, plmn); - } - - for (i = 0; i < mme_config.gummei.nb_mme_gid; i++) { - S1ap_MME_Group_ID_t *mme_gid; - - /* FIXME: free object from list once encoded */ - mme_gid = calloc(1, sizeof(*mme_gid)); - INT16_TO_OCTET_STRING(mme_config.gummei.mme_gid[i], mme_gid); - ASN_SEQUENCE_ADD(&servedGUMMEI.servedGroupIDs.list, mme_gid); - } - - for (i = 0; i < mme_config.gummei.nb_mmec; i++) { - S1ap_MME_Code_t *mmec; - - /* FIXME: free object from list once encoded */ - mmec = calloc(1, sizeof(*mmec)); - INT8_TO_OCTET_STRING(mme_config.gummei.mmec[i], mmec); - ASN_SEQUENCE_ADD(&servedGUMMEI.servedMMECs.list, mmec); - } - - config_unlock(&mme_config); - - /* The MME is only serving E-UTRAN RAT, so the list contains only one element */ - ASN_SEQUENCE_ADD(&s1_setup_response_p->servedGUMMEIs, &servedGUMMEI); - - message.procedureCode = S1ap_ProcedureCode_id_S1Setup; - message.direction = S1AP_PDU_PR_successfulOutcome; - - enc_rval = s1ap_mme_encode_pdu(&message, &buffer, &length); - - /* Failed to encode s1 setup response... */ - if (enc_rval < 0) { - S1AP_DEBUG("Removed eNB %d\n", eNB_association->sctp_assoc_id); - s1ap_remove_eNB(eNB_association); - } else { - /* Consider the response as sent. S1AP is ready to accept UE contexts */ - eNB_association->s1_state = S1AP_READY; - } - - MSC_LOG_TX_MESSAGE( - MSC_S1AP_MME, - MSC_S1AP_ENB, - NULL,0, - "0 S1Setup/successfulOutcome assoc_id %u", - eNB_association->sctp_assoc_id); - /* Non-UE signalling -> stream 0 */ - return s1ap_mme_itti_send_sctp_request(buffer, length, eNB_association->sctp_assoc_id, - 0); -} - -//------------------------------------------------------------------------------ -int s1ap_mme_handle_ue_cap_indication(uint32_t assoc_id, uint32_t stream, - struct s1ap_message_s *message) -//------------------------------------------------------------------------------ -{ - ue_description_t *ue_ref; - S1ap_UECapabilityInfoIndicationIEs_t *ue_cap_p; - - DevAssert(message != NULL); - - ue_cap_p = &message->msg.s1ap_UECapabilityInfoIndicationIEs; - - MSC_LOG_RX_MESSAGE( - MSC_S1AP_MME, - MSC_S1AP_ENB, - NULL,0, - "0 UECapabilityInfoIndication/%s eNB_ue_s1ap_id "S1AP_UE_ID_FMT" mme_ue_s1ap_id "S1AP_UE_ID_FMT" ", - s1ap_direction2String[message->direction], - ue_cap_p->eNB_UE_S1AP_ID, - ue_cap_p->mme_ue_s1ap_id); - - if ((ue_ref = s1ap_is_ue_mme_id_in_list(ue_cap_p->mme_ue_s1ap_id)) == NULL) { - S1AP_DEBUG("No UE is attached to this mme UE s1ap id: "S1AP_UE_ID_FMT"\n", - (uint32_t)ue_cap_p->mme_ue_s1ap_id); - return -1; - } - - if (ue_ref->eNB_ue_s1ap_id != ue_cap_p->eNB_UE_S1AP_ID) { - S1AP_DEBUG("Mismatch in eNB UE S1AP ID, known: "S1AP_UE_ID_FMT", received: "S1AP_UE_ID_FMT"\n", - ue_ref->eNB_ue_s1ap_id, (uint32_t)ue_cap_p->eNB_UE_S1AP_ID); - return -1; - } - - /* Just display a warning when message received over wrong stream */ - if (ue_ref->sctp_stream_recv != stream) { - S1AP_ERROR("Received ue capability indication for " - "(MME UE S1AP ID/eNB UE S1AP ID) ("S1AP_UE_ID_FMT"/"S1AP_UE_ID_FMT") over wrong stream " - "expecting %u, received on %u\n", - (uint32_t)ue_cap_p->mme_ue_s1ap_id, ue_ref->eNB_ue_s1ap_id, - ue_ref->sctp_stream_recv, stream); - } - - /* Forward the ue capabilities to MME application layer */ - { - MessageDef *message_p; - s1ap_ue_cap_ind_t *ue_cap_ind_p; - - message_p = itti_alloc_new_message(TASK_S1AP, S1AP_UE_CAPABILITIES_IND); - - DevAssert(message_p != NULL); - - ue_cap_ind_p = &message_p->ittiMsg.s1ap_ue_cap_ind; - ue_cap_ind_p->eNB_ue_s1ap_id = ue_ref->eNB_ue_s1ap_id; - ue_cap_ind_p->mme_ue_s1ap_id = ue_ref->mme_ue_s1ap_id; - - DevCheck(ue_cap_p->ueRadioCapability.size < 100, - 100, ue_cap_p->ueRadioCapability.size, 0); - - memcpy(ue_cap_ind_p->radio_capabilities, ue_cap_p->ueRadioCapability.buf, - ue_cap_p->ueRadioCapability.size); - - ue_cap_ind_p->radio_capabilities_length = ue_cap_p->ueRadioCapability.size; - - MSC_LOG_TX_MESSAGE( - MSC_S1AP_MME, - MSC_MMEAPP_MME, - NULL,0, - "0 S1AP_UE_CAPABILITIES_IND eNB_ue_s1ap_id "S1AP_UE_ID_FMT" mme_ue_s1ap_id "S1AP_UE_ID_FMT" len %u", - ue_cap_ind_p->eNB_ue_s1ap_id, - ue_cap_ind_p->mme_ue_s1ap_id, - ue_cap_ind_p->radio_capabilities_length); - - return itti_send_msg_to_task(TASK_MME_APP, INSTANCE_DEFAULT, message_p); - } - return 0; -} - -//////////////////////////////////////////////////////////////////////////////// -//******************* Context Management procedures **************************// -//////////////////////////////////////////////////////////////////////////////// - -//------------------------------------------------------------------------------ -int s1ap_mme_handle_initial_context_setup_response( - uint32_t assoc_id, - uint32_t stream, - struct s1ap_message_s *message) -//------------------------------------------------------------------------------ -{ - - S1ap_InitialContextSetupResponseIEs_t *initialContextSetupResponseIEs_p = NULL; - S1ap_E_RABSetupItemCtxtSURes_t *eRABSetupItemCtxtSURes_p = NULL; - ue_description_t *ue_ref = NULL; - MessageDef *message_p = NULL; - - initialContextSetupResponseIEs_p = &message->msg.s1ap_InitialContextSetupResponseIEs; - - MSC_LOG_RX_MESSAGE( - MSC_S1AP_MME, - MSC_S1AP_ENB, - NULL,0, - "0 InitialContextSetup/%s eNB_ue_s1ap_id "S1AP_UE_ID_FMT" mme_ue_s1ap_id "S1AP_UE_ID_FMT" len %u", - s1ap_direction2String[message->direction], - initialContextSetupResponseIEs_p->eNB_UE_S1AP_ID, - initialContextSetupResponseIEs_p->mme_ue_s1ap_id); - - if ((ue_ref = s1ap_is_ue_mme_id_in_list( - (uint32_t)initialContextSetupResponseIEs_p->mme_ue_s1ap_id)) == NULL) { - S1AP_DEBUG("No UE is attached to this mme UE s1ap id: "S1AP_UE_ID_FMT" %u(10)\n", - (uint32_t)initialContextSetupResponseIEs_p->mme_ue_s1ap_id, - (uint32_t)initialContextSetupResponseIEs_p->mme_ue_s1ap_id); - return -1; - } - - if (ue_ref->eNB_ue_s1ap_id != - initialContextSetupResponseIEs_p->eNB_UE_S1AP_ID) { - S1AP_DEBUG("Mismatch in eNB UE S1AP ID, known: "S1AP_UE_ID_FMT" %u(10), received: 0x%06x %u(10)\n", - ue_ref->eNB_ue_s1ap_id, - ue_ref->eNB_ue_s1ap_id, - (uint32_t)initialContextSetupResponseIEs_p->eNB_UE_S1AP_ID, - (uint32_t)initialContextSetupResponseIEs_p->eNB_UE_S1AP_ID); - return -1; - } - - if (initialContextSetupResponseIEs_p->e_RABSetupListCtxtSURes.s1ap_E_RABSetupItemCtxtSURes.count - != 1) { - S1AP_DEBUG("E-RAB creation has failed\n"); - return -1; - } - - ue_ref->s1_ue_state = S1AP_UE_CONNECTED; - - message_p = itti_alloc_new_message(TASK_S1AP, MME_APP_INITIAL_CONTEXT_SETUP_RSP); - - AssertFatal(message_p != NULL,"itti_alloc_new_message Failed"); - memset((void*)&message_p->ittiMsg.mme_app_initial_context_setup_rsp, - 0, - sizeof(mme_app_initial_context_setup_rsp_t)); - - /* Bad, very bad cast... */ - eRABSetupItemCtxtSURes_p = (S1ap_E_RABSetupItemCtxtSURes_t *) - initialContextSetupResponseIEs_p->e_RABSetupListCtxtSURes.s1ap_E_RABSetupItemCtxtSURes.array[0]; - - - MME_APP_INITIAL_CONTEXT_SETUP_RSP(message_p).mme_ue_s1ap_id = ue_ref->mme_ue_s1ap_id; - MME_APP_INITIAL_CONTEXT_SETUP_RSP(message_p).eps_bearer_id = eRABSetupItemCtxtSURes_p->e_RAB_ID ; - MME_APP_INITIAL_CONTEXT_SETUP_RSP(message_p).bearer_s1u_enb_fteid.ipv4 = 1; // TO DO - MME_APP_INITIAL_CONTEXT_SETUP_RSP(message_p).bearer_s1u_enb_fteid.ipv6 = 0; // TO DO - MME_APP_INITIAL_CONTEXT_SETUP_RSP(message_p).bearer_s1u_enb_fteid.interface_type = S1_U_ENODEB_GTP_U; - MME_APP_INITIAL_CONTEXT_SETUP_RSP(message_p).bearer_s1u_enb_fteid.teid = htonl(*((uint32_t *)eRABSetupItemCtxtSURes_p->gTP_TEID.buf)); - memcpy(&MME_APP_INITIAL_CONTEXT_SETUP_RSP(message_p).bearer_s1u_enb_fteid.ipv4_address, - eRABSetupItemCtxtSURes_p->transportLayerAddress.buf, - 4); - - - MSC_LOG_TX_MESSAGE( - MSC_S1AP_MME, - MSC_MMEAPP_MME, - NULL,0, - "0 MME_APP_INITIAL_CONTEXT_SETUP_RSP mme_ue_s1ap_id "S1AP_UE_ID_FMT" ebi %u s1u enb teid %u", - MME_APP_INITIAL_CONTEXT_SETUP_RSP(message_p).mme_ue_s1ap_id, - MME_APP_INITIAL_CONTEXT_SETUP_RSP(message_p).eps_bearer_id, - MME_APP_INITIAL_CONTEXT_SETUP_RSP(message_p).bearer_s1u_enb_fteid.teid); - - return itti_send_msg_to_task(TASK_MME_APP, INSTANCE_DEFAULT, message_p); -} - - -//------------------------------------------------------------------------------ -int s1ap_mme_handle_ue_context_release_request(uint32_t assoc_id, - uint32_t stream, struct s1ap_message_s *message) -//------------------------------------------------------------------------------ -{ - S1ap_UEContextReleaseRequestIEs_t *ueContextReleaseRequest_p = NULL; - ue_description_t *ue_ref = NULL; - MessageDef *message_p = NULL; - - ueContextReleaseRequest_p = &message->msg.s1ap_UEContextReleaseRequestIEs; - - MSC_LOG_RX_MESSAGE( - MSC_S1AP_MME, - MSC_S1AP_ENB, - NULL,0, - "0 UEContextReleaseRequest/%s eNB_ue_s1ap_id "S1AP_UE_ID_FMT" mme_ue_s1ap_id "S1AP_UE_ID_FMT" len %u", - s1ap_direction2String[message->direction], - ueContextReleaseRequest_p->eNB_UE_S1AP_ID, - ueContextReleaseRequest_p->mme_ue_s1ap_id); - - /* The UE context release procedure is initiated if the cause is != than user inactivity. - * TS36.413 #8.3.2.2. - */ - if (ueContextReleaseRequest_p->cause.present == S1ap_Cause_PR_radioNetwork) { - if (ueContextReleaseRequest_p->cause.choice.radioNetwork == - S1ap_CauseRadioNetwork_user_inactivity) { - S1AP_DEBUG("UE_CONTEXT_RELEASE_REQUEST ignored, cause user inactivity\n"); - MSC_LOG_EVENT( - MSC_S1AP_MME, - "0 UE_CONTEXT_RELEASE_REQUEST ignored, cause user inactivity", - ueContextReleaseRequest_p->mme_ue_s1ap_id); - return -1; - } - } - - if ((ue_ref = s1ap_is_ue_mme_id_in_list( - ueContextReleaseRequest_p->mme_ue_s1ap_id)) == NULL) { - /* MME doesn't know the MME UE S1AP ID provided. - * TODO - */ - S1AP_DEBUG("UE_CONTEXT_RELEASE_REQUEST ignored cause could not get context with mme_ue_s1ap_id "S1AP_UE_ID_FMT" %u(10)\n", - ueContextReleaseRequest_p->mme_ue_s1ap_id, - ueContextReleaseRequest_p->mme_ue_s1ap_id); - MSC_LOG_EVENT( - MSC_S1AP_MME, - "0 UE_CONTEXT_RELEASE_REQUEST ignored, no context mme_ue_s1ap_id "S1AP_UE_ID_FMT" ", - ueContextReleaseRequest_p->mme_ue_s1ap_id); - return -1; - } else { - if (ue_ref->eNB_ue_s1ap_id == (ueContextReleaseRequest_p->eNB_UE_S1AP_ID & - 0x00ffffff)) { - /* Both eNB UE S1AP ID and MME UE S1AP ID match. - * -> Send a UE context Release Command to eNB. - * TODO - */ - //s1ap_mme_generate_ue_context_release_command(ue_ref); - // UE context will be removed when receiving UE_CONTEXT_RELEASE_COMPLETE - - message_p = itti_alloc_new_message(TASK_S1AP, S1AP_UE_CONTEXT_RELEASE_REQ); - - AssertFatal(message_p != NULL,"itti_alloc_new_message Failed"); - memset((void*)&message_p->ittiMsg.s1ap_ue_context_release_req, - 0, - sizeof(s1ap_ue_context_release_req_t)); - - S1AP_UE_CONTEXT_RELEASE_REQ(message_p).mme_ue_s1ap_id = ue_ref->mme_ue_s1ap_id; - - MSC_LOG_TX_MESSAGE( - MSC_S1AP_MME, - MSC_MMEAPP_MME, - NULL,0, - "0 S1AP_UE_CONTEXT_RELEASE_REQ mme_ue_s1ap_id "S1AP_UE_ID_FMT" ", - S1AP_UE_CONTEXT_RELEASE_REQ(message_p).mme_ue_s1ap_id); - - return itti_send_msg_to_task(TASK_MME_APP, INSTANCE_DEFAULT, message_p); - - } else { - // TODO - S1AP_DEBUG("UE_CONTEXT_RELEASE_REQUEST ignored, cause mismatch eNB_ue_s1ap_id: ctxt "S1AP_UE_ID_FMT" != request "S1AP_UE_ID_FMT" ", - ue_ref->eNB_ue_s1ap_id, ueContextReleaseRequest_p->eNB_UE_S1AP_ID); - MSC_LOG_EVENT( - MSC_S1AP_MME, - "0 UE_CONTEXT_RELEASE_REQUEST ignored, cause mismatch eNB_ue_s1ap_id: ctxt "S1AP_UE_ID_FMT" != request "S1AP_UE_ID_FMT" ", - ue_ref->eNB_ue_s1ap_id, ueContextReleaseRequest_p->eNB_UE_S1AP_ID); - return -1; - } - } - - return 0; -} - -//------------------------------------------------------------------------------ -static int s1ap_mme_generate_ue_context_release_command( - ue_description_t *ue_ref) -//------------------------------------------------------------------------------ -{ - uint8_t *buffer; - uint32_t length; - - s1ap_message message; - S1ap_UEContextReleaseCommandIEs_t *ueContextReleaseCommandIEs_p; - - if (ue_ref == NULL) { - return -1; - } - - memset(&message, 0, sizeof(s1ap_message)); - - message.procedureCode = S1ap_ProcedureCode_id_UEContextRelease; - message.direction = S1AP_PDU_PR_initiatingMessage; - - ueContextReleaseCommandIEs_p = &message.msg.s1ap_UEContextReleaseCommandIEs; - - /* Fill in ID pair */ - ueContextReleaseCommandIEs_p->uE_S1AP_IDs.present = S1ap_UE_S1AP_IDs_PR_uE_S1AP_ID_pair; - ueContextReleaseCommandIEs_p->uE_S1AP_IDs.choice.uE_S1AP_ID_pair.mME_UE_S1AP_ID = - ue_ref->mme_ue_s1ap_id; - ueContextReleaseCommandIEs_p->uE_S1AP_IDs.choice.uE_S1AP_ID_pair.eNB_UE_S1AP_ID = - ue_ref->eNB_ue_s1ap_id; - ueContextReleaseCommandIEs_p->uE_S1AP_IDs.choice.uE_S1AP_ID_pair.iE_Extensions = - NULL; - - ueContextReleaseCommandIEs_p->cause.present = S1ap_Cause_PR_radioNetwork; - ueContextReleaseCommandIEs_p->cause.choice.radioNetwork = - S1ap_CauseRadioNetwork_release_due_to_eutran_generated_reason; - - if (s1ap_mme_encode_pdu(&message, &buffer, &length) < 0) { - MSC_LOG_EVENT( - MSC_S1AP_MME, - "0 UEContextRelease/initiatingMessage eNB_ue_s1ap_id "S1AP_UE_ID_FMT" mme_ue_s1ap_id "S1AP_UE_ID_FMT" encoding failed", - ue_ref->eNB_ue_s1ap_id, - ue_ref->mme_ue_s1ap_id); - return -1; - } - MSC_LOG_TX_MESSAGE( - MSC_S1AP_MME, - MSC_S1AP_ENB, - NULL,0, - "0 UEContextRelease/initiatingMessage eNB_ue_s1ap_id "S1AP_UE_ID_FMT" mme_ue_s1ap_id "S1AP_UE_ID_FMT"", - ue_ref->eNB_ue_s1ap_id,ue_ref->mme_ue_s1ap_id); - - return s1ap_mme_itti_send_sctp_request(buffer, length, ue_ref->eNB->sctp_assoc_id, - ue_ref->sctp_stream_send); -} - - -//------------------------------------------------------------------------------ -int s1ap_handle_ue_context_release_command( - const s1ap_ue_context_release_command_t * const ue_context_release_command_pP) -//------------------------------------------------------------------------------ -{ - ue_description_t *ue_ref_p = NULL; - - if ((ue_ref_p = s1ap_is_ue_mme_id_in_list( - ue_context_release_command_pP->mme_ue_s1ap_id)) == NULL) { - /* MME doesn't know the MME UE S1AP ID provided. - * TODO - */ - S1AP_DEBUG("UE_CONTEXT_RELEASE_COMMAND ignored cause could not get context with mme_ue_s1ap_id "S1AP_UE_ID_FMT" %u(10)\n", - ue_context_release_command_pP->mme_ue_s1ap_id, - ue_context_release_command_pP->mme_ue_s1ap_id); - MSC_LOG_EVENT( - MSC_S1AP_MME, - "0 UE_CONTEXT_RELEASE_COMMAND ignored, no context mme_ue_s1ap_id", - ue_context_release_command_pP->mme_ue_s1ap_id); - return -1; - } else { - return s1ap_mme_generate_ue_context_release_command(ue_ref_p); - } - return -1; -} - -//------------------------------------------------------------------------------ -int s1ap_mme_handle_ue_context_release_complete(uint32_t assoc_id, - uint32_t stream, struct s1ap_message_s *message) -//------------------------------------------------------------------------------ -{ - S1ap_UEContextReleaseCompleteIEs_t *ueContextReleaseComplete_p; - ue_description_t *ue_ref = NULL; - MessageDef *message_p = NULL; - - ueContextReleaseComplete_p = &message->msg.s1ap_UEContextReleaseCompleteIEs; - MSC_LOG_RX_MESSAGE( - MSC_S1AP_MME, - MSC_S1AP_ENB, - NULL,0, - "0 UEContextRelease/%s eNB_ue_s1ap_id "S1AP_UE_ID_FMT" mme_ue_s1ap_id "S1AP_UE_ID_FMT" len %u", - s1ap_direction2String[message->direction], - ueContextReleaseComplete_p->eNB_UE_S1AP_ID, - ueContextReleaseComplete_p->mme_ue_s1ap_id); - - if ((ue_ref = s1ap_is_ue_mme_id_in_list( - ueContextReleaseComplete_p->mme_ue_s1ap_id)) == NULL) { - /* MME doesn't know the MME UE S1AP ID provided. - * TODO - */ - MSC_LOG_EVENT( - MSC_S1AP_MME, - "0 UEContextReleaseComplete ignored, no context mme_ue_s1ap_id "S1AP_UE_ID_FMT" ", - ueContextReleaseComplete_p->mme_ue_s1ap_id); - return -1; - } - - /* eNB has sent a release complete message. We can safely remove UE context. - * TODO: inform NAS and remove e-RABS. - */ - message_p = itti_alloc_new_message(TASK_S1AP, S1AP_UE_CONTEXT_RELEASE_COMPLETE); - - AssertFatal(message_p != NULL,"itti_alloc_new_message Failed"); - memset((void*)&message_p->ittiMsg.s1ap_ue_context_release_complete, - 0, - sizeof(s1ap_ue_context_release_complete_t)); - - S1AP_UE_CONTEXT_RELEASE_COMPLETE(message_p).mme_ue_s1ap_id = ue_ref->mme_ue_s1ap_id; - - MSC_LOG_TX_MESSAGE( - MSC_S1AP_MME, - MSC_MMEAPP_MME, - NULL,0, - "0 S1AP_UE_CONTEXT_RELEASE_COMPLETE mme_ue_s1ap_id "S1AP_UE_ID_FMT" ", - S1AP_UE_CONTEXT_RELEASE_COMPLETE(message_p).mme_ue_s1ap_id); - - itti_send_msg_to_task(TASK_MME_APP, INSTANCE_DEFAULT, message_p); - - s1ap_remove_ue(ue_ref); - S1AP_DEBUG("Removed UE "S1AP_UE_ID_FMT"\n", - (uint32_t)ueContextReleaseComplete_p->mme_ue_s1ap_id); - return 0; -} - -//------------------------------------------------------------------------------ -int s1ap_mme_handle_initial_context_setup_failure(uint32_t assoc_id, - uint32_t stream, struct s1ap_message_s *message) -//------------------------------------------------------------------------------ -{ - S1ap_InitialContextSetupFailureIEs_t *initialContextSetupFailureIEs_p; - - ue_description_t *ue_ref = NULL; - - initialContextSetupFailureIEs_p = &message->msg.s1ap_InitialContextSetupFailureIEs; - MSC_LOG_RX_MESSAGE( - MSC_S1AP_MME, - MSC_S1AP_ENB, - NULL,0, - "0 InitialContextSetup/%s eNB_ue_s1ap_id "S1AP_UE_ID_FMT" mme_ue_s1ap_id "S1AP_UE_ID_FMT" len %u", - s1ap_direction2String[message->direction], - initialContextSetupFailureIEs_p->eNB_UE_S1AP_ID, - initialContextSetupFailureIEs_p->mme_ue_s1ap_id); - - if ((ue_ref = s1ap_is_ue_mme_id_in_list( - initialContextSetupFailureIEs_p->mme_ue_s1ap_id)) == NULL) { - /* MME doesn't know the MME UE S1AP ID provided. */ - MSC_LOG_EVENT( - MSC_S1AP_MME, - "0 InitialContextSetupFailure ignored, no context mme_ue_s1ap_id "S1AP_UE_ID_FMT" ", - initialContextSetupFailureIEs_p->mme_ue_s1ap_id); - return -1; - } - - if (ue_ref->eNB_ue_s1ap_id != (initialContextSetupFailureIEs_p->eNB_UE_S1AP_ID - & 0x00ffffff)) { - return -1; - } - - s1ap_remove_ue(ue_ref); - MSC_LOG_EVENT( - MSC_S1AP_MME, - "0 Removed UE mme_ue_s1ap_id "S1AP_UE_ID_FMT" ", - initialContextSetupFailureIEs_p->mme_ue_s1ap_id); - S1AP_DEBUG("Removed UE "S1AP_UE_ID_FMT"\n", - (uint32_t)initialContextSetupFailureIEs_p->mme_ue_s1ap_id); - return 0; -} - -//////////////////////////////////////////////////////////////////////////////// -//************************ Handover signalling *******************************// -//////////////////////////////////////////////////////////////////////////////// - -//------------------------------------------------------------------------------ -int s1ap_mme_handle_path_switch_request(uint32_t assoc_id, uint32_t stream, - struct s1ap_message_s *message) -//------------------------------------------------------------------------------ -{ - S1ap_PathSwitchRequestIEs_t *pathSwitchRequest_p; - ue_description_t *ue_ref; - uint32_t eNB_ue_s1ap_id; - - pathSwitchRequest_p = &message->msg.s1ap_PathSwitchRequestIEs; - - // eNB UE S1AP ID is limited to 24 bits - eNB_ue_s1ap_id = (uint32_t)(pathSwitchRequest_p->eNB_UE_S1AP_ID & 0x00ffffff); - - S1AP_DEBUG("Path Switch Request message received from eNB UE S1AP ID: "S1AP_UE_ID_FMT"\n", - (int)eNB_ue_s1ap_id); - - if ((ue_ref = s1ap_is_ue_mme_id_in_list( - pathSwitchRequest_p->sourceMME_UE_S1AP_ID)) == NULL) { - /* The MME UE S1AP ID provided by eNB doesn't point to any valid UE. - * MME replies with a PATH SWITCH REQUEST FAILURE message and start operation - * as described in TS 36.413 [11]. - * TODO - */ - } else { - if (ue_ref->eNB_ue_s1ap_id != eNB_ue_s1ap_id) { - /* Received unique UE eNB ID mismatch with the one known in MME. - * Handle this case as defined upper. - * TODO - */ - return -1; - } - - //TODO: Switch the eRABs provided - } - - return 0; -} - -//------------------------------------------------------------------------------ -int s1ap_handle_sctp_deconnection(uint32_t assoc_id) -//------------------------------------------------------------------------------ -{ - int current_ue_index = 0; - int handled_ues = 0; - int i; - - MessageDef *message_p = NULL; - - ue_description_t *ue_ref = NULL; - eNB_description_t *eNB_association; - - /* Checking that the assoc id has a valid eNB attached to. */ - eNB_association = s1ap_is_eNB_assoc_id_in_list(assoc_id); - - if (eNB_association == NULL) { - S1AP_ERROR("No eNB attached to this assoc_id: %d\n", - assoc_id); - return -1; - } - MSC_LOG_EVENT( - MSC_S1AP_MME, - "0 Event SCTP_CLOSE_ASSOCIATION assoc_id: %d", - assoc_id); - - STAILQ_FOREACH(ue_ref, &eNB_association->ue_list_head, ue_entries) { - /* Ask for a release of each UE context associated to the eNB */ - if (current_ue_index == 0) { - message_p = itti_alloc_new_message(TASK_S1AP, S1AP_ENB_DEREGISTERED_IND); - } - - S1AP_ENB_DEREGISTERED_IND(message_p).mme_ue_s1ap_id[current_ue_index] = ue_ref->mme_ue_s1ap_id; - - if (current_ue_index == 0 && handled_ues > 0) { - S1AP_ENB_DEREGISTERED_IND(message_p).nb_ue_to_deregister = S1AP_ITTI_UE_PER_DEREGISTER_MESSAGE; - itti_send_msg_to_task(TASK_NAS_MME, INSTANCE_DEFAULT, message_p); - } - - handled_ues++; - current_ue_index = handled_ues % S1AP_ITTI_UE_PER_DEREGISTER_MESSAGE; - } - - if ((handled_ues % S1AP_ITTI_UE_PER_DEREGISTER_MESSAGE) != 0) { - S1AP_ENB_DEREGISTERED_IND(message_p).nb_ue_to_deregister = current_ue_index; - - for (i = current_ue_index; i < S1AP_ITTI_UE_PER_DEREGISTER_MESSAGE; i++) { - S1AP_ENB_DEREGISTERED_IND(message_p).mme_ue_s1ap_id[current_ue_index] = 0; - } - - MSC_LOG_TX_MESSAGE( - MSC_S1AP_MME, - MSC_NAS_MME, - NULL,0, - "0 S1AP_ENB_DEREGISTERED_IND num ue to deregister %u", - S1AP_ENB_DEREGISTERED_IND(message_p).nb_ue_to_deregister); - - itti_send_msg_to_task(TASK_NAS_MME, INSTANCE_DEFAULT, message_p); - } - - s1ap_remove_eNB(eNB_association); - s1ap_dump_eNB_list(); - - S1AP_DEBUG("Removed eNB attached to assoc_id: %d\n", - assoc_id); - return 0; -} - -//------------------------------------------------------------------------------ -int s1ap_handle_new_association(sctp_new_peer_t *sctp_new_peer_p) -//------------------------------------------------------------------------------ -{ - eNB_description_t *eNB_association; - - DevAssert(sctp_new_peer_p != NULL); - - /* Checking that the assoc id has a valid eNB attached to. */ - if ((eNB_association = s1ap_is_eNB_assoc_id_in_list(sctp_new_peer_p->assoc_id)) == NULL) { - S1AP_DEBUG("Create eNB context for assoc_id: %d\n", - sctp_new_peer_p->assoc_id); - /* Create new context */ - eNB_association = s1ap_new_eNB(); - - if (eNB_association == NULL) { - /* We failed to allocate memory */ - /* TODO: send reject there */ - S1AP_ERROR("Failed to allocate eNB context for assoc_id: %d\n", - sctp_new_peer_p->assoc_id); - } - } else { - S1AP_DEBUG("eNB context already exists for assoc_id: %d, update it\n", - sctp_new_peer_p->assoc_id); - } - - eNB_association->sctp_assoc_id = sctp_new_peer_p->assoc_id; - - /* Fill in in and out number of streams available on SCTP connection. */ - eNB_association->instreams = sctp_new_peer_p->instreams; - eNB_association->outstreams = sctp_new_peer_p->outstreams; - - /* initialize the next sctp stream to 1 as 0 is reserved for non - * ue associated signalling. - */ - eNB_association->next_sctp_stream = 1; - MSC_LOG_EVENT( - MSC_S1AP_MME, - "0 Event SCTP_NEW_ASSOCIATION assoc_id: %d", - eNB_association->sctp_assoc_id); - - return 0; -} - -//////////////////////////////////////////////////////////////////////////////// -//************************* E-RAB management *********************************// -//////////////////////////////////////////////////////////////////////////////// - -// NOT CALLED -int s1ap_handle_create_session_response(SgwCreateSessionResponse - *session_response_p) -{ - /* We received create session response from S-GW on S11 interface abstraction. - * At least one bearer has been established. We can now send s1ap initial context setup request - * message to eNB. - */ - char supportedAlgorithms[] = { 0x02, 0xa0 }; - char securityKey[] = { 0xfd, 0x23, 0xad, 0x22, 0xd0, 0x21, 0x02, 0x90, 0x19, 0xed, - 0xcf, 0xc9, 0x78, 0x44, 0xba, 0xbb, 0x34, 0x6e, 0xff, 0x89, - 0x1c, 0x3a, 0x56, 0xf0, 0x81, 0x34, 0xdd, 0xee, 0x19, 0x55, - 0xf2, 0x1f - }; - - ue_description_t *ue_ref = NULL; - s1ap_message message; - uint8_t *buffer_p; - uint32_t length; - - S1ap_InitialContextSetupRequestIEs_t *initialContextSetupRequest_p; - S1ap_E_RABToBeSetupItemCtxtSUReq_t e_RABToBeSetup; - - AssertFatal(0, "Not called anymore"); - DevAssert(session_response_p != NULL); - - DevCheck(session_response_p->bearer_context_created.cause == REQUEST_ACCEPTED, - REQUEST_ACCEPTED, session_response_p->bearer_context_created.cause, 0); - - if ((session_response_p->bearer_context_created.s1u_sgw_fteid.ipv4 == 0) && - (session_response_p->bearer_context_created.s1u_sgw_fteid.ipv6 == 0)) { - - S1AP_ERROR("No IP address provided for transport layer address\n" - " -->Sending Intial context setup failure\n"); - return -1; - } - - if ((ue_ref = s1ap_is_teid_in_list(session_response_p->s11_sgw_teid.teid)) == NULL) { - S1AP_DEBUG("[%d] is not attached to any UE context\n", - session_response_p->s11_sgw_teid.teid); - return -1; - } - - memset(&message, 0, sizeof(s1ap_message)); - memset(&e_RABToBeSetup, 0, sizeof(S1ap_E_RABToBeSetupItemCtxtSUReq_t)); - - message.procedureCode = S1ap_ProcedureCode_id_InitialContextSetup; - message.direction = S1AP_PDU_PR_initiatingMessage; - - initialContextSetupRequest_p = &message.msg.s1ap_InitialContextSetupRequestIEs; - - initialContextSetupRequest_p->mme_ue_s1ap_id = ue_ref->mme_ue_s1ap_id; - initialContextSetupRequest_p->eNB_UE_S1AP_ID = ue_ref->eNB_ue_s1ap_id; - - /* uEaggregateMaximumBitrateDL and uEaggregateMaximumBitrateUL expressed in term of bits/sec */ - asn_int642INTEGER( - &initialContextSetupRequest_p->uEaggregateMaximumBitrate.uEaggregateMaximumBitRateDL, - 100000000UL); - asn_int642INTEGER( - &initialContextSetupRequest_p->uEaggregateMaximumBitrate.uEaggregateMaximumBitRateUL, - 50000000UL); - - //initialContextSetupRequest_p->uEaggregateMaximumBitrate.uEaggregateMaximumBitRateDL = 100000000UL; - //initialContextSetupRequest_p->uEaggregateMaximumBitrate.uEaggregateMaximumBitRateUL = 50000000UL; - - e_RABToBeSetup.e_RAB_ID = - session_response_p->bearer_context_created.eps_bearer_id; /* ??? */ - e_RABToBeSetup.e_RABlevelQoSParameters.qCI = 0; // ?? - e_RABToBeSetup.e_RABlevelQoSParameters.allocationRetentionPriority.priorityLevel - = 15; //No priority - e_RABToBeSetup.e_RABlevelQoSParameters.allocationRetentionPriority.pre_emptionCapability - = S1ap_Pre_emptionCapability_shall_not_trigger_pre_emption; - e_RABToBeSetup.e_RABlevelQoSParameters.allocationRetentionPriority.pre_emptionVulnerability - = S1ap_Pre_emptionVulnerability_not_pre_emptable; - - // e_RABToBeSetup.gTP_TEID.buf = calloc(4, sizeof(uint8_t)); - // INT32_TO_BUFFER(session_response_p->bearer_context_created.s1u_sgw_fteid.teid, - // e_RABToBeSetup.gTP_TEID.buf); - // e_RABToBeSetup.gTP_TEID.size = 4; - DevCheck(session_response_p->bearer_context_created.s1u_sgw_fteid.teid != 0, - session_response_p->bearer_context_created.s1u_sgw_fteid.teid, 0, 0); - INT32_TO_OCTET_STRING( - session_response_p->bearer_context_created.s1u_sgw_fteid.teid, - &e_RABToBeSetup.gTP_TEID); - - if ((session_response_p->bearer_context_created.s1u_sgw_fteid.ipv4 == 1) && - (session_response_p->bearer_context_created.s1u_sgw_fteid.ipv6 == 0)) { - /* Only IPv4 supported */ - INT32_TO_BIT_STRING( - session_response_p->bearer_context_created.s1u_sgw_fteid.ipv4_address, - &e_RABToBeSetup.transportLayerAddress); - } else if ((session_response_p->bearer_context_created.s1u_sgw_fteid.ipv4 == 0) && - (session_response_p->bearer_context_created.s1u_sgw_fteid.ipv6 == 1)) { - /* Only IPv6 supported */ - e_RABToBeSetup.transportLayerAddress.buf = calloc(16, sizeof(uint8_t)); - memcpy(e_RABToBeSetup.transportLayerAddress.buf, - (void *)&session_response_p->bearer_context_created.s1u_sgw_fteid.ipv6_address, - 16); - e_RABToBeSetup.transportLayerAddress.size = 16; - e_RABToBeSetup.transportLayerAddress.bits_unused = 0; - } else if ((session_response_p->bearer_context_created.s1u_sgw_fteid.ipv4 == 1) && - (session_response_p->bearer_context_created.s1u_sgw_fteid.ipv6 == 1)) { - /* Both IPv4 and IPv6 supported */ - e_RABToBeSetup.transportLayerAddress.buf = calloc(20, sizeof(uint8_t)); - e_RABToBeSetup.transportLayerAddress.size = 20; - e_RABToBeSetup.transportLayerAddress.bits_unused = 0; - memcpy(e_RABToBeSetup.transportLayerAddress.buf, - &session_response_p->bearer_context_created.s1u_sgw_fteid.ipv4_address, 4); - memcpy(e_RABToBeSetup.transportLayerAddress.buf + 4, - session_response_p->bearer_context_created.s1u_sgw_fteid.ipv6_address, 16); - } - - ASN_SEQUENCE_ADD(&initialContextSetupRequest_p->e_RABToBeSetupListCtxtSUReq, - &e_RABToBeSetup); - - initialContextSetupRequest_p->ueSecurityCapabilities.encryptionAlgorithms.buf = - (uint8_t *)supportedAlgorithms; - initialContextSetupRequest_p->ueSecurityCapabilities.encryptionAlgorithms.size = 2; - initialContextSetupRequest_p->ueSecurityCapabilities.encryptionAlgorithms.bits_unused - = 0; - - initialContextSetupRequest_p->ueSecurityCapabilities.integrityProtectionAlgorithms.buf - = (uint8_t *)supportedAlgorithms; - initialContextSetupRequest_p->ueSecurityCapabilities.integrityProtectionAlgorithms.size - = 2; - initialContextSetupRequest_p->ueSecurityCapabilities.integrityProtectionAlgorithms.bits_unused - = 0; - - initialContextSetupRequest_p->securityKey.buf = (uint8_t *) - securityKey; /* 256 bits length */ - initialContextSetupRequest_p->securityKey.size = 32; - initialContextSetupRequest_p->securityKey.bits_unused = 0; - - if (s1ap_mme_encode_pdu(&message, &buffer_p, &length) < 0) { - return -1; - } - - return s1ap_mme_itti_send_sctp_request(buffer_p, length, ue_ref->eNB->sctp_assoc_id, - ue_ref->sctp_stream_send); - - // return s1ap_mme_encode_initial_context_setup_request(&initialContextSetupRequest, - // ue_ref); -} diff --git a/openair-cn/S1AP/s1ap_mme_handlers.h b/openair-cn/S1AP/s1ap_mme_handlers.h deleted file mode 100644 index fc00d8c8af..0000000000 --- a/openair-cn/S1AP/s1ap_mme_handlers.h +++ /dev/null @@ -1,93 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -#include "s1ap_ies_defs.h" -#include "intertask_interface.h" - -#ifndef S1AP_MME_HANDLERS_H_ -#define S1AP_MME_HANDLERS_H_ - -/** \brief Handle decoded incoming messages from SCTP - * \param assoc_id SCTP association ID - * \param stream Stream number - * \param message_p The message decoded by the ASN1C decoder - * @returns int - **/ -int s1ap_mme_handle_message(uint32_t assoc_id, uint32_t stream, - struct s1ap_message_s *message_p); - -int s1ap_mme_handle_ue_cap_indication(uint32_t assoc_id, uint32_t stream, - struct s1ap_message_s *message); - -/** \brief Handle an S1 Setup request message. - * Typically add the eNB in the list of served eNB if not present, simply reset - * UEs association otherwise. S1SetupResponse message is sent in case of success or - * S1SetupFailure if the MME cannot accept the configuration received. - * \param assoc_id SCTP association ID - * \param stream Stream number - * \param message_p The message decoded by the ASN1C decoder - * @returns int - **/ -int s1ap_mme_handle_s1_setup_request(uint32_t assoc_id, uint32_t stream, - struct s1ap_message_s *message_p); - -int s1ap_mme_handle_path_switch_request(uint32_t assoc_id, uint32_t stream, - struct s1ap_message_s *message_p); - -int s1ap_mme_handle_ue_context_release_request(uint32_t assoc_id, - uint32_t stream, struct s1ap_message_s *message_p); - -int s1ap_handle_ue_context_release_command( - const s1ap_ue_context_release_command_t * const ue_context_release_command_pP); - -int s1ap_mme_handle_ue_context_release_complete(uint32_t assoc_id, - uint32_t stream, struct s1ap_message_s *message_p); - -int s1ap_mme_handle_initial_context_setup_failure(uint32_t assoc_id, - uint32_t stream, struct s1ap_message_s *message_p); - -int s1ap_mme_handle_initial_context_setup_response( - uint32_t assoc_id, - uint32_t stream, - struct s1ap_message_s *message_p); - -int s1ap_handle_sctp_deconnection(uint32_t assoc_id); - -int s1ap_handle_new_association(sctp_new_peer_t *sctp_new_peer_p); - -int s1ap_handle_create_session_response(SgwCreateSessionResponse - *session_response_p); - -int s1ap_mme_set_cause(S1ap_Cause_t *cause_p, S1ap_Cause_PR cause_type, long cause_value); - -int s1ap_mme_generate_s1_setup_failure( - uint32_t assoc_id, S1ap_Cause_PR cause_type, long cause_value, - long time_to_wait); - -#endif /* S1AP_MME_HANDLERS_H_ */ diff --git a/openair-cn/S1AP/s1ap_mme_itti_messaging.c b/openair-cn/S1AP/s1ap_mme_itti_messaging.c deleted file mode 100644 index 1c2a90be61..0000000000 --- a/openair-cn/S1AP/s1ap_mme_itti_messaging.c +++ /dev/null @@ -1,88 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -#include "s1ap_mme_itti_messaging.h" - -int s1ap_mme_itti_send_sctp_request(uint8_t *buffer, uint32_t length, - uint32_t assoc_id, uint16_t stream) -{ - MessageDef *message_p; - - message_p = itti_alloc_new_message(TASK_S1AP, SCTP_DATA_REQ); - - SCTP_DATA_REQ(message_p).buffer = buffer; - SCTP_DATA_REQ(message_p).bufLen = length; - SCTP_DATA_REQ(message_p).assocId = assoc_id; - SCTP_DATA_REQ(message_p).stream = stream; - - return itti_send_msg_to_task(TASK_SCTP, INSTANCE_DEFAULT, message_p); -} - -int s1ap_mme_itti_nas_uplink_ind(const uint32_t ue_id, uint8_t * const buffer, - const uint32_t length) -{ - MessageDef *message_p; - - message_p = itti_alloc_new_message(TASK_S1AP, NAS_UPLINK_DATA_IND); - - NAS_UL_DATA_IND(message_p).UEid = ue_id; - NAS_UL_DATA_IND(message_p).nasMsg.data = buffer; - NAS_UL_DATA_IND(message_p).nasMsg.length = length; - - MSC_LOG_TX_MESSAGE( - MSC_S1AP_MME, - MSC_NAS_MME, - NULL,0, - "0 NAS_UPLINK_DATA_IND ue_id "S1AP_UE_ID_FMT" len %u", - NAS_UL_DATA_IND(message_p).UEid, - NAS_UL_DATA_IND(message_p).nasMsg.length); - - return itti_send_msg_to_task(TASK_NAS_MME, INSTANCE_DEFAULT, message_p); -} - -int s1ap_mme_itti_nas_downlink_cnf(const uint32_t ue_id, - nas_error_code_t error_code) -{ - MessageDef *message_p; - - message_p = itti_alloc_new_message(TASK_S1AP, NAS_DOWNLINK_DATA_CNF); - - NAS_DL_DATA_CNF(message_p).UEid = ue_id; - NAS_DL_DATA_CNF(message_p).errCode = error_code; - - MSC_LOG_TX_MESSAGE( - MSC_S1AP_MME, - MSC_NAS_MME, - NULL,0, - "0 NAS_DOWNLINK_DATA_CNF ue_id "S1AP_UE_ID_FMT" errCode %u", - NAS_DL_DATA_CNF(message_p).UEid, - NAS_DL_DATA_CNF(message_p).errCode); - - return itti_send_msg_to_task(TASK_NAS_MME, INSTANCE_DEFAULT, message_p); -} diff --git a/openair-cn/S1AP/s1ap_mme_itti_messaging.h b/openair-cn/S1AP/s1ap_mme_itti_messaging.h deleted file mode 100644 index 28ad9863c6..0000000000 --- a/openair-cn/S1AP/s1ap_mme_itti_messaging.h +++ /dev/null @@ -1,151 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -#include <stdint.h> -#include <string.h> - -#include "intertask_interface.h" -#include "s1ap_common.h" -#include "msc.h" - -#ifndef S1AP_MME_ITTI_MESSAGING_H_ -#define S1AP_MME_ITTI_MESSAGING_H_ - -int s1ap_mme_itti_send_sctp_request(uint8_t *buffer, uint32_t length, - uint32_t assoc_id, uint16_t stream); - -int s1ap_mme_itti_nas_uplink_ind(const uint32_t ue_id, uint8_t *const buffer, - const uint32_t length); - -int s1ap_mme_itti_nas_downlink_cnf(const uint32_t ue_id, - nas_error_code_t error_code); - - -static inline void s1ap_mme_itti_mme_app_establish_ind( - const uint32_t ue_id, - const uint8_t * const nas_msg, - const uint32_t nas_msg_length, - const long cause, - const uint16_t tac) -{ - MessageDef *message_p = NULL; - - message_p = itti_alloc_new_message(TASK_S1AP, MME_APP_CONNECTION_ESTABLISHMENT_IND); - - MME_APP_CONNECTION_ESTABLISHMENT_IND(message_p).mme_ue_s1ap_id = ue_id; - - MME_APP_CONNECTION_ESTABLISHMENT_IND(message_p).nas.UEid = ue_id; - /* Mapping between asn1 definition and NAS definition */ - MME_APP_CONNECTION_ESTABLISHMENT_IND(message_p).nas.asCause = cause + 1; - MME_APP_CONNECTION_ESTABLISHMENT_IND(message_p).nas.tac = tac; - MME_APP_CONNECTION_ESTABLISHMENT_IND(message_p).nas.initialNasMsg.length = nas_msg_length; - - MME_APP_CONNECTION_ESTABLISHMENT_IND(message_p).nas.initialNasMsg.data = malloc(sizeof(uint8_t) * nas_msg_length); - memcpy(MME_APP_CONNECTION_ESTABLISHMENT_IND(message_p).nas.initialNasMsg.data, nas_msg, nas_msg_length); - - - MSC_LOG_TX_MESSAGE( - MSC_S1AP_MME, - MSC_MMEAPP_MME, - NULL,0, - "0 MME_APP_CONNECTION_ESTABLISHMENT_IND ue_id "S1AP_UE_ID_FMT" as cause %u tac %u len %u", - ue_id, - MME_APP_CONNECTION_ESTABLISHMENT_IND(message_p).nas.asCause, - MME_APP_CONNECTION_ESTABLISHMENT_IND(message_p).nas.tac, - MME_APP_CONNECTION_ESTABLISHMENT_IND(message_p).nas.initialNasMsg.length); - // should be sent to MME_APP, but this one would forward it to NAS_MME, so send it directly to NAS_MME - // but let's see - itti_send_msg_to_task(TASK_MME_APP, INSTANCE_DEFAULT, message_p); -} - - - -static inline void s1ap_mme_itti_nas_establish_ind( - const uint32_t ue_id, uint8_t * const nas_msg, const uint32_t nas_msg_length, - const long cause, const uint16_t tac) -{ - MessageDef *message_p; - - message_p = itti_alloc_new_message(TASK_S1AP, NAS_CONNECTION_ESTABLISHMENT_IND); - - NAS_CONN_EST_IND(message_p).nas.UEid = ue_id; - /* Mapping between asn1 definition and NAS definition */ - NAS_CONN_EST_IND(message_p).nas.asCause = cause + 1; - NAS_CONN_EST_IND(message_p).nas.tac = tac; - NAS_CONN_EST_IND(message_p).nas.initialNasMsg.length = nas_msg_length; - - NAS_CONN_EST_IND(message_p).nas.initialNasMsg.data = malloc(sizeof(uint8_t) * nas_msg_length); - memcpy(NAS_CONN_EST_IND(message_p).nas.initialNasMsg.data, nas_msg, nas_msg_length); - - - MSC_LOG_TX_MESSAGE( - MSC_S1AP_MME, - MSC_NAS_MME, - NULL,0, - "0 NAS_CONNECTION_ESTABLISHMENT_IND ue_id "S1AP_UE_ID_FMT" as cause %u tac %u len %u", - ue_id, - NAS_CONN_EST_IND(message_p).nas.asCause, - NAS_CONN_EST_IND(message_p).nas.tac, - NAS_CONN_EST_IND(message_p).nas.initialNasMsg.length); - - // should be sent to MME_APP, but this one would forward it to NAS_MME, so send it directly to NAS_MME - // but let's see - itti_send_msg_to_task(TASK_NAS_MME, INSTANCE_DEFAULT, message_p); -} - -static inline void s1ap_mme_itti_nas_non_delivery_ind( - const uint32_t ue_id, uint8_t * const nas_msg, const uint32_t nas_msg_length) -{ - MessageDef *message_p; - - message_p = itti_alloc_new_message(TASK_S1AP, NAS_DOWNLINK_DATA_REJ); - - NAS_DL_DATA_REJ(message_p).UEid = ue_id; - /* Mapping between asn1 definition and NAS definition */ - //NAS_NON_DELIVERY_IND(message_p).asCause = cause + 1; - NAS_DL_DATA_REJ(message_p).nasMsg.length = nas_msg_length; - - NAS_DL_DATA_REJ(message_p).nasMsg.data = malloc(sizeof(uint8_t) * nas_msg_length); - memcpy(NAS_DL_DATA_REJ(message_p).nasMsg.data, nas_msg, nas_msg_length); - - - MSC_LOG_TX_MESSAGE( - MSC_S1AP_MME, - MSC_NAS_MME, - NULL,0, - "0 NAS_DOWNLINK_DATA_REJ ue_id "S1AP_UE_ID_FMT" len %u", - ue_id, - NAS_DL_DATA_REJ(message_p).nasMsg.length); - - // should be sent to MME_APP, but this one would forward it to NAS_MME, so send it directly to NAS_MME - // but let's see - itti_send_msg_to_task(TASK_NAS_MME, INSTANCE_DEFAULT, message_p); -} - -#endif /* S1AP_MME_ITTI_MESSAGING_H_ */ diff --git a/openair-cn/S1AP/s1ap_mme_nas_procedures.c b/openair-cn/S1AP/s1ap_mme_nas_procedures.c deleted file mode 100644 index 4b8229e73b..0000000000 --- a/openair-cn/S1AP/s1ap_mme_nas_procedures.c +++ /dev/null @@ -1,765 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -#include <stdio.h> -#include <stdint.h> - - -#include "s1ap_common.h" -#include "s1ap_ies_defs.h" -#include "s1ap_mme_encoder.h" -#include "s1ap_mme_handlers.h" -#include "s1ap_mme_nas_procedures.h" -#include "s1ap_mme_retransmission.h" - -#include "s1ap_mme_itti_messaging.h" - -#include "s1ap_mme.h" - -#include "intertask_interface.h" -#include "timer.h" - -#include "assertions.h" -#include "conversions.h" -#include "msc.h" - -/* Every time a new UE is associated, increment this variable. - * But care if it wraps to increment also the mme_ue_s1ap_id_has_wrapped - * variable. Limit: UINT32_MAX (in stdint.h). - */ -static uint32_t mme_ue_s1ap_id = 0; -static uint8_t mme_ue_s1ap_id_has_wrapped = 0; - -extern const char *s1ap_direction2String[]; - - -int s1ap_mme_handle_initial_ue_message(uint32_t assoc_id, uint32_t stream, - struct s1ap_message_s *message) -{ - S1ap_InitialUEMessageIEs_t *initialUEMessage_p; - ue_description_t *ue_ref; - eNB_description_t *eNB_ref; - uint32_t eNB_ue_s1ap_id; - - initialUEMessage_p = &message->msg.s1ap_InitialUEMessageIEs; - - MSC_LOG_RX_MESSAGE( - MSC_S1AP_MME, - MSC_S1AP_ENB, - NULL,0, - "0 initialUEMessage/%s assoc_id %u stream %u "S1AP_UE_ID_FMT" ", - s1ap_direction2String[message->direction], - assoc_id, stream, initialUEMessage_p->eNB_UE_S1AP_ID); - - if ((eNB_ref = s1ap_is_eNB_assoc_id_in_list(assoc_id)) == NULL) { - S1AP_DEBUG("Unkwnon eNB on assoc_id %d\n", assoc_id); - return -1; - } - - // eNB UE S1AP ID is limited to 24 bits - eNB_ue_s1ap_id = (uint32_t)(initialUEMessage_p->eNB_UE_S1AP_ID & 0x00ffffff); - - S1AP_DEBUG("New Initial UE message received with eNB UE S1AP ID: "S1AP_UE_ID_FMT"\n", - eNB_ue_s1ap_id); - - ue_ref = s1ap_is_ue_eNB_id_in_list(eNB_ref, eNB_ue_s1ap_id); - - if (ue_ref == NULL) { - uint16_t tac = 0; - - /* This UE eNB Id has currently no known s1 association. - * Create new UE context by associating new mme_ue_s1ap_id. - * Update eNB UE list. - * Forward message to NAS. - */ - if ((ue_ref = s1ap_new_ue(assoc_id)) == NULL) - // If we failed to allocate a new UE return -1 - { - return -1; - } - - ue_ref->s1_ue_state = S1AP_UE_WAITING_CSR; - ue_ref->eNB_ue_s1ap_id = eNB_ue_s1ap_id; - ue_ref->mme_ue_s1ap_id = (uint32_t)ue_ref; - // On which stream we received the message - ue_ref->sctp_stream_recv = stream; - ue_ref->sctp_stream_send = ue_ref->eNB->next_sctp_stream; - - /* Increment the sctp stream for the eNB association. - * If the next sctp stream is >= outstream negociated between eNB and MME, - * wrap to first stream. - * TODO: search for the first available stream instead. - */ - if (ue_ref->eNB->next_sctp_stream++ >= ue_ref->eNB->outstreams) { - ue_ref->eNB->next_sctp_stream = 1; - } - - /* Increment the unique UE mme s1ap id and - * take care about overflow case. - */ - if (mme_ue_s1ap_id_has_wrapped == 0) { - mme_ue_s1ap_id++; - - if (mme_ue_s1ap_id == 0) { - mme_ue_s1ap_id_has_wrapped = 1; - } - } else { - /* TODO: should take the first available mme_ue_s1ap_id instead of - * the mme_ue_s1ap_id variable. - */ - DevMessage("mme ue s1ap id has wrapped -> case not handled\n"); - } - - s1ap_dump_eNB(ue_ref->eNB); - - OCTET_STRING_TO_TAC(&initialUEMessage_p->tai.tAC, tac); - - /* We received the first NAS transport message: initial UE message. - * Send a NAS ESTABLISH IND to NAS layer - */ -#if defined(ORIGINAL_CODE) - s1ap_mme_itti_nas_establish_ind( - ue_ref->mme_ue_s1ap_id, - initialUEMessage_p->nas_pdu.buf, - initialUEMessage_p->nas_pdu.size, - initialUEMessage_p->rrC_Establishment_Cause, - tac); -#else - s1ap_mme_itti_mme_app_establish_ind( - ue_ref->mme_ue_s1ap_id, - initialUEMessage_p->nas_pdu.buf, - initialUEMessage_p->nas_pdu.size, - initialUEMessage_p->rrC_Establishment_Cause, - tac); -#endif - } - - return 0; -} - - - -int s1ap_mme_handle_uplink_nas_transport(uint32_t assoc_id, uint32_t stream, - struct s1ap_message_s *message) -{ - S1ap_UplinkNASTransportIEs_t *uplinkNASTransport_p; - ue_description_t *ue_ref; - - uplinkNASTransport_p = &message->msg.s1ap_UplinkNASTransportIEs; - - MSC_LOG_RX_MESSAGE( - MSC_S1AP_MME, - MSC_S1AP_ENB, - NULL,0, - "0 uplinkNASTransport/%s mme_ue_s1ap_id "S1AP_UE_ID_FMT" eNB_ue_s1ap_id "S1AP_UE_ID_FMT" nas len %u", - s1ap_direction2String[message->direction], - uplinkNASTransport_p->mme_ue_s1ap_id, - uplinkNASTransport_p->eNB_UE_S1AP_ID, - uplinkNASTransport_p->nas_pdu.size); - - if ((ue_ref = s1ap_is_ue_mme_id_in_list(uplinkNASTransport_p->mme_ue_s1ap_id)) - == NULL) { - S1AP_DEBUG("No UE is attached to this mme UE s1ap id: "S1AP_UE_ID_FMT"\n", - (int)uplinkNASTransport_p->mme_ue_s1ap_id); - return -1; - } - - if (ue_ref->s1_ue_state != S1AP_UE_CONNECTED) { - S1AP_DEBUG("Received uplink NAS transport while UE in state != S1AP_UE_CONNECTED\n"); - return -1; - } - - //TODO: forward NAS PDU to NAS -#if defined(DISABLE_USE_NAS) - DevMessage("Can't go further (TODO)\n"); -#else - s1ap_mme_itti_nas_uplink_ind(uplinkNASTransport_p->mme_ue_s1ap_id, uplinkNASTransport_p->nas_pdu.buf, - uplinkNASTransport_p->nas_pdu.size); -#endif - return 0; -} - - - -int s1ap_mme_handle_nas_non_delivery(uint32_t assoc_id, uint32_t stream, - struct s1ap_message_s *message) -{ - S1ap_NASNonDeliveryIndication_IEs_t *nasNonDeliveryIndication_p = NULL; - ue_description_t *ue_ref = NULL; - - /* UE associated signalling on stream == 0 is not valid. */ - if (stream == 0) { - S1AP_DEBUG("Received new nas non delivery on stream == 0\n"); - return -1; - } - - nasNonDeliveryIndication_p = &message->msg.s1ap_NASNonDeliveryIndication_IEs; - - MSC_LOG_RX_MESSAGE( - MSC_S1AP_MME, - MSC_S1AP_ENB, - NULL,0, - "0 NASNonDeliveryIndication/%s mme_ue_s1ap_id "S1AP_UE_ID_FMT" eNB_ue_s1ap_id "S1AP_UE_ID_FMT" cause %u nas len %u", - s1ap_direction2String[message->direction], - nasNonDeliveryIndication_p->mme_ue_s1ap_id, - nasNonDeliveryIndication_p->eNB_UE_S1AP_ID, - nasNonDeliveryIndication_p->cause, - nasNonDeliveryIndication_p->nas_pdu.size); - - if ((ue_ref = s1ap_is_ue_mme_id_in_list(nasNonDeliveryIndication_p->mme_ue_s1ap_id)) - == NULL) { - S1AP_DEBUG("No UE is attached to this mme UE s1ap id: "S1AP_UE_ID_FMT"\n", - (int)nasNonDeliveryIndication_p->mme_ue_s1ap_id); - return -1; - } - - if (ue_ref->s1_ue_state != S1AP_UE_CONNECTED) { - S1AP_DEBUG("Received uplink NASNonDeliveryIndication while UE in state != S1AP_UE_CONNECTED\n"); - return -1; - } - - //TODO: forward NAS PDU to NAS - s1ap_mme_itti_nas_non_delivery_ind( - nasNonDeliveryIndication_p->mme_ue_s1ap_id, - nasNonDeliveryIndication_p->nas_pdu.buf, - nasNonDeliveryIndication_p->nas_pdu.size); - return 0; -} - -int s1ap_generate_downlink_nas_transport(const uint32_t ue_id, void * const data, - const uint32_t size) -{ - ue_description_t *ue_ref; - uint8_t *buffer_p; - uint32_t length; - - if ((ue_ref = s1ap_is_ue_mme_id_in_list(ue_id)) == NULL) { - /* If the UE-associated logical S1-connection is not established, - * the MME shall allocate a unique MME UE S1AP ID to be used for the UE. - */ - S1AP_DEBUG("Unknown UE MME ID "S1AP_UE_ID_FMT", This case is not handled right now\n", ue_id); - - return -1; - } else { - /* We have fount the UE in the list. - * Create new IE list message and encode it. - */ - S1ap_DownlinkNASTransportIEs_t *downlinkNasTransport = NULL; - - s1ap_message message; - - memset(&message, 0, sizeof(s1ap_message)); - - message.procedureCode = S1ap_ProcedureCode_id_downlinkNASTransport; - message.direction = S1AP_PDU_PR_initiatingMessage; - - ue_ref->s1_ue_state = S1AP_UE_CONNECTED; - - downlinkNasTransport = &message.msg.s1ap_DownlinkNASTransportIEs; - - /* Setting UE informations with the ones fount in ue_ref */ - downlinkNasTransport->mme_ue_s1ap_id = ue_ref->mme_ue_s1ap_id; - downlinkNasTransport->eNB_UE_S1AP_ID = ue_ref->eNB_ue_s1ap_id; - - /* Fill in the NAS pdu */ - OCTET_STRING_fromBuf(&downlinkNasTransport->nas_pdu, (char*)data, size); - - if (s1ap_mme_encode_pdu(&message, &buffer_p, &length) < 0) { - // TODO: handle something - return -1; - } - - S1AP_DEBUG("Send S1ap_ProcedureCode_id_downlinkNASTransport ue_id = "S1AP_UE_ID_FMT" mme_ue_s1ap_id = "S1AP_UE_ID_FMT" eNB_UE_S1AP_ID = "S1AP_UE_ID_FMT"\n", - ue_id, - downlinkNasTransport->mme_ue_s1ap_id, - downlinkNasTransport->eNB_UE_S1AP_ID); - - MSC_LOG_TX_MESSAGE( - MSC_S1AP_MME, - MSC_S1AP_ENB, - NULL,0, - "0 downlinkNASTransport/initiatingMessage ue_id "S1AP_UE_ID_FMT" mme_ue_s1ap_id "S1AP_UE_ID_FMT" eNB_ue_s1ap_id"S1AP_UE_ID_FMT" nas length %u", - ue_id, - downlinkNasTransport->mme_ue_s1ap_id, - downlinkNasTransport->eNB_UE_S1AP_ID, - size); - - s1ap_mme_itti_send_sctp_request(buffer_p, length, - ue_ref->eNB->sctp_assoc_id, - ue_ref->sctp_stream_send); - } - - return 0; -} - -#if defined(DISABLE_USE_NAS) -int s1ap_handle_attach_accepted(nas_attach_accept_t *attach_accept_p) -{ - /* We received create session response from S-GW on S11 interface abstraction. - * At least one bearer has been established. We can now send s1ap initial context setup request - * message to eNB. - */ - uint8_t supportedAlgorithms[] = { 0x00, 0x02 }; - uint8_t offset = 0; - uint8_t *buffer_p; - uint32_t length; - - ue_description_t *ue_ref = NULL; - s1ap_message message; - s1ap_initial_ctxt_setup_req_t *initial_p; - - S1ap_InitialContextSetupRequestIEs_t *initialContextSetupRequest_p; - S1ap_E_RABToBeSetupItemCtxtSUReq_t e_RABToBeSetup; - - DevAssert(attach_accept_p != NULL); - - initial_p = &attach_accept_p->transparent; - - if ((ue_ref = s1ap_is_ue_mme_id_in_list(initial_p->mme_ue_s1ap_id)) == NULL) { - S1AP_DEBUG("This mme ue s1ap id ("S1AP_UE_ID_FMT") is not attached to any UE context\n", - initial_p->mme_ue_s1ap_id); - return -1; - } - - /* Start the outcome response timer. - * When time is reached, MME consider that procedure outcome has failed. - */ - // timer_setup(mme_config.s1ap_config.outcome_drop_timer_sec, 0, TASK_S1AP, INSTANCE_DEFAULT, - // TIMER_ONE_SHOT, - // NULL, - // &ue_ref->outcome_response_timer_id); - /* Insert the timer in the MAP of mme_ue_s1ap_id <-> timer_id */ - // s1ap_timer_insert(ue_ref->mme_ue_s1ap_id, ue_ref->outcome_response_timer_id); - - memset(&message, 0, sizeof(s1ap_message)); - memset(&e_RABToBeSetup, 0, sizeof(S1ap_E_RABToBeSetupItemCtxtSUReq_t)); - - message.procedureCode = S1ap_ProcedureCode_id_InitialContextSetup; - message.direction = S1AP_PDU_PR_initiatingMessage; - - initialContextSetupRequest_p = &message.msg.s1ap_InitialContextSetupRequestIEs; - - initialContextSetupRequest_p->mme_ue_s1ap_id = (unsigned long)ue_ref->mme_ue_s1ap_id; - initialContextSetupRequest_p->eNB_UE_S1AP_ID = (unsigned long)ue_ref->eNB_ue_s1ap_id; - - /* uEaggregateMaximumBitrateDL and uEaggregateMaximumBitrateUL expressed in term of bits/sec */ - initialContextSetupRequest_p->uEaggregateMaximumBitrate.uEaggregateMaximumBitRateDL = initial_p->ambr.br_dl; - initialContextSetupRequest_p->uEaggregateMaximumBitrate.uEaggregateMaximumBitRateUL = initial_p->ambr.br_ul; - - e_RABToBeSetup.e_RAB_ID = initial_p->ebi; - e_RABToBeSetup.e_RABlevelQoSParameters.qCI = initial_p->qci; - e_RABToBeSetup.e_RABlevelQoSParameters.allocationRetentionPriority.priorityLevel - = initial_p->prio_level; //No priority - e_RABToBeSetup.e_RABlevelQoSParameters.allocationRetentionPriority.pre_emptionCapability - = initial_p->pre_emp_capability; - e_RABToBeSetup.e_RABlevelQoSParameters.allocationRetentionPriority.pre_emptionVulnerability - = initial_p->pre_emp_vulnerability; - - /* Set the GTP-TEID. This is the S1-U S-GW TEID */ - INT32_TO_OCTET_STRING(initial_p->teid, &e_RABToBeSetup.gTP_TEID); - - /* S-GW IP address(es) for user-plane */ - if ((initial_p->s_gw_address.pdn_type == IPv4) || - (initial_p->s_gw_address.pdn_type == IPv4_AND_v6)) { - e_RABToBeSetup.transportLayerAddress.buf = calloc(4, sizeof(uint8_t)); - /* Only IPv4 supported */ - memcpy(e_RABToBeSetup.transportLayerAddress.buf, - initial_p->s_gw_address.address.ipv4_address, - 4); - offset += 4; - e_RABToBeSetup.transportLayerAddress.size = 4; - e_RABToBeSetup.transportLayerAddress.bits_unused = 0; - } - - if ((initial_p->s_gw_address.pdn_type == IPv6) || - (initial_p->s_gw_address.pdn_type == IPv4_AND_v6)) { - if (offset == 0) { - /* Both IPv4 and IPv6 provided */ - /* TODO: check memory allocation */ - e_RABToBeSetup.transportLayerAddress.buf = calloc(16, sizeof(uint8_t)); - } else { - /* Only IPv6 supported */ - /* TODO: check memory allocation */ - e_RABToBeSetup.transportLayerAddress.buf - = realloc(e_RABToBeSetup.transportLayerAddress.buf, (16 + offset) * sizeof(uint8_t)); - } - - memcpy(&e_RABToBeSetup.transportLayerAddress.buf[offset], - initial_p->s_gw_address.address.ipv6_address, - 16); - e_RABToBeSetup.transportLayerAddress.size = 16 + offset; - e_RABToBeSetup.transportLayerAddress.bits_unused = 0; - } - - ASN_SEQUENCE_ADD(&initialContextSetupRequest_p->e_RABToBeSetupListCtxtSUReq, - &e_RABToBeSetup); - - initialContextSetupRequest_p->ueSecurityCapabilities.encryptionAlgorithms.buf = - (uint8_t *)supportedAlgorithms; - initialContextSetupRequest_p->ueSecurityCapabilities.encryptionAlgorithms.size = 2; - initialContextSetupRequest_p->ueSecurityCapabilities.encryptionAlgorithms.bits_unused - = 0; - - initialContextSetupRequest_p->ueSecurityCapabilities.integrityProtectionAlgorithms.buf - = (uint8_t *)supportedAlgorithms; - initialContextSetupRequest_p->ueSecurityCapabilities.integrityProtectionAlgorithms.size - = 2; - initialContextSetupRequest_p->ueSecurityCapabilities.integrityProtectionAlgorithms.bits_unused - = 0; - - initialContextSetupRequest_p->securityKey.buf = initial_p->keNB; /* 256 bits length */ - initialContextSetupRequest_p->securityKey.size = 32; - initialContextSetupRequest_p->securityKey.bits_unused = 0; - - if (s1ap_mme_encode_pdu(&message, &buffer_p, &length) < 0) { - // TODO: handle something - return -1; - } - - return s1ap_mme_itti_send_sctp_request(buffer_p, length, ue_ref->eNB->sctp_assoc_id, - ue_ref->sctp_stream_send); -} -#else -//void s1ap_handle_conn_est_cnf(nas_conn_est_cnf_t *nas_conn_est_cnf_p) -//{ -// /* We received create session response from S-GW on S11 interface abstraction. -// * At least one bearer has been established. We can now send s1ap initial context setup request -// * message to eNB. -// */ -// uint8_t supportedAlgorithms[] = { 0x00, 0x00 }; -// uint8_t offset = 0; -// uint8_t *buffer_p; -// uint32_t length, teid = 12; -// -// ue_description_t *ue_ref = NULL; -// s1ap_message message; -// -// S1ap_InitialContextSetupRequestIEs_t *initialContextSetupRequest_p; -// S1ap_E_RABToBeSetupItemCtxtSUReq_t e_RABToBeSetup; -// S1ap_NAS_PDU_t nas_pdu; -// -// DevAssert(nas_conn_est_cnf_p != NULL); -// -// if ((ue_ref = s1ap_is_ue_mme_id_in_list(nas_conn_est_cnf_p->UEid)) == NULL) { -// S1AP_DEBUG("This mme ue s1ap id (%08x) is not attached to any UE context\n", -// nas_conn_est_cnf_p->UEid); -// DevParam(nas_conn_est_cnf_p->UEid, 0, 0); -// } -// -// /* Start the outcome response timer. -// * When time is reached, MME consider that procedure outcome has failed. -// */ -//// timer_setup(mme_config.s1ap_config.outcome_drop_timer_sec, 0, TASK_S1AP, INSTANCE_DEFAULT, -//// TIMER_ONE_SHOT, -//// NULL, -//// &ue_ref->outcome_response_timer_id); -// /* Insert the timer in the MAP of mme_ue_s1ap_id <-> timer_id */ -//// s1ap_timer_insert(ue_ref->mme_ue_s1ap_id, ue_ref->outcome_response_timer_id); -// -// memset(&message, 0, sizeof(s1ap_message)); -// memset(&e_RABToBeSetup, 0, sizeof(S1ap_E_RABToBeSetupItemCtxtSUReq_t)); -// -// message.procedureCode = S1ap_ProcedureCode_id_InitialContextSetup; -// message.direction = S1AP_PDU_PR_initiatingMessage; -// -// initialContextSetupRequest_p = &message.msg.s1ap_InitialContextSetupRequestIEs; -// -// initialContextSetupRequest_p->mme_ue_s1ap_id = (unsigned long)ue_ref->mme_ue_s1ap_id; -// initialContextSetupRequest_p->eNB_UE_S1AP_ID = (unsigned long)ue_ref->eNB_ue_s1ap_id; -// -// /* uEaggregateMaximumBitrateDL and uEaggregateMaximumBitrateUL expressed in term of bits/sec */ -//// initialContextSetupRequest_p->uEaggregateMaximumBitrate.uEaggregateMaximumBitRateDL = initial_p->ambr.br_dl; -//// initialContextSetupRequest_p->uEaggregateMaximumBitrate.uEaggregateMaximumBitRateUL = initial_p->ambr.br_ul; -// -// initialContextSetupRequest_p->uEaggregateMaximumBitrate.uEaggregateMaximumBitRateDL = 1024 * 1024; -// initialContextSetupRequest_p->uEaggregateMaximumBitrate.uEaggregateMaximumBitRateDL = 512 * 1024; -// -//// e_RABToBeSetup.e_RAB_ID = initial_p->ebi; -// e_RABToBeSetup.e_RAB_ID = 5; -//// e_RABToBeSetup.e_RABlevelQoSParameters.qCI = initial_p->qci; -// e_RABToBeSetup.e_RABlevelQoSParameters.qCI = 0; -// -// memset(&nas_pdu, 0, sizeof(nas_pdu)); -// -// nas_pdu.size = nas_conn_est_cnf_p->nasMsg.length; -// nas_pdu.buf = nas_conn_est_cnf_p->nasMsg.data; -// -// e_RABToBeSetup.nAS_PDU = &nas_pdu; -// e_RABToBeSetup.e_RABlevelQoSParameters.allocationRetentionPriority.priorityLevel = -// S1ap_PriorityLevel_lowest; -// e_RABToBeSetup.e_RABlevelQoSParameters.allocationRetentionPriority.pre_emptionCapability = -// S1ap_Pre_emptionCapability_shall_not_trigger_pre_emption; -// e_RABToBeSetup.e_RABlevelQoSParameters.allocationRetentionPriority.pre_emptionVulnerability = -// S1ap_Pre_emptionVulnerability_not_pre_emptable; -// INT32_TO_OCTET_STRING(teid, &e_RABToBeSetup.gTP_TEID); -//// e_RABToBeSetup.e_RABlevelQoSParameters.allocationRetentionPriority.priorityLevel -//// = initial_p->prio_level; //No priority -//// e_RABToBeSetup.e_RABlevelQoSParameters.allocationRetentionPriority.pre_emptionCapability -//// = initial_p->pre_emp_capability; -//// e_RABToBeSetup.e_RABlevelQoSParameters.allocationRetentionPriority.pre_emptionVulnerability -//// = initial_p->pre_emp_vulnerability; -// -// /* Set the GTP-TEID. This is the S1-U S-GW TEID */ -//// INT32_TO_OCTET_STRING(initial_p->teid, &e_RABToBeSetup.gTP_TEID); -// -// /* S-GW IP address(es) for user-plane */ -//// if ((initial_p->s_gw_address.pdn_type == IPv4) || -//// (initial_p->s_gw_address.pdn_type == IPv4_AND_v6)) -//// { -//// e_RABToBeSetup.transportLayerAddress.buf = calloc(4, sizeof(uint8_t)); -//// /* Only IPv4 supported */ -//// memcpy(e_RABToBeSetup.transportLayerAddress.buf, -//// initial_p->s_gw_address.address.ipv4_address, -//// 4); -//// offset += 4; -//// e_RABToBeSetup.transportLayerAddress.size = 4; -//// e_RABToBeSetup.transportLayerAddress.bits_unused = 0; -//// } -//// if ((initial_p->s_gw_address.pdn_type == IPv6) || -//// (initial_p->s_gw_address.pdn_type == IPv4_AND_v6)) -//// { -//// if (offset == 0) { -//// /* Both IPv4 and IPv6 provided */ -//// /* TODO: check memory allocation */ -//// e_RABToBeSetup.transportLayerAddress.buf = calloc(16, sizeof(uint8_t)); -//// } else { -//// /* Only IPv6 supported */ -//// /* TODO: check memory allocation */ -//// e_RABToBeSetup.transportLayerAddress.buf -//// = realloc(e_RABToBeSetup.transportLayerAddress.buf, (16 + offset) * sizeof(uint8_t)); -//// } -//// memcpy(&e_RABToBeSetup.transportLayerAddress.buf[offset], -//// initial_p->s_gw_address.address.ipv6_address, -//// 16); -//// e_RABToBeSetup.transportLayerAddress.size = 16 + offset; -//// e_RABToBeSetup.transportLayerAddress.bits_unused = 0; -//// } -// -// ASN_SEQUENCE_ADD(&initialContextSetupRequest_p->e_RABToBeSetupListCtxtSUReq, -// &e_RABToBeSetup); -// -// initialContextSetupRequest_p->ueSecurityCapabilities.encryptionAlgorithms.buf = -// (uint8_t *)supportedAlgorithms; -// initialContextSetupRequest_p->ueSecurityCapabilities.encryptionAlgorithms.size = 2; -// initialContextSetupRequest_p->ueSecurityCapabilities.encryptionAlgorithms.bits_unused -// = 0; -// -// initialContextSetupRequest_p->ueSecurityCapabilities.integrityProtectionAlgorithms.buf -// = (uint8_t *)supportedAlgorithms; -// initialContextSetupRequest_p->ueSecurityCapabilities.integrityProtectionAlgorithms.size -// = 2; -// initialContextSetupRequest_p->ueSecurityCapabilities.integrityProtectionAlgorithms.bits_unused -// = 0; -// -//// initialContextSetupRequest_p->securityKey.buf = initial_p->keNB; /* 256 bits length */ -// uint8_t keNB[32]; -// memset(keNB, 0, sizeof(keNB)); -// -// initialContextSetupRequest_p->securityKey.buf = keNB; -// initialContextSetupRequest_p->securityKey.size = 32; -// initialContextSetupRequest_p->securityKey.bits_unused = 0; -// -// if (s1ap_mme_encode_pdu(&message, &buffer_p, &length) < 0) { -// // TODO: handle something -// DevMessage("Failed to encode initial context setup request message\n"); -// } -// -// free(nas_conn_est_cnf_p->nasMsg.data); -// -// s1ap_mme_itti_send_sctp_request(buffer_p, length, ue_ref->eNB->sctp_assoc_id, -// ue_ref->sctp_stream_send); -//} - -void s1ap_handle_conn_est_cnf(const mme_app_connection_establishment_cnf_t * const conn_est_cnf_pP) -{ - /* We received create session response from S-GW on S11 interface abstraction. - * At least one bearer has been established. We can now send s1ap initial context setup request - * message to eNB. - */ - uint8_t offset = 0; - uint8_t *buffer_p = NULL; - uint32_t length = 0; - ue_description_t *ue_ref = NULL; - S1ap_InitialContextSetupRequestIEs_t *initialContextSetupRequest_p = NULL; - S1ap_E_RABToBeSetupItemCtxtSUReq_t e_RABToBeSetup; - S1ap_NAS_PDU_t nas_pdu; - s1ap_message message; - - DevAssert(conn_est_cnf_pP != NULL); - - if ((ue_ref = s1ap_is_ue_mme_id_in_list(conn_est_cnf_pP->nas_conn_est_cnf.UEid)) == NULL) { - S1AP_DEBUG("This mme ue s1ap id ("S1AP_UE_ID_FMT") is not attached to any UE context\n", - conn_est_cnf_pP->nas_conn_est_cnf.UEid); - - DevParam(conn_est_cnf_pP->nas_conn_est_cnf.UEid, 0, 0); - } - - /* Start the outcome response timer. - * When time is reached, MME consider that procedure outcome has failed. - */ - // timer_setup(mme_config.s1ap_config.outcome_drop_timer_sec, 0, TASK_S1AP, INSTANCE_DEFAULT, - // TIMER_ONE_SHOT, - // NULL, - // &ue_ref->outcome_response_timer_id); - /* Insert the timer in the MAP of mme_ue_s1ap_id <-> timer_id */ - // s1ap_timer_insert(ue_ref->mme_ue_s1ap_id, ue_ref->outcome_response_timer_id); - - memset(&message, 0, sizeof(s1ap_message)); - memset(&e_RABToBeSetup, 0, sizeof(S1ap_E_RABToBeSetupItemCtxtSUReq_t)); - - message.procedureCode = S1ap_ProcedureCode_id_InitialContextSetup; - message.direction = S1AP_PDU_PR_initiatingMessage; - - initialContextSetupRequest_p = &message.msg.s1ap_InitialContextSetupRequestIEs; - - initialContextSetupRequest_p->mme_ue_s1ap_id = (unsigned long)ue_ref->mme_ue_s1ap_id; - initialContextSetupRequest_p->eNB_UE_S1AP_ID = (unsigned long)ue_ref->eNB_ue_s1ap_id; - - /* uEaggregateMaximumBitrateDL and uEaggregateMaximumBitrateUL expressed in term of bits/sec */ - asn_uint642INTEGER(&initialContextSetupRequest_p->uEaggregateMaximumBitrate.uEaggregateMaximumBitRateDL, conn_est_cnf_pP->ambr.br_dl); - asn_uint642INTEGER(&initialContextSetupRequest_p->uEaggregateMaximumBitrate.uEaggregateMaximumBitRateUL, conn_est_cnf_pP->ambr.br_ul); - - e_RABToBeSetup.e_RAB_ID = conn_est_cnf_pP->eps_bearer_id; //5; - e_RABToBeSetup.e_RABlevelQoSParameters.qCI = conn_est_cnf_pP->bearer_qos_qci; - - - memset(&nas_pdu, 0, sizeof(nas_pdu)); - nas_pdu.size = conn_est_cnf_pP->nas_conn_est_cnf.nasMsg.length; - nas_pdu.buf = conn_est_cnf_pP->nas_conn_est_cnf.nasMsg.data; - e_RABToBeSetup.nAS_PDU = &nas_pdu; - -#if defined(ORIGINAL_S1AP_CODE) - e_RABToBeSetup.e_RABlevelQoSParameters.allocationRetentionPriority.priorityLevel = - S1ap_PriorityLevel_lowest; - e_RABToBeSetup.e_RABlevelQoSParameters.allocationRetentionPriority.pre_emptionCapability = - S1ap_Pre_emptionCapability_shall_not_trigger_pre_emption; - e_RABToBeSetup.e_RABlevelQoSParameters.allocationRetentionPriority.pre_emptionVulnerability = - S1ap_Pre_emptionVulnerability_not_pre_emptable; -#else - e_RABToBeSetup.e_RABlevelQoSParameters.allocationRetentionPriority.priorityLevel = - conn_est_cnf_pP->bearer_qos_prio_level; - e_RABToBeSetup.e_RABlevelQoSParameters.allocationRetentionPriority.pre_emptionCapability = - conn_est_cnf_pP->bearer_qos_pre_emp_capability; - e_RABToBeSetup.e_RABlevelQoSParameters.allocationRetentionPriority.pre_emptionVulnerability = - conn_est_cnf_pP->bearer_qos_pre_emp_vulnerability; -#endif - /* Set the GTP-TEID. This is the S1-U S-GW TEID */ - INT32_TO_OCTET_STRING(conn_est_cnf_pP->bearer_s1u_sgw_fteid.teid, &e_RABToBeSetup.gTP_TEID); - - /* S-GW IP address(es) for user-plane */ - if (conn_est_cnf_pP->bearer_s1u_sgw_fteid.ipv4) { - e_RABToBeSetup.transportLayerAddress.buf = calloc(4, sizeof(uint8_t)); - /* Only IPv4 supported */ - memcpy(e_RABToBeSetup.transportLayerAddress.buf, - &conn_est_cnf_pP->bearer_s1u_sgw_fteid.ipv4_address, - 4); - offset += 4; - e_RABToBeSetup.transportLayerAddress.size = 4; - e_RABToBeSetup.transportLayerAddress.bits_unused = 0; - } - - if (conn_est_cnf_pP->bearer_s1u_sgw_fteid.ipv6) { - if (offset == 0) { - /* Both IPv4 and IPv6 provided */ - /* TODO: check memory allocation */ - e_RABToBeSetup.transportLayerAddress.buf = calloc(16, sizeof(uint8_t)); - } else { - /* Only IPv6 supported */ - /* TODO: check memory allocation */ - e_RABToBeSetup.transportLayerAddress.buf - = realloc(e_RABToBeSetup.transportLayerAddress.buf, (16 + offset) * sizeof(uint8_t)); - } - - memcpy(&e_RABToBeSetup.transportLayerAddress.buf[offset], - conn_est_cnf_pP->bearer_s1u_sgw_fteid.ipv6_address, - 16); - e_RABToBeSetup.transportLayerAddress.size = 16 + offset; - e_RABToBeSetup.transportLayerAddress.bits_unused = 0; - } - - ASN_SEQUENCE_ADD(&initialContextSetupRequest_p->e_RABToBeSetupListCtxtSUReq, - &e_RABToBeSetup); - - initialContextSetupRequest_p->ueSecurityCapabilities.encryptionAlgorithms.buf = - (uint8_t *)&conn_est_cnf_pP->security_capabilities_encryption_algorithms; - initialContextSetupRequest_p->ueSecurityCapabilities.encryptionAlgorithms.size = 2; - initialContextSetupRequest_p->ueSecurityCapabilities.encryptionAlgorithms.bits_unused - = 0; - - initialContextSetupRequest_p->ueSecurityCapabilities.integrityProtectionAlgorithms.buf = - (uint8_t *)&conn_est_cnf_pP->security_capabilities_integrity_algorithms; - initialContextSetupRequest_p->ueSecurityCapabilities.integrityProtectionAlgorithms.size - = 2; - initialContextSetupRequest_p->ueSecurityCapabilities.integrityProtectionAlgorithms.bits_unused - = 0; - - S1AP_DEBUG("security_capabilities_encryption_algorithms 0x%04X\n", - conn_est_cnf_pP->security_capabilities_encryption_algorithms); - S1AP_DEBUG("security_capabilities_integrity_algorithms 0x%04X\n", - conn_est_cnf_pP->security_capabilities_integrity_algorithms); - - if (conn_est_cnf_pP->keNB) { - initialContextSetupRequest_p->securityKey.buf = malloc(32); - memcpy(initialContextSetupRequest_p->securityKey.buf, - conn_est_cnf_pP->keNB, - 32); - - initialContextSetupRequest_p->securityKey.size = 32; - } else { - S1AP_DEBUG("No keNB\n"); - initialContextSetupRequest_p->securityKey.buf = NULL; - initialContextSetupRequest_p->securityKey.size = 0; - } - - initialContextSetupRequest_p->securityKey.bits_unused = 0; - - if (s1ap_mme_encode_pdu(&message, &buffer_p, &length) < 0) { - // TODO: handle something - DevMessage("Failed to encode initial context setup request message\n"); - } - - free(conn_est_cnf_pP->nas_conn_est_cnf.nasMsg.data); - - MSC_LOG_TX_MESSAGE( - MSC_S1AP_MME, - MSC_S1AP_ENB, - NULL,0, - "0 InitialContextSetup/initiatingMessage mme_ue_s1ap_id "S1AP_UE_ID_FMT" eNB_ue_s1ap_id "S1AP_UE_ID_FMT" nas length %u", - initialContextSetupRequest_p->mme_ue_s1ap_id, - initialContextSetupRequest_p->eNB_UE_S1AP_ID, - nas_pdu.size); - - s1ap_mme_itti_send_sctp_request( - buffer_p, - length, - ue_ref->eNB->sctp_assoc_id, - ue_ref->sctp_stream_send); -} - -#endif diff --git a/openair-cn/S1AP/s1ap_mme_nas_procedures.h b/openair-cn/S1AP/s1ap_mme_nas_procedures.h deleted file mode 100644 index 51d45f1fb2..0000000000 --- a/openair-cn/S1AP/s1ap_mme_nas_procedures.h +++ /dev/null @@ -1,74 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -#include <stdint.h> - -#include "s1ap_ies_defs.h" -#include "intertask_interface.h" - -#ifndef S1AP_MME_NAS_PROCEDURES_H_ -#define S1AP_MME_NAS_PROCEDURES_H_ - -/** \brief Handle an Initial UE message. - * \param assocId lower layer assoc id (SCTP) - * \param stream SCTP stream on which data had been received - * \param message The message as decoded by the ASN.1 codec - * @returns -1 on failure, 0 otherwise - **/ -int s1ap_mme_handle_initial_ue_message(uint32_t assocId, uint32_t stream, - struct s1ap_message_s *message); - -/** \brief Handle an Uplink NAS transport message. - * Process the RRC transparent container and forward it to NAS entity. - * \param assocId lower layer assoc id (SCTP) - * \param stream SCTP stream on which data had been received - * \param message The message as decoded by the ASN.1 codec - * @returns -1 on failure, 0 otherwise - **/ -int s1ap_mme_handle_uplink_nas_transport(uint32_t assocId, uint32_t stream, - struct s1ap_message_s *message); - -/** \brief Handle a NAS non delivery indication message from eNB - * \param assocId lower layer assoc id (SCTP) - * \param stream SCTP stream on which data had been received - * \param message The message as decoded by the ASN.1 codec - * @returns -1 on failure, 0 otherwise - **/ -int s1ap_mme_handle_nas_non_delivery(uint32_t assocId, uint32_t stream, - struct s1ap_message_s *message); - -#if defined(DISABLE_USE_NAS) -int s1ap_handle_attach_accepted(nas_attach_accept_t *attach_accept_p); -#else -void s1ap_handle_conn_est_cnf(const mme_app_connection_establishment_cnf_t * const conn_est_cnf_p); -#endif - -int s1ap_generate_downlink_nas_transport(const uint32_t ue_id, void * const data, - const uint32_t size); -#endif /* S1AP_MME_NAS_PROCEDURES_H_ */ diff --git a/openair-cn/S1AP/s1ap_mme_retransmission.c b/openair-cn/S1AP/s1ap_mme_retransmission.c deleted file mode 100644 index 0ce368ffa8..0000000000 --- a/openair-cn/S1AP/s1ap_mme_retransmission.c +++ /dev/null @@ -1,150 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -#include <stdlib.h> -#include <stdio.h> -#include <stdint.h> - -#include "tree.h" -#include "assertions.h" - -#include "intertask_interface.h" - -#include "timer.h" -#include "s1ap_common.h" -#include "s1ap_mme_retransmission.h" - -inline int s1ap_mme_timer_map_compare_id( - struct s1ap_timer_map_s *p1, struct s1ap_timer_map_s *p2); - -/* Reference to tree root element */ -RB_HEAD(s1ap_timer_map, s1ap_timer_map_s) s1ap_timer_tree = RB_INITIALIZER(); - -/* RB tree functions for s1ap timer map are not exposed to the rest of the code - * only declare prototypes here. - */ -RB_PROTOTYPE(s1ap_timer_map, s1ap_timer_map_s, entries, - s1ap_mme_timer_map_compare_id); - -RB_GENERATE(s1ap_timer_map, s1ap_timer_map_s, entries, - s1ap_mme_timer_map_compare_id); - -int s1ap_mme_timer_map_compare_id( - struct s1ap_timer_map_s *p1, struct s1ap_timer_map_s *p2) -{ - if (p1->mme_ue_s1ap_id > 0) { - if (p1->mme_ue_s1ap_id > p2->mme_ue_s1ap_id) { - return 1; - } - - if (p1->mme_ue_s1ap_id < p2->mme_ue_s1ap_id) { - return -1; - } - - return 0; - } - - if (p1->timer_id > p2->timer_id) { - return 1; - } - - if (p1->timer_id < p2->timer_id) { - return -1; - } - - /* Match -> return 0 */ - return 0; -} - -int s1ap_timer_insert(uint32_t mme_ue_s1ap_id, long timer_id) -{ - struct s1ap_timer_map_s *new; - - new = malloc(sizeof(struct s1ap_timer_map_s)); - - new->timer_id = timer_id; - new->mme_ue_s1ap_id = mme_ue_s1ap_id; - - if (RB_INSERT(s1ap_timer_map, &s1ap_timer_tree, new) != NULL) { - S1AP_ERROR("Timer with id 0x%lx already exists\n", timer_id); - free(new); - return -1; - } - - return 0; -} - -int s1ap_handle_timer_expiry(timer_has_expired_t *timer_has_expired) -{ - struct s1ap_timer_map_s *find; - struct s1ap_timer_map_s elm; - - DevAssert(timer_has_expired != NULL); - - memset(&elm, 0, sizeof(elm)); - - elm.timer_id = timer_has_expired->timer_id; - - if ((find = RB_FIND(s1ap_timer_map, &s1ap_timer_tree, &elm)) == NULL) { - S1AP_WARN("Timer id 0x%lx has not been found in tree. Maybe the timer " - "reference has been removed before receiving timer signal\n", - timer_has_expired->timer_id); - return 0; - } - - /* Remove the timer from the map */ - RB_REMOVE(s1ap_timer_map, &s1ap_timer_tree, find); - - /* Destroy the element */ - free(find); - - /* TODO: notify NAS and remove ue context */ - return 0; -} - -int s1ap_timer_remove_ue(uint32_t mme_ue_s1ap_id) -{ - struct s1ap_timer_map_s *find; - - S1AP_DEBUG("Removing timer associated with UE "S1AP_UE_ID_FMT"\n", - mme_ue_s1ap_id); - - DevAssert(mme_ue_s1ap_id != 0); - - RB_FOREACH(find, s1ap_timer_map, &s1ap_timer_tree) { - if (find->mme_ue_s1ap_id == mme_ue_s1ap_id) { - timer_remove(find->timer_id); - /* Remove the timer from the map */ - RB_REMOVE(s1ap_timer_map, &s1ap_timer_tree, find); - /* Destroy the element */ - free(find); - } - } - return 0; -} diff --git a/openair-cn/S1AP/s1ap_mme_retransmission.h b/openair-cn/S1AP/s1ap_mme_retransmission.h deleted file mode 100644 index f13a0c597c..0000000000 --- a/openair-cn/S1AP/s1ap_mme_retransmission.h +++ /dev/null @@ -1,51 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -#include "tree.h" - -#ifndef S1AP_MME_RETRANSMISSION_H_ -#define S1AP_MME_RETRANSMISSION_H_ - -typedef struct s1ap_timer_map_s { - long timer_id; - uint32_t mme_ue_s1ap_id; - - RB_ENTRY(s1ap_timer_map_s) entries; -} s1ap_timer_map_t; - -int s1ap_mme_timer_map_compare_id( - struct s1ap_timer_map_s *p1, struct s1ap_timer_map_s *p2); - -int s1ap_handle_timer_expiry(timer_has_expired_t *timer_has_expired); - -int s1ap_timer_insert(uint32_t mme_ue_s1ap_id, long timer_id); - -int s1ap_timer_remove_ue(uint32_t mme_ue_s1ap_id); - -#endif /* S1AP_MME_RETRANSMISSION_H_ */ diff --git a/openair-cn/S1AP/s1ap_mme_ta.c b/openair-cn/S1AP/s1ap_mme_ta.c deleted file mode 100644 index 706f22a722..0000000000 --- a/openair-cn/S1AP/s1ap_mme_ta.c +++ /dev/null @@ -1,160 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -#include <stdio.h> -#include <stdlib.h> -#include <stdint.h> - -#include "assertions.h" -#include "conversions.h" - -#include "mme_config.h" - -#include "s1ap_mme.h" -#include "s1ap_common.h" -#include "s1ap_mme_ta.h" - -static -int s1ap_mme_compare_plmn(S1ap_PLMNidentity_t *plmn) -{ - int i; - uint16_t mcc; - uint16_t mnc; - uint16_t mnc_len; - - DevAssert(plmn != NULL); - - TBCD_TO_MCC_MNC(plmn, mcc, mnc, mnc_len); - - config_read_lock(&mme_config); - - for (i = 0; i < mme_config.gummei.nb_mme_gid; i++) { - S1AP_DEBUG("Comparing plmn_mcc %d/%d, plmn_mnc %d/%d plmn_mnc_len %d/%d\n", - mme_config.gummei.plmn_mcc[i], mcc, - mme_config.gummei.plmn_mnc[i],mnc, - mme_config.gummei.plmn_mnc_len[i],mnc_len); - - if ((mme_config.gummei.plmn_mcc[i] == mcc) && - (mme_config.gummei.plmn_mnc[i] == mnc) && - (mme_config.gummei.plmn_mnc_len[i] == mnc_len)) - /* There is a matching plmn */ - return TA_LIST_AT_LEAST_ONE_MATCH; - } - - config_unlock(&mme_config); - - return TA_LIST_NO_MATCH; -} - -/* @brief compare a list of broadcasted plmns against the MME configured. - */ -static -int s1ap_mme_compare_plmns(S1ap_BPLMNs_t *b_plmns) -{ - int i; - int matching_occurence = 0; - - DevAssert(b_plmns != NULL); - - for (i = 0; i < b_plmns->list.count; i++) { - if (s1ap_mme_compare_plmn(b_plmns->list.array[i]) - == TA_LIST_AT_LEAST_ONE_MATCH) - matching_occurence++; - } - - if (matching_occurence == 0) - return TA_LIST_NO_MATCH; - else if (matching_occurence == b_plmns->list.count - 1) - return TA_LIST_COMPLETE_MATCH; - else - return TA_LIST_AT_LEAST_ONE_MATCH; -} - -/* @brief compare a TAC - */ -static -int s1ap_mme_compare_tac(S1ap_TAC_t *tac) -{ - int i; - uint16_t tac_value; - - DevAssert(tac != NULL); - - OCTET_STRING_TO_TAC(tac, tac_value); - - config_read_lock(&mme_config); - - for (i = 0; i < mme_config.gummei.nb_plmns; i++) { - S1AP_DEBUG("Comparing config tac %d, received tac = %d\n", mme_config.gummei.plmn_tac[i], tac_value); - - if (mme_config.gummei.plmn_tac[i] == tac_value) - return TA_LIST_AT_LEAST_ONE_MATCH; - } - - config_unlock(&mme_config); - - return TA_LIST_NO_MATCH; -} - -/* @brief compare a given ta list against the one provided by mme configuration. - * @param ta_list - * @return - TA_LIST_UNKNOWN_PLMN if at least one TAC match and no PLMN match - * - TA_LIST_UNKNOWN_TAC if at least one PLMN match and no TAC match - * - TA_LIST_RET_OK if both tac and plmn match at least one element - */ -int s1ap_mme_compare_ta_lists(S1ap_SupportedTAs_t *ta_list) -{ - int i; - int tac_ret, bplmn_ret; - - DevAssert(ta_list != NULL); - - /* Parse every item in the list and try to find matching parameters */ - for (i = 0; i < ta_list->list.count; i++) { - S1ap_SupportedTAs_Item_t *ta; - - ta = ta_list->list.array[i]; - DevAssert(ta != NULL); - - tac_ret = s1ap_mme_compare_tac(&ta->tAC); - bplmn_ret = s1ap_mme_compare_plmns(&ta->broadcastPLMNs); - - if (tac_ret == TA_LIST_NO_MATCH && bplmn_ret == TA_LIST_NO_MATCH) { - return TA_LIST_UNKNOWN_PLMN + TA_LIST_UNKNOWN_TAC; - } else { - if (tac_ret > TA_LIST_NO_MATCH && bplmn_ret == TA_LIST_NO_MATCH) { - return TA_LIST_UNKNOWN_PLMN; - } else if (tac_ret == TA_LIST_NO_MATCH && bplmn_ret > TA_LIST_NO_MATCH) { - return TA_LIST_UNKNOWN_TAC; - } - } - } - - return TA_LIST_RET_OK; -} diff --git a/openair-cn/S1AP/s1ap_mme_ta.h b/openair-cn/S1AP/s1ap_mme_ta.h deleted file mode 100644 index 32a6a9cd15..0000000000 --- a/openair-cn/S1AP/s1ap_mme_ta.h +++ /dev/null @@ -1,44 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -#ifndef S1AP_MME_TA_H_ -#define S1AP_MME_TA_H_ - -enum { - TA_LIST_UNKNOWN_TAC = -2, - TA_LIST_UNKNOWN_PLMN = -1, - TA_LIST_RET_OK = 0, - TA_LIST_NO_MATCH = 0x1, - TA_LIST_AT_LEAST_ONE_MATCH = 0x2, - TA_LIST_COMPLETE_MATCH = 0x3, -}; - -int s1ap_mme_compare_ta_lists(S1ap_SupportedTAs_t *ta_list); - -#endif /* S1AP_MME_TA_H_ */ diff --git a/openair-cn/S6A/COPYING b/openair-cn/S6A/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair-cn/S6A/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program 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. - - This program 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 this program. If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - <program> Copyright (C) <year> <name of author> - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<http://www.gnu.org/licenses/>. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<http://www.gnu.org/philosophy/why-not-lgpl.html>. diff --git a/openair-cn/S6A/Makefile.am b/openair-cn/S6A/Makefile.am deleted file mode 100644 index 4f781887c9..0000000000 --- a/openair-cn/S6A/Makefile.am +++ /dev/null @@ -1,52 +0,0 @@ -################################################################################ -# 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@eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ -AM_CFLAGS = \ - @ADD_CFLAGS@ \ - -I$(top_srcdir)/COMMON \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/api/network \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/include \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/ies \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/emm/msg \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/esm/msg \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/util \ - -I$(top_srcdir)/INTERTASK_INTERFACE \ - -I$(top_srcdir)/UTILS - -noinst_LTLIBRARIES = libs6a.la -libs6a_la_LDFLAGS = -all-static - -libs6a_la_SOURCES = \ - s6a_defs.h s6a_messages.h \ - s6a_auth_info.c \ - s6a_dict.c \ - s6a_error.c \ - s6a_peer.c \ - s6a_subscription_data.c \ - s6a_task.c \ - s6a_up_loc.c diff --git a/openair-cn/S6A/freediameter/README.txt b/openair-cn/S6A/freediameter/README.txt deleted file mode 100644 index a1c80e1cab..0000000000 --- a/openair-cn/S6A/freediameter/README.txt +++ /dev/null @@ -1,15 +0,0 @@ -Pre-requisities: -Cmake libgnutls-3.1.0 - -The best way to install freeDiameter is to use to script provided in this folder. - -download tarball here: http://www.freediameter.net/hg/freeDiameter/archive/1.1.5.tar.gz -extract it somewhere. -cd freeDiameter-1.1.5 -patch -p1 < freediameter-1.1.5.patch -mkdir build && cd build -cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr ../ -sudo make install - -if you choose to install libraries in default path (/usr/local/lib), you will have - to tell configure to use LDFLAGS='-L/usr/local/lib' \ No newline at end of file diff --git a/openair-cn/S6A/freediameter/freediameter-1.1.5.patch b/openair-cn/S6A/freediameter/freediameter-1.1.5.patch deleted file mode 100644 index 3b03890675..0000000000 --- a/openair-cn/S6A/freediameter/freediameter-1.1.5.patch +++ /dev/null @@ -1,4296 +0,0 @@ -diff -NaurB -x '*~' -x build freeDiameter-1.1.5-unmodified/extensions/CMakeLists.txt freeDiameter-1.1.5/extensions/CMakeLists.txt ---- freeDiameter-1.1.5-unmodified/extensions/CMakeLists.txt 2012-11-03 18:45:41.000000000 +0100 -+++ freeDiameter-1.1.5/extensions/CMakeLists.txt 2013-02-14 14:40:40.605217128 +0100 -@@ -35,7 +35,7 @@ - - #### - # Diameter applications dictionaries -- -+FD_EXTENSION_SUBDIR(dict_s6a "3GPP S6A TS.29.279-990" ON) - FD_EXTENSION_SUBDIR(dict_nasreq "NASREQ (RFC4005) Dictionary definitions" ON) - FD_EXTENSION_SUBDIR(dict_eap "Diameter EAP (RFC4072) Dictionary definitions" ON) - -diff -NaurB -x '*~' -x build freeDiameter-1.1.5-unmodified/extensions/dict_s6a/CMakeLists.txt freeDiameter-1.1.5/extensions/dict_s6a/CMakeLists.txt ---- freeDiameter-1.1.5-unmodified/extensions/dict_s6a/CMakeLists.txt 1970-01-01 01:00:00.000000000 +0100 -+++ freeDiameter-1.1.5/extensions/dict_s6a/CMakeLists.txt 2012-11-22 17:14:40.177272498 +0100 -@@ -0,0 +1,13 @@ -+# The dict_rfc5777 extension -+PROJECT("S6a protocol based on 3GPP 29.272-990" C) -+ -+# Compile as a module -+FD_ADD_EXTENSION(dict_s6a dict_s6a.c) -+ -+ -+#### -+## INSTALL section ## -+ -+INSTALL(TARGETS dict_s6a -+ LIBRARY DESTINATION ${INSTALL_EXTENSIONS_SUFFIX} -+ COMPONENT freeDiameter-dictionary-s6a) -diff -NaurB -x '*~' -x build freeDiameter-1.1.5-unmodified/extensions/dict_s6a/dict_s6a.c freeDiameter-1.1.5/extensions/dict_s6a/dict_s6a.c ---- freeDiameter-1.1.5-unmodified/extensions/dict_s6a/dict_s6a.c 1970-01-01 01:00:00.000000000 +0100 -+++ freeDiameter-1.1.5/extensions/dict_s6a/dict_s6a.c 2013-02-13 09:08:27.026025453 +0100 -@@ -0,0 +1,4212 @@ -+/********************************************************************************************************* -+* Software License Agreement (BSD License) * -+* Author: Sebastien ROUX <sebastien.roux@eurecom.fr> * -+* * -+* Copyright (c) 2013, Eurecom * -+* All rights reserved. * -+* * -+* Redistribution and use of this software in source and binary forms, with or without modification, are * -+* permitted provided that the following conditions are met: * -+* * -+* * Redistributions of source code must retain the above * -+* copyright notice, this list of conditions and the * -+* following disclaimer. * -+* * -+* * Redistributions in binary form must reproduce the above * -+* copyright notice, this list of conditions and the * -+* following disclaimer in the documentation and/or other * -+* materials provided with the distribution. * -+* * -+* * Neither the name of the Teraoka Laboratory nor the * -+* names of its contributors may be used to endorse or * -+* promote products derived from this software without * -+* specific prior written permission of Teraoka Laboratory * -+* * -+* * -+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED * -+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * -+* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * -+* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * -+* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * -+* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * -+* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * -+* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * -+*********************************************************************************************************/ -+ -+#include <freeDiameter/extension.h> -+ -+/* The content of this file follows the same structure as dict_base_proto.c */ -+ -+#define CHECK_dict_new( _type, _data, _parent, _ref ) \ -+ CHECK_FCT( fd_dict_new( fd_g_config->cnf_dict, (_type), (_data), (_parent), (_ref)) ); -+ -+#define CHECK_dict_search( _type, _criteria, _what, _result ) \ -+ CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, (_type), (_criteria), (_what), (_result), ENOENT) ); -+ -+struct local_rules_definition { -+ char *avp_name; -+ enum rule_position position; -+ int min; -+ int max; -+}; -+ -+#define RULE_ORDER( _position ) ((((_position) == RULE_FIXED_HEAD) || ((_position) == RULE_FIXED_TAIL)) ? 1 : 0 ) -+ -+#define PARSE_loc_rules( _rulearray, _parent) { \ -+ int __ar; \ -+ for (__ar=0; __ar < sizeof(_rulearray) / sizeof((_rulearray)[0]); __ar++) { \ -+ struct dict_rule_data __data = { NULL, \ -+ (_rulearray)[__ar].position, \ -+ 0, \ -+ (_rulearray)[__ar].min, \ -+ (_rulearray)[__ar].max}; \ -+ __data.rule_order = RULE_ORDER(__data.rule_position); \ -+ CHECK_FCT( fd_dict_search( \ -+ fd_g_config->cnf_dict, \ -+ DICT_AVP, \ -+ AVP_BY_NAME_ALL_VENDORS, \ -+ (_rulearray)[__ar].avp_name, \ -+ &__data.rule_avp, 0 ) ); \ -+ if ( !__data.rule_avp ) { \ -+ TRACE_DEBUG(INFO, "AVP Not found: '%s'", (_rulearray)[__ar].avp_name ); \ -+ return ENOENT; \ -+ } \ -+ CHECK_FCT_DO( fd_dict_new( fd_g_config->cnf_dict, DICT_RULE, &__data, _parent, NULL), \ -+ { \ -+ TRACE_DEBUG(INFO, "Error on rule with AVP '%s'", \ -+ (_rulearray)[__ar].avp_name ); \ -+ return EINVAL; \ -+ } ); \ -+ } \ -+} -+ -+#define enumval_def_u32( _val_, _str_ ) \ -+ { _str_, { .u32 = _val_ }} -+ -+#define enumval_def_os( _len_, _val_, _str_ ) \ -+ { _str_, { .os = { .data = (unsigned char *)_val_, .len = _len_ }}} -+ -+/* Defines if there are any */ -+ -+/* Dictionary */ -+ -+int dict_s6a_init(char * conffile) -+{ -+#define VENDOR_3GPP_Id 10415 -+ -+ TRACE_ENTRY("%p", conffile); -+ -+ struct dict_object * vendor_dict; -+ { -+ struct dict_vendor_data vendor_data = { VENDOR_3GPP_Id, "3GPP" }; -+ CHECK_dict_new (DICT_VENDOR, &vendor_data, NULL, &vendor_dict); -+ } -+ -+ struct dict_object * s6a_dict; -+ { -+ struct dict_application_data data = { 16777251, "Diameter S6a 3GPP" }; -+ CHECK_dict_new( DICT_APPLICATION, &data , NULL, &s6a_dict); -+ } -+ -+ /* AVP section */ -+ { -+ /* Loading the derived data formats */ -+ -+ struct dict_object * Time_type; -+ struct dict_object * Address_type; -+ struct dict_object * UTF8String_type; -+ -+ CHECK_dict_search( DICT_TYPE, TYPE_BY_NAME, "Time", &Time_type); -+ CHECK_dict_search( DICT_TYPE, TYPE_BY_NAME, "Address", &Address_type); -+ CHECK_dict_search( DICT_TYPE, TYPE_BY_NAME, "UTF8String", &UTF8String_type); -+ -+ /* 3GPP-Charging-Characteristics */ -+ { -+ struct dict_avp_data data = { -+ 13, /* Code */ -+ 0, /* Vendor */ -+ "3GPP-Charging-Characteristics", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , UTF8String_type, NULL); -+ } -+ -+ /* Service-Selection - RFC 5778 */ -+ { -+ struct dict_avp_data data = { -+ 493, /* Code */ -+ 0, /* Vendor */ -+ "Service-Selection", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , UTF8String_type, NULL); -+ } -+ -+ /* Max-Requested-Bandwidth-DL AVP - 3GPP TS 29.214 #5.3.14 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 515, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Max-Requested-Bandwidth-DL", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* Max-Requested-Bandwidth-UL AVP - 3GPP TS 29.214 #5.3.15 */ -+ { -+ struct dict_avp_data data = { -+ 516, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Max-Requested-Bandwidth-UL", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, NULL); -+ } -+ -+ /* Visited-Network-Identifier AVP - 3GPP TS 29.229 #6.3.1 */ -+ { -+ struct dict_avp_data data = { -+ 600, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Visited-Network-Identifier", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, NULL); -+ } -+ -+ /* Confidentiality-Key AVP - 3GPP TS 29.229 #6.3.27 */ -+ { -+ struct dict_avp_data data = { -+ 625, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Confidentiality-Key", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, NULL); -+ } -+ -+ /* Integrity-Key AVP - 3GPP TS 29.229 #6.3.28 */ -+ { -+ struct dict_avp_data data = { -+ 626, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Integrity-Key", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, NULL); -+ } -+ -+ /* Feature-List-ID AVP - 3GPP TS 29.229 #6.3.29 */ -+ { -+ struct dict_avp_data data = { -+ 629, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Feature-List-ID", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, NULL); -+ } -+ -+ /* Feature-List AVP - 3GPP TS 29.229 #6.3.30 */ -+ { -+ struct dict_avp_data data = { -+ 630, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Feature-List", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, NULL); -+ } -+ -+ /* MSISDN AVP - 3GPP TS 29.329 #6.3.2 */ -+ { -+ struct dict_avp_data data = { -+ 701, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "MSISDN", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, NULL); -+ } -+ -+ /* Served-Party-IP-Address AVP - 3GPP TS 32.299 #7.2.187 -+ * The Served-Party-IP-Address AVP (AVP code 848) is of type Address -+ * and holds the IP address of either the calling or called party, -+ * depending on whether the P-CSCF is in touch with the calling or the -+ * called party. This AVP is only provided by the P-CSCF. -+ */ -+ { -+ struct dict_avp_data data = { -+ 848, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Served-Party-IP-Address", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , Address_type, NULL); -+ } -+ -+ /* QoS-Class-Identifier AVP - 3GPP TS 29.212 #5.3.17 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(QoS-Class-Identifier)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_1 = { "QCI_1", { .i32 = 1 }}; -+ struct dict_enumval_data t_2 = { "QCI_2", { .i32 = 2 }}; -+ struct dict_enumval_data t_3 = { "QCI_3", { .i32 = 3 }}; -+ struct dict_enumval_data t_4 = { "QCI_4", { .i32 = 4 }}; -+ struct dict_enumval_data t_5 = { "QCI_5", { .i32 = 5 }}; -+ struct dict_enumval_data t_6 = { "QCI_6", { .i32 = 6 }}; -+ struct dict_enumval_data t_7 = { "QCI_7", { .i32 = 7 }}; -+ struct dict_enumval_data t_8 = { "QCI_8", { .i32 = 8 }}; -+ struct dict_enumval_data t_9 = { "QCI_9", { .i32 = 9 }}; -+ -+ struct dict_avp_data data = { -+ 1028, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "QoS-Class-Identifier", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ /* Create the Enumerated type, and then the AVP */ -+ CHECK_dict_new( DICT_TYPE, &tdata, NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1, avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_2, avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_3, avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_4, avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_5, avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_6, avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_7, avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_8, avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_9, avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* RAT-Type AVP - 3GPP TS 29.212 #5.3.31 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_UNSIGNED32, "Enumerated(RAT-Type)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "WLAN", { .u32 = 0 }}; -+ struct dict_enumval_data t_1 = { "VIRTUAL", { .u32 = 1 }}; -+ struct dict_enumval_data t_1000 = { "UTRAN", { .u32 = 1000 }}; -+ struct dict_enumval_data t_1001 = { "GERAN", { .u32 = 1001 }}; -+ struct dict_enumval_data t_1002 = { "GAN", { .u32 = 1002 }}; -+ struct dict_enumval_data t_1003 = { "HSPA_EVOLUTION", { .u32 = 1003 }}; -+ struct dict_enumval_data t_1004 = { "EUTRAN", { .u32 = 1004 }}; -+ struct dict_enumval_data t_2000 = { "CDMA2000_1X", { .u32 = 2000 }}; -+ struct dict_enumval_data t_2001 = { "HRPD", { .u32 = 2001 }}; -+ struct dict_enumval_data t_2002 = { "UMB", { .u32 = 2002 }}; -+ struct dict_enumval_data t_2003 = { "EHRPD", { .u32 = 2003 }}; -+ -+ struct dict_avp_data data = { -+ 1032, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "RAT-Type", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ /* Create the Enumerated type, and then the AVP */ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1000 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1001 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1002 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1003 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1004 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_2000 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_2001 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_2002 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_2003 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* Priority-Level AVP - 3GPP TS 29.272 #5.3.45 */ -+ { -+ struct dict_avp_data data = { -+ 1046, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Priority-Level", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, NULL); -+ } -+ -+ /* Pre-emption-Capability AVP - 3GPP TS 29.212 #5.3.46 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Pre-emption-Capability)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "PRE-EMPTION_CAPABILITY_ENABLED", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "PRE-EMPTION_CAPABILITY_DISABLED", { .i32 = 1 }}; -+ -+ struct dict_avp_data data = { -+ 1047, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Pre-emption-Capability", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ /* Create the Enumerated type, and then the AVP */ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* Pre-emption-Vulnerability AVP - 3GPP TS 29.212 #5.3.47 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Pre-emption-Vulnerability)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "PRE-EMPTION_VULNERABILITY_ENABLED", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "PRE-EMPTION_VULNERABILITY_DISABLED", { .i32 = 1 }}; -+ -+ struct dict_avp_data data = { -+ 1048, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Pre-emption-Vulnerability", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ /* Create the Enumerated type, and then the AVP */ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* Allocation-Retention-Priority AVP - 3GPP TS 29.272 #5.3.32 */ -+ { -+ /* -+ -+ Allocation-Retention-Priority ::= < AVP Header: 1034 > -+ { Priority-Level } -+ [ Pre-emption-Capability ] -+ [ Pre-emption-Vulnerability ] -+ -+ The Allocation-Retention-Priority AVP (AVP code 1034) is of type -+ Grouped, and it is used to indicate the priority of allocation and -+ retention, the pre-emption capability and pre-emption vulnerability -+ for the SDF if provided within the QoS-Information-AVP or for the -+ EPS default bearer if provided within the Default-EPS-Bearer-QoS AVP. -+ */ -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1034, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Allocation-Retention-Priority", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Priority-Level", RULE_REQUIRED, -1, 1 } -+ ,{ "Pre-emption-Capability", RULE_OPTIONAL, -1, 1 } -+ ,{ "Pre-emption-Vulnerability", RULE_OPTIONAL, -1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* PDP-Address AVP - 3GPP TS 32.299 #6.3.2 */ -+ { -+ /* -+ * The PDP-Address-Prefix-Length AVP needs not be available for IPv6 -+ * typed IP-address prefix length of 64 bits. -+ */ -+ struct dict_avp_data data = { -+ 1227, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "PDP-Address", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , Address_type, NULL); -+ } -+ -+ /* Subscriber-Status - 3GPP TS 29.272 #7.3.29 */ -+ { -+ struct dict_object * type; -+ struct dict_type_data tdata = { AVP_TYPE_UNSIGNED32, "Enumerated(Subscriber-Status)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "SERVICE_GRANTED", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "OPERATOR_DETERMINED_BARRING", { .i32 = 1 }}; -+ -+ struct dict_avp_data data = { -+ 1424, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Subscriber-Status", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_TYPE, &tdata, NULL, &type); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0, type, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1, type, NULL); -+ CHECK_dict_new( DICT_AVP, &data, NULL, &type); -+ } -+ -+ /* STN-SR AVP - 3GPP TS 29.272 #7.3.33 */ -+ { -+ struct dict_avp_data data = { -+ 1433, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "STN-SR", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , UTF8String_type, NULL); -+ } -+ -+ /* ICS-Indicator AVP - 3GPP TS 29.272 #7.3.104 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(ICS-Indicator)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "FALSE", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "TRUE", { .i32 = 1 }}; -+ -+ struct dict_avp_data data = { -+ 1491, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "ICS-Indicator", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ /* Create the Enumerated type, and then the AVP */ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , avp, NULL); -+ } -+ -+ /* IMEI AVP - 3GPP TS 29.272 #7.3.4 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1402, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "IMEI", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , UTF8String_type, &avp); -+ } -+ -+ /* 3GPP2-MEID AVP - 3GPP TS 29.272 #7.3.6 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1471, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "3GPP2-MEID", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, &avp); -+ } -+ -+ /* Software Version - 3GPP TS 29.272 #7.3.5 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1403, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Software-Version", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , UTF8String_type, &avp); -+ } -+ -+ /* Terminal Information AVP - 3GPP TS 29.272 #7.3.3 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1401, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Terminal-Information", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "IMEI", RULE_REQUIRED, 1, 1 } -+ ,{ "3GPP2-MEID", RULE_REQUIRED, 1, 1 } -+ ,{ "Software-Version", RULE_REQUIRED, 1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* ULA-Flags - 3GPP TS 29.272 #7.3.8 */ -+ { -+ struct dict_avp_data data = { -+ 1406, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "ULA-Flags", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, NULL); -+ } -+ -+ /* Visited-PLMN-Id AVP - 3GPP TS 29.272 #7.3.9 */ -+ { -+ struct dict_avp_data data = { -+ 1407, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Visited-PLMN-Id", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, NULL); -+ } -+ -+ /* Number-Of-Requested-Vectors - 3GPP TS 29.272 #7.3.14 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1410, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Number-Of-Requested-Vectors", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* Re-Synchronization-Info - 3GPP TS 29.272 #7.3.15 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1411, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Re-Synchronization-Info", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* Immediate-Response-Preferred - 3GPP TS 29.272 #7.3.16 */ -+ { -+ struct dict_avp_data data = { -+ 1412, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Immediate-Response-Preferred", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, NULL); -+ } -+ -+ /* Requested-EUTRAN-Authentication-Info AVP - 3GPP TS 29.272 #7.3.11 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1408, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Requested-EUTRAN-Authentication-Info", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Number-Of-Requested-Vectors", RULE_OPTIONAL, -1, 1 } -+ ,{ "Immediate-Response-Preferred", RULE_OPTIONAL, -1, 1 } -+ ,{ "Re-Synchronization-Info", RULE_OPTIONAL, -1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* Requested-UTRAN-GERAN-Authentication-Info AVP - 3GPP TS 29.272 #7.3.12 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1409, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Requested-UTRAN-GERAN-Authentication-Info", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Number-Of-Requested-Vectors", RULE_OPTIONAL, -1, 1 } -+ ,{ "Immediate-Response-Preferred", RULE_OPTIONAL, -1, 1 } -+ ,{ "Re-Synchronization-Info", RULE_OPTIONAL, -1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* Item-Number AVP - 3GPP TS 29.272 #7.3.23 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1419, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Item-Number", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* RAND AVP - 3GPP TS 29.272 #7.3.53 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1447, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "RAND", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* XRES AVP - 3GPP TS 29.272 #7.3.54 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1448, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "XRES", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* AUTN AVP - 3GPP TS 29.272 #7.3.55 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1449, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "AUTN", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* SRES AVP - 3GPP TS 29.272 #7.3.60 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1454, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "SRES", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, &avp); -+ } -+ -+ /* KASME AVP - 3GPP TS 29.272 #7.3.56 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1450, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "KASME", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* Kc AVP - 3GPP TS 29.272 #7.3.59 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1453, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Kc", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, &avp); -+ } -+ -+ /* Trace-Collection-Entity AVP - 3GPP TS 29.272 #7.3.96 */ -+ { -+ struct dict_avp_data data = { -+ 1452, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Trace-Collection-Entity", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, Address_type, NULL); -+ } -+ -+ /* E-UTRAN-Vector - 3GPP TS 29.272 #7.3.18 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1414, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "E-UTRAN-Vector", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Item-Number", RULE_OPTIONAL, -1, 1 } -+ ,{ "RAND", RULE_REQUIRED, -1, 1 } -+ ,{ "XRES", RULE_REQUIRED, -1, 1 } -+ ,{ "AUTN", RULE_REQUIRED, -1, 1 } -+ ,{ "KASME", RULE_REQUIRED, -1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* UTRAN-Vector - 3GPP TS 29.272 #7.3.19 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1415, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "UTRAN-Vector", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Item-Number", RULE_OPTIONAL, -1, 1 } -+ ,{ "RAND", RULE_REQUIRED, -1, 1 } -+ ,{ "XRES", RULE_REQUIRED, -1, 1 } -+ ,{ "AUTN", RULE_REQUIRED, -1, 1 } -+ ,{ "Confidentiality-Key", RULE_REQUIRED, -1, 1 } -+ ,{ "Integrity-Key", RULE_REQUIRED, -1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* GERAN-Vector - 3GPP TS 29.272 #7.3.20 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1416, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "GERAN-Vector", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Item-Number", RULE_OPTIONAL, -1, 1 } -+ ,{ "RAND", RULE_REQUIRED, -1, 1 } -+ ,{ "SRES", RULE_REQUIRED, -1, 1 } -+ ,{ "Kc", RULE_REQUIRED, -1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* Authentication-Info - 3GPP TS 29.272 #7.3.17 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1413, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Authentication-Info", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "E-UTRAN-Vector", RULE_OPTIONAL, -1, -1 } -+ ,{ "UTRAN-Vector", RULE_OPTIONAL, -1, -1 } -+ ,{ "GERAN-Vector", RULE_OPTIONAL, -1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* Network-Access-Mode - 3GPP TS 29.272 #7.3.21 */ -+ { -+ struct dict_object * type; -+ struct dict_type_data tdata = { AVP_TYPE_UNSIGNED32, "Enumerated(Network-Access-Mode)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "PACKET_AND_CIRCUIT", { .u32 = 0 }}; -+ struct dict_enumval_data t_1 = { "ONLY_PACKET", { .u32 = 1 }}; -+ -+ struct dict_avp_data data = { -+ 1417, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Network-Access-Mode", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &type); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , type, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , type, NULL); -+ CHECK_dict_new( DICT_AVP, &data , type, NULL); -+ } -+ -+ /* HPLMN-ODB AVP - 3GPP TS 29.272 #7.3.22 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1418, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "HPLMN-ODB", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* Cancellation-Type - 3GPP TS 29.272 #7.3.24 */ -+ { -+ struct dict_object * type; -+ struct dict_type_data tdata = { AVP_TYPE_UNSIGNED32, "Enumerated(Cancellation-Type)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "MME_UPDATE_PROCEDURE", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "SGSN_UPDATE_PROCEDURE", { .i32 = 1 }}; -+ struct dict_enumval_data t_2 = { "SUBSCRIPTION_WITHDRAWAL", { .i32 = 2 }}; -+ struct dict_enumval_data t_3 = { "UPDATE_PROCEDURE_IWF", { .i32 = 3 }}; -+ struct dict_enumval_data t_4 = { "INITIAL_ATTACH_PROCEDURE", { .i32 = 4 }}; -+ -+ struct dict_avp_data data = { -+ 1420, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Cancellation-Type", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_TYPE, &tdata, NULL, &type); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0, type, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1, type, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_2, type, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_3, type, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_4, type, NULL); -+ CHECK_dict_new( DICT_AVP, &data, NULL, &type); -+ } -+ -+ /* DSR-Flags AVP - 3GPP TS 29.272 #7.3.25 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1421, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "DSR-Flags", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* DSA-Flags AVP - 3GPP TS 29.272 #7.3.26 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1422, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "DSA-Flags", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* Context-Identifier AVP - 3GPP TS 29.272 #7.3.27 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1423, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Context-Identifier", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* Operator-Determined-Barring AVP - 3GPP TS 29.272 #7.3.30 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1425, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Operator-Determined-Barring", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* Access-Restriction-Data AVP - 3GPP TS 29.272 #7.3.31 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1426, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Access-Restriction-Data", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* APN-OI-Replacement AVP - 3GPP TS 29.272 #7.3.32 */ -+ { -+ struct dict_avp_data data = { -+ 1427, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "APN-OI-Replacement", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , UTF8String_type, NULL); -+ } -+ -+ /* All-APN-Configurations-Included-Indicator AVP - 3GPP TS 29.272 #7.3.33 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(All-APN-Configurations-Included-Indicator)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "All_APN_CONFIGURATIONS_INCLUDED", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "MODIFIED/ADDED_APN_CONFIGURATIONS_INCLUDED", { .i32 = 1 }}; -+ -+ struct dict_avp_data data = { -+ 1428, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "All-APN-Configurations-Included-Indicator", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ /* Create the Enumerated type, and then the AVP */ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , avp, NULL); -+ } -+ -+ /* PDN-Type AVP - 3GPP TS 29.272 #7.3.62 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(PDN-Type)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "IPv4", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "IPv6", { .i32 = 1 }}; -+ struct dict_enumval_data t_2 = { "IPv4v6", { .i32 = 2 }}; -+ struct dict_enumval_data t_3 = { "IPv4_OR_IPv6", { .i32 = 3 }}; -+ -+ struct dict_avp_data data = { -+ 1456, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "PDN-Type", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ /* Create the Enumerated type, and then the AVP */ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_2 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_3 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , avp, NULL); -+ } -+ -+ /* EPS-Subscribed-QoS-Profile AVP - 3GPP TS 29.272 #7.3.37 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1431, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "EPS-Subscribed-QoS-Profile", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "QoS-Class-Identifier", RULE_REQUIRED, -1, 1 } -+ ,{ "Allocation-Retention-Priority", RULE_REQUIRED, -1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* VPLMN-Dynamic-Address-Allowed AVP - 3GPP TS 29.272 #7.3.38 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(VPLMN-Dynamic-Address-Allowed)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "NOTALLOWED", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "ALLOWED", { .i32 = 1 }}; -+ -+ struct dict_avp_data data = { -+ 1432, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "VPLMN-Dynamic-Address-Allowed", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ /* Create the Enumerated type, and then the AVP */ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , avp, NULL); -+ } -+ -+ /* Alert-Reason AVP - 3GPP TS 29.272 #7.3.83 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Alert-Reason)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "UE_PRESENT", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "UE_MEMORY_AVAILABLE", { .i32 = 1 }}; -+ -+ struct dict_avp_data data = { -+ 1434, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Alert-Reason", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ /* Create the Enumerated type, and then the AVP */ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , avp, NULL); -+ } -+ -+ /* PDN-GW-Allocation-Type AVP - 3GPP TS 29.272 #7.3.44 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(PDN-GW-Allocation-Type)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "STATIC", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "DYNAMIC", { .i32 = 1 }}; -+ -+ struct dict_avp_data data = { -+ 1438, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "PDN-GW-Allocation-Type", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ /* Create the Enumerated type, and then the AVP */ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , avp, NULL); -+ } -+ -+ /* Expiration-Date AVP - 3GPP TS 29.272 #7.3.80 */ -+ { -+ struct dict_avp_data data = { -+ 1439, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Expiration-Date", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , Time_type, NULL); -+ } -+ -+ /* CSG-Id AVP - 3GPP TS 29.272 #7.3.79 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1437, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "CSG-Id", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* AMBR AVP - 3GPP TS 29.272 #7.3.41 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1435, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "AMBR", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Max-Requested-Bandwidth-UL", RULE_REQUIRED, -1, 1 } -+ ,{ "Max-Requested-Bandwidth-DL", RULE_REQUIRED, -1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* Specific-APN-Info AVP - 3GPP TS 29.272 #7.3.82 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1472, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Specific-APN-Info", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Service-Selection", RULE_REQUIRED, -1, 1 } -+ ,{ "MIP6-Agent-Info", RULE_REQUIRED, -1, 1 } -+ ,{ "Visited-Network-Identifier", RULE_OPTIONAL, -1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* SIPTO-Permission AVP - 3GPP TS 29.272 #7.3.135 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(SIPTO-Permission)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "SIPTO_ALLOWED", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "SIPTO_NOTALLOWED", { .i32 = 1 }}; -+ -+ struct dict_avp_data data = { -+ 1613, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "SIPTO-Permission", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ /* Create the Enumerated type, and then the AVP */ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , avp, NULL); -+ } -+ -+ /* LIPA-Permission AVP - 3GPP TS 29.272 #7.3.133 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(LIPA-Permission)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "LIPA-PROHIBITED", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "LIPA-ONLY", { .i32 = 1 }}; -+ struct dict_enumval_data t_2 = { "LIPA-CONDITIONAL", { .i32 = 2 }}; -+ -+ struct dict_avp_data data = { -+ 1618, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "LIPA-Permission", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ /* Create the Enumerated type, and then the AVP */ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_2 , avp, NULL); -+ -+ CHECK_dict_new( DICT_AVP, &data , avp, NULL); -+ } -+ -+ /* List-Of-Measurements AVP - 3GPP TS 29.272 #7.3.139 */ -+ { -+ struct dict_avp_data data = { -+ 1625, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "List-Of-Measurements", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, NULL); -+ } -+ -+ /* Reporting-Trigger AVP - 3GPP TS 29.272 #7.3.140 */ -+ { -+ struct dict_avp_data data = { -+ 1626, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Reporting-Trigger", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, NULL); -+ } -+ -+ /* Report-Interval AVP - 3GPP TS 29.272 #7.3.141 and TS 32.422 #5.10.5 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Report-Interval)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "250ms", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "500ms", { .i32 = 1 }}; -+ struct dict_enumval_data t_2 = { "1000ms", { .i32 = 2 }}; -+ struct dict_enumval_data t_3 = { "2000ms", { .i32 = 3 }}; -+ struct dict_enumval_data t_4 = { "3000ms", { .i32 = 4 }}; -+ struct dict_enumval_data t_5 = { "4000ms", { .i32 = 5 }}; -+ struct dict_enumval_data t_6 = { "6000ms", { .i32 = 6 }}; -+ struct dict_enumval_data t_7 = { "8000ms", { .i32 = 7 }}; -+ struct dict_enumval_data t_8 = { "12000ms", { .i32 = 8 }}; -+ struct dict_enumval_data t_9 = { "16000ms", { .i32 = 9 }}; -+ struct dict_enumval_data t_10 = { "20000ms", { .i32 = 10 }}; -+ struct dict_enumval_data t_11 = { "24000ms", { .i32 = 11 }}; -+ struct dict_enumval_data t_12 = { "28000ms", { .i32 = 12 }}; -+ struct dict_enumval_data t_13 = { "32000ms", { .i32 = 13 }}; -+ struct dict_enumval_data t_14 = { "64000ms", { .i32 = 14 }}; -+ /* Possible in LTE */ -+ struct dict_enumval_data t_15 = { "120ms", { .i32 = 15 }}; -+ struct dict_enumval_data t_16 = { "240ms", { .i32 = 16 }}; -+ struct dict_enumval_data t_17 = { "480ms", { .i32 = 17 }}; -+ struct dict_enumval_data t_18 = { "640ms", { .i32 = 18 }}; -+ struct dict_enumval_data t_19 = { "1024ms", { .i32 = 19 }}; -+ struct dict_enumval_data t_20 = { "2048ms", { .i32 = 20 }}; -+ struct dict_enumval_data t_21 = { "5120ms", { .i32 = 21 }}; -+ struct dict_enumval_data t_22 = { "10240ms", { .i32 = 22 }}; -+ struct dict_enumval_data t_23 = { "1min", { .i32 = 23 }}; -+ struct dict_enumval_data t_24 = { "6min", { .i32 = 24 }}; -+ struct dict_enumval_data t_25 = { "12min", { .i32 = 25 }}; -+ struct dict_enumval_data t_26 = { "30min", { .i32 = 26 }}; -+ struct dict_enumval_data t_27 = { "60min", { .i32 = 27 }}; -+ -+ struct dict_avp_data data = { -+ 1627, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Report-Interval", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ /* Create the Enumerated type, and then the AVP */ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_2 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_3 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_4 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_5 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_6 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_7 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_8 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_9 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_10 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_11 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_12 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_13 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_14 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_15 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_16 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_17 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_18 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_19 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_20 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_21 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_22 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_23 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_24 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_25 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_26 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_27 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , avp, NULL); -+ } -+ -+ /* Report-Amount AVP - 3GPP TS 29.272 #7.3.142 and TS 32.422 #5.10.6 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Report-Amount)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "1", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "2", { .i32 = 1 }}; -+ struct dict_enumval_data t_2 = { "4", { .i32 = 2 }}; -+ struct dict_enumval_data t_3 = { "8", { .i32 = 3 }}; -+ struct dict_enumval_data t_4 = { "16", { .i32 = 4 }}; -+ struct dict_enumval_data t_5 = { "32", { .i32 = 5 }}; -+ struct dict_enumval_data t_6 = { "64", { .i32 = 6 }}; -+ struct dict_enumval_data t_7 = { "infinity", { .i32 = 7 }}; -+ -+ struct dict_avp_data data = { -+ 1628, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Report-Amount", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ /* Create the Enumerated type, and then the AVP */ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_2 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_3 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_4 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_5 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_6 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_7 , avp, NULL); -+ -+ CHECK_dict_new( DICT_AVP, &data , avp, NULL); -+ } -+ -+ /* Event-Threshold-RSRP AVP - 3GPP TS 29.272 #7.3.143 */ -+ { -+ struct dict_avp_data data = { -+ 1629, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Event-Threshold-RSRP", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, NULL); -+ } -+ -+ /* Event-Threshold-RSRQ AVP - 3GPP TS 29.272 #7.3.144 */ -+ { -+ struct dict_avp_data data = { -+ 1630, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Event-Threshold-RSRQ", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, NULL); -+ } -+ -+ /* Logging-Interval AVP - 3GPP TS 29.272 #7.3.145 and TS 32.422 #5.10.8 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Logging-Interval)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "1.28", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "2.56", { .i32 = 1 }}; -+ struct dict_enumval_data t_2 = { "5.12", { .i32 = 2 }}; -+ struct dict_enumval_data t_3 = { "10.24", { .i32 = 3 }}; -+ struct dict_enumval_data t_4 = { "20.48", { .i32 = 4 }}; -+ struct dict_enumval_data t_5 = { "30.72", { .i32 = 5 }}; -+ struct dict_enumval_data t_6 = { "40.96", { .i32 = 6 }}; -+ struct dict_enumval_data t_7 = { "61.44", { .i32 = 7 }}; -+ -+ struct dict_avp_data data = { -+ 1631, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Logging-Interval", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ /* Create the Enumerated type, and then the AVP */ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_2 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_3 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_4 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_5 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_6 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_7 , avp, NULL); -+ -+ CHECK_dict_new( DICT_AVP, &data , avp, NULL); -+ } -+ -+ /* Logging-Duration AVP - 3GPP TS 29.272 #7.3.145 and TS 32.422 #5.10.9 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Logging-Duration)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "600sec", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "1200sec", { .i32 = 1 }}; -+ struct dict_enumval_data t_2 = { "2400sec", { .i32 = 2 }}; -+ struct dict_enumval_data t_3 = { "3600sec", { .i32 = 3 }}; -+ struct dict_enumval_data t_4 = { "5400sec", { .i32 = 4 }}; -+ struct dict_enumval_data t_5 = { "7200sec", { .i32 = 5 }}; -+ -+ struct dict_avp_data data = { -+ 1632, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Logging-Duration", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ /* Create the Enumerated type, and then the AVP */ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_2 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_3 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_4 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_5 , avp, NULL); -+ -+ CHECK_dict_new( DICT_AVP, &data , avp, NULL); -+ } -+ -+ /* APN-Configuration AVP - 3GPP TS 29.272 #7.3.35 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1430, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "APN-Configuration", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Context-Identifier", RULE_REQUIRED, -1, 1 } -+ ,{ "Served-Party-IP-Address", RULE_OPTIONAL, -1, 2 } -+ ,{ "PDN-Type", RULE_REQUIRED, -1, 1 } -+ ,{ "Service-Selection", RULE_REQUIRED, -1, 1 } -+ ,{ "EPS-Subscribed-QoS-Profile", RULE_OPTIONAL, -1, 1 } -+ ,{ "VPLMN-Dynamic-Address-Allowed", RULE_OPTIONAL, -1, 1 } -+ ,{ "MIP6-Agent-Info", RULE_OPTIONAL, -1, 1 } -+ ,{ "Visited-Network-Identifier", RULE_OPTIONAL, -1, 1 } -+ ,{ "PDN-GW-Allocation-Type", RULE_OPTIONAL, -1, 1 } -+ ,{ "3GPP-Charging-Characteristics", RULE_OPTIONAL, -1, 1 } -+ ,{ "AMBR", RULE_OPTIONAL, -1, 1 } -+ ,{ "Specific-APN-Info", RULE_OPTIONAL, -1, -1 } -+ ,{ "APN-OI-Replacement", RULE_OPTIONAL, -1, 1 } -+ ,{ "SIPTO-Permission", RULE_OPTIONAL, -1, 1 } -+ ,{ "LIPA-Permission", RULE_OPTIONAL, -1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* APN-Configuration-Profile AVP - 3GPP TS 29.272 #7.3.34 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1429, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "APN-Configuration-Profile", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Context-Identifier", RULE_REQUIRED, -1, 1 } -+ ,{ "All-APN-Configurations-Included-Indicator", RULE_REQUIRED, -1, 1 } -+ ,{ "APN-Configuration", RULE_REQUIRED, -1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* CSG-Subscription-Data AVP - 3GPP TS 29.272 #7.3.78 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1436, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "CSG-Subscription-Data", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "CSG-Id", RULE_REQUIRED, -1, 1 } -+ ,{ "Expiration-Date", RULE_OPTIONAL, -1, 1 } -+ ,{ "Service-Selection", RULE_OPTIONAL, -1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* RAT-Frequency-Selection-Priority-ID AVP - 3GPP TS 29.272 #7.3.46 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1440, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "RAT-Frequency-Selection-Priority-ID", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* IDA-Flags AVP - 3GPP TS 29.272 #7.3.47 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1441, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "IDA-Flags", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* PUA-Flags AVP - 3GPP TS 29.272 #7.3.48 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1442, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "PUA-Flags", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* NOR-Flags AVP - 3GPP TS 29.272 #7.3.49 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1443, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "NOR-Flags", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* User-Id AVP - 3GPP TS 29.272 #7.3.50 */ -+ { -+ struct dict_avp_data data = { -+ 1444, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "User-Id", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , UTF8String_type, NULL); -+ } -+ -+ /* Equipment-Status AVP - 3GPP TS 29.272 #7.3.51 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Equipment-Status)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "WHITELISTED", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "BLACKLISTED", { .i32 = 1 }}; -+ struct dict_enumval_data t_2 = { "GREYLISTED", { .i32 = 2 }}; -+ -+ struct dict_avp_data data = { -+ 1445, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Equipment-Status", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ /* Create the Enumerated type, and then the AVP */ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_2 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , avp, NULL); -+ } -+ -+ /* Regional-Subscription-Zone-Code AVP - 3GPP TS 29.272 #7.3.52 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1446, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Regional-Subscription-Zone-Code", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* Roaming-Restricted-Due-To-Unsupported-Feature AVP - 3GPP TS 29.272 #7.3.81 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Roaming-Restricted-Due-To-Unsupported-Feature)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "Roaming-Restricted-Due-To-Unsupported-Feature", { .i32 = 0 }}; -+ -+ struct dict_avp_data data = { -+ 1457, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Roaming-Restricted-Due-To-Unsupported-Feature", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ /* Create the Enumerated type, and then the AVP */ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , avp, NULL); -+ } -+ -+ /* Trace-Reference AVP - 3GPP TS 29.272 #7.3.64 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1459, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Trace-Reference", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, &avp); -+ } -+ -+ /* Trace-Depth AVP - 3GPP TS 29.272 #7.3.67 and 3GPP TS 32.422 #5.3 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Trace-Depth)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "Minimum", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "Medium", { .i32 = 1 }}; -+ struct dict_enumval_data t_2 = { "Maximum", { .i32 = 2 }}; -+ struct dict_enumval_data t_3 = { "MinimumWithoutVendorSpecificExtension", { .i32 = 3 }}; -+ struct dict_enumval_data t_4 = { "MediumWithoutVendorSpecificExtension", { .i32 = 4 }}; -+ struct dict_enumval_data t_5 = { "MaximumWithoutVendorSpecificExtension", { .i32 = 5 }}; -+ -+ struct dict_avp_data data = { -+ 1462, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Trace-Depth", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ /* Create the Enumerated type, and then the AVP */ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_2 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_3 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_4 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_5 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , avp, NULL); -+ } -+ -+ /* Trace-NE-Type-List AVP - 3GPP TS 29.272 #7.3.68 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1463, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Trace-NE-Type-List", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, &avp); -+ } -+ -+ /* Trace-Event-List AVP - 3GPP TS 29.272 #7.3.69 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1464, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Trace-Interface-List", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, &avp); -+ } -+ -+ /* Trace-Event-List AVP - 3GPP TS 29.272 #7.3.70 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1465, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Trace-Event-List", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, &avp); -+ } -+ -+ /* OMC-Id AVP - 3GPP TS 29.272 #7.3.71 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1466, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "OMC-Id", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, &avp); -+ } -+ -+ /* Complete-Data-List-Included-Indicator AVP - 3GPP TS 29.272 #7.3.73 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Complete-Data-List-Included-Indicator)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "All_PDP_CONTEXTS_INCLUDED", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "MODIFIED/ADDED_PDP CONTEXTS_INCLUDED", { .i32 = 1 }}; -+ -+ struct dict_avp_data data = { -+ 1468, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Complete-Data-List-Included-Indicator", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ /* Create the Enumerated type, and then the AVP */ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , avp, NULL); -+ } -+ -+ /* PDP-Type AVP - 3GPP TS 29.272 #7.3.75 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1470, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "PDP-Type", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, &avp); -+ } -+ -+ /* GMLC-Number AVP - 3GPP TS 29.272 #7.3.85 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1474, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "GMLC-Number", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, &avp); -+ } -+ -+ /* SS-Code AVP - 3GPP TS 29.272 #7.3.87 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1476, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "SS-Code", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, &avp); -+ } -+ -+ /* SS-Status AVP - 3GPP TS 29.272 #7.3.88 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1477, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "SS-Status", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, &avp); -+ } -+ -+ /* Notification-To-UE-User AVP - 3GPP TS 29.272 #7.3.89 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Notification-To-UE-User)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "NOTIFY_LOCATION_ALLOWED", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "NOTIFYANDVERIFY_LOCATION_ALLOWED_IF_NO_RESPONSE", { .i32 = 1 }}; -+ struct dict_enumval_data t_2 = { "NOTIFYANDVERIFY_LOCATION_NOT_ALLOWED_IF_NO_RESPONSE", { .i32 = 2 }}; -+ struct dict_enumval_data t_3 = { "LOCATION_NOT_ALLOWED", { .i32 = 3 }}; -+ -+ struct dict_avp_data data = { -+ 1478, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Notification-To-UE-User", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ /* Create the Enumerated type, and then the AVP */ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_2 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_3 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , avp, NULL); -+ } -+ -+ /* Client-Identity AVP - 3GPP TS 29.272 #7.3.91 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1480, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Client-Identity", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, &avp); -+ } -+ -+ /* GMLC-Restriction AVP - 3GPP TS 29.272 #7.3.92 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(GMLC-Restriction)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "GMLC_LIST", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "HOME_COUNTRY", { .i32 = 1 }}; -+ -+ struct dict_avp_data data = { -+ 1481, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "GMLC-Restriction", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ /* Create the Enumerated type, and then the AVP */ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , avp, NULL); -+ } -+ -+ /* PLMN-Client AVP - 3GPP TS 29.272 #7.3.92 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(PLMN-Client)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "BROADCAST_SERVICE", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "O_AND_M_HPLMN", { .i32 = 1 }}; -+ struct dict_enumval_data t_2 = { "O_AND_M_VPLMN", { .i32 = 2 }}; -+ struct dict_enumval_data t_3 = { "ANONYMOUS_LOCATION", { .i32 = 3 }}; -+ struct dict_enumval_data t_4 = { "TARGET_UE_SUBSCRIBED_SERVICE", { .i32 = 4 }}; -+ -+ struct dict_avp_data data = { -+ 1482, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "PLMN-Client", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ /* Create the Enumerated type, and then the AVP */ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_2 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_3 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_4 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , avp, NULL); -+ } -+ -+ /* ServiceTypeIdentity AVP - 3GPP TS 29.272 #7.3.95 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1484, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "ServiceTypeIdentity", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, &avp); -+ } -+ -+ /* QoS-Subscribed - 3GPP TS 29.272 #7.3.77 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1404, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "QoS-Subscribed", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* ULR-Flags - 3GPP TS 29.272 #7.3.7 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1405, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "ULR-Flags", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* Ext-PDP-Type AVP - 3GPP TS 29.272 #7.3.75A */ -+ { -+ struct dict_avp_data data = { -+ 1620, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Ext-PDP-Type", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, NULL); -+ } -+ -+ /* Ext-PDP-Address AVP - 3GPP TS 29.272 #7.3.129 */ -+ { -+ struct dict_avp_data data = { -+ 1621, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Ext-PDP-Address", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, Address_type, NULL); -+ } -+ -+ /* TS-Code AVP - 3GPP TS 29.272 #7.3.100 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1487, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "TS-Code", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* External-Client AVP - 3GPP TS 29.272 #7.3.90 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1479, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "External-Client", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Client-Identity", RULE_REQUIRED, -1, 1 } -+ ,{ "GMLC-Restriction", RULE_OPTIONAL, -1, 1 } -+ ,{ "Notification-To-UE-User", RULE_OPTIONAL, -1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* Service-Type AVP - 3GPP TS 29.272 #7.3.94 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1483, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Service-Type", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "ServiceTypeIdentity", RULE_REQUIRED, -1, 1 } -+ ,{ "GMLC-Restriction", RULE_OPTIONAL, -1, 1 } -+ ,{ "Notification-To-UE-User", RULE_OPTIONAL, -1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* LCS-PrivacyException AVP - 3GPP TS 29.272 #7.3.86 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1475, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "LCS-PrivacyException", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "SS-Code", RULE_REQUIRED, -1, 1 } -+ ,{ "SS-Status", RULE_REQUIRED, -1, 1 } -+ ,{ "Notification-To-UE-User", RULE_OPTIONAL, -1, 1 } -+ ,{ "External-Client", RULE_OPTIONAL, -1, -1 } -+ ,{ "PLMN-Client", RULE_OPTIONAL, -1, -1 } -+ ,{ "Service-Type", RULE_OPTIONAL, -1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* MO-LR AVP - 3GPP TS 29.272 #7.3.96 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1485, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "MO-LR", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "SS-Code", RULE_REQUIRED, -1, 1 } -+ ,{ "SS-Status", RULE_REQUIRED, -1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* LCS-Info AVP - 3GPP TS 29.272 #7.3.84 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1473, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "LCS-Info", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "GMLC-Number", RULE_OPTIONAL, -1, -1 } -+ ,{ "LCS-PrivacyException", RULE_OPTIONAL, -1, -1 } -+ ,{ "MO-LR", RULE_OPTIONAL, -1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* PDP-Context AVP - 3GPP TS 29.272 #7.3.74 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1469, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "PDP-Context", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Context-Identifier", RULE_REQUIRED, -1, 1 } -+ ,{ "PDP-Type", RULE_REQUIRED, -1, 1 } -+ ,{ "PDP-Address", RULE_OPTIONAL, -1, 1 } -+ ,{ "QoS-Subscribed", RULE_REQUIRED, -1, 1 } -+ ,{ "VPLMN-Dynamic-Address-Allowed", RULE_OPTIONAL, -1, 1 } -+ ,{ "Service-Selection", RULE_REQUIRED, -1, 1 } -+ ,{ "3GPP-Charging-Characteristics", RULE_OPTIONAL, -1, 1 } -+ ,{ "Ext-PDP-Type", RULE_OPTIONAL, -1, 1 } -+ ,{ "Ext-PDP-Address", RULE_OPTIONAL, -1, 1 } -+ ,{ "AMBR", RULE_OPTIONAL, -1, 1 } -+ ,{ "SIPTO-Permission", RULE_OPTIONAL, -1, 1 } -+ ,{ "LIPA-Permission", RULE_OPTIONAL, -1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* GPRS-Subscription-Data AVP - 3GPP TS 29.272 #7.3.72 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1467, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "GPRS-Subscription-Data", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Complete-Data-List-Included-Indicator", RULE_REQUIRED, -1, 1 } -+ ,{ "PDP-Context", RULE_REQUIRED, -1, 50 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* Teleservice-List AVP - 3GPP TS 29.272 #7.3.99 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1486, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Teleservice-List", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "TS-Code", RULE_REQUIRED, -1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* Call-Barring-Infor-List AVP - 3GPP TS 29.272 #7.3.101 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1488, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Call-Barring-Infor-List", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "SS-Code", RULE_REQUIRED, 1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* SGSN-Number AVP - 3GPP TS 29.272 #7.3.102 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1489, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "SGSN-Number", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* IDR-Flags AVP - 3GPP TS 29.272 #7.3.103 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1490, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "IDR-Flags", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* IMS-Voice-Over-PS-Sessions-Supported AVP - 3GPP TS 29.272 #7.3.106 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(IMS-Voice-Over-PS-Sessions-Supported)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "NOT_SUPPORTED", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "SUPPORTED", { .i32 = 1 }}; -+ -+ struct dict_avp_data data = { -+ 1492, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "IMS-Voice-Over-PS-Sessions-Supported", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ /* Create the Enumerated type, and then the AVP */ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , avp, NULL); -+ } -+ -+ /* SGSN-Number AVP - 3GPP TS 29.272 #7.3.102 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Homogeneous-Support-of-IMS-Voice-Over-PSSessions)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "NOT_SUPPORTED", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "SUPPORTED", { .i32 = 1 }}; -+ -+ struct dict_avp_data data = { -+ 1493, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Homogeneous-Support-of-IMS-Voice-Over-PSSessions", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* Last-UE-Activity-Time AVP - 3GPP TS 29.272 #7.3.108 */ -+ { -+ struct dict_avp_data data = { -+ 1494, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Last-UE-Activity-Time", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , Time_type, NULL); -+ } -+ -+ /* E-UTRAN-Cell-Global-Identity AVP - 3GPP TS 29.272 #7.3.117 */ -+ { -+ struct dict_avp_data data = { -+ 1602, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "E-UTRAN-Cell-Global-Identity", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, NULL); -+ } -+ -+ /* Tracking-Area-Identity AVP - 3GPP TS 29.272 #7.3.118 */ -+ { -+ struct dict_avp_data data = { -+ 1603, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Tracking-Area-Identity", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, NULL); -+ } -+ -+ /* Cell-Global-Identity AVP - 3GPP TS 29.272 #7.3.119 */ -+ { -+ struct dict_avp_data data = { -+ 1604, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Cell-Global-Identity", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, NULL); -+ } -+ -+ /* Routing-Area-Identity AVP - 3GPP TS 29.272 #7.3.120 */ -+ { -+ struct dict_avp_data data = { -+ 1605, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Routing-Area-Identity", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, NULL); -+ } -+ -+ /* Location-Area-Identity AVP - 3GPP TS 29.272 #7.3.121 */ -+ { -+ struct dict_avp_data data = { -+ 1606, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Location-Area-Identity", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, NULL); -+ } -+ -+ /* Service-Area-Identity AVP - 3GPP TS 29.272 #7.3.122 */ -+ { -+ struct dict_avp_data data = { -+ 1607, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Service-Area-Identity", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, NULL); -+ } -+ -+ /* Geographical-Information AVP - 3GPP TS 29.272 #7.3.123 */ -+ { -+ struct dict_avp_data data = { -+ 1608, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Geographical-Information", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, NULL); -+ } -+ -+ /* Geodetic-Information AVP - 3GPP TS 29.272 #7.3.124 */ -+ { -+ struct dict_avp_data data = { -+ 1609, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Geodetic-Information", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, NULL); -+ } -+ -+ /* Current-Location-Retrieved AVP - 3GPP TS 29.272 #7.3.125 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Current-Location-Retrieved)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "ACTIVE-LOCATION-RETRIEVAL", { .i32 = 0 }}; -+ -+ struct dict_avp_data data = { -+ 1610, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Current-Location-Retrieved", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* Age-Of-Location-Information AVP - 3GPP TS 29.272 #7.3.126 */ -+ { -+ struct dict_avp_data data = { -+ 1611, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Age-Of-Location-Information", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, NULL); -+ } -+ -+ /* UE-SRVCC-Capability AVP - 3GPP TS 29.272 #7.3.130 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(UE-SRVCC-Capability)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "UE-SRVCC-NOT-SUPPORTED", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "UE-SRVCC-SUPPORTED", { .i32 = 1 }}; -+ -+ struct dict_avp_data data = { -+ 1615, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "UE-SRVCC-Capability", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* MPS-Priority AVP - 3GPP TS 29.272 #7.3.131 */ -+ { -+ struct dict_avp_data data = { -+ 1616, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "MPS-Priority", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, NULL); -+ } -+ -+ /* VPLMN-LIPA-Allowed AVP - 3GPP TS 29.272 #7.3.132 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(VPLMN-LIPA-Allowed)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "LIPA-NOTALLOWED", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "LIPA-ALLOWED", { .i32 = 1 }}; -+ -+ struct dict_avp_data data = { -+ 1617, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "VPLMN-LIPA-Allowed", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* Subscribed-Periodic-RAU-TAU-Timer AVP - 3GPP TS 29.272 #7.3.134 */ -+ { -+ struct dict_avp_data data = { -+ 1619, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Subscribed-Periodic-RAU-TAU-Timer", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, NULL); -+ } -+ -+ /* Job-Type AVP - 3GPP TS 29.272 #7.3.132 and 3GPP TS 32.422 #5.10.1 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Job-Type)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "Immediate-MDT-Only", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "Logged-MDT-only", { .i32 = 1 }}; -+ struct dict_enumval_data t_2 = { "Trace-Only", { .i32 = 2 }}; -+ struct dict_enumval_data t_3 = { "Immediate-MDT-and-Trace", { .i32 = 3 }}; -+ -+ struct dict_avp_data data = { -+ 1623, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Job-Type", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_2 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_3 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* Relay-Node-Indicator AVP - 3GPP TS 29.272 #7.3.147 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Relay-Node-Indicator)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "NOT_RELAY_NODE", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "RELAY_NODE", { .i32 = 1 }}; -+ -+ struct dict_avp_data data = { -+ 1633, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Relay-Node-Indicator", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* MDT-User-Consent AVP - 3GPP TS 29.272 #7.3.148 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(MDT-User-Consent)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "CONSENT_NOT_GIVEN", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "CONSENT_GIVEN", { .i32 = 1 }}; -+ -+ struct dict_avp_data data = { -+ 1634, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "MDT-User-Consent", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* PUR-Flags AVP - 3GPP TS 29.272 #7.3.149 */ -+ { -+ struct dict_avp_data data = { -+ 1635, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "PUR-Flags", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, NULL); -+ } -+ -+ /* User-State AVP - 3GPP TS 29.272 #7.3.114 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(User-State)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "DETACHED", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "ATTACHED_NOT_REACHABLE_FOR_PAGING", { .i32 = 1 }}; -+ struct dict_enumval_data t_2 = { "ATTACHED_REACHABLE_FOR_PAGING", { .i32 = 2 }}; -+ struct dict_enumval_data t_3 = { "CONNECTED_NOT_REACHABLE_FOR_PAGING", { .i32 = 3 }}; -+ struct dict_enumval_data t_4 = { "CONNECTED_REACHABLE_FOR_PAGING", { .i32 = 4 }}; -+ struct dict_enumval_data t_5 = { "NETWORK_DETERMINED_NOT_REACHABLE", { .i32 = 5 }}; -+ -+ struct dict_avp_data data = { -+ 1499, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "User-State", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_2 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_3 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_4 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_5 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* MME-User-State AVP - 3GPP TS 29.272 #7.3.112 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1497, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "MME-User-State", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "User-State", RULE_OPTIONAL, -1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* SGSN-User-State AVP - 3GPP TS 29.272 #7.3.113 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1498, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "SGSN-User-State", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "User-State", RULE_OPTIONAL, -1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* EPS-User-State AVP - 3GPP TS 29.272 #7.3.110 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1495, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "EPS-User-State", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "MME-User-State", RULE_OPTIONAL, -1, 1 } -+ ,{ "SGSN-User-State", RULE_OPTIONAL, -1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* MME-Location-Information AVP - 3GPP TS 29.272 #7.3.115 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1600, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "MME-Location-Information", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "E-UTRAN-Cell-Global-Identity", RULE_OPTIONAL, -1, 1 } -+ ,{ "Tracking-Area-Identity", RULE_OPTIONAL, -1, 1 } -+ ,{ "Geographical-Information", RULE_OPTIONAL, -1, 1 } -+ ,{ "Geodetic-Information", RULE_OPTIONAL, -1, 1 } -+ ,{ "Current-Location-Retrieved", RULE_OPTIONAL, -1, 1 } -+ ,{ "Age-Of-Location-Information", RULE_OPTIONAL, -1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* SGSN-Location-Information AVP - 3GPP TS 29.272 #7.3.116 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1601, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "SGSN-Location-Information", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Cell-Global-Identity", RULE_OPTIONAL, -1, 1 } -+ ,{ "Location-Area-Identity", RULE_OPTIONAL, -1, 1 } -+ ,{ "Service-Area-Identity", RULE_OPTIONAL, -1, 1 } -+ ,{ "Routing-Area-Identity", RULE_OPTIONAL, -1, 1 } -+ ,{ "Geographical-Information", RULE_OPTIONAL, -1, 1 } -+ ,{ "Geodetic-Information", RULE_OPTIONAL, -1, 1 } -+ ,{ "Current-Location-Retrieved", RULE_OPTIONAL, -1, 1 } -+ ,{ "Age-Of-Location-Information", RULE_OPTIONAL, -1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* Area-Scope AVP - 3GPP TS 29.272 #7.3.138 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1624, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Area-Scope", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Cell-Global-Identity", RULE_OPTIONAL, -1, -1 } -+ ,{ "E-UTRAN-Cell-Global-Identity", RULE_OPTIONAL, -1, -1 } -+ ,{ "Routing-Area-Identity", RULE_OPTIONAL, -1, -1 } -+ ,{ "Location-Area-Identity", RULE_OPTIONAL, -1, -1 } -+ ,{ "Tracking-Area-Identity", RULE_OPTIONAL, -1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* MDT-Configuration AVP - 3GPP TS 29.272 #7.3.136 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1622, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "MDT-Configuration", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Job-Type", RULE_REQUIRED, -1, 1 } -+ ,{ "Area-Scope", RULE_OPTIONAL, -1, 1 } -+ ,{ "List-Of-Measurements", RULE_OPTIONAL, -1, 1 } -+ ,{ "Reporting-Trigger", RULE_OPTIONAL, -1, 1 } -+ ,{ "Report-Interval", RULE_OPTIONAL, -1, 1 } -+ ,{ "Report-Amount", RULE_OPTIONAL, -1, 1 } -+ ,{ "Event-Threshold-RSRP", RULE_OPTIONAL, -1, 1 } -+ ,{ "Event-Threshold-RSRQ", RULE_OPTIONAL, -1, 1 } -+ ,{ "Logging-Interval", RULE_OPTIONAL, -1, 1 } -+ ,{ "Logging-Duration", RULE_OPTIONAL, -1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* EPS-Location-Information AVP - 3GPP TS 29.272 #7.3.111 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1496, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "EPS-Location-Information", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "MME-Location-Information", RULE_OPTIONAL, -1, 1 } -+ ,{ "SGSN-Location-Information", RULE_OPTIONAL, -1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* Active-APN AVP - 3GPP TS 29.173 #7.3.127 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1612, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Active-APN", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Context-Identifier", RULE_REQUIRED, -1, 1 } -+ ,{ "Service-Selection", RULE_OPTIONAL, -1, 1 } -+ ,{ "MIP6-Agent-Info", RULE_OPTIONAL, -1, 1 } -+ ,{ "Visited-Network-Identifier", RULE_OPTIONAL, -1, 1 } -+ ,{ "Specific-APN-Info", RULE_OPTIONAL, -1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* Error-Diagnostic AVP - 3GPP TS 29.272 #7.3.128 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Error-Diagnostic)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "GPRS_DATA_SUBSCRIBED", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "NO_GPRS_DATA_SUBSCRIBED", { .i32 = 1 }}; -+ struct dict_enumval_data t_2 = { "ODB-ALL-APN", { .i32 = 2 }}; -+ struct dict_enumval_data t_3 = { "ODB-HPLMN-APN", { .i32 = 3 }}; -+ struct dict_enumval_data t_4 = { "ODB-VPLMN-APN", { .i32 = 4 }}; -+ -+ struct dict_avp_data data = { -+ 1614, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Error-Diagnostic", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_2 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_3 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_4 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* GMLC-Address AVP - 3GPP TS 29.173 #6.4.7 */ -+ { -+ struct dict_avp_data data = { -+ 2405, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "GMLC-Address", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , Address_type, NULL); -+ } -+ -+ /* Supported Features AVP - 3GPP TS 29.229 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 628, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Supported-Features", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Vendor-Id", RULE_REQUIRED, 1, 1 } -+ ,{ "Feature-List-ID", RULE_REQUIRED, 1, 1 } -+ ,{ "Feature-List", RULE_REQUIRED, 1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* Trace-Data AVP - 3GPP TS 29.272 #7.3.63 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1458, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Trace-Data", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Trace-Reference", RULE_REQUIRED, -1, 1 } -+ ,{ "Trace-Depth", RULE_REQUIRED, -1, 1 } -+ ,{ "Trace-NE-Type-List", RULE_REQUIRED, -1, 1 } -+ ,{ "Trace-Interface-List", RULE_OPTIONAL, -1, 1 } -+ ,{ "Trace-Event-List", RULE_REQUIRED, -1, 1 } -+ ,{ "OMC-Id", RULE_OPTIONAL, -1, 1 } -+ ,{ "Trace-Collection-Entity", RULE_REQUIRED, -1, 1 } -+ ,{ "MDT-Configuration", RULE_OPTIONAL, -1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* Subscription-Data AVP - 3GPP TS 29.272 #7.3.2 */ -+ { -+ /* -+ -+ * The Subscription-Data AVP is of type Grouped. It shall contain -+ * the information related to the user profile relevant for -+ * EPS and GERAN/UTRAN. -+ -+ Subscription-Data ::= <AVP header: 1400 10415> -+ [ Subscriber-Status ] -+ [ MSISDN ] -+ [ STN-SR ] -+ [ ICS-Indicator ] -+ [ Network-Access-Mode ] -+ [ Operator-Determined-Barring ] -+ [ HPLMN-ODB ] -+ *10[ Regional-Subscription-Zone-Code] -+ [ Access-Restriction-Data ] -+ [ APN-OI-Replacement ] -+ [ LCS-Info ] -+ [ Teleservice-List ] -+ [ Call-Barring-Infor-List ] -+ [ 3GPP-Charging-Characteristics ] -+ [ AMBR ] -+ [ APN-Configuration-Profile ] -+ [ RAT-Frequency-Selection-Priority-ID ] -+ [ Trace-Data] -+ [ GPRS-Subscription-Data ] -+ *[ CSG-Subscription-Data ] -+ [ Roaming-Restricted-Due-To-Unsupported-Feature ] -+ [ Subscribed-Periodic-RAU-TAU-Timer ] -+ [ MPS-Priority ] -+ [ VPLMN-LIPA-Allowed ] -+ [ Relay-Node-Indicator ] -+ [ MDT-User-Consent ] -+ *[ AVP ] -+ -+ * The AMBR included in this grouped AVP shall include the AMBR -+ * associated to the user’s subscription (UE-AMBR); -+ * Max-Requested-Bandwidth-UL and Max-Requested-Bandwidth-DL within -+ * this AVP shall not both be set to "0". -+ * The APN-OI-Replacement included in this grouped AVP shall include -+ * the UE level APN-OI-Replacement associated to the user’s subscription. -+ */ -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1400, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Subscription-Data", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Subscriber-Status", RULE_OPTIONAL, -1, 1 } -+ ,{ "MSISDN", RULE_OPTIONAL, -1, 1 } -+ ,{ "STN-SR", RULE_OPTIONAL, -1, 1 } -+ ,{ "ICS-Indicator", RULE_OPTIONAL, -1, 1 } -+ ,{ "Network-Access-Mode", RULE_OPTIONAL, -1, 1 } -+ ,{ "Operator-Determined-Barring", RULE_OPTIONAL, -1, 1 } -+ ,{ "HPLMN-ODB", RULE_OPTIONAL, -1, 1 } -+ ,{ "Regional-Subscription-Zone-Code", RULE_OPTIONAL, -1, 10 } -+ ,{ "Access-Restriction-Data", RULE_OPTIONAL, -1, 1 } -+ ,{ "APN-OI-Replacement", RULE_OPTIONAL, -1, 1 } -+ ,{ "LCS-Info", RULE_OPTIONAL, -1, 1 } -+ ,{ "Teleservice-List", RULE_OPTIONAL, -1, 1 } -+ ,{ "Call-Barring-Infor-List", RULE_OPTIONAL, -1, 1 } -+ ,{ "3GPP-Charging-Characteristics", RULE_OPTIONAL, -1, 1 } -+ ,{ "AMBR", RULE_OPTIONAL, -1, 1 } -+ ,{ "APN-Configuration-Profile", RULE_OPTIONAL, -1, 1 } -+ ,{ "RAT-Frequency-Selection-Priority-ID", RULE_OPTIONAL, -1, 1 } -+ ,{ "Trace-Data", RULE_OPTIONAL, -1, 1 } -+ ,{ "GPRS-Subscription-Data", RULE_OPTIONAL, -1, 1 } -+ ,{ "CSG-Subscription-Data", RULE_OPTIONAL, -1, -1 } -+ ,{ "Roaming-Restricted-Due-To-Unsupported-Feature", RULE_OPTIONAL, -1, 1 } -+ ,{ "Subscribed-Periodic-RAU-TAU-Timer", RULE_OPTIONAL, -1, 1 } -+ ,{ "MPS-Priority", RULE_OPTIONAL, -1, 1 } -+ ,{ "VPLMN-LIPA-Allowed", RULE_OPTIONAL, -1, 1 } -+ ,{ "Relay-Node-Indicator", RULE_OPTIONAL, -1, 1 } -+ ,{ "MDT-User-Consent", RULE_OPTIONAL, -1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* S6A-Update Location Request - 3GPP TS 29.272 #7.2.3 */ -+ { -+ /* -+ -+ The Update-Location-Request (ULR) command, indicated by the -+ Command-Code field set to 316 and the "R" bit set in -+ the Command Flags field, is sent from MME or SGSN to HSS. -+ -+ < Update-Location-Request> ::= < Diameter Header: 316, REQ, PXY, 16777251 > -+ < Session-Id > -+ [ Vendor-Specific-Application-Id ] -+ { Auth-Session-State } -+ { Origin-Host } -+ { Origin-Realm } -+ [ Destination-Host ] -+ { Destination-Realm } -+ { User-Name } -+ *[ Supported-Features ] -+ [ Terminal-Information ] -+ { RAT-Type } -+ { ULR-Flags } -+ [ UE-SRVCC-Capability ] -+ { Visited-PLMN-Id } -+ [ SGSN-Number ] -+ [ Homogeneous-Support-of-IMS-Voice-Over-PS-Sessions ] -+ [ GMLC-Address ] -+ *[ Active-APN ] -+ *[ AVP ] -+ *[ Proxy-Info ] -+ *[ Route-Record ] -+ */ -+ struct dict_object * cmd; -+ struct dict_cmd_data data = { -+ 316, /* Code */ -+ "Update-Location-Request", /* Name */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE /* Fixed flag values */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Session-Id", RULE_FIXED_HEAD, -1, 1 } -+ ,{ "Vendor-Specific-Application-Id", RULE_OPTIONAL, -1, 1 } -+ ,{ "Auth-Session-State", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Host", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "Destination-Host", RULE_OPTIONAL, -1, 1 } -+ ,{ "Destination-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "User-Name", RULE_REQUIRED, -1, 1 } -+ ,{ "Supported-Features", RULE_OPTIONAL, -1, -1 } -+ ,{ "Terminal-Information", RULE_OPTIONAL, -1, 1 } -+ ,{ "RAT-Type", RULE_REQUIRED, 1, 1 } -+ ,{ "ULR-Flags", RULE_REQUIRED, 1, 1 } -+ ,{ "UE-SRVCC-Capability", RULE_OPTIONAL, -1, 1 } -+ ,{ "Visited-PLMN-Id", RULE_REQUIRED, 1, 1 } -+ ,{ "SGSN-Number", RULE_OPTIONAL, -1, 1 } -+ ,{ "Homogeneous-Support-of-IMS-Voice-Over-PSSessions", RULE_OPTIONAL, -1, 1 } -+ ,{ "GMLC-Address", RULE_OPTIONAL, -1, 1 } -+ ,{ "Active-APN", RULE_OPTIONAL, -1, -1 } -+ ,{ "Proxy-Info", RULE_OPTIONAL, -1, -1 } -+ ,{ "Route-Record", RULE_OPTIONAL, -1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_COMMAND, &data, s6a_dict, &cmd); -+ PARSE_loc_rules( rules, cmd ); -+ } -+ -+ /* S6A-Update Location Answer - 3GPP TS 29.272 #7.2.4 */ -+ { -+ /* -+ -+ The Update-Location-Answer (ULA) command, indicated by the -+ Command-Code field set to 316 and the 'R' bit cleared -+ in the Command Flags field, is sent from HSS to MME or SGSN. -+ -+ < Update-Location-Answer> ::= < Diameter Header: 316, PXY, 16777251 > -+ < Session-Id > -+ [ Vendor-Specific-Application-Id ] -+ [ Result-Code ] -+ [ Experimental-Result ] -+ [ Error-Diagnostic ] -+ { Auth-Session-State } -+ { Origin-Host } -+ { Origin-Realm } -+ *[ Supported-Features ] -+ [ ULA-Flags ] -+ [ Subscription-Data ] -+ *[ AVP ] -+ *[ Failed-AVP ] -+ *[ Proxy-Info ] -+ *[ Route-Record ] -+ */ -+ struct dict_object * cmd; -+ struct dict_cmd_data data = { -+ 316, /* Code */ -+ "Update-Location-Answer", /* Name */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */ -+ CMD_FLAG_PROXIABLE /* Fixed flag values */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Session-Id", RULE_FIXED_HEAD, -1, 1 } -+ ,{ "Vendor-Specific-Application-Id", RULE_OPTIONAL, -1, 1 } -+ ,{ "Result-Code", RULE_OPTIONAL, -1, 1 } -+ ,{ "Experimental-Result", RULE_OPTIONAL, -1, 1 } -+ ,{ "Error-Diagnostic", RULE_OPTIONAL, -1, 1 } -+ ,{ "Auth-Session-State", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Host", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "Supported-Features", RULE_OPTIONAL, -1, -1 } -+ ,{ "ULA-Flags", RULE_OPTIONAL, -1, 1 } -+ ,{ "Subscription-Data", RULE_OPTIONAL, -1, 1 } -+ ,{ "Failed-AVP", RULE_OPTIONAL, -1, -1 } -+ ,{ "Proxy-Info", RULE_OPTIONAL, -1, -1 } -+ ,{ "Route-Record", RULE_OPTIONAL, -1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_COMMAND, &data, s6a_dict, &cmd); -+ PARSE_loc_rules( rules, cmd ); -+ } -+ -+ /* S6A-Cancel-Location-Request - 3GPP TS 29.272 #7.2.7 */ -+ { -+ /* -+ -+ The Cancel-Location-Request (CLR) command, indicated by the -+ Command-Code field set to 317 and the 'R' bit set in -+ the Command Flags field, is sent from HSS to MME or SGSN. -+ -+ < Cancel-Location-Request> ::= < Diameter Header: 317, REQ, PXY, 16777251 > -+ < Session-Id > -+ [ Vendor-Specific-Application-Id ] -+ { Auth-Session-State } -+ { Origin-Host } -+ { Origin-Realm } -+ { Destination-Host } -+ { Destination-Realm } -+ { User-Name } -+ *[Supported-Features ] -+ { Cancellation-Type } -+ *[ AVP ] -+ *[ Proxy-Info ] -+ *[ Route-Record ] -+ */ -+ struct dict_object * cmd; -+ struct dict_cmd_data data = { -+ 317, /* Code */ -+ "Cancel-Location-Request", /* Name */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE /* Fixed flag values */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Session-Id", RULE_FIXED_HEAD, -1, 1 } -+ ,{ "Vendor-Specific-Application-Id", RULE_OPTIONAL, -1, 1 } -+ ,{ "Auth-Session-State", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Host", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "Destination-Host", RULE_OPTIONAL, -1, 1 } -+ ,{ "Destination-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "User-Name", RULE_REQUIRED, -1, 1 } -+ ,{ "Supported-Features", RULE_OPTIONAL, -1, -1 } -+ ,{ "Cancellation-Type", RULE_REQUIRED, -1, 1 } -+ ,{ "Proxy-Info", RULE_OPTIONAL, -1, -1 } -+ ,{ "Route-Record", RULE_OPTIONAL, -1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_COMMAND, &data, s6a_dict, &cmd); -+ PARSE_loc_rules( rules, cmd ); -+ } -+ -+ /* S6A-Cancel-Location-Answer - 3GPP TS 29.272 #7.2.8 */ -+ { -+ /* -+ -+ The Cancel-Location-Answer (CLA) command, indicated by the -+ Command-Code field set to 317 and the 'R' bit cleared -+ in the Command Flags field, is sent from MME or SGSN to HSS. -+ -+ < Cancel-Location-Answer> ::= < Diameter Header: 317, PXY, 16777251 > -+ < Session-Id > -+ [ Vendor-Specific-Application-Id ] -+ *[ Supported-Features ] -+ [ Result-Code ] -+ [ Experimental-Result ] -+ { Auth-Session-State } -+ { Origin-Host } -+ { Origin-Realm } -+ *[ AVP ] -+ *[ Failed-AVP ] -+ *[ Proxy-Info ] -+ *[ Route-Record ] -+ */ -+ struct dict_object * cmd; -+ struct dict_cmd_data data = { -+ 317, /* Code */ -+ "Cancel-Location-Answer", /* Name */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */ -+ CMD_FLAG_PROXIABLE /* Fixed flag values */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Session-Id", RULE_FIXED_HEAD, -1, 1 } -+ ,{ "Vendor-Specific-Application-Id", RULE_OPTIONAL, -1, 1 } -+ ,{ "Supported-Features", RULE_OPTIONAL, -1, -1 } -+ ,{ "Result-Code", RULE_OPTIONAL, -1, 1 } -+ ,{ "Experimental-Result", RULE_OPTIONAL, -1, 1 } -+ ,{ "Auth-Session-State", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Host", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "Failed-AVP", RULE_OPTIONAL, -1, -1 } -+ ,{ "Proxy-Info", RULE_OPTIONAL, -1, -1 } -+ ,{ "Route-Record", RULE_OPTIONAL, -1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_COMMAND, &data, s6a_dict, &cmd); -+ PARSE_loc_rules( rules, cmd ); -+ } -+ -+ /* S6A-Authentication-Information-Request - 3GPP TS 29.272 #7.2.4 */ -+ { -+ /* -+ -+ The Authentication-Information-Request (AIR) command, indicated by -+ the Command-Code field set to 318 and the 'R' -+ bit set in the Command Flags field, is sent from MME or SGSN to HSS. -+ -+ < Authentication-Information-Request> ::= < Diameter Header: 318, REQ, PXY, 16777251 > -+ < Session-Id > -+ [ Vendor-Specific-Application-Id ] -+ { Auth-Session-State } -+ { Origin-Host } -+ { Origin-Realm } -+ [ Destination-Host ] -+ { Destination-Realm } -+ { User-Name } -+ *[ Supported-Features ] -+ [ Requested-EUTRAN-Authentication-Info ] -+ [ Requested-UTRAN-GERAN-Authentication-Info ] -+ { Visited-PLMN-Id } -+ *[ AVP ] -+ *[ Proxy-Info ] -+ *[ Route-Record ] -+ */ -+ struct dict_object * cmd; -+ struct dict_cmd_data data = { -+ 318, /* Code */ -+ "Authentication-Information-Request", /* Name */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE /* Fixed flag values */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Session-Id", RULE_FIXED_HEAD, -1, 1 } -+ ,{ "Vendor-Specific-Application-Id", RULE_OPTIONAL, -1, 1 } -+ ,{ "Auth-Session-State", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Host", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "Destination-Host", RULE_OPTIONAL, -1, 1 } -+ ,{ "Destination-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "User-Name", RULE_REQUIRED, -1, 1 } -+ ,{ "Supported-Features", RULE_OPTIONAL, -1, -1 } -+ ,{ "Requested-EUTRAN-Authentication-Info", RULE_OPTIONAL, -1, 1 } -+ ,{ "Requested-UTRAN-GERAN-Authentication-Info", RULE_OPTIONAL, -1, 1 } -+ ,{ "Visited-PLMN-Id", RULE_REQUIRED, -1, 1 } -+ ,{ "Proxy-Info", RULE_OPTIONAL, -1, -1 } -+ ,{ "Route-Record", RULE_OPTIONAL, -1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_COMMAND, &data, s6a_dict, &cmd); -+ PARSE_loc_rules( rules, cmd ); -+ } -+ -+ /* S6A-Authentication-Information-Answer - 3GPP TS 29.272 #7.2.6 */ -+ { -+ /* -+ -+ The Authentication-Information-Answer (AIA) command, indicated by -+ the Command-Code field set to318 and the 'R' bit cleared in the -+ Command Flags field, is sent from HSS to MME or SGSN. -+ -+ < Authentication-Information-Answer> ::= < Diameter Header: 318, PXY, 16777251 > -+ < Session-Id > -+ [ Vendor-Specific-Application-Id ] -+ [ Result-Code ] -+ [ Experimental-Result ] -+ [ Error-Diagnostic ] -+ { Auth-Session-State } -+ { Origin-Host } -+ { Origin-Realm } -+ *[ Supported-Features ] -+ [ Authentication-Info ] -+ *[ AVP ] -+ *[ Failed-AVP ] -+ *[ Proxy-Info ] -+ *[ Route-Record ] -+ */ -+ struct dict_object * cmd; -+ struct dict_cmd_data data = { -+ 318, /* Code */ -+ "Authentication-Information-Answer", /* Name */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */ -+ CMD_FLAG_PROXIABLE /* Fixed flag values */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Session-Id", RULE_FIXED_HEAD, -1, 1 } -+ ,{ "Vendor-Specific-Application-Id", RULE_OPTIONAL, -1, 1 } -+ ,{ "Result-Code", RULE_OPTIONAL, -1, 1 } -+ ,{ "Experimental-Result", RULE_OPTIONAL, -1, 1 } -+ ,{ "Error-Diagnostic", RULE_OPTIONAL, -1, 1 } -+ ,{ "Origin-Host", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "Supported-Features", RULE_OPTIONAL, -1, -1 } -+ ,{ "Authentication-Info", RULE_OPTIONAL, -1, 1 } -+ ,{ "Failed-AVP", RULE_OPTIONAL, -1, -1 } -+ ,{ "Proxy-Info", RULE_OPTIONAL, -1, -1 } -+ ,{ "Route-Record", RULE_OPTIONAL, -1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_COMMAND, &data, s6a_dict, &cmd); -+ PARSE_loc_rules( rules, cmd ); -+ } -+ -+ /* Insert-Subscriber-Data-Request IDR Command - 3GPP TS 29.272 #7.2.9 */ -+ { -+ /* -+ -+ The Insert-Subscriber-Data-Request (IDR) command, indicated by the -+ Command-Code field set to 319 and the 'R' bit set in the Command -+ Flags field, is sent from HSS to MME or SGSN. -+ -+ < Insert-Subscriber-Data-Request> ::= < Diameter Header: 319, REQ, PXY, 16777251 > -+ < Session-Id > -+ [ Vendor-Specific-Application-Id ] -+ { Auth-Session-State } -+ { Origin-Host } -+ { Origin-Realm } -+ { Destination-Host } -+ { Destination-Realm } -+ { User-Name } -+ *[ Supported-Features] -+ { Subscription-Data} -+ [IDR- Flags ] -+ *[ AVP ] -+ *[ Proxy-Info ] -+ *[ Route-Record ] -+ */ -+ struct dict_object * cmd; -+ struct dict_cmd_data data = { -+ 319, /* Code */ -+ "Insert-Subscriber-Data-Request", /* Name */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE /* Fixed flag values */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Session-Id", RULE_FIXED_HEAD, -1, 1 } -+ ,{ "Vendor-Specific-Application-Id", RULE_OPTIONAL, -1, 1 } -+ ,{ "Auth-Session-State", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Host", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "Destination-Host", RULE_REQUIRED, -1, 1 } -+ ,{ "Destination-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "User-Name", RULE_REQUIRED, -1, 1 } -+ ,{ "Supported-Features", RULE_OPTIONAL, -1, -1 } -+ ,{ "Subscription-Data", RULE_REQUIRED, -1, 1 } -+ ,{ "IDR-Flags", RULE_OPTIONAL, -1, 1 } -+ ,{ "Proxy-Info", RULE_OPTIONAL, -1, -1 } -+ ,{ "Route-Record", RULE_OPTIONAL, -1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_COMMAND, &data, s6a_dict, &cmd); -+ PARSE_loc_rules( rules, cmd ); -+ } -+ -+ /* Insert-Subscriber-Data-Answer IDA Command - 3GPP TS 29.272 #7.2.10 */ -+ { -+ /* -+ -+ The Insert-Subscriber-Data-Request (IDR) command, indicated by the -+ Command-Code field set to 319 and the 'R' bit set in the Command -+ Flags field, is sent from HSS to MME or SGSN. -+ -+ < Insert-Subscriber-Data-Answer> ::= < Diameter Header: 319, PXY, 16777251 > -+ < Session-Id > -+ [ Vendor-Specific-Application-Id ] -+ *[ Supported-Features ] -+ [ Result-Code ] -+ [ Experimental-Result ] -+ { Auth-Session-State } -+ { Origin-Host } -+ { Origin-Realm } -+ [ IMS-Voice-Over-PS-Sessions-Supported ] -+ [ Last-UE-Activity-Time ] -+ [ RAT-Type ] -+ [ IDA-Flags ] -+ [ EPS-User-State ] -+ [ EPS-Location-Information ] -+ *[ AVP ] -+ *[ Failed-AVP ] -+ *[ Proxy-Info ] -+ *[ Route-Record ] -+ */ -+ struct dict_object * cmd; -+ struct dict_cmd_data data = { -+ 319, /* Code */ -+ "Insert-Subscriber-Data-Answer", /* Name */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */ -+ CMD_FLAG_PROXIABLE /* Fixed flag values */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Session-Id", RULE_FIXED_HEAD, -1, 1 } -+ ,{ "Vendor-Specific-Application-Id", RULE_OPTIONAL, -1, 1 } -+ ,{ "Supported-Features", RULE_OPTIONAL, -1, -1 } -+ ,{ "Result-Code", RULE_OPTIONAL, -1, 1 } -+ ,{ "Experimental-Result", RULE_OPTIONAL, -1, 1 } -+ ,{ "Auth-Session-State", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Host", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "IMS-Voice-Over-PS-Sessions-Supported", RULE_OPTIONAL, -1, 1 } -+ ,{ "Last-UE-Activity-Time", RULE_OPTIONAL, -1, 1 } -+ ,{ "RAT-Type", RULE_OPTIONAL, -1, 1 } -+ ,{ "IDA-Flags", RULE_OPTIONAL, -1, 1 } -+ ,{ "EPS-User-State", RULE_OPTIONAL, -1, 1 } -+ ,{ "EPS-Location-Information", RULE_OPTIONAL, -1, 1 } -+ ,{ "Failed-AVP", RULE_OPTIONAL, -1, -1 } -+ ,{ "Proxy-Info", RULE_OPTIONAL, -1, -1 } -+ ,{ "Route-Record", RULE_OPTIONAL, -1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_COMMAND, &data, s6a_dict, &cmd); -+ PARSE_loc_rules( rules, cmd ); -+ } -+ -+ /* Delete-Subscriber-Data-Request (DSR) Command - 3GPP TS 29.272 #7.2.11 */ -+ { -+ /* -+ -+ The Delete-SubscriberData-Request (DSR) command, indicated by -+ the Command-Code field set to 320 and the 'R' bit -+ set in the Command Flags field, is sent from HSS to MME or SGSN. -+ -+ < Delete-Subscriber-Data-Request > ::= < Diameter Header: 320, REQ, PXY, 16777251 > -+ < Session-Id > -+ [ Vendor-Specific-Application-Id ] -+ { Auth-Session-State } -+ { Origin-Host } -+ { Origin-Realm } -+ { Destination-Host } -+ { Destination-Realm } -+ { User-Name } -+ *[ Supported-Features ] -+ { DSR-Flags } -+ *[ Context-Identifier ] -+ [ Trace-Reference ] -+ *[ TS-Code ] -+ *[ SS-Code ] -+ *[ AVP ] -+ *[ Proxy-Info ] -+ *[ Route-Record ] -+ */ -+ struct dict_object * cmd; -+ struct dict_cmd_data data = { -+ 320, /* Code */ -+ "Delete-SubscriberData-Request", /* Name */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE /* Fixed flag values */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Session-Id", RULE_FIXED_HEAD, -1, 1 } -+ ,{ "Vendor-Specific-Application-Id", RULE_OPTIONAL, -1, 1 } -+ ,{ "Auth-Session-State", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Host", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "Destination-Host", RULE_REQUIRED, -1, 1 } -+ ,{ "Destination-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "User-Name", RULE_REQUIRED, -1, 1 } -+ ,{ "Supported-Features", RULE_OPTIONAL, -1, -1 } -+ ,{ "DSR-Flags", RULE_REQUIRED, -1, 1 } -+ ,{ "Context-Identifier", RULE_OPTIONAL, -1, -1 } -+ ,{ "Trace-Reference", RULE_OPTIONAL, -1, 1 } -+ ,{ "TS-Code", RULE_OPTIONAL, -1, -1 } -+ ,{ "SS-Code", RULE_OPTIONAL, -1, -1 } -+ ,{ "Proxy-Info", RULE_OPTIONAL, -1, -1 } -+ ,{ "Route-Record", RULE_OPTIONAL, -1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_COMMAND, &data, s6a_dict, &cmd); -+ PARSE_loc_rules( rules, cmd ); -+ } -+ -+ /* Delete-Subscriber-Data-Answer (DSA) Command - 3GPP TS 29.272 #7.2.12 */ -+ { -+ /* -+ -+ The Delete-SubscriberData-Answer (DSA) command, indicated by the -+ Command-Code field set to 320 and the 'R' bit -+ cleared in the Command Flags field, is sent from MME or SGSN to HSS. -+ -+ < Delete-Subscriber-Data-Answer> ::= < Diameter Header: 320, PXY, 16777251 > -+ < Session-Id > -+ [ Vendor-Specific-Application-Id ] -+ *[ Supported-Features ] -+ [ Result-Code ] -+ [ Experimental-Result ] -+ { Auth-Session-State } -+ { Origin-Host } -+ { Origin-Realm } -+ [ DSA-Flags ] -+ *[ AVP ] -+ *[ Failed-AVP ] -+ *[ Proxy-Info ] -+ *[ Route-Record ] -+ */ -+ struct dict_object * cmd; -+ struct dict_cmd_data data = { -+ 320, /* Code */ -+ "Delete-SubscriberData-Answer", /* Name */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */ -+ CMD_FLAG_PROXIABLE /* Fixed flag values */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Session-Id", RULE_FIXED_HEAD, -1, 1 } -+ ,{ "Vendor-Specific-Application-Id", RULE_OPTIONAL, -1, 1 } -+ ,{ "Supported-Features", RULE_OPTIONAL, -1, -1 } -+ ,{ "Result-Code", RULE_OPTIONAL, -1, 1 } -+ ,{ "Experimental-Result", RULE_OPTIONAL, -1, 1 } -+ ,{ "Auth-Session-State", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Host", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "DSA-Flags", RULE_OPTIONAL, -1, 1 } -+ ,{ "Proxy-Info", RULE_OPTIONAL, -1, -1 } -+ ,{ "Route-Record", RULE_OPTIONAL, -1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_COMMAND, &data, s6a_dict, &cmd); -+ PARSE_loc_rules( rules, cmd ); -+ } -+ -+ /* Purge-UE-Request (PUR) Command - 3GPP TS 29.272 #7.2.13 */ -+ { -+ /* -+ -+ The Delete-SubscriberData-Request (DSR) command, indicated by -+ the Command-Code field set to 320 and the 'R' bit -+ set in the Command Flags field, is sent from HSS to MME or SGSN. -+ -+ < Purge-UE-Request> ::= < Diameter Header: 321, REQ, PXY, 16777251 > -+ < Session-Id > -+ [ Vendor-Specific-Application-Id ] -+ { Auth-Session-State } -+ { Origin-Host } -+ { Origin-Realm } -+ [ Destination-Host ] -+ { Destination-Realm } -+ { User-Name } -+ [ PUR-Flags ] -+ *[ Supported-Features ] -+ *[ AVP ] -+ *[ Proxy-Info ] -+ *[ Route-Record ] -+ */ -+ struct dict_object * cmd; -+ struct dict_cmd_data data = { -+ 321, /* Code */ -+ "Purge-UE-Request", /* Name */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE /* Fixed flag values */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Session-Id", RULE_FIXED_HEAD, -1, 1 } -+ ,{ "Vendor-Specific-Application-Id", RULE_OPTIONAL, -1, 1 } -+ ,{ "Auth-Session-State", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Host", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "Destination-Host", RULE_OPTIONAL, -1, 1 } -+ ,{ "Destination-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "User-Name", RULE_REQUIRED, -1, 1 } -+ ,{ "PUR-Flags", RULE_OPTIONAL, -1, 1 } -+ ,{ "Supported-Features", RULE_OPTIONAL, -1, -1 } -+ ,{ "Proxy-Info", RULE_OPTIONAL, -1, -1 } -+ ,{ "Route-Record", RULE_OPTIONAL, -1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_COMMAND, &data, s6a_dict, &cmd); -+ PARSE_loc_rules( rules, cmd ); -+ } -+ -+ /* Purge-UE-Answer (PUA) Command - 3GPP TS 29.272 #7.2.14 */ -+ { -+ /* -+ -+ The Purge-UE-Answer (PUA) command, indicated by the Command-Code -+ field set to 321 and the 'R' bit cleared in the -+ Command Flags field, is sent from HSS to MME or SGSN. -+ -+ < Purge-UE-Answer> ::= < Diameter Header: 321, PXY, 16777251 > -+ < Session-Id > -+ [ Vendor-Specific-Application-Id ] -+ *[ Supported-Features ] -+ [ Result-Code ] -+ [ Experimental-Result ] -+ { Auth-Session-State } -+ { Origin-Host } -+ { Origin-Realm } -+ [ PUA-Flags ] -+ *[ AVP ] -+ *[ Failed-AVP ] -+ *[ Proxy-Info ] -+ *[ Route-Record ] -+ */ -+ struct dict_object * cmd; -+ struct dict_cmd_data data = { -+ 321, /* Code */ -+ "Purge-UE-Answer", /* Name */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */ -+ CMD_FLAG_PROXIABLE /* Fixed flag values */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Session-Id", RULE_FIXED_HEAD, -1, 1 } -+ ,{ "Vendor-Specific-Application-Id", RULE_OPTIONAL, -1, 1 } -+ ,{ "Supported-Features", RULE_OPTIONAL, -1, -1 } -+ ,{ "Result-Code", RULE_OPTIONAL, -1, 1 } -+ ,{ "Experimental-Result", RULE_OPTIONAL, -1, 1 } -+ ,{ "Auth-Session-State", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Host", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "PUA-Flags", RULE_OPTIONAL, -1, 1 } -+ ,{ "Failed-AVP", RULE_OPTIONAL, -1, -1 } -+ ,{ "Proxy-Info", RULE_OPTIONAL, -1, -1 } -+ ,{ "Route-Record", RULE_OPTIONAL, -1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_COMMAND, &data, s6a_dict, &cmd); -+ PARSE_loc_rules( rules, cmd ); -+ } -+ -+ /* Reset-Request (RSR) Command - 3GPP TS 29.272 #7.2.15 */ -+ { -+ /* -+ -+ The Reset-Request (RSR) command, indicated by the Command-Code -+ field set to 322 and the 'R' bit set in the -+ Command Flags field, is sent from HSS to MME or SGSN. -+ -+ < Reset-Request> ::= < Diameter Header: 322, REQ, PXY, 16777251 > -+ < Session-Id > -+ [ Vendor-Specific-Application-Id ] -+ { Auth-Session-State } -+ { Origin-Host } -+ { Origin-Realm } -+ { Destination-Host } -+ { Destination-Realm } -+ *[ Supported-Features ] -+ *[ User-Id ] -+ *[ AVP ] -+ *[ Proxy-Info ] -+ *[ Route-Record ] -+ */ -+ struct dict_object * cmd; -+ struct dict_cmd_data data = { -+ 322, /* Code */ -+ "Reset-Request", /* Name */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE /* Fixed flag values */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Session-Id", RULE_FIXED_HEAD, -1, 1 } -+ ,{ "Vendor-Specific-Application-Id", RULE_OPTIONAL, -1, 1 } -+ ,{ "Auth-Session-State", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Host", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "Destination-Host", RULE_REQUIRED, -1, 1 } -+ ,{ "Destination-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "Supported-Features", RULE_OPTIONAL, -1, -1 } -+ ,{ "User-Id", RULE_OPTIONAL, -1, -1 } -+ ,{ "Proxy-Info", RULE_OPTIONAL, -1, -1 } -+ ,{ "Route-Record", RULE_OPTIONAL, -1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_COMMAND, &data, s6a_dict, &cmd); -+ PARSE_loc_rules( rules, cmd ); -+ } -+ -+ /* Reset-Answer (RSA) Command - 3GPP TS 29.272 #7.2.16 */ -+ { -+ /* -+ -+ The Authentication-Information-Answer (RSA) command, indicated by -+ the Command-Code field set to 322 and the 'R' -+ bit cleared in the Command Flags field, is sent from MME or SGSN to HSS. -+ -+ < Reset-Answer> ::= < Diameter Header: 322, PXY, 16777251 > -+ < Session-Id > -+ [ Vendor-Specific-Application-Id ] -+ *[ Supported-Features ] -+ [ Result-Code ] -+ [ Experimental-Result ] -+ { Auth-Session-State } -+ { Origin-Host } -+ { Origin-Realm } -+ *[ AVP ] -+ *[ Failed-AVP ] -+ *[ Proxy-Info ] -+ *[ Route-Record ] -+ */ -+ struct dict_object * cmd; -+ struct dict_cmd_data data = { -+ 322, /* Code */ -+ "Reset-Anwer", /* Name */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */ -+ CMD_FLAG_PROXIABLE /* Fixed flag values */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Session-Id", RULE_FIXED_HEAD, -1, 1 } -+ ,{ "Vendor-Specific-Application-Id", RULE_OPTIONAL, -1, 1 } -+ ,{ "Supported-Features", RULE_OPTIONAL, -1, -1 } -+ ,{ "Result-Code", RULE_OPTIONAL, -1, 1 } -+ ,{ "Experimental-Result", RULE_OPTIONAL, -1, 1 } -+ ,{ "Auth-Session-State", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Host", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "Failed-AVP", RULE_OPTIONAL, -1, -1 } -+ ,{ "Proxy-Info", RULE_OPTIONAL, -1, -1 } -+ ,{ "Route-Record", RULE_OPTIONAL, -1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_COMMAND, &data, s6a_dict, &cmd); -+ PARSE_loc_rules( rules, cmd ); -+ } -+ -+ /* Notify-Request (NOR) Command - 3GPP TS 29.272 #7.2.17 */ -+ { -+ /* -+ -+ The Notify-Request (NOR) command, indicated by the Command-Code -+ field set to 323 and the 'R' bit set in the Command Flags field, -+ is sent from MME or SGSN to HSS. -+ -+ < Notify-Request> ::= < Diameter Header: 323, REQ, PXY, 16777251 > -+ < Session-Id > -+ [ Vendor-Specific-Application-Id ] -+ { Auth-Session-State } -+ { Origin-Host } -+ { Origin-Realm } -+ [ Destination-Host ] -+ { Destination-Realm } -+ { User-Name } -+ *[ Supported-Features ] -+ [ Terminal-Information ] -+ [ MIP6-Agent-Info ] -+ [ Visited-Network-Identifier ] -+ [ Context-Identifier ] -+ [ Service-Selection ] -+ [ Alert-Reason ] -+ [ UE-SRVCC-Capability ] -+ [ NOR-Flags ] -+ *[ AVP ] -+ *[ Proxy-Info ] -+ *[ Route-Record ] -+ */ -+ struct dict_object * cmd; -+ struct dict_cmd_data data = { -+ 323, /* Code */ -+ "Notify-Request", /* Name */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE /* Fixed flag values */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Session-Id", RULE_FIXED_HEAD, -1, 1 } -+ ,{ "Vendor-Specific-Application-Id", RULE_OPTIONAL, -1, 1 } -+ ,{ "Auth-Session-State", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Host", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "Destination-Host", RULE_OPTIONAL, -1, 1 } -+ ,{ "Destination-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "User-Name", RULE_REQUIRED, -1, 1 } -+ ,{ "Supported-Features", RULE_OPTIONAL, -1, -1 } -+ ,{ "Terminal-Information", RULE_OPTIONAL, -1, 1 } -+ ,{ "MIP6-Agent-Info", RULE_OPTIONAL, -1, 1 } -+ ,{ "Visited-Network-Identifier", RULE_OPTIONAL, -1, 1 } -+ ,{ "Context-Identifier", RULE_OPTIONAL, -1, 1 } -+ ,{ "Service-Selection", RULE_OPTIONAL, -1, 1 } -+ ,{ "Alert-Reason", RULE_OPTIONAL, -1, 1 } -+ ,{ "UE-SRVCC-Capability", RULE_OPTIONAL, -1, 1 } -+ ,{ "NOR-Flags", RULE_OPTIONAL, -1, 1 } -+ ,{ "Proxy-Info", RULE_OPTIONAL, -1, -1 } -+ ,{ "Route-Record", RULE_OPTIONAL, -1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_COMMAND, &data, s6a_dict, &cmd); -+ PARSE_loc_rules( rules, cmd ); -+ } -+ -+ /* Notify-Answer (NOA) Command - 3GPP TS 29.272 #7.2.18 */ -+ { -+ /* -+ -+ The Notify-Answer (NOA) command, indicated by the Command-Code -+ field set to 323 and the 'R' bit cleared in the -+ Command Flags field, is sent from HSS to MME or SGSN. -+ -+ < Notify-Answer> ::= < Diameter Header: 323, PXY, 16777251 > -+ < Session-Id > -+ [ Vendor-Specific-Application-Id ] -+ [ Result-Code ] -+ [ Experimental-Result ] -+ { Auth-Session-State } -+ { Origin-Host } -+ { Origin-Realm } -+ *[ Supported-Features ] -+ *[ AVP ] -+ *[ Failed-AVP ] -+ *[ Proxy-Info ] -+ *[ Route-Record ] -+ */ -+ struct dict_object * cmd; -+ struct dict_cmd_data data = { -+ 323, /* Code */ -+ "Notify-Answer", /* Name */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */ -+ CMD_FLAG_PROXIABLE /* Fixed flag values */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Session-Id", RULE_FIXED_HEAD, -1, 1 } -+ ,{ "Vendor-Specific-Application-Id", RULE_OPTIONAL, -1, 1 } -+ ,{ "Result-Code", RULE_OPTIONAL, -1, 1 } -+ ,{ "Experimental-Result", RULE_OPTIONAL, -1, 1 } -+ ,{ "Auth-Session-State", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Host", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "Supported-Features", RULE_OPTIONAL, -1, -1 } -+ ,{ "Failed-AVP", RULE_OPTIONAL, -1, -1 } -+ ,{ "Proxy-Info", RULE_OPTIONAL, -1, -1 } -+ ,{ "Route-Record", RULE_OPTIONAL, -1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_COMMAND, &data, s6a_dict, &cmd); -+ PARSE_loc_rules( rules, cmd ); -+ } -+ -+ /* ME-Identity-Check-Request (ECR) Command - 3GPP TS 29.272 #7.2.19 */ -+ { -+ /* -+ -+ The ME-Identity-Check-Request (ECR) command, indicated by the -+ Command-Code field set to 324 and the 'R' bit set -+ in the Command Flags field, is sent from MME or SGSN to EIR. -+ -+ < ME-Identity-Check-Request > ::= < Diameter Header: 324, REQ, PXY, 16777252 > -+ < Session-Id > -+ [ Vendor-Specific-Application-Id ] -+ { Auth-Session-State } -+ { Origin-Host } -+ { Origin-Realm } -+ [ Destination-Host ] -+ { Destination-Realm } -+ { Terminal-Information } -+ [ User-Name ] -+ *[ AVP ] -+ *[ Proxy-Info ] -+ *[ Route-Record ] -+ */ -+ struct dict_object * cmd; -+ struct dict_cmd_data data = { -+ 324, /* Code */ -+ "ME-Identity-Check-Request", /* Name */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE /* Fixed flag values */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Session-Id", RULE_FIXED_HEAD, -1, 1 } -+ ,{ "Vendor-Specific-Application-Id", RULE_OPTIONAL, -1, 1 } -+ ,{ "Auth-Session-State", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Host", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "Destination-Host", RULE_OPTIONAL, -1, 1 } -+ ,{ "Destination-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "Terminal-Information", RULE_REQUIRED, -1, 1 } -+ ,{ "User-Name", RULE_OPTIONAL, -1, 1 } -+ ,{ "Proxy-Info", RULE_OPTIONAL, -1, -1 } -+ ,{ "Route-Record", RULE_OPTIONAL, -1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_COMMAND, &data, s6a_dict, &cmd); -+ PARSE_loc_rules( rules, cmd ); -+ } -+ -+ /* ME-Identity-Check-Answer (ECA) Command - 3GPP TS 29.272 #7.2.20 */ -+ { -+ /* -+ -+ The ME-Identity-Check-Answer (ECA) command, indicated by the -+ Command-Code field set to 324 and the 'R' bit -+ cleared in the Command Flags field, is sent from EIR to MME or SGSN. -+ -+ < ME-Identity-Check-Answer> ::= < Diameter Header: 324, PXY, 16777252 > -+ < Session-Id > -+ [ Vendor-Specific-Application-Id ] -+ [ Result-Code ] -+ [ Experimental-Result ] -+ { Auth-Session-State } -+ { Origin-Host } -+ { Origin-Realm } -+ [ Equipment-Status ] -+ *[ AVP ] -+ *[ Failed-AVP ] -+ *[ Proxy-Info ] -+ *[ Route-Record ] -+ */ -+ struct dict_object * cmd; -+ struct dict_cmd_data data = { -+ 324, /* Code */ -+ "ME-Identity-Check-Answer", /* Name */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */ -+ CMD_FLAG_PROXIABLE /* Fixed flag values */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Session-Id", RULE_FIXED_HEAD, -1, 1 } -+ ,{ "Vendor-Specific-Application-Id", RULE_OPTIONAL, -1, 1 } -+ ,{ "Result-Code", RULE_OPTIONAL, -1, 1 } -+ ,{ "Experimental-Result", RULE_OPTIONAL, -1, 1 } -+ ,{ "Auth-Session-State", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Host", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "Equipment-Status", RULE_OPTIONAL, -1, 1 } -+ ,{ "User-Name", RULE_OPTIONAL, -1, 1 } -+ ,{ "Failed-AVP", RULE_OPTIONAL, -1, -1 } -+ ,{ "Proxy-Info", RULE_OPTIONAL, -1, -1 } -+ ,{ "Route-Record", RULE_OPTIONAL, -1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_COMMAND, &data, s6a_dict, &cmd); -+ PARSE_loc_rules( rules, cmd ); -+ } -+ } -+ -+ TRACE_DEBUG(INFO, "Dictionary Extension 'S6A from 3GPP standard v.10.5' initialized"); -+ return 0; -+} -+EXTENSION_ENTRY("dict_s6a", dict_s6a_init, "dict_nas_mipv6"); -diff -NaurB -x '*~' -x build freeDiameter-1.1.5-unmodified/include/freeDiameter/freeDiameter-host.h.in freeDiameter-1.1.5/include/freeDiameter/freeDiameter-host.h.in ---- freeDiameter-1.1.5-unmodified/include/freeDiameter/freeDiameter-host.h.in 2012-11-03 18:45:41.000000000 +0100 -+++ freeDiameter-1.1.5/include/freeDiameter/freeDiameter-host.h.in 2013-02-12 10:56:29.411429498 +0100 -@@ -37,6 +37,9 @@ - #ifndef FD_IS_CONFIG - #define FD_IS_CONFIG - -+#if HAVE_CONFIG_H -+# include "config.h" -+#else - #cmakedefine HAVE_NTOHLL - #cmakedefine HAVE_MALLOC_H - #cmakedefine HAVE_SIGNALENT_H -@@ -57,6 +60,7 @@ - #cmakedefine GNUTLS_VERSION_210 - #cmakedefine GNUTLS_VERSION_300 - #cmakedefine GNUTLS_VERSION_310 -+#endif /* !HAVE_CONFIG_H */ - - #cmakedefine ERRORS_ON_TODO - #cmakedefine DEBUG -diff -NaurB -x '*~' -x build freeDiameter-1.1.5-unmodified/include/freeDiameter/libfdproto.h freeDiameter-1.1.5/include/freeDiameter/libfdproto.h ---- freeDiameter-1.1.5-unmodified/include/freeDiameter/libfdproto.h 2012-11-03 18:45:41.000000000 +0100 -+++ freeDiameter-1.1.5/include/freeDiameter/libfdproto.h 2013-02-05 13:46:06.683419353 +0100 -@@ -499,7 +499,7 @@ - TRACE_DEBUG_ALL( "Check FCT: " #__call__ ); \ - __ret__ = (__call__); \ - if (__ret__ != 0) { \ -- TRACE_DEBUG_ERROR("ERROR: in '" #__call__ "':\t%s", strerror(__ret__)); \ -+ TRACE_DEBUG_ERROR("ERROR: in %s:%d'" #__call__ "':\t%s", __FILE__, __LINE__, strerror(__ret__)); \ - __fallback__; \ - } \ - } - -diff -NaurB -x '*~' -x build freeDiameter-1.1.5-unmodified/libfdproto/messages.c freeDiameter-1.1.5/libfdproto/messages.c ---- freeDiameter-1.1.5-unmodified/libfdproto/messages.c 2012-11-03 18:45:41.000000000 +0100 -+++ freeDiameter-1.1.5/libfdproto/messages.c 2013-02-14 14:41:42.281217289 +0100 -@@ -967,8 +967,12 @@ - - /* Check the parameters */ - CHECK_PARAMS( CHECK_MSG(msg) ); -- CHECK_PARAMS( msg->msg_public.msg_flags & CMD_FLAG_REQUEST ); /* we associate with requests only */ -+// CHECK_PARAMS( msg->msg_public.msg_flags & CMD_FLAG_REQUEST ); /* we associate with requests only */ - CHECK_PARAMS( (anscb == NULL) || (msg->msg_cb.fct == NULL) ); /* We are not overwritting a cb */ -+ /* No need to associate a callback with an answer. */ -+ if ((msg->msg_public.msg_flags & CMD_FLAG_REQUEST) == 0) { -+ return 0; -+ } - - /* Associate callback and data with the message, if any */ - msg->msg_cb.fct = anscb; diff --git a/openair-cn/S6A/freediameter/freediameter-1.2.0.patch b/openair-cn/S6A/freediameter/freediameter-1.2.0.patch deleted file mode 100644 index 1474f12138..0000000000 --- a/openair-cn/S6A/freediameter/freediameter-1.2.0.patch +++ /dev/null @@ -1,4245 +0,0 @@ -diff -rupN freeDiameter-1.2.0/extensions/CMakeLists.txt freeDiameter-1.2.0.yang/extensions/CMakeLists.txt ---- freeDiameter-1.2.0/extensions/CMakeLists.txt 2013-09-14 12:09:01.000000000 +0200 -+++ freeDiameter-1.2.0.yang/extensions/CMakeLists.txt 2015-03-17 15:47:15.237308388 +0100 -@@ -36,6 +36,7 @@ INCLUDE_DIRECTORIES(${LFDCORE_INCLUDES}) - #### - # Diameter applications dictionaries - -+FD_EXTENSION_SUBDIR(dict_s6a "3GPP S6A TS.29.279-990" ON) - FD_EXTENSION_SUBDIR(dict_nasreq "NASREQ (RFC4005) Dictionary definitions" ON) - FD_EXTENSION_SUBDIR(dict_eap "Diameter EAP (RFC4072) Dictionary definitions" ON) - -diff -rupN freeDiameter-1.2.0/extensions/dict_s6a/CMakeLists.txt freeDiameter-1.2.0.yang/extensions/dict_s6a/CMakeLists.txt ---- freeDiameter-1.2.0/extensions/dict_s6a/CMakeLists.txt 1970-01-01 01:00:00.000000000 +0100 -+++ freeDiameter-1.2.0.yang/extensions/dict_s6a/CMakeLists.txt 2015-03-17 15:22:46.729309000 +0100 -@@ -0,0 +1,14 @@ -+# The dict_rfc5777 extension -+PROJECT("S6a protocol based on 3GPP 29.272-990" C) -+ -+# Compile as a module -+FD_ADD_EXTENSION(dict_s6a dict_s6a.c) -+ -+ -+#### -+## INSTALL section ## -+ -+INSTALL(TARGETS dict_s6a -+ LIBRARY DESTINATION ${INSTALL_EXTENSIONS_SUFFIX} -+ COMPONENT freeDiameter-dictionary-s6a) -+ -diff -rupN freeDiameter-1.2.0/extensions/dict_s6a/dict_s6a.c freeDiameter-1.2.0.yang/extensions/dict_s6a/dict_s6a.c ---- freeDiameter-1.2.0/extensions/dict_s6a/dict_s6a.c 1970-01-01 01:00:00.000000000 +0100 -+++ freeDiameter-1.2.0.yang/extensions/dict_s6a/dict_s6a.c 2015-03-17 15:22:46.729309000 +0100 -@@ -0,0 +1,4212 @@ -+/********************************************************************************************************* -+* Software License Agreement (BSD License) * -+* Author: Sebastien ROUX <sebastien.roux@eurecom.fr> * -+* * -+* Copyright (c) 2013, Eurecom * -+* All rights reserved. * -+* * -+* Redistribution and use of this software in source and binary forms, with or without modification, are * -+* permitted provided that the following conditions are met: * -+* * -+* * Redistributions of source code must retain the above * -+* copyright notice, this list of conditions and the * -+* following disclaimer. * -+* * -+* * Redistributions in binary form must reproduce the above * -+* copyright notice, this list of conditions and the * -+* following disclaimer in the documentation and/or other * -+* materials provided with the distribution. * -+* * -+* * Neither the name of the Teraoka Laboratory nor the * -+* names of its contributors may be used to endorse or * -+* promote products derived from this software without * -+* specific prior written permission of Teraoka Laboratory * -+* * -+* * -+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED * -+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * -+* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * -+* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * -+* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * -+* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * -+* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * -+* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * -+*********************************************************************************************************/ -+ -+#include <freeDiameter/extension.h> -+ -+/* The content of this file follows the same structure as dict_base_proto.c */ -+ -+#define CHECK_dict_new( _type, _data, _parent, _ref ) \ -+ CHECK_FCT( fd_dict_new( fd_g_config->cnf_dict, (_type), (_data), (_parent), (_ref)) ); -+ -+#define CHECK_dict_search( _type, _criteria, _what, _result ) \ -+ CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, (_type), (_criteria), (_what), (_result), ENOENT) ); -+ -+struct local_rules_definition { -+ char *avp_name; -+ enum rule_position position; -+ int min; -+ int max; -+}; -+ -+#define RULE_ORDER( _position ) ((((_position) == RULE_FIXED_HEAD) || ((_position) == RULE_FIXED_TAIL)) ? 1 : 0 ) -+ -+#define PARSE_loc_rules( _rulearray, _parent) { \ -+ int __ar; \ -+ for (__ar=0; __ar < sizeof(_rulearray) / sizeof((_rulearray)[0]); __ar++) { \ -+ struct dict_rule_data __data = { NULL, \ -+ (_rulearray)[__ar].position, \ -+ 0, \ -+ (_rulearray)[__ar].min, \ -+ (_rulearray)[__ar].max}; \ -+ __data.rule_order = RULE_ORDER(__data.rule_position); \ -+ CHECK_FCT( fd_dict_search( \ -+ fd_g_config->cnf_dict, \ -+ DICT_AVP, \ -+ AVP_BY_NAME_ALL_VENDORS, \ -+ (_rulearray)[__ar].avp_name, \ -+ &__data.rule_avp, 0 ) ); \ -+ if ( !__data.rule_avp ) { \ -+ TRACE_DEBUG(INFO, "AVP Not found: '%s'", (_rulearray)[__ar].avp_name ); \ -+ return ENOENT; \ -+ } \ -+ CHECK_FCT_DO( fd_dict_new( fd_g_config->cnf_dict, DICT_RULE, &__data, _parent, NULL), \ -+ { \ -+ TRACE_DEBUG(INFO, "Error on rule with AVP '%s'", \ -+ (_rulearray)[__ar].avp_name ); \ -+ return EINVAL; \ -+ } ); \ -+ } \ -+} -+ -+#define enumval_def_u32( _val_, _str_ ) \ -+ { _str_, { .u32 = _val_ }} -+ -+#define enumval_def_os( _len_, _val_, _str_ ) \ -+ { _str_, { .os = { .data = (unsigned char *)_val_, .len = _len_ }}} -+ -+/* Defines if there are any */ -+ -+/* Dictionary */ -+ -+int dict_s6a_init(char * conffile) -+{ -+#define VENDOR_3GPP_Id 10415 -+ -+ TRACE_ENTRY("%p", conffile); -+ -+ struct dict_object * vendor_dict; -+ { -+ struct dict_vendor_data vendor_data = { VENDOR_3GPP_Id, "3GPP" }; -+ CHECK_dict_new (DICT_VENDOR, &vendor_data, NULL, &vendor_dict); -+ } -+ -+ struct dict_object * s6a_dict; -+ { -+ struct dict_application_data data = { 16777251, "Diameter S6a 3GPP" }; -+ CHECK_dict_new( DICT_APPLICATION, &data , NULL, &s6a_dict); -+ } -+ -+ /* AVP section */ -+ { -+ /* Loading the derived data formats */ -+ -+ struct dict_object * Time_type; -+ struct dict_object * Address_type; -+ struct dict_object * UTF8String_type; -+ -+ CHECK_dict_search( DICT_TYPE, TYPE_BY_NAME, "Time", &Time_type); -+ CHECK_dict_search( DICT_TYPE, TYPE_BY_NAME, "Address", &Address_type); -+ CHECK_dict_search( DICT_TYPE, TYPE_BY_NAME, "UTF8String", &UTF8String_type); -+ -+ /* 3GPP-Charging-Characteristics */ -+ { -+ struct dict_avp_data data = { -+ 13, /* Code */ -+ 0, /* Vendor */ -+ "3GPP-Charging-Characteristics", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , UTF8String_type, NULL); -+ } -+ -+ /* Service-Selection - RFC 5778 */ -+ { -+ struct dict_avp_data data = { -+ 493, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor , EURECOM: with FD 1.2.0 does not work if vendor ID is 0 for this AVP*/ -+ "Service-Selection", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , UTF8String_type, NULL); -+ } -+ -+ /* Max-Requested-Bandwidth-DL AVP - 3GPP TS 29.214 #5.3.14 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 515, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Max-Requested-Bandwidth-DL", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* Max-Requested-Bandwidth-UL AVP - 3GPP TS 29.214 #5.3.15 */ -+ { -+ struct dict_avp_data data = { -+ 516, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Max-Requested-Bandwidth-UL", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, NULL); -+ } -+ -+ /* Visited-Network-Identifier AVP - 3GPP TS 29.229 #6.3.1 */ -+ { -+ struct dict_avp_data data = { -+ 600, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Visited-Network-Identifier", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, NULL); -+ } -+ -+ /* Confidentiality-Key AVP - 3GPP TS 29.229 #6.3.27 */ -+ { -+ struct dict_avp_data data = { -+ 625, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Confidentiality-Key", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, NULL); -+ } -+ -+ /* Integrity-Key AVP - 3GPP TS 29.229 #6.3.28 */ -+ { -+ struct dict_avp_data data = { -+ 626, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Integrity-Key", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, NULL); -+ } -+ -+ /* Feature-List-ID AVP - 3GPP TS 29.229 #6.3.29 */ -+ { -+ struct dict_avp_data data = { -+ 629, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Feature-List-ID", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, NULL); -+ } -+ -+ /* Feature-List AVP - 3GPP TS 29.229 #6.3.30 */ -+ { -+ struct dict_avp_data data = { -+ 630, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Feature-List", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, NULL); -+ } -+ -+ /* MSISDN AVP - 3GPP TS 29.329 #6.3.2 */ -+ { -+ struct dict_avp_data data = { -+ 701, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "MSISDN", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, NULL); -+ } -+ -+ /* Served-Party-IP-Address AVP - 3GPP TS 32.299 #7.2.187 -+ * The Served-Party-IP-Address AVP (AVP code 848) is of type Address -+ * and holds the IP address of either the calling or called party, -+ * depending on whether the P-CSCF is in touch with the calling or the -+ * called party. This AVP is only provided by the P-CSCF. -+ */ -+ { -+ struct dict_avp_data data = { -+ 848, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Served-Party-IP-Address", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , Address_type, NULL); -+ } -+ -+ /* QoS-Class-Identifier AVP - 3GPP TS 29.212 #5.3.17 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(QoS-Class-Identifier)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_1 = { "QCI_1", { .i32 = 1 }}; -+ struct dict_enumval_data t_2 = { "QCI_2", { .i32 = 2 }}; -+ struct dict_enumval_data t_3 = { "QCI_3", { .i32 = 3 }}; -+ struct dict_enumval_data t_4 = { "QCI_4", { .i32 = 4 }}; -+ struct dict_enumval_data t_5 = { "QCI_5", { .i32 = 5 }}; -+ struct dict_enumval_data t_6 = { "QCI_6", { .i32 = 6 }}; -+ struct dict_enumval_data t_7 = { "QCI_7", { .i32 = 7 }}; -+ struct dict_enumval_data t_8 = { "QCI_8", { .i32 = 8 }}; -+ struct dict_enumval_data t_9 = { "QCI_9", { .i32 = 9 }}; -+ -+ struct dict_avp_data data = { -+ 1028, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "QoS-Class-Identifier", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ /* Create the Enumerated type, and then the AVP */ -+ CHECK_dict_new( DICT_TYPE, &tdata, NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1, avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_2, avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_3, avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_4, avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_5, avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_6, avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_7, avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_8, avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_9, avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* RAT-Type AVP - 3GPP TS 29.212 #5.3.31 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_UNSIGNED32, "Enumerated(RAT-Type)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "WLAN", { .u32 = 0 }}; -+ struct dict_enumval_data t_1 = { "VIRTUAL", { .u32 = 1 }}; -+ struct dict_enumval_data t_1000 = { "UTRAN", { .u32 = 1000 }}; -+ struct dict_enumval_data t_1001 = { "GERAN", { .u32 = 1001 }}; -+ struct dict_enumval_data t_1002 = { "GAN", { .u32 = 1002 }}; -+ struct dict_enumval_data t_1003 = { "HSPA_EVOLUTION", { .u32 = 1003 }}; -+ struct dict_enumval_data t_1004 = { "EUTRAN", { .u32 = 1004 }}; -+ struct dict_enumval_data t_2000 = { "CDMA2000_1X", { .u32 = 2000 }}; -+ struct dict_enumval_data t_2001 = { "HRPD", { .u32 = 2001 }}; -+ struct dict_enumval_data t_2002 = { "UMB", { .u32 = 2002 }}; -+ struct dict_enumval_data t_2003 = { "EHRPD", { .u32 = 2003 }}; -+ -+ struct dict_avp_data data = { -+ 1032, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "RAT-Type", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ /* Create the Enumerated type, and then the AVP */ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1000 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1001 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1002 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1003 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1004 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_2000 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_2001 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_2002 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_2003 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* Priority-Level AVP - 3GPP TS 29.272 #5.3.45 */ -+ { -+ struct dict_avp_data data = { -+ 1046, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Priority-Level", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, NULL); -+ } -+ -+ /* Pre-emption-Capability AVP - 3GPP TS 29.212 #5.3.46 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Pre-emption-Capability)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "PRE-EMPTION_CAPABILITY_ENABLED", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "PRE-EMPTION_CAPABILITY_DISABLED", { .i32 = 1 }}; -+ -+ struct dict_avp_data data = { -+ 1047, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Pre-emption-Capability", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ /* Create the Enumerated type, and then the AVP */ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* Pre-emption-Vulnerability AVP - 3GPP TS 29.212 #5.3.47 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Pre-emption-Vulnerability)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "PRE-EMPTION_VULNERABILITY_ENABLED", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "PRE-EMPTION_VULNERABILITY_DISABLED", { .i32 = 1 }}; -+ -+ struct dict_avp_data data = { -+ 1048, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Pre-emption-Vulnerability", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ /* Create the Enumerated type, and then the AVP */ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* Allocation-Retention-Priority AVP - 3GPP TS 29.272 #5.3.32 */ -+ { -+ /* -+ -+ Allocation-Retention-Priority ::= < AVP Header: 1034 > -+ { Priority-Level } -+ [ Pre-emption-Capability ] -+ [ Pre-emption-Vulnerability ] -+ -+ The Allocation-Retention-Priority AVP (AVP code 1034) is of type -+ Grouped, and it is used to indicate the priority of allocation and -+ retention, the pre-emption capability and pre-emption vulnerability -+ for the SDF if provided within the QoS-Information-AVP or for the -+ EPS default bearer if provided within the Default-EPS-Bearer-QoS AVP. -+ */ -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1034, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Allocation-Retention-Priority", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Priority-Level", RULE_REQUIRED, -1, 1 } -+ ,{ "Pre-emption-Capability", RULE_OPTIONAL, -1, 1 } -+ ,{ "Pre-emption-Vulnerability", RULE_OPTIONAL, -1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* PDP-Address AVP - 3GPP TS 32.299 #6.3.2 */ -+ { -+ /* -+ * The PDP-Address-Prefix-Length AVP needs not be available for IPv6 -+ * typed IP-address prefix length of 64 bits. -+ */ -+ struct dict_avp_data data = { -+ 1227, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "PDP-Address", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , Address_type, NULL); -+ } -+ -+ /* Subscriber-Status - 3GPP TS 29.272 #7.3.29 */ -+ { -+ struct dict_object * type; -+ struct dict_type_data tdata = { AVP_TYPE_UNSIGNED32, "Enumerated(Subscriber-Status)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "SERVICE_GRANTED", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "OPERATOR_DETERMINED_BARRING", { .i32 = 1 }}; -+ -+ struct dict_avp_data data = { -+ 1424, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Subscriber-Status", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_TYPE, &tdata, NULL, &type); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0, type, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1, type, NULL); -+ CHECK_dict_new( DICT_AVP, &data, NULL, &type); -+ } -+ -+ /* STN-SR AVP - 3GPP TS 29.272 #7.3.33 */ -+ { -+ struct dict_avp_data data = { -+ 1433, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "STN-SR", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , UTF8String_type, NULL); -+ } -+ -+ /* ICS-Indicator AVP - 3GPP TS 29.272 #7.3.104 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(ICS-Indicator)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "FALSE", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "TRUE", { .i32 = 1 }}; -+ -+ struct dict_avp_data data = { -+ 1491, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "ICS-Indicator", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ /* Create the Enumerated type, and then the AVP */ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , avp, NULL); -+ } -+ -+ /* IMEI AVP - 3GPP TS 29.272 #7.3.4 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1402, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "IMEI", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , UTF8String_type, &avp); -+ } -+ -+ /* 3GPP2-MEID AVP - 3GPP TS 29.272 #7.3.6 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1471, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "3GPP2-MEID", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, &avp); -+ } -+ -+ /* Software Version - 3GPP TS 29.272 #7.3.5 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1403, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Software-Version", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , UTF8String_type, &avp); -+ } -+ -+ /* Terminal Information AVP - 3GPP TS 29.272 #7.3.3 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1401, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Terminal-Information", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "IMEI", RULE_REQUIRED, 1, 1 } -+ ,{ "3GPP2-MEID", RULE_REQUIRED, 1, 1 } -+ ,{ "Software-Version", RULE_REQUIRED, 1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* ULA-Flags - 3GPP TS 29.272 #7.3.8 */ -+ { -+ struct dict_avp_data data = { -+ 1406, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "ULA-Flags", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, NULL); -+ } -+ -+ /* Visited-PLMN-Id AVP - 3GPP TS 29.272 #7.3.9 */ -+ { -+ struct dict_avp_data data = { -+ 1407, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Visited-PLMN-Id", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, NULL); -+ } -+ -+ /* Number-Of-Requested-Vectors - 3GPP TS 29.272 #7.3.14 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1410, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Number-Of-Requested-Vectors", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* Re-Synchronization-Info - 3GPP TS 29.272 #7.3.15 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1411, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Re-Synchronization-Info", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* Immediate-Response-Preferred - 3GPP TS 29.272 #7.3.16 */ -+ { -+ struct dict_avp_data data = { -+ 1412, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Immediate-Response-Preferred", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, NULL); -+ } -+ -+ /* Requested-EUTRAN-Authentication-Info AVP - 3GPP TS 29.272 #7.3.11 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1408, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Requested-EUTRAN-Authentication-Info", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Number-Of-Requested-Vectors", RULE_OPTIONAL, -1, 1 } -+ ,{ "Immediate-Response-Preferred", RULE_OPTIONAL, -1, 1 } -+ ,{ "Re-Synchronization-Info", RULE_OPTIONAL, -1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* Requested-UTRAN-GERAN-Authentication-Info AVP - 3GPP TS 29.272 #7.3.12 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1409, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Requested-UTRAN-GERAN-Authentication-Info", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Number-Of-Requested-Vectors", RULE_OPTIONAL, -1, 1 } -+ ,{ "Immediate-Response-Preferred", RULE_OPTIONAL, -1, 1 } -+ ,{ "Re-Synchronization-Info", RULE_OPTIONAL, -1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* Item-Number AVP - 3GPP TS 29.272 #7.3.23 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1419, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Item-Number", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* RAND AVP - 3GPP TS 29.272 #7.3.53 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1447, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "RAND", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* XRES AVP - 3GPP TS 29.272 #7.3.54 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1448, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "XRES", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* AUTN AVP - 3GPP TS 29.272 #7.3.55 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1449, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "AUTN", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* SRES AVP - 3GPP TS 29.272 #7.3.60 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1454, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "SRES", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, &avp); -+ } -+ -+ /* KASME AVP - 3GPP TS 29.272 #7.3.56 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1450, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "KASME", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* Kc AVP - 3GPP TS 29.272 #7.3.59 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1453, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Kc", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, &avp); -+ } -+ -+ /* Trace-Collection-Entity AVP - 3GPP TS 29.272 #7.3.96 */ -+ { -+ struct dict_avp_data data = { -+ 1452, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Trace-Collection-Entity", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, Address_type, NULL); -+ } -+ -+ /* E-UTRAN-Vector - 3GPP TS 29.272 #7.3.18 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1414, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "E-UTRAN-Vector", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Item-Number", RULE_OPTIONAL, -1, 1 } -+ ,{ "RAND", RULE_REQUIRED, -1, 1 } -+ ,{ "XRES", RULE_REQUIRED, -1, 1 } -+ ,{ "AUTN", RULE_REQUIRED, -1, 1 } -+ ,{ "KASME", RULE_REQUIRED, -1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* UTRAN-Vector - 3GPP TS 29.272 #7.3.19 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1415, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "UTRAN-Vector", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Item-Number", RULE_OPTIONAL, -1, 1 } -+ ,{ "RAND", RULE_REQUIRED, -1, 1 } -+ ,{ "XRES", RULE_REQUIRED, -1, 1 } -+ ,{ "AUTN", RULE_REQUIRED, -1, 1 } -+ ,{ "Confidentiality-Key", RULE_REQUIRED, -1, 1 } -+ ,{ "Integrity-Key", RULE_REQUIRED, -1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* GERAN-Vector - 3GPP TS 29.272 #7.3.20 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1416, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "GERAN-Vector", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Item-Number", RULE_OPTIONAL, -1, 1 } -+ ,{ "RAND", RULE_REQUIRED, -1, 1 } -+ ,{ "SRES", RULE_REQUIRED, -1, 1 } -+ ,{ "Kc", RULE_REQUIRED, -1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* Authentication-Info - 3GPP TS 29.272 #7.3.17 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1413, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Authentication-Info", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "E-UTRAN-Vector", RULE_OPTIONAL, -1, -1 } -+ ,{ "UTRAN-Vector", RULE_OPTIONAL, -1, -1 } -+ ,{ "GERAN-Vector", RULE_OPTIONAL, -1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* Network-Access-Mode - 3GPP TS 29.272 #7.3.21 */ -+ { -+ struct dict_object * type; -+ struct dict_type_data tdata = { AVP_TYPE_UNSIGNED32, "Enumerated(Network-Access-Mode)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "PACKET_AND_CIRCUIT", { .u32 = 0 }}; -+ struct dict_enumval_data t_1 = { "ONLY_PACKET", { .u32 = 1 }}; -+ -+ struct dict_avp_data data = { -+ 1417, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Network-Access-Mode", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &type); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , type, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , type, NULL); -+ CHECK_dict_new( DICT_AVP, &data , type, NULL); -+ } -+ -+ /* HPLMN-ODB AVP - 3GPP TS 29.272 #7.3.22 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1418, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "HPLMN-ODB", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* Cancellation-Type - 3GPP TS 29.272 #7.3.24 */ -+ { -+ struct dict_object * type; -+ struct dict_type_data tdata = { AVP_TYPE_UNSIGNED32, "Enumerated(Cancellation-Type)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "MME_UPDATE_PROCEDURE", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "SGSN_UPDATE_PROCEDURE", { .i32 = 1 }}; -+ struct dict_enumval_data t_2 = { "SUBSCRIPTION_WITHDRAWAL", { .i32 = 2 }}; -+ struct dict_enumval_data t_3 = { "UPDATE_PROCEDURE_IWF", { .i32 = 3 }}; -+ struct dict_enumval_data t_4 = { "INITIAL_ATTACH_PROCEDURE", { .i32 = 4 }}; -+ -+ struct dict_avp_data data = { -+ 1420, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Cancellation-Type", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_TYPE, &tdata, NULL, &type); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0, type, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1, type, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_2, type, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_3, type, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_4, type, NULL); -+ CHECK_dict_new( DICT_AVP, &data, NULL, &type); -+ } -+ -+ /* DSR-Flags AVP - 3GPP TS 29.272 #7.3.25 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1421, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "DSR-Flags", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* DSA-Flags AVP - 3GPP TS 29.272 #7.3.26 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1422, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "DSA-Flags", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* Context-Identifier AVP - 3GPP TS 29.272 #7.3.27 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1423, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Context-Identifier", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* Operator-Determined-Barring AVP - 3GPP TS 29.272 #7.3.30 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1425, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Operator-Determined-Barring", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* Access-Restriction-Data AVP - 3GPP TS 29.272 #7.3.31 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1426, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Access-Restriction-Data", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* APN-OI-Replacement AVP - 3GPP TS 29.272 #7.3.32 */ -+ { -+ struct dict_avp_data data = { -+ 1427, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "APN-OI-Replacement", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , UTF8String_type, NULL); -+ } -+ -+ /* All-APN-Configurations-Included-Indicator AVP - 3GPP TS 29.272 #7.3.33 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(All-APN-Configurations-Included-Indicator)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "All_APN_CONFIGURATIONS_INCLUDED", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "MODIFIED/ADDED_APN_CONFIGURATIONS_INCLUDED", { .i32 = 1 }}; -+ -+ struct dict_avp_data data = { -+ 1428, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "All-APN-Configurations-Included-Indicator", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ /* Create the Enumerated type, and then the AVP */ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , avp, NULL); -+ } -+ -+ /* PDN-Type AVP - 3GPP TS 29.272 #7.3.62 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(PDN-Type)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "IPv4", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "IPv6", { .i32 = 1 }}; -+ struct dict_enumval_data t_2 = { "IPv4v6", { .i32 = 2 }}; -+ struct dict_enumval_data t_3 = { "IPv4_OR_IPv6", { .i32 = 3 }}; -+ -+ struct dict_avp_data data = { -+ 1456, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "PDN-Type", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ /* Create the Enumerated type, and then the AVP */ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_2 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_3 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , avp, NULL); -+ } -+ -+ /* EPS-Subscribed-QoS-Profile AVP - 3GPP TS 29.272 #7.3.37 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1431, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "EPS-Subscribed-QoS-Profile", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "QoS-Class-Identifier", RULE_REQUIRED, -1, 1 } -+ ,{ "Allocation-Retention-Priority", RULE_REQUIRED, -1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* VPLMN-Dynamic-Address-Allowed AVP - 3GPP TS 29.272 #7.3.38 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(VPLMN-Dynamic-Address-Allowed)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "NOTALLOWED", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "ALLOWED", { .i32 = 1 }}; -+ -+ struct dict_avp_data data = { -+ 1432, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "VPLMN-Dynamic-Address-Allowed", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ /* Create the Enumerated type, and then the AVP */ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , avp, NULL); -+ } -+ -+ /* Alert-Reason AVP - 3GPP TS 29.272 #7.3.83 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Alert-Reason)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "UE_PRESENT", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "UE_MEMORY_AVAILABLE", { .i32 = 1 }}; -+ -+ struct dict_avp_data data = { -+ 1434, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Alert-Reason", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ /* Create the Enumerated type, and then the AVP */ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , avp, NULL); -+ } -+ -+ /* PDN-GW-Allocation-Type AVP - 3GPP TS 29.272 #7.3.44 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(PDN-GW-Allocation-Type)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "STATIC", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "DYNAMIC", { .i32 = 1 }}; -+ -+ struct dict_avp_data data = { -+ 1438, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "PDN-GW-Allocation-Type", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ /* Create the Enumerated type, and then the AVP */ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , avp, NULL); -+ } -+ -+ /* Expiration-Date AVP - 3GPP TS 29.272 #7.3.80 */ -+ { -+ struct dict_avp_data data = { -+ 1439, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Expiration-Date", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , Time_type, NULL); -+ } -+ -+ /* CSG-Id AVP - 3GPP TS 29.272 #7.3.79 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1437, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "CSG-Id", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* AMBR AVP - 3GPP TS 29.272 #7.3.41 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1435, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "AMBR", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Max-Requested-Bandwidth-UL", RULE_REQUIRED, -1, 1 } -+ ,{ "Max-Requested-Bandwidth-DL", RULE_REQUIRED, -1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* Specific-APN-Info AVP - 3GPP TS 29.272 #7.3.82 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1472, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Specific-APN-Info", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Service-Selection", RULE_REQUIRED, -1, 1 } -+ ,{ "MIP6-Agent-Info", RULE_REQUIRED, -1, 1 } -+ ,{ "Visited-Network-Identifier", RULE_OPTIONAL, -1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* SIPTO-Permission AVP - 3GPP TS 29.272 #7.3.135 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(SIPTO-Permission)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "SIPTO_ALLOWED", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "SIPTO_NOTALLOWED", { .i32 = 1 }}; -+ -+ struct dict_avp_data data = { -+ 1613, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "SIPTO-Permission", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ /* Create the Enumerated type, and then the AVP */ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , avp, NULL); -+ } -+ -+ /* LIPA-Permission AVP - 3GPP TS 29.272 #7.3.133 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(LIPA-Permission)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "LIPA-PROHIBITED", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "LIPA-ONLY", { .i32 = 1 }}; -+ struct dict_enumval_data t_2 = { "LIPA-CONDITIONAL", { .i32 = 2 }}; -+ -+ struct dict_avp_data data = { -+ 1618, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "LIPA-Permission", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ /* Create the Enumerated type, and then the AVP */ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_2 , avp, NULL); -+ -+ CHECK_dict_new( DICT_AVP, &data , avp, NULL); -+ } -+ -+ /* List-Of-Measurements AVP - 3GPP TS 29.272 #7.3.139 */ -+ { -+ struct dict_avp_data data = { -+ 1625, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "List-Of-Measurements", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, NULL); -+ } -+ -+ /* Reporting-Trigger AVP - 3GPP TS 29.272 #7.3.140 */ -+ { -+ struct dict_avp_data data = { -+ 1626, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Reporting-Trigger", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, NULL); -+ } -+ -+ /* Report-Interval AVP - 3GPP TS 29.272 #7.3.141 and TS 32.422 #5.10.5 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Report-Interval)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "250ms", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "500ms", { .i32 = 1 }}; -+ struct dict_enumval_data t_2 = { "1000ms", { .i32 = 2 }}; -+ struct dict_enumval_data t_3 = { "2000ms", { .i32 = 3 }}; -+ struct dict_enumval_data t_4 = { "3000ms", { .i32 = 4 }}; -+ struct dict_enumval_data t_5 = { "4000ms", { .i32 = 5 }}; -+ struct dict_enumval_data t_6 = { "6000ms", { .i32 = 6 }}; -+ struct dict_enumval_data t_7 = { "8000ms", { .i32 = 7 }}; -+ struct dict_enumval_data t_8 = { "12000ms", { .i32 = 8 }}; -+ struct dict_enumval_data t_9 = { "16000ms", { .i32 = 9 }}; -+ struct dict_enumval_data t_10 = { "20000ms", { .i32 = 10 }}; -+ struct dict_enumval_data t_11 = { "24000ms", { .i32 = 11 }}; -+ struct dict_enumval_data t_12 = { "28000ms", { .i32 = 12 }}; -+ struct dict_enumval_data t_13 = { "32000ms", { .i32 = 13 }}; -+ struct dict_enumval_data t_14 = { "64000ms", { .i32 = 14 }}; -+ /* Possible in LTE */ -+ struct dict_enumval_data t_15 = { "120ms", { .i32 = 15 }}; -+ struct dict_enumval_data t_16 = { "240ms", { .i32 = 16 }}; -+ struct dict_enumval_data t_17 = { "480ms", { .i32 = 17 }}; -+ struct dict_enumval_data t_18 = { "640ms", { .i32 = 18 }}; -+ struct dict_enumval_data t_19 = { "1024ms", { .i32 = 19 }}; -+ struct dict_enumval_data t_20 = { "2048ms", { .i32 = 20 }}; -+ struct dict_enumval_data t_21 = { "5120ms", { .i32 = 21 }}; -+ struct dict_enumval_data t_22 = { "10240ms", { .i32 = 22 }}; -+ struct dict_enumval_data t_23 = { "1min", { .i32 = 23 }}; -+ struct dict_enumval_data t_24 = { "6min", { .i32 = 24 }}; -+ struct dict_enumval_data t_25 = { "12min", { .i32 = 25 }}; -+ struct dict_enumval_data t_26 = { "30min", { .i32 = 26 }}; -+ struct dict_enumval_data t_27 = { "60min", { .i32 = 27 }}; -+ -+ struct dict_avp_data data = { -+ 1627, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Report-Interval", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ /* Create the Enumerated type, and then the AVP */ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_2 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_3 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_4 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_5 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_6 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_7 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_8 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_9 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_10 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_11 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_12 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_13 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_14 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_15 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_16 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_17 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_18 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_19 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_20 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_21 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_22 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_23 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_24 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_25 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_26 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_27 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , avp, NULL); -+ } -+ -+ /* Report-Amount AVP - 3GPP TS 29.272 #7.3.142 and TS 32.422 #5.10.6 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Report-Amount)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "1", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "2", { .i32 = 1 }}; -+ struct dict_enumval_data t_2 = { "4", { .i32 = 2 }}; -+ struct dict_enumval_data t_3 = { "8", { .i32 = 3 }}; -+ struct dict_enumval_data t_4 = { "16", { .i32 = 4 }}; -+ struct dict_enumval_data t_5 = { "32", { .i32 = 5 }}; -+ struct dict_enumval_data t_6 = { "64", { .i32 = 6 }}; -+ struct dict_enumval_data t_7 = { "infinity", { .i32 = 7 }}; -+ -+ struct dict_avp_data data = { -+ 1628, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Report-Amount", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ /* Create the Enumerated type, and then the AVP */ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_2 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_3 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_4 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_5 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_6 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_7 , avp, NULL); -+ -+ CHECK_dict_new( DICT_AVP, &data , avp, NULL); -+ } -+ -+ /* Event-Threshold-RSRP AVP - 3GPP TS 29.272 #7.3.143 */ -+ { -+ struct dict_avp_data data = { -+ 1629, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Event-Threshold-RSRP", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, NULL); -+ } -+ -+ /* Event-Threshold-RSRQ AVP - 3GPP TS 29.272 #7.3.144 */ -+ { -+ struct dict_avp_data data = { -+ 1630, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Event-Threshold-RSRQ", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, NULL); -+ } -+ -+ /* Logging-Interval AVP - 3GPP TS 29.272 #7.3.145 and TS 32.422 #5.10.8 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Logging-Interval)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "1.28", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "2.56", { .i32 = 1 }}; -+ struct dict_enumval_data t_2 = { "5.12", { .i32 = 2 }}; -+ struct dict_enumval_data t_3 = { "10.24", { .i32 = 3 }}; -+ struct dict_enumval_data t_4 = { "20.48", { .i32 = 4 }}; -+ struct dict_enumval_data t_5 = { "30.72", { .i32 = 5 }}; -+ struct dict_enumval_data t_6 = { "40.96", { .i32 = 6 }}; -+ struct dict_enumval_data t_7 = { "61.44", { .i32 = 7 }}; -+ -+ struct dict_avp_data data = { -+ 1631, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Logging-Interval", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ /* Create the Enumerated type, and then the AVP */ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_2 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_3 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_4 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_5 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_6 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_7 , avp, NULL); -+ -+ CHECK_dict_new( DICT_AVP, &data , avp, NULL); -+ } -+ -+ /* Logging-Duration AVP - 3GPP TS 29.272 #7.3.145 and TS 32.422 #5.10.9 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Logging-Duration)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "600sec", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "1200sec", { .i32 = 1 }}; -+ struct dict_enumval_data t_2 = { "2400sec", { .i32 = 2 }}; -+ struct dict_enumval_data t_3 = { "3600sec", { .i32 = 3 }}; -+ struct dict_enumval_data t_4 = { "5400sec", { .i32 = 4 }}; -+ struct dict_enumval_data t_5 = { "7200sec", { .i32 = 5 }}; -+ -+ struct dict_avp_data data = { -+ 1632, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Logging-Duration", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ /* Create the Enumerated type, and then the AVP */ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_2 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_3 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_4 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_5 , avp, NULL); -+ -+ CHECK_dict_new( DICT_AVP, &data , avp, NULL); -+ } -+ -+ /* APN-Configuration AVP - 3GPP TS 29.272 #7.3.35 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1430, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "APN-Configuration", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Context-Identifier", RULE_REQUIRED, -1, 1 } -+ ,{ "Served-Party-IP-Address", RULE_OPTIONAL, -1, 2 } -+ ,{ "PDN-Type", RULE_REQUIRED, -1, 1 } -+ ,{ "Service-Selection", RULE_REQUIRED, -1, 1 } -+ ,{ "EPS-Subscribed-QoS-Profile", RULE_OPTIONAL, -1, 1 } -+ ,{ "VPLMN-Dynamic-Address-Allowed", RULE_OPTIONAL, -1, 1 } -+ ,{ "MIP6-Agent-Info", RULE_OPTIONAL, -1, 1 } -+ ,{ "Visited-Network-Identifier", RULE_OPTIONAL, -1, 1 } -+ ,{ "PDN-GW-Allocation-Type", RULE_OPTIONAL, -1, 1 } -+ ,{ "3GPP-Charging-Characteristics", RULE_OPTIONAL, -1, 1 } -+ ,{ "AMBR", RULE_OPTIONAL, -1, 1 } -+ ,{ "Specific-APN-Info", RULE_OPTIONAL, -1, -1 } -+ ,{ "APN-OI-Replacement", RULE_OPTIONAL, -1, 1 } -+ ,{ "SIPTO-Permission", RULE_OPTIONAL, -1, 1 } -+ ,{ "LIPA-Permission", RULE_OPTIONAL, -1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* APN-Configuration-Profile AVP - 3GPP TS 29.272 #7.3.34 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1429, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "APN-Configuration-Profile", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Context-Identifier", RULE_REQUIRED, -1, 1 } -+ ,{ "All-APN-Configurations-Included-Indicator", RULE_REQUIRED, -1, 1 } -+ ,{ "APN-Configuration", RULE_REQUIRED, -1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* CSG-Subscription-Data AVP - 3GPP TS 29.272 #7.3.78 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1436, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "CSG-Subscription-Data", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "CSG-Id", RULE_REQUIRED, -1, 1 } -+ ,{ "Expiration-Date", RULE_OPTIONAL, -1, 1 } -+ ,{ "Service-Selection", RULE_OPTIONAL, -1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* RAT-Frequency-Selection-Priority-ID AVP - 3GPP TS 29.272 #7.3.46 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1440, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "RAT-Frequency-Selection-Priority-ID", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* IDA-Flags AVP - 3GPP TS 29.272 #7.3.47 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1441, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "IDA-Flags", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* PUA-Flags AVP - 3GPP TS 29.272 #7.3.48 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1442, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "PUA-Flags", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* NOR-Flags AVP - 3GPP TS 29.272 #7.3.49 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1443, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "NOR-Flags", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* User-Id AVP - 3GPP TS 29.272 #7.3.50 */ -+ { -+ struct dict_avp_data data = { -+ 1444, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "User-Id", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , UTF8String_type, NULL); -+ } -+ -+ /* Equipment-Status AVP - 3GPP TS 29.272 #7.3.51 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Equipment-Status)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "WHITELISTED", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "BLACKLISTED", { .i32 = 1 }}; -+ struct dict_enumval_data t_2 = { "GREYLISTED", { .i32 = 2 }}; -+ -+ struct dict_avp_data data = { -+ 1445, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Equipment-Status", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ /* Create the Enumerated type, and then the AVP */ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_2 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , avp, NULL); -+ } -+ -+ /* Regional-Subscription-Zone-Code AVP - 3GPP TS 29.272 #7.3.52 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1446, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Regional-Subscription-Zone-Code", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* Roaming-Restricted-Due-To-Unsupported-Feature AVP - 3GPP TS 29.272 #7.3.81 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Roaming-Restricted-Due-To-Unsupported-Feature)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "Roaming-Restricted-Due-To-Unsupported-Feature", { .i32 = 0 }}; -+ -+ struct dict_avp_data data = { -+ 1457, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Roaming-Restricted-Due-To-Unsupported-Feature", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ /* Create the Enumerated type, and then the AVP */ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , avp, NULL); -+ } -+ -+ /* Trace-Reference AVP - 3GPP TS 29.272 #7.3.64 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1459, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Trace-Reference", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, &avp); -+ } -+ -+ /* Trace-Depth AVP - 3GPP TS 29.272 #7.3.67 and 3GPP TS 32.422 #5.3 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Trace-Depth)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "Minimum", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "Medium", { .i32 = 1 }}; -+ struct dict_enumval_data t_2 = { "Maximum", { .i32 = 2 }}; -+ struct dict_enumval_data t_3 = { "MinimumWithoutVendorSpecificExtension", { .i32 = 3 }}; -+ struct dict_enumval_data t_4 = { "MediumWithoutVendorSpecificExtension", { .i32 = 4 }}; -+ struct dict_enumval_data t_5 = { "MaximumWithoutVendorSpecificExtension", { .i32 = 5 }}; -+ -+ struct dict_avp_data data = { -+ 1462, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Trace-Depth", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ /* Create the Enumerated type, and then the AVP */ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_2 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_3 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_4 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_5 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , avp, NULL); -+ } -+ -+ /* Trace-NE-Type-List AVP - 3GPP TS 29.272 #7.3.68 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1463, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Trace-NE-Type-List", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, &avp); -+ } -+ -+ /* Trace-Event-List AVP - 3GPP TS 29.272 #7.3.69 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1464, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Trace-Interface-List", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, &avp); -+ } -+ -+ /* Trace-Event-List AVP - 3GPP TS 29.272 #7.3.70 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1465, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Trace-Event-List", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, &avp); -+ } -+ -+ /* OMC-Id AVP - 3GPP TS 29.272 #7.3.71 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1466, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "OMC-Id", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, &avp); -+ } -+ -+ /* Complete-Data-List-Included-Indicator AVP - 3GPP TS 29.272 #7.3.73 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Complete-Data-List-Included-Indicator)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "All_PDP_CONTEXTS_INCLUDED", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "MODIFIED/ADDED_PDP CONTEXTS_INCLUDED", { .i32 = 1 }}; -+ -+ struct dict_avp_data data = { -+ 1468, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Complete-Data-List-Included-Indicator", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ /* Create the Enumerated type, and then the AVP */ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , avp, NULL); -+ } -+ -+ /* PDP-Type AVP - 3GPP TS 29.272 #7.3.75 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1470, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "PDP-Type", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, &avp); -+ } -+ -+ /* GMLC-Number AVP - 3GPP TS 29.272 #7.3.85 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1474, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "GMLC-Number", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, &avp); -+ } -+ -+ /* SS-Code AVP - 3GPP TS 29.272 #7.3.87 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1476, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "SS-Code", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, &avp); -+ } -+ -+ /* SS-Status AVP - 3GPP TS 29.272 #7.3.88 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1477, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "SS-Status", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, &avp); -+ } -+ -+ /* Notification-To-UE-User AVP - 3GPP TS 29.272 #7.3.89 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Notification-To-UE-User)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "NOTIFY_LOCATION_ALLOWED", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "NOTIFYANDVERIFY_LOCATION_ALLOWED_IF_NO_RESPONSE", { .i32 = 1 }}; -+ struct dict_enumval_data t_2 = { "NOTIFYANDVERIFY_LOCATION_NOT_ALLOWED_IF_NO_RESPONSE", { .i32 = 2 }}; -+ struct dict_enumval_data t_3 = { "LOCATION_NOT_ALLOWED", { .i32 = 3 }}; -+ -+ struct dict_avp_data data = { -+ 1478, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Notification-To-UE-User", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ /* Create the Enumerated type, and then the AVP */ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_2 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_3 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , avp, NULL); -+ } -+ -+ /* Client-Identity AVP - 3GPP TS 29.272 #7.3.91 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1480, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Client-Identity", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, &avp); -+ } -+ -+ /* GMLC-Restriction AVP - 3GPP TS 29.272 #7.3.92 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(GMLC-Restriction)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "GMLC_LIST", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "HOME_COUNTRY", { .i32 = 1 }}; -+ -+ struct dict_avp_data data = { -+ 1481, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "GMLC-Restriction", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ /* Create the Enumerated type, and then the AVP */ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , avp, NULL); -+ } -+ -+ /* PLMN-Client AVP - 3GPP TS 29.272 #7.3.92 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(PLMN-Client)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "BROADCAST_SERVICE", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "O_AND_M_HPLMN", { .i32 = 1 }}; -+ struct dict_enumval_data t_2 = { "O_AND_M_VPLMN", { .i32 = 2 }}; -+ struct dict_enumval_data t_3 = { "ANONYMOUS_LOCATION", { .i32 = 3 }}; -+ struct dict_enumval_data t_4 = { "TARGET_UE_SUBSCRIBED_SERVICE", { .i32 = 4 }}; -+ -+ struct dict_avp_data data = { -+ 1482, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "PLMN-Client", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ /* Create the Enumerated type, and then the AVP */ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_2 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_3 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_4 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , avp, NULL); -+ } -+ -+ /* ServiceTypeIdentity AVP - 3GPP TS 29.272 #7.3.95 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1484, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "ServiceTypeIdentity", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, &avp); -+ } -+ -+ /* QoS-Subscribed - 3GPP TS 29.272 #7.3.77 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1404, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "QoS-Subscribed", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* ULR-Flags - 3GPP TS 29.272 #7.3.7 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1405, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "ULR-Flags", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* Ext-PDP-Type AVP - 3GPP TS 29.272 #7.3.75A */ -+ { -+ struct dict_avp_data data = { -+ 1620, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Ext-PDP-Type", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, NULL); -+ } -+ -+ /* Ext-PDP-Address AVP - 3GPP TS 29.272 #7.3.129 */ -+ { -+ struct dict_avp_data data = { -+ 1621, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Ext-PDP-Address", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, Address_type, NULL); -+ } -+ -+ /* TS-Code AVP - 3GPP TS 29.272 #7.3.100 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1487, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "TS-Code", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* External-Client AVP - 3GPP TS 29.272 #7.3.90 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1479, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "External-Client", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Client-Identity", RULE_REQUIRED, -1, 1 } -+ ,{ "GMLC-Restriction", RULE_OPTIONAL, -1, 1 } -+ ,{ "Notification-To-UE-User", RULE_OPTIONAL, -1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* Service-Type AVP - 3GPP TS 29.272 #7.3.94 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1483, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Service-Type", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "ServiceTypeIdentity", RULE_REQUIRED, -1, 1 } -+ ,{ "GMLC-Restriction", RULE_OPTIONAL, -1, 1 } -+ ,{ "Notification-To-UE-User", RULE_OPTIONAL, -1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* LCS-PrivacyException AVP - 3GPP TS 29.272 #7.3.86 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1475, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "LCS-PrivacyException", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "SS-Code", RULE_REQUIRED, -1, 1 } -+ ,{ "SS-Status", RULE_REQUIRED, -1, 1 } -+ ,{ "Notification-To-UE-User", RULE_OPTIONAL, -1, 1 } -+ ,{ "External-Client", RULE_OPTIONAL, -1, -1 } -+ ,{ "PLMN-Client", RULE_OPTIONAL, -1, -1 } -+ ,{ "Service-Type", RULE_OPTIONAL, -1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* MO-LR AVP - 3GPP TS 29.272 #7.3.96 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1485, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "MO-LR", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "SS-Code", RULE_REQUIRED, -1, 1 } -+ ,{ "SS-Status", RULE_REQUIRED, -1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* LCS-Info AVP - 3GPP TS 29.272 #7.3.84 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1473, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "LCS-Info", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "GMLC-Number", RULE_OPTIONAL, -1, -1 } -+ ,{ "LCS-PrivacyException", RULE_OPTIONAL, -1, -1 } -+ ,{ "MO-LR", RULE_OPTIONAL, -1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* PDP-Context AVP - 3GPP TS 29.272 #7.3.74 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1469, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "PDP-Context", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Context-Identifier", RULE_REQUIRED, -1, 1 } -+ ,{ "PDP-Type", RULE_REQUIRED, -1, 1 } -+ ,{ "PDP-Address", RULE_OPTIONAL, -1, 1 } -+ ,{ "QoS-Subscribed", RULE_REQUIRED, -1, 1 } -+ ,{ "VPLMN-Dynamic-Address-Allowed", RULE_OPTIONAL, -1, 1 } -+ ,{ "Service-Selection", RULE_REQUIRED, -1, 1 } -+ ,{ "3GPP-Charging-Characteristics", RULE_OPTIONAL, -1, 1 } -+ ,{ "Ext-PDP-Type", RULE_OPTIONAL, -1, 1 } -+ ,{ "Ext-PDP-Address", RULE_OPTIONAL, -1, 1 } -+ ,{ "AMBR", RULE_OPTIONAL, -1, 1 } -+ ,{ "SIPTO-Permission", RULE_OPTIONAL, -1, 1 } -+ ,{ "LIPA-Permission", RULE_OPTIONAL, -1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* GPRS-Subscription-Data AVP - 3GPP TS 29.272 #7.3.72 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1467, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "GPRS-Subscription-Data", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Complete-Data-List-Included-Indicator", RULE_REQUIRED, -1, 1 } -+ ,{ "PDP-Context", RULE_REQUIRED, -1, 50 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* Teleservice-List AVP - 3GPP TS 29.272 #7.3.99 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1486, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Teleservice-List", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "TS-Code", RULE_REQUIRED, -1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* Call-Barring-Infor-List AVP - 3GPP TS 29.272 #7.3.101 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1488, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Call-Barring-Infor-List", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "SS-Code", RULE_REQUIRED, 1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* SGSN-Number AVP - 3GPP TS 29.272 #7.3.102 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1489, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "SGSN-Number", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* IDR-Flags AVP - 3GPP TS 29.272 #7.3.103 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1490, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "IDR-Flags", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* IMS-Voice-Over-PS-Sessions-Supported AVP - 3GPP TS 29.272 #7.3.106 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(IMS-Voice-Over-PS-Sessions-Supported)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "NOT_SUPPORTED", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "SUPPORTED", { .i32 = 1 }}; -+ -+ struct dict_avp_data data = { -+ 1492, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "IMS-Voice-Over-PS-Sessions-Supported", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ /* Create the Enumerated type, and then the AVP */ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , avp, NULL); -+ } -+ -+ /* SGSN-Number AVP - 3GPP TS 29.272 #7.3.102 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Homogeneous-Support-of-IMS-Voice-Over-PSSessions)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "NOT_SUPPORTED", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "SUPPORTED", { .i32 = 1 }}; -+ -+ struct dict_avp_data data = { -+ 1493, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Homogeneous-Support-of-IMS-Voice-Over-PSSessions", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* Last-UE-Activity-Time AVP - 3GPP TS 29.272 #7.3.108 */ -+ { -+ struct dict_avp_data data = { -+ 1494, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Last-UE-Activity-Time", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , Time_type, NULL); -+ } -+ -+ /* E-UTRAN-Cell-Global-Identity AVP - 3GPP TS 29.272 #7.3.117 */ -+ { -+ struct dict_avp_data data = { -+ 1602, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "E-UTRAN-Cell-Global-Identity", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, NULL); -+ } -+ -+ /* Tracking-Area-Identity AVP - 3GPP TS 29.272 #7.3.118 */ -+ { -+ struct dict_avp_data data = { -+ 1603, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Tracking-Area-Identity", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, NULL); -+ } -+ -+ /* Cell-Global-Identity AVP - 3GPP TS 29.272 #7.3.119 */ -+ { -+ struct dict_avp_data data = { -+ 1604, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Cell-Global-Identity", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, NULL); -+ } -+ -+ /* Routing-Area-Identity AVP - 3GPP TS 29.272 #7.3.120 */ -+ { -+ struct dict_avp_data data = { -+ 1605, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Routing-Area-Identity", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, NULL); -+ } -+ -+ /* Location-Area-Identity AVP - 3GPP TS 29.272 #7.3.121 */ -+ { -+ struct dict_avp_data data = { -+ 1606, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Location-Area-Identity", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, NULL); -+ } -+ -+ /* Service-Area-Identity AVP - 3GPP TS 29.272 #7.3.122 */ -+ { -+ struct dict_avp_data data = { -+ 1607, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Service-Area-Identity", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, NULL); -+ } -+ -+ /* Geographical-Information AVP - 3GPP TS 29.272 #7.3.123 */ -+ { -+ struct dict_avp_data data = { -+ 1608, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Geographical-Information", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, NULL); -+ } -+ -+ /* Geodetic-Information AVP - 3GPP TS 29.272 #7.3.124 */ -+ { -+ struct dict_avp_data data = { -+ 1609, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Geodetic-Information", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, NULL); -+ } -+ -+ /* Current-Location-Retrieved AVP - 3GPP TS 29.272 #7.3.125 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Current-Location-Retrieved)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "ACTIVE-LOCATION-RETRIEVAL", { .i32 = 0 }}; -+ -+ struct dict_avp_data data = { -+ 1610, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Current-Location-Retrieved", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* Age-Of-Location-Information AVP - 3GPP TS 29.272 #7.3.126 */ -+ { -+ struct dict_avp_data data = { -+ 1611, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Age-Of-Location-Information", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, NULL); -+ } -+ -+ /* UE-SRVCC-Capability AVP - 3GPP TS 29.272 #7.3.130 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(UE-SRVCC-Capability)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "UE-SRVCC-NOT-SUPPORTED", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "UE-SRVCC-SUPPORTED", { .i32 = 1 }}; -+ -+ struct dict_avp_data data = { -+ 1615, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "UE-SRVCC-Capability", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* MPS-Priority AVP - 3GPP TS 29.272 #7.3.131 */ -+ { -+ struct dict_avp_data data = { -+ 1616, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "MPS-Priority", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, NULL); -+ } -+ -+ /* VPLMN-LIPA-Allowed AVP - 3GPP TS 29.272 #7.3.132 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(VPLMN-LIPA-Allowed)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "LIPA-NOTALLOWED", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "LIPA-ALLOWED", { .i32 = 1 }}; -+ -+ struct dict_avp_data data = { -+ 1617, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "VPLMN-LIPA-Allowed", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* Subscribed-Periodic-RAU-TAU-Timer AVP - 3GPP TS 29.272 #7.3.134 */ -+ { -+ struct dict_avp_data data = { -+ 1619, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Subscribed-Periodic-RAU-TAU-Timer", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, NULL); -+ } -+ -+ /* Job-Type AVP - 3GPP TS 29.272 #7.3.132 and 3GPP TS 32.422 #5.10.1 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Job-Type)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "Immediate-MDT-Only", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "Logged-MDT-only", { .i32 = 1 }}; -+ struct dict_enumval_data t_2 = { "Trace-Only", { .i32 = 2 }}; -+ struct dict_enumval_data t_3 = { "Immediate-MDT-and-Trace", { .i32 = 3 }}; -+ -+ struct dict_avp_data data = { -+ 1623, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Job-Type", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_2 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_3 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* Relay-Node-Indicator AVP - 3GPP TS 29.272 #7.3.147 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Relay-Node-Indicator)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "NOT_RELAY_NODE", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "RELAY_NODE", { .i32 = 1 }}; -+ -+ struct dict_avp_data data = { -+ 1633, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Relay-Node-Indicator", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* MDT-User-Consent AVP - 3GPP TS 29.272 #7.3.148 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(MDT-User-Consent)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "CONSENT_NOT_GIVEN", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "CONSENT_GIVEN", { .i32 = 1 }}; -+ -+ struct dict_avp_data data = { -+ 1634, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "MDT-User-Consent", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* PUR-Flags AVP - 3GPP TS 29.272 #7.3.149 */ -+ { -+ struct dict_avp_data data = { -+ 1635, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "PUR-Flags", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_UNSIGNED32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, NULL); -+ } -+ -+ /* User-State AVP - 3GPP TS 29.272 #7.3.114 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(User-State)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "DETACHED", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "ATTACHED_NOT_REACHABLE_FOR_PAGING", { .i32 = 1 }}; -+ struct dict_enumval_data t_2 = { "ATTACHED_REACHABLE_FOR_PAGING", { .i32 = 2 }}; -+ struct dict_enumval_data t_3 = { "CONNECTED_NOT_REACHABLE_FOR_PAGING", { .i32 = 3 }}; -+ struct dict_enumval_data t_4 = { "CONNECTED_REACHABLE_FOR_PAGING", { .i32 = 4 }}; -+ struct dict_enumval_data t_5 = { "NETWORK_DETERMINED_NOT_REACHABLE", { .i32 = 5 }}; -+ -+ struct dict_avp_data data = { -+ 1499, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "User-State", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_2 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_3 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_4 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_5 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* MME-User-State AVP - 3GPP TS 29.272 #7.3.112 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1497, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "MME-User-State", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "User-State", RULE_OPTIONAL, -1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* SGSN-User-State AVP - 3GPP TS 29.272 #7.3.113 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1498, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "SGSN-User-State", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "User-State", RULE_OPTIONAL, -1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* EPS-User-State AVP - 3GPP TS 29.272 #7.3.110 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1495, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "EPS-User-State", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "MME-User-State", RULE_OPTIONAL, -1, 1 } -+ ,{ "SGSN-User-State", RULE_OPTIONAL, -1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* MME-Location-Information AVP - 3GPP TS 29.272 #7.3.115 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1600, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "MME-Location-Information", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "E-UTRAN-Cell-Global-Identity", RULE_OPTIONAL, -1, 1 } -+ ,{ "Tracking-Area-Identity", RULE_OPTIONAL, -1, 1 } -+ ,{ "Geographical-Information", RULE_OPTIONAL, -1, 1 } -+ ,{ "Geodetic-Information", RULE_OPTIONAL, -1, 1 } -+ ,{ "Current-Location-Retrieved", RULE_OPTIONAL, -1, 1 } -+ ,{ "Age-Of-Location-Information", RULE_OPTIONAL, -1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* SGSN-Location-Information AVP - 3GPP TS 29.272 #7.3.116 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1601, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "SGSN-Location-Information", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Cell-Global-Identity", RULE_OPTIONAL, -1, 1 } -+ ,{ "Location-Area-Identity", RULE_OPTIONAL, -1, 1 } -+ ,{ "Service-Area-Identity", RULE_OPTIONAL, -1, 1 } -+ ,{ "Routing-Area-Identity", RULE_OPTIONAL, -1, 1 } -+ ,{ "Geographical-Information", RULE_OPTIONAL, -1, 1 } -+ ,{ "Geodetic-Information", RULE_OPTIONAL, -1, 1 } -+ ,{ "Current-Location-Retrieved", RULE_OPTIONAL, -1, 1 } -+ ,{ "Age-Of-Location-Information", RULE_OPTIONAL, -1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* Area-Scope AVP - 3GPP TS 29.272 #7.3.138 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1624, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Area-Scope", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Cell-Global-Identity", RULE_OPTIONAL, -1, -1 } -+ ,{ "E-UTRAN-Cell-Global-Identity", RULE_OPTIONAL, -1, -1 } -+ ,{ "Routing-Area-Identity", RULE_OPTIONAL, -1, -1 } -+ ,{ "Location-Area-Identity", RULE_OPTIONAL, -1, -1 } -+ ,{ "Tracking-Area-Identity", RULE_OPTIONAL, -1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* MDT-Configuration AVP - 3GPP TS 29.272 #7.3.136 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1622, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "MDT-Configuration", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Job-Type", RULE_REQUIRED, -1, 1 } -+ ,{ "Area-Scope", RULE_OPTIONAL, -1, 1 } -+ ,{ "List-Of-Measurements", RULE_OPTIONAL, -1, 1 } -+ ,{ "Reporting-Trigger", RULE_OPTIONAL, -1, 1 } -+ ,{ "Report-Interval", RULE_OPTIONAL, -1, 1 } -+ ,{ "Report-Amount", RULE_OPTIONAL, -1, 1 } -+ ,{ "Event-Threshold-RSRP", RULE_OPTIONAL, -1, 1 } -+ ,{ "Event-Threshold-RSRQ", RULE_OPTIONAL, -1, 1 } -+ ,{ "Logging-Interval", RULE_OPTIONAL, -1, 1 } -+ ,{ "Logging-Duration", RULE_OPTIONAL, -1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* EPS-Location-Information AVP - 3GPP TS 29.272 #7.3.111 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1496, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "EPS-Location-Information", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "MME-Location-Information", RULE_OPTIONAL, -1, 1 } -+ ,{ "SGSN-Location-Information", RULE_OPTIONAL, -1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* Active-APN AVP - 3GPP TS 29.173 #7.3.127 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1612, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Active-APN", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Context-Identifier", RULE_REQUIRED, -1, 1 } -+ ,{ "Service-Selection", RULE_OPTIONAL, -1, 1 } -+ ,{ "MIP6-Agent-Info", RULE_OPTIONAL, -1, 1 } -+ ,{ "Visited-Network-Identifier", RULE_OPTIONAL, -1, 1 } -+ ,{ "Specific-APN-Info", RULE_OPTIONAL, -1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* Error-Diagnostic AVP - 3GPP TS 29.272 #7.3.128 */ -+ { -+ struct dict_object * avp; -+ struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Error-Diagnostic)" , NULL, NULL, NULL }; -+ struct dict_enumval_data t_0 = { "GPRS_DATA_SUBSCRIBED", { .i32 = 0 }}; -+ struct dict_enumval_data t_1 = { "NO_GPRS_DATA_SUBSCRIBED", { .i32 = 1 }}; -+ struct dict_enumval_data t_2 = { "ODB-ALL-APN", { .i32 = 2 }}; -+ struct dict_enumval_data t_3 = { "ODB-HPLMN-APN", { .i32 = 3 }}; -+ struct dict_enumval_data t_4 = { "ODB-VPLMN-APN", { .i32 = 4 }}; -+ -+ struct dict_avp_data data = { -+ 1614, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Error-Diagnostic", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_INTEGER32 /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_TYPE, &tdata , NULL, &avp); -+ CHECK_dict_new( DICT_ENUMVAL, &t_0 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_1 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_2 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_3 , avp, NULL); -+ CHECK_dict_new( DICT_ENUMVAL, &t_4 , avp, NULL); -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ } -+ -+ /* GMLC-Address AVP - 3GPP TS 29.173 #6.4.7 */ -+ { -+ struct dict_avp_data data = { -+ 2405, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "GMLC-Address", /* Name */ -+ AVP_FLAG_VENDOR, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_OCTETSTRING /* base type of data */ -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , Address_type, NULL); -+ } -+ -+ /* Supported Features AVP - 3GPP TS 29.229 */ -+ { -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 628, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Supported-Features", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Vendor-Id", RULE_REQUIRED, 1, 1 } -+ ,{ "Feature-List-ID", RULE_REQUIRED, 1, 1 } -+ ,{ "Feature-List", RULE_REQUIRED, 1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* Trace-Data AVP - 3GPP TS 29.272 #7.3.63 */ -+ { -+ struct dict_object * avp; -+ -+ struct dict_avp_data data = { -+ 1458, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Trace-Data", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Trace-Reference", RULE_REQUIRED, -1, 1 } -+ ,{ "Trace-Depth", RULE_REQUIRED, -1, 1 } -+ ,{ "Trace-NE-Type-List", RULE_REQUIRED, -1, 1 } -+ ,{ "Trace-Interface-List", RULE_OPTIONAL, -1, 1 } -+ ,{ "Trace-Event-List", RULE_REQUIRED, -1, 1 } -+ ,{ "OMC-Id", RULE_OPTIONAL, -1, 1 } -+ ,{ "Trace-Collection-Entity", RULE_REQUIRED, -1, 1 } -+ ,{ "MDT-Configuration", RULE_OPTIONAL, -1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data, NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* Subscription-Data AVP - 3GPP TS 29.272 #7.3.2 */ -+ { -+ /* -+ -+ * The Subscription-Data AVP is of type Grouped. It shall contain -+ * the information related to the user profile relevant for -+ * EPS and GERAN/UTRAN. -+ -+ Subscription-Data ::= <AVP header: 1400 10415> -+ [ Subscriber-Status ] -+ [ MSISDN ] -+ [ STN-SR ] -+ [ ICS-Indicator ] -+ [ Network-Access-Mode ] -+ [ Operator-Determined-Barring ] -+ [ HPLMN-ODB ] -+ *10[ Regional-Subscription-Zone-Code] -+ [ Access-Restriction-Data ] -+ [ APN-OI-Replacement ] -+ [ LCS-Info ] -+ [ Teleservice-List ] -+ [ Call-Barring-Infor-List ] -+ [ 3GPP-Charging-Characteristics ] -+ [ AMBR ] -+ [ APN-Configuration-Profile ] -+ [ RAT-Frequency-Selection-Priority-ID ] -+ [ Trace-Data] -+ [ GPRS-Subscription-Data ] -+ *[ CSG-Subscription-Data ] -+ [ Roaming-Restricted-Due-To-Unsupported-Feature ] -+ [ Subscribed-Periodic-RAU-TAU-Timer ] -+ [ MPS-Priority ] -+ [ VPLMN-LIPA-Allowed ] -+ [ Relay-Node-Indicator ] -+ [ MDT-User-Consent ] -+ *[ AVP ] -+ -+ * The AMBR included in this grouped AVP shall include the AMBR -+ * associated to the user’s subscription (UE-AMBR); -+ * Max-Requested-Bandwidth-UL and Max-Requested-Bandwidth-DL within -+ * this AVP shall not both be set to "0". -+ * The APN-OI-Replacement included in this grouped AVP shall include -+ * the UE level APN-OI-Replacement associated to the user’s subscription. -+ */ -+ struct dict_object * avp; -+ struct dict_avp_data data = { -+ 1400, /* Code */ -+ VENDOR_3GPP_Id, /* Vendor */ -+ "Subscription-Data", /* Name */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ -+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ -+ AVP_TYPE_GROUPED /* base type of data */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Subscriber-Status", RULE_OPTIONAL, -1, 1 } -+ ,{ "MSISDN", RULE_OPTIONAL, -1, 1 } -+ ,{ "STN-SR", RULE_OPTIONAL, -1, 1 } -+ ,{ "ICS-Indicator", RULE_OPTIONAL, -1, 1 } -+ ,{ "Network-Access-Mode", RULE_OPTIONAL, -1, 1 } -+ ,{ "Operator-Determined-Barring", RULE_OPTIONAL, -1, 1 } -+ ,{ "HPLMN-ODB", RULE_OPTIONAL, -1, 1 } -+ ,{ "Regional-Subscription-Zone-Code", RULE_OPTIONAL, -1, 10 } -+ ,{ "Access-Restriction-Data", RULE_OPTIONAL, -1, 1 } -+ ,{ "APN-OI-Replacement", RULE_OPTIONAL, -1, 1 } -+ ,{ "LCS-Info", RULE_OPTIONAL, -1, 1 } -+ ,{ "Teleservice-List", RULE_OPTIONAL, -1, 1 } -+ ,{ "Call-Barring-Infor-List", RULE_OPTIONAL, -1, 1 } -+ ,{ "3GPP-Charging-Characteristics", RULE_OPTIONAL, -1, 1 } -+ ,{ "AMBR", RULE_OPTIONAL, -1, 1 } -+ ,{ "APN-Configuration-Profile", RULE_OPTIONAL, -1, 1 } -+ ,{ "RAT-Frequency-Selection-Priority-ID", RULE_OPTIONAL, -1, 1 } -+ ,{ "Trace-Data", RULE_OPTIONAL, -1, 1 } -+ ,{ "GPRS-Subscription-Data", RULE_OPTIONAL, -1, 1 } -+ ,{ "CSG-Subscription-Data", RULE_OPTIONAL, -1, -1 } -+ ,{ "Roaming-Restricted-Due-To-Unsupported-Feature", RULE_OPTIONAL, -1, 1 } -+ ,{ "Subscribed-Periodic-RAU-TAU-Timer", RULE_OPTIONAL, -1, 1 } -+ ,{ "MPS-Priority", RULE_OPTIONAL, -1, 1 } -+ ,{ "VPLMN-LIPA-Allowed", RULE_OPTIONAL, -1, 1 } -+ ,{ "Relay-Node-Indicator", RULE_OPTIONAL, -1, 1 } -+ ,{ "MDT-User-Consent", RULE_OPTIONAL, -1, 1 } -+ }; -+ -+ CHECK_dict_new( DICT_AVP, &data , NULL, &avp); -+ PARSE_loc_rules( rules, avp ); -+ } -+ -+ /* S6A-Update Location Request - 3GPP TS 29.272 #7.2.3 */ -+ { -+ /* -+ -+ The Update-Location-Request (ULR) command, indicated by the -+ Command-Code field set to 316 and the "R" bit set in -+ the Command Flags field, is sent from MME or SGSN to HSS. -+ -+ < Update-Location-Request> ::= < Diameter Header: 316, REQ, PXY, 16777251 > -+ < Session-Id > -+ [ Vendor-Specific-Application-Id ] -+ { Auth-Session-State } -+ { Origin-Host } -+ { Origin-Realm } -+ [ Destination-Host ] -+ { Destination-Realm } -+ { User-Name } -+ *[ Supported-Features ] -+ [ Terminal-Information ] -+ { RAT-Type } -+ { ULR-Flags } -+ [ UE-SRVCC-Capability ] -+ { Visited-PLMN-Id } -+ [ SGSN-Number ] -+ [ Homogeneous-Support-of-IMS-Voice-Over-PS-Sessions ] -+ [ GMLC-Address ] -+ *[ Active-APN ] -+ *[ AVP ] -+ *[ Proxy-Info ] -+ *[ Route-Record ] -+ */ -+ struct dict_object * cmd; -+ struct dict_cmd_data data = { -+ 316, /* Code */ -+ "Update-Location-Request", /* Name */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE /* Fixed flag values */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Session-Id", RULE_FIXED_HEAD, -1, 1 } -+ ,{ "Vendor-Specific-Application-Id", RULE_OPTIONAL, -1, 1 } -+ ,{ "Auth-Session-State", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Host", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "Destination-Host", RULE_OPTIONAL, -1, 1 } -+ ,{ "Destination-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "User-Name", RULE_REQUIRED, -1, 1 } -+ ,{ "Supported-Features", RULE_OPTIONAL, -1, -1 } -+ ,{ "Terminal-Information", RULE_OPTIONAL, -1, 1 } -+ ,{ "RAT-Type", RULE_REQUIRED, 1, 1 } -+ ,{ "ULR-Flags", RULE_REQUIRED, 1, 1 } -+ ,{ "UE-SRVCC-Capability", RULE_OPTIONAL, -1, 1 } -+ ,{ "Visited-PLMN-Id", RULE_REQUIRED, 1, 1 } -+ ,{ "SGSN-Number", RULE_OPTIONAL, -1, 1 } -+ ,{ "Homogeneous-Support-of-IMS-Voice-Over-PSSessions", RULE_OPTIONAL, -1, 1 } -+ ,{ "GMLC-Address", RULE_OPTIONAL, -1, 1 } -+ ,{ "Active-APN", RULE_OPTIONAL, -1, -1 } -+ ,{ "Proxy-Info", RULE_OPTIONAL, -1, -1 } -+ ,{ "Route-Record", RULE_OPTIONAL, -1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_COMMAND, &data, s6a_dict, &cmd); -+ PARSE_loc_rules( rules, cmd ); -+ } -+ -+ /* S6A-Update Location Answer - 3GPP TS 29.272 #7.2.4 */ -+ { -+ /* -+ -+ The Update-Location-Answer (ULA) command, indicated by the -+ Command-Code field set to 316 and the 'R' bit cleared -+ in the Command Flags field, is sent from HSS to MME or SGSN. -+ -+ < Update-Location-Answer> ::= < Diameter Header: 316, PXY, 16777251 > -+ < Session-Id > -+ [ Vendor-Specific-Application-Id ] -+ [ Result-Code ] -+ [ Experimental-Result ] -+ [ Error-Diagnostic ] -+ { Auth-Session-State } -+ { Origin-Host } -+ { Origin-Realm } -+ *[ Supported-Features ] -+ [ ULA-Flags ] -+ [ Subscription-Data ] -+ *[ AVP ] -+ *[ Failed-AVP ] -+ *[ Proxy-Info ] -+ *[ Route-Record ] -+ */ -+ struct dict_object * cmd; -+ struct dict_cmd_data data = { -+ 316, /* Code */ -+ "Update-Location-Answer", /* Name */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */ -+ CMD_FLAG_PROXIABLE /* Fixed flag values */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Session-Id", RULE_FIXED_HEAD, -1, 1 } -+ ,{ "Vendor-Specific-Application-Id", RULE_OPTIONAL, -1, 1 } -+ ,{ "Result-Code", RULE_OPTIONAL, -1, 1 } -+ ,{ "Experimental-Result", RULE_OPTIONAL, -1, 1 } -+ ,{ "Error-Diagnostic", RULE_OPTIONAL, -1, 1 } -+ ,{ "Auth-Session-State", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Host", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "Supported-Features", RULE_OPTIONAL, -1, -1 } -+ ,{ "ULA-Flags", RULE_OPTIONAL, -1, 1 } -+ ,{ "Subscription-Data", RULE_OPTIONAL, -1, 1 } -+ ,{ "Failed-AVP", RULE_OPTIONAL, -1, -1 } -+ ,{ "Proxy-Info", RULE_OPTIONAL, -1, -1 } -+ ,{ "Route-Record", RULE_OPTIONAL, -1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_COMMAND, &data, s6a_dict, &cmd); -+ PARSE_loc_rules( rules, cmd ); -+ } -+ -+ /* S6A-Cancel-Location-Request - 3GPP TS 29.272 #7.2.7 */ -+ { -+ /* -+ -+ The Cancel-Location-Request (CLR) command, indicated by the -+ Command-Code field set to 317 and the 'R' bit set in -+ the Command Flags field, is sent from HSS to MME or SGSN. -+ -+ < Cancel-Location-Request> ::= < Diameter Header: 317, REQ, PXY, 16777251 > -+ < Session-Id > -+ [ Vendor-Specific-Application-Id ] -+ { Auth-Session-State } -+ { Origin-Host } -+ { Origin-Realm } -+ { Destination-Host } -+ { Destination-Realm } -+ { User-Name } -+ *[Supported-Features ] -+ { Cancellation-Type } -+ *[ AVP ] -+ *[ Proxy-Info ] -+ *[ Route-Record ] -+ */ -+ struct dict_object * cmd; -+ struct dict_cmd_data data = { -+ 317, /* Code */ -+ "Cancel-Location-Request", /* Name */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE /* Fixed flag values */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Session-Id", RULE_FIXED_HEAD, -1, 1 } -+ ,{ "Vendor-Specific-Application-Id", RULE_OPTIONAL, -1, 1 } -+ ,{ "Auth-Session-State", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Host", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "Destination-Host", RULE_OPTIONAL, -1, 1 } -+ ,{ "Destination-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "User-Name", RULE_REQUIRED, -1, 1 } -+ ,{ "Supported-Features", RULE_OPTIONAL, -1, -1 } -+ ,{ "Cancellation-Type", RULE_REQUIRED, -1, 1 } -+ ,{ "Proxy-Info", RULE_OPTIONAL, -1, -1 } -+ ,{ "Route-Record", RULE_OPTIONAL, -1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_COMMAND, &data, s6a_dict, &cmd); -+ PARSE_loc_rules( rules, cmd ); -+ } -+ -+ /* S6A-Cancel-Location-Answer - 3GPP TS 29.272 #7.2.8 */ -+ { -+ /* -+ -+ The Cancel-Location-Answer (CLA) command, indicated by the -+ Command-Code field set to 317 and the 'R' bit cleared -+ in the Command Flags field, is sent from MME or SGSN to HSS. -+ -+ < Cancel-Location-Answer> ::= < Diameter Header: 317, PXY, 16777251 > -+ < Session-Id > -+ [ Vendor-Specific-Application-Id ] -+ *[ Supported-Features ] -+ [ Result-Code ] -+ [ Experimental-Result ] -+ { Auth-Session-State } -+ { Origin-Host } -+ { Origin-Realm } -+ *[ AVP ] -+ *[ Failed-AVP ] -+ *[ Proxy-Info ] -+ *[ Route-Record ] -+ */ -+ struct dict_object * cmd; -+ struct dict_cmd_data data = { -+ 317, /* Code */ -+ "Cancel-Location-Answer", /* Name */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */ -+ CMD_FLAG_PROXIABLE /* Fixed flag values */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Session-Id", RULE_FIXED_HEAD, -1, 1 } -+ ,{ "Vendor-Specific-Application-Id", RULE_OPTIONAL, -1, 1 } -+ ,{ "Supported-Features", RULE_OPTIONAL, -1, -1 } -+ ,{ "Result-Code", RULE_OPTIONAL, -1, 1 } -+ ,{ "Experimental-Result", RULE_OPTIONAL, -1, 1 } -+ ,{ "Auth-Session-State", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Host", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "Failed-AVP", RULE_OPTIONAL, -1, -1 } -+ ,{ "Proxy-Info", RULE_OPTIONAL, -1, -1 } -+ ,{ "Route-Record", RULE_OPTIONAL, -1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_COMMAND, &data, s6a_dict, &cmd); -+ PARSE_loc_rules( rules, cmd ); -+ } -+ -+ /* S6A-Authentication-Information-Request - 3GPP TS 29.272 #7.2.4 */ -+ { -+ /* -+ -+ The Authentication-Information-Request (AIR) command, indicated by -+ the Command-Code field set to 318 and the 'R' -+ bit set in the Command Flags field, is sent from MME or SGSN to HSS. -+ -+ < Authentication-Information-Request> ::= < Diameter Header: 318, REQ, PXY, 16777251 > -+ < Session-Id > -+ [ Vendor-Specific-Application-Id ] -+ { Auth-Session-State } -+ { Origin-Host } -+ { Origin-Realm } -+ [ Destination-Host ] -+ { Destination-Realm } -+ { User-Name } -+ *[ Supported-Features ] -+ [ Requested-EUTRAN-Authentication-Info ] -+ [ Requested-UTRAN-GERAN-Authentication-Info ] -+ { Visited-PLMN-Id } -+ *[ AVP ] -+ *[ Proxy-Info ] -+ *[ Route-Record ] -+ */ -+ struct dict_object * cmd; -+ struct dict_cmd_data data = { -+ 318, /* Code */ -+ "Authentication-Information-Request", /* Name */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE /* Fixed flag values */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Session-Id", RULE_FIXED_HEAD, -1, 1 } -+ ,{ "Vendor-Specific-Application-Id", RULE_OPTIONAL, -1, 1 } -+ ,{ "Auth-Session-State", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Host", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "Destination-Host", RULE_OPTIONAL, -1, 1 } -+ ,{ "Destination-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "User-Name", RULE_REQUIRED, -1, 1 } -+ ,{ "Supported-Features", RULE_OPTIONAL, -1, -1 } -+ ,{ "Requested-EUTRAN-Authentication-Info", RULE_OPTIONAL, -1, 1 } -+ ,{ "Requested-UTRAN-GERAN-Authentication-Info", RULE_OPTIONAL, -1, 1 } -+ ,{ "Visited-PLMN-Id", RULE_REQUIRED, -1, 1 } -+ ,{ "Proxy-Info", RULE_OPTIONAL, -1, -1 } -+ ,{ "Route-Record", RULE_OPTIONAL, -1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_COMMAND, &data, s6a_dict, &cmd); -+ PARSE_loc_rules( rules, cmd ); -+ } -+ -+ /* S6A-Authentication-Information-Answer - 3GPP TS 29.272 #7.2.6 */ -+ { -+ /* -+ -+ The Authentication-Information-Answer (AIA) command, indicated by -+ the Command-Code field set to318 and the 'R' bit cleared in the -+ Command Flags field, is sent from HSS to MME or SGSN. -+ -+ < Authentication-Information-Answer> ::= < Diameter Header: 318, PXY, 16777251 > -+ < Session-Id > -+ [ Vendor-Specific-Application-Id ] -+ [ Result-Code ] -+ [ Experimental-Result ] -+ [ Error-Diagnostic ] -+ { Auth-Session-State } -+ { Origin-Host } -+ { Origin-Realm } -+ *[ Supported-Features ] -+ [ Authentication-Info ] -+ *[ AVP ] -+ *[ Failed-AVP ] -+ *[ Proxy-Info ] -+ *[ Route-Record ] -+ */ -+ struct dict_object * cmd; -+ struct dict_cmd_data data = { -+ 318, /* Code */ -+ "Authentication-Information-Answer", /* Name */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */ -+ CMD_FLAG_PROXIABLE /* Fixed flag values */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Session-Id", RULE_FIXED_HEAD, -1, 1 } -+ ,{ "Vendor-Specific-Application-Id", RULE_OPTIONAL, -1, 1 } -+ ,{ "Result-Code", RULE_OPTIONAL, -1, 1 } -+ ,{ "Experimental-Result", RULE_OPTIONAL, -1, 1 } -+ ,{ "Error-Diagnostic", RULE_OPTIONAL, -1, 1 } -+ ,{ "Origin-Host", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "Supported-Features", RULE_OPTIONAL, -1, -1 } -+ ,{ "Authentication-Info", RULE_OPTIONAL, -1, 1 } -+ ,{ "Failed-AVP", RULE_OPTIONAL, -1, -1 } -+ ,{ "Proxy-Info", RULE_OPTIONAL, -1, -1 } -+ ,{ "Route-Record", RULE_OPTIONAL, -1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_COMMAND, &data, s6a_dict, &cmd); -+ PARSE_loc_rules( rules, cmd ); -+ } -+ -+ /* Insert-Subscriber-Data-Request IDR Command - 3GPP TS 29.272 #7.2.9 */ -+ { -+ /* -+ -+ The Insert-Subscriber-Data-Request (IDR) command, indicated by the -+ Command-Code field set to 319 and the 'R' bit set in the Command -+ Flags field, is sent from HSS to MME or SGSN. -+ -+ < Insert-Subscriber-Data-Request> ::= < Diameter Header: 319, REQ, PXY, 16777251 > -+ < Session-Id > -+ [ Vendor-Specific-Application-Id ] -+ { Auth-Session-State } -+ { Origin-Host } -+ { Origin-Realm } -+ { Destination-Host } -+ { Destination-Realm } -+ { User-Name } -+ *[ Supported-Features] -+ { Subscription-Data} -+ [IDR- Flags ] -+ *[ AVP ] -+ *[ Proxy-Info ] -+ *[ Route-Record ] -+ */ -+ struct dict_object * cmd; -+ struct dict_cmd_data data = { -+ 319, /* Code */ -+ "Insert-Subscriber-Data-Request", /* Name */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE /* Fixed flag values */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Session-Id", RULE_FIXED_HEAD, -1, 1 } -+ ,{ "Vendor-Specific-Application-Id", RULE_OPTIONAL, -1, 1 } -+ ,{ "Auth-Session-State", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Host", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "Destination-Host", RULE_REQUIRED, -1, 1 } -+ ,{ "Destination-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "User-Name", RULE_REQUIRED, -1, 1 } -+ ,{ "Supported-Features", RULE_OPTIONAL, -1, -1 } -+ ,{ "Subscription-Data", RULE_REQUIRED, -1, 1 } -+ ,{ "IDR-Flags", RULE_OPTIONAL, -1, 1 } -+ ,{ "Proxy-Info", RULE_OPTIONAL, -1, -1 } -+ ,{ "Route-Record", RULE_OPTIONAL, -1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_COMMAND, &data, s6a_dict, &cmd); -+ PARSE_loc_rules( rules, cmd ); -+ } -+ -+ /* Insert-Subscriber-Data-Answer IDA Command - 3GPP TS 29.272 #7.2.10 */ -+ { -+ /* -+ -+ The Insert-Subscriber-Data-Request (IDR) command, indicated by the -+ Command-Code field set to 319 and the 'R' bit set in the Command -+ Flags field, is sent from HSS to MME or SGSN. -+ -+ < Insert-Subscriber-Data-Answer> ::= < Diameter Header: 319, PXY, 16777251 > -+ < Session-Id > -+ [ Vendor-Specific-Application-Id ] -+ *[ Supported-Features ] -+ [ Result-Code ] -+ [ Experimental-Result ] -+ { Auth-Session-State } -+ { Origin-Host } -+ { Origin-Realm } -+ [ IMS-Voice-Over-PS-Sessions-Supported ] -+ [ Last-UE-Activity-Time ] -+ [ RAT-Type ] -+ [ IDA-Flags ] -+ [ EPS-User-State ] -+ [ EPS-Location-Information ] -+ *[ AVP ] -+ *[ Failed-AVP ] -+ *[ Proxy-Info ] -+ *[ Route-Record ] -+ */ -+ struct dict_object * cmd; -+ struct dict_cmd_data data = { -+ 319, /* Code */ -+ "Insert-Subscriber-Data-Answer", /* Name */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */ -+ CMD_FLAG_PROXIABLE /* Fixed flag values */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Session-Id", RULE_FIXED_HEAD, -1, 1 } -+ ,{ "Vendor-Specific-Application-Id", RULE_OPTIONAL, -1, 1 } -+ ,{ "Supported-Features", RULE_OPTIONAL, -1, -1 } -+ ,{ "Result-Code", RULE_OPTIONAL, -1, 1 } -+ ,{ "Experimental-Result", RULE_OPTIONAL, -1, 1 } -+ ,{ "Auth-Session-State", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Host", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "IMS-Voice-Over-PS-Sessions-Supported", RULE_OPTIONAL, -1, 1 } -+ ,{ "Last-UE-Activity-Time", RULE_OPTIONAL, -1, 1 } -+ ,{ "RAT-Type", RULE_OPTIONAL, -1, 1 } -+ ,{ "IDA-Flags", RULE_OPTIONAL, -1, 1 } -+ ,{ "EPS-User-State", RULE_OPTIONAL, -1, 1 } -+ ,{ "EPS-Location-Information", RULE_OPTIONAL, -1, 1 } -+ ,{ "Failed-AVP", RULE_OPTIONAL, -1, -1 } -+ ,{ "Proxy-Info", RULE_OPTIONAL, -1, -1 } -+ ,{ "Route-Record", RULE_OPTIONAL, -1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_COMMAND, &data, s6a_dict, &cmd); -+ PARSE_loc_rules( rules, cmd ); -+ } -+ -+ /* Delete-Subscriber-Data-Request (DSR) Command - 3GPP TS 29.272 #7.2.11 */ -+ { -+ /* -+ -+ The Delete-SubscriberData-Request (DSR) command, indicated by -+ the Command-Code field set to 320 and the 'R' bit -+ set in the Command Flags field, is sent from HSS to MME or SGSN. -+ -+ < Delete-Subscriber-Data-Request > ::= < Diameter Header: 320, REQ, PXY, 16777251 > -+ < Session-Id > -+ [ Vendor-Specific-Application-Id ] -+ { Auth-Session-State } -+ { Origin-Host } -+ { Origin-Realm } -+ { Destination-Host } -+ { Destination-Realm } -+ { User-Name } -+ *[ Supported-Features ] -+ { DSR-Flags } -+ *[ Context-Identifier ] -+ [ Trace-Reference ] -+ *[ TS-Code ] -+ *[ SS-Code ] -+ *[ AVP ] -+ *[ Proxy-Info ] -+ *[ Route-Record ] -+ */ -+ struct dict_object * cmd; -+ struct dict_cmd_data data = { -+ 320, /* Code */ -+ "Delete-SubscriberData-Request", /* Name */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE /* Fixed flag values */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Session-Id", RULE_FIXED_HEAD, -1, 1 } -+ ,{ "Vendor-Specific-Application-Id", RULE_OPTIONAL, -1, 1 } -+ ,{ "Auth-Session-State", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Host", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "Destination-Host", RULE_REQUIRED, -1, 1 } -+ ,{ "Destination-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "User-Name", RULE_REQUIRED, -1, 1 } -+ ,{ "Supported-Features", RULE_OPTIONAL, -1, -1 } -+ ,{ "DSR-Flags", RULE_REQUIRED, -1, 1 } -+ ,{ "Context-Identifier", RULE_OPTIONAL, -1, -1 } -+ ,{ "Trace-Reference", RULE_OPTIONAL, -1, 1 } -+ ,{ "TS-Code", RULE_OPTIONAL, -1, -1 } -+ ,{ "SS-Code", RULE_OPTIONAL, -1, -1 } -+ ,{ "Proxy-Info", RULE_OPTIONAL, -1, -1 } -+ ,{ "Route-Record", RULE_OPTIONAL, -1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_COMMAND, &data, s6a_dict, &cmd); -+ PARSE_loc_rules( rules, cmd ); -+ } -+ -+ /* Delete-Subscriber-Data-Answer (DSA) Command - 3GPP TS 29.272 #7.2.12 */ -+ { -+ /* -+ -+ The Delete-SubscriberData-Answer (DSA) command, indicated by the -+ Command-Code field set to 320 and the 'R' bit -+ cleared in the Command Flags field, is sent from MME or SGSN to HSS. -+ -+ < Delete-Subscriber-Data-Answer> ::= < Diameter Header: 320, PXY, 16777251 > -+ < Session-Id > -+ [ Vendor-Specific-Application-Id ] -+ *[ Supported-Features ] -+ [ Result-Code ] -+ [ Experimental-Result ] -+ { Auth-Session-State } -+ { Origin-Host } -+ { Origin-Realm } -+ [ DSA-Flags ] -+ *[ AVP ] -+ *[ Failed-AVP ] -+ *[ Proxy-Info ] -+ *[ Route-Record ] -+ */ -+ struct dict_object * cmd; -+ struct dict_cmd_data data = { -+ 320, /* Code */ -+ "Delete-SubscriberData-Answer", /* Name */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */ -+ CMD_FLAG_PROXIABLE /* Fixed flag values */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Session-Id", RULE_FIXED_HEAD, -1, 1 } -+ ,{ "Vendor-Specific-Application-Id", RULE_OPTIONAL, -1, 1 } -+ ,{ "Supported-Features", RULE_OPTIONAL, -1, -1 } -+ ,{ "Result-Code", RULE_OPTIONAL, -1, 1 } -+ ,{ "Experimental-Result", RULE_OPTIONAL, -1, 1 } -+ ,{ "Auth-Session-State", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Host", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "DSA-Flags", RULE_OPTIONAL, -1, 1 } -+ ,{ "Proxy-Info", RULE_OPTIONAL, -1, -1 } -+ ,{ "Route-Record", RULE_OPTIONAL, -1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_COMMAND, &data, s6a_dict, &cmd); -+ PARSE_loc_rules( rules, cmd ); -+ } -+ -+ /* Purge-UE-Request (PUR) Command - 3GPP TS 29.272 #7.2.13 */ -+ { -+ /* -+ -+ The Delete-SubscriberData-Request (DSR) command, indicated by -+ the Command-Code field set to 320 and the 'R' bit -+ set in the Command Flags field, is sent from HSS to MME or SGSN. -+ -+ < Purge-UE-Request> ::= < Diameter Header: 321, REQ, PXY, 16777251 > -+ < Session-Id > -+ [ Vendor-Specific-Application-Id ] -+ { Auth-Session-State } -+ { Origin-Host } -+ { Origin-Realm } -+ [ Destination-Host ] -+ { Destination-Realm } -+ { User-Name } -+ [ PUR-Flags ] -+ *[ Supported-Features ] -+ *[ AVP ] -+ *[ Proxy-Info ] -+ *[ Route-Record ] -+ */ -+ struct dict_object * cmd; -+ struct dict_cmd_data data = { -+ 321, /* Code */ -+ "Purge-UE-Request", /* Name */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE /* Fixed flag values */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Session-Id", RULE_FIXED_HEAD, -1, 1 } -+ ,{ "Vendor-Specific-Application-Id", RULE_OPTIONAL, -1, 1 } -+ ,{ "Auth-Session-State", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Host", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "Destination-Host", RULE_OPTIONAL, -1, 1 } -+ ,{ "Destination-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "User-Name", RULE_REQUIRED, -1, 1 } -+ ,{ "PUR-Flags", RULE_OPTIONAL, -1, 1 } -+ ,{ "Supported-Features", RULE_OPTIONAL, -1, -1 } -+ ,{ "Proxy-Info", RULE_OPTIONAL, -1, -1 } -+ ,{ "Route-Record", RULE_OPTIONAL, -1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_COMMAND, &data, s6a_dict, &cmd); -+ PARSE_loc_rules( rules, cmd ); -+ } -+ -+ /* Purge-UE-Answer (PUA) Command - 3GPP TS 29.272 #7.2.14 */ -+ { -+ /* -+ -+ The Purge-UE-Answer (PUA) command, indicated by the Command-Code -+ field set to 321 and the 'R' bit cleared in the -+ Command Flags field, is sent from HSS to MME or SGSN. -+ -+ < Purge-UE-Answer> ::= < Diameter Header: 321, PXY, 16777251 > -+ < Session-Id > -+ [ Vendor-Specific-Application-Id ] -+ *[ Supported-Features ] -+ [ Result-Code ] -+ [ Experimental-Result ] -+ { Auth-Session-State } -+ { Origin-Host } -+ { Origin-Realm } -+ [ PUA-Flags ] -+ *[ AVP ] -+ *[ Failed-AVP ] -+ *[ Proxy-Info ] -+ *[ Route-Record ] -+ */ -+ struct dict_object * cmd; -+ struct dict_cmd_data data = { -+ 321, /* Code */ -+ "Purge-UE-Answer", /* Name */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */ -+ CMD_FLAG_PROXIABLE /* Fixed flag values */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Session-Id", RULE_FIXED_HEAD, -1, 1 } -+ ,{ "Vendor-Specific-Application-Id", RULE_OPTIONAL, -1, 1 } -+ ,{ "Supported-Features", RULE_OPTIONAL, -1, -1 } -+ ,{ "Result-Code", RULE_OPTIONAL, -1, 1 } -+ ,{ "Experimental-Result", RULE_OPTIONAL, -1, 1 } -+ ,{ "Auth-Session-State", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Host", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "PUA-Flags", RULE_OPTIONAL, -1, 1 } -+ ,{ "Failed-AVP", RULE_OPTIONAL, -1, -1 } -+ ,{ "Proxy-Info", RULE_OPTIONAL, -1, -1 } -+ ,{ "Route-Record", RULE_OPTIONAL, -1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_COMMAND, &data, s6a_dict, &cmd); -+ PARSE_loc_rules( rules, cmd ); -+ } -+ -+ /* Reset-Request (RSR) Command - 3GPP TS 29.272 #7.2.15 */ -+ { -+ /* -+ -+ The Reset-Request (RSR) command, indicated by the Command-Code -+ field set to 322 and the 'R' bit set in the -+ Command Flags field, is sent from HSS to MME or SGSN. -+ -+ < Reset-Request> ::= < Diameter Header: 322, REQ, PXY, 16777251 > -+ < Session-Id > -+ [ Vendor-Specific-Application-Id ] -+ { Auth-Session-State } -+ { Origin-Host } -+ { Origin-Realm } -+ { Destination-Host } -+ { Destination-Realm } -+ *[ Supported-Features ] -+ *[ User-Id ] -+ *[ AVP ] -+ *[ Proxy-Info ] -+ *[ Route-Record ] -+ */ -+ struct dict_object * cmd; -+ struct dict_cmd_data data = { -+ 322, /* Code */ -+ "Reset-Request", /* Name */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE /* Fixed flag values */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Session-Id", RULE_FIXED_HEAD, -1, 1 } -+ ,{ "Vendor-Specific-Application-Id", RULE_OPTIONAL, -1, 1 } -+ ,{ "Auth-Session-State", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Host", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "Destination-Host", RULE_REQUIRED, -1, 1 } -+ ,{ "Destination-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "Supported-Features", RULE_OPTIONAL, -1, -1 } -+ ,{ "User-Id", RULE_OPTIONAL, -1, -1 } -+ ,{ "Proxy-Info", RULE_OPTIONAL, -1, -1 } -+ ,{ "Route-Record", RULE_OPTIONAL, -1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_COMMAND, &data, s6a_dict, &cmd); -+ PARSE_loc_rules( rules, cmd ); -+ } -+ -+ /* Reset-Answer (RSA) Command - 3GPP TS 29.272 #7.2.16 */ -+ { -+ /* -+ -+ The Authentication-Information-Answer (RSA) command, indicated by -+ the Command-Code field set to 322 and the 'R' -+ bit cleared in the Command Flags field, is sent from MME or SGSN to HSS. -+ -+ < Reset-Answer> ::= < Diameter Header: 322, PXY, 16777251 > -+ < Session-Id > -+ [ Vendor-Specific-Application-Id ] -+ *[ Supported-Features ] -+ [ Result-Code ] -+ [ Experimental-Result ] -+ { Auth-Session-State } -+ { Origin-Host } -+ { Origin-Realm } -+ *[ AVP ] -+ *[ Failed-AVP ] -+ *[ Proxy-Info ] -+ *[ Route-Record ] -+ */ -+ struct dict_object * cmd; -+ struct dict_cmd_data data = { -+ 322, /* Code */ -+ "Reset-Anwer", /* Name */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */ -+ CMD_FLAG_PROXIABLE /* Fixed flag values */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Session-Id", RULE_FIXED_HEAD, -1, 1 } -+ ,{ "Vendor-Specific-Application-Id", RULE_OPTIONAL, -1, 1 } -+ ,{ "Supported-Features", RULE_OPTIONAL, -1, -1 } -+ ,{ "Result-Code", RULE_OPTIONAL, -1, 1 } -+ ,{ "Experimental-Result", RULE_OPTIONAL, -1, 1 } -+ ,{ "Auth-Session-State", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Host", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "Failed-AVP", RULE_OPTIONAL, -1, -1 } -+ ,{ "Proxy-Info", RULE_OPTIONAL, -1, -1 } -+ ,{ "Route-Record", RULE_OPTIONAL, -1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_COMMAND, &data, s6a_dict, &cmd); -+ PARSE_loc_rules( rules, cmd ); -+ } -+ -+ /* Notify-Request (NOR) Command - 3GPP TS 29.272 #7.2.17 */ -+ { -+ /* -+ -+ The Notify-Request (NOR) command, indicated by the Command-Code -+ field set to 323 and the 'R' bit set in the Command Flags field, -+ is sent from MME or SGSN to HSS. -+ -+ < Notify-Request> ::= < Diameter Header: 323, REQ, PXY, 16777251 > -+ < Session-Id > -+ [ Vendor-Specific-Application-Id ] -+ { Auth-Session-State } -+ { Origin-Host } -+ { Origin-Realm } -+ [ Destination-Host ] -+ { Destination-Realm } -+ { User-Name } -+ *[ Supported-Features ] -+ [ Terminal-Information ] -+ [ MIP6-Agent-Info ] -+ [ Visited-Network-Identifier ] -+ [ Context-Identifier ] -+ [ Service-Selection ] -+ [ Alert-Reason ] -+ [ UE-SRVCC-Capability ] -+ [ NOR-Flags ] -+ *[ AVP ] -+ *[ Proxy-Info ] -+ *[ Route-Record ] -+ */ -+ struct dict_object * cmd; -+ struct dict_cmd_data data = { -+ 323, /* Code */ -+ "Notify-Request", /* Name */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE /* Fixed flag values */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Session-Id", RULE_FIXED_HEAD, -1, 1 } -+ ,{ "Vendor-Specific-Application-Id", RULE_OPTIONAL, -1, 1 } -+ ,{ "Auth-Session-State", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Host", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "Destination-Host", RULE_OPTIONAL, -1, 1 } -+ ,{ "Destination-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "User-Name", RULE_REQUIRED, -1, 1 } -+ ,{ "Supported-Features", RULE_OPTIONAL, -1, -1 } -+ ,{ "Terminal-Information", RULE_OPTIONAL, -1, 1 } -+ ,{ "MIP6-Agent-Info", RULE_OPTIONAL, -1, 1 } -+ ,{ "Visited-Network-Identifier", RULE_OPTIONAL, -1, 1 } -+ ,{ "Context-Identifier", RULE_OPTIONAL, -1, 1 } -+ ,{ "Service-Selection", RULE_OPTIONAL, -1, 1 } -+ ,{ "Alert-Reason", RULE_OPTIONAL, -1, 1 } -+ ,{ "UE-SRVCC-Capability", RULE_OPTIONAL, -1, 1 } -+ ,{ "NOR-Flags", RULE_OPTIONAL, -1, 1 } -+ ,{ "Proxy-Info", RULE_OPTIONAL, -1, -1 } -+ ,{ "Route-Record", RULE_OPTIONAL, -1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_COMMAND, &data, s6a_dict, &cmd); -+ PARSE_loc_rules( rules, cmd ); -+ } -+ -+ /* Notify-Answer (NOA) Command - 3GPP TS 29.272 #7.2.18 */ -+ { -+ /* -+ -+ The Notify-Answer (NOA) command, indicated by the Command-Code -+ field set to 323 and the 'R' bit cleared in the -+ Command Flags field, is sent from HSS to MME or SGSN. -+ -+ < Notify-Answer> ::= < Diameter Header: 323, PXY, 16777251 > -+ < Session-Id > -+ [ Vendor-Specific-Application-Id ] -+ [ Result-Code ] -+ [ Experimental-Result ] -+ { Auth-Session-State } -+ { Origin-Host } -+ { Origin-Realm } -+ *[ Supported-Features ] -+ *[ AVP ] -+ *[ Failed-AVP ] -+ *[ Proxy-Info ] -+ *[ Route-Record ] -+ */ -+ struct dict_object * cmd; -+ struct dict_cmd_data data = { -+ 323, /* Code */ -+ "Notify-Answer", /* Name */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */ -+ CMD_FLAG_PROXIABLE /* Fixed flag values */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Session-Id", RULE_FIXED_HEAD, -1, 1 } -+ ,{ "Vendor-Specific-Application-Id", RULE_OPTIONAL, -1, 1 } -+ ,{ "Result-Code", RULE_OPTIONAL, -1, 1 } -+ ,{ "Experimental-Result", RULE_OPTIONAL, -1, 1 } -+ ,{ "Auth-Session-State", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Host", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "Supported-Features", RULE_OPTIONAL, -1, -1 } -+ ,{ "Failed-AVP", RULE_OPTIONAL, -1, -1 } -+ ,{ "Proxy-Info", RULE_OPTIONAL, -1, -1 } -+ ,{ "Route-Record", RULE_OPTIONAL, -1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_COMMAND, &data, s6a_dict, &cmd); -+ PARSE_loc_rules( rules, cmd ); -+ } -+ -+ /* ME-Identity-Check-Request (ECR) Command - 3GPP TS 29.272 #7.2.19 */ -+ { -+ /* -+ -+ The ME-Identity-Check-Request (ECR) command, indicated by the -+ Command-Code field set to 324 and the 'R' bit set -+ in the Command Flags field, is sent from MME or SGSN to EIR. -+ -+ < ME-Identity-Check-Request > ::= < Diameter Header: 324, REQ, PXY, 16777252 > -+ < Session-Id > -+ [ Vendor-Specific-Application-Id ] -+ { Auth-Session-State } -+ { Origin-Host } -+ { Origin-Realm } -+ [ Destination-Host ] -+ { Destination-Realm } -+ { Terminal-Information } -+ [ User-Name ] -+ *[ AVP ] -+ *[ Proxy-Info ] -+ *[ Route-Record ] -+ */ -+ struct dict_object * cmd; -+ struct dict_cmd_data data = { -+ 324, /* Code */ -+ "ME-Identity-Check-Request", /* Name */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE /* Fixed flag values */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Session-Id", RULE_FIXED_HEAD, -1, 1 } -+ ,{ "Vendor-Specific-Application-Id", RULE_OPTIONAL, -1, 1 } -+ ,{ "Auth-Session-State", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Host", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "Destination-Host", RULE_OPTIONAL, -1, 1 } -+ ,{ "Destination-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "Terminal-Information", RULE_REQUIRED, -1, 1 } -+ ,{ "User-Name", RULE_OPTIONAL, -1, 1 } -+ ,{ "Proxy-Info", RULE_OPTIONAL, -1, -1 } -+ ,{ "Route-Record", RULE_OPTIONAL, -1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_COMMAND, &data, s6a_dict, &cmd); -+ PARSE_loc_rules( rules, cmd ); -+ } -+ -+ /* ME-Identity-Check-Answer (ECA) Command - 3GPP TS 29.272 #7.2.20 */ -+ { -+ /* -+ -+ The ME-Identity-Check-Answer (ECA) command, indicated by the -+ Command-Code field set to 324 and the 'R' bit -+ cleared in the Command Flags field, is sent from EIR to MME or SGSN. -+ -+ < ME-Identity-Check-Answer> ::= < Diameter Header: 324, PXY, 16777252 > -+ < Session-Id > -+ [ Vendor-Specific-Application-Id ] -+ [ Result-Code ] -+ [ Experimental-Result ] -+ { Auth-Session-State } -+ { Origin-Host } -+ { Origin-Realm } -+ [ Equipment-Status ] -+ *[ AVP ] -+ *[ Failed-AVP ] -+ *[ Proxy-Info ] -+ *[ Route-Record ] -+ */ -+ struct dict_object * cmd; -+ struct dict_cmd_data data = { -+ 324, /* Code */ -+ "ME-Identity-Check-Answer", /* Name */ -+ CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */ -+ CMD_FLAG_PROXIABLE /* Fixed flag values */ -+ }; -+ -+ struct local_rules_definition rules[] = -+ { -+ { "Session-Id", RULE_FIXED_HEAD, -1, 1 } -+ ,{ "Vendor-Specific-Application-Id", RULE_OPTIONAL, -1, 1 } -+ ,{ "Result-Code", RULE_OPTIONAL, -1, 1 } -+ ,{ "Experimental-Result", RULE_OPTIONAL, -1, 1 } -+ ,{ "Auth-Session-State", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Host", RULE_REQUIRED, -1, 1 } -+ ,{ "Origin-Realm", RULE_REQUIRED, -1, 1 } -+ ,{ "Equipment-Status", RULE_OPTIONAL, -1, 1 } -+ ,{ "User-Name", RULE_OPTIONAL, -1, 1 } -+ ,{ "Failed-AVP", RULE_OPTIONAL, -1, -1 } -+ ,{ "Proxy-Info", RULE_OPTIONAL, -1, -1 } -+ ,{ "Route-Record", RULE_OPTIONAL, -1, -1 } -+ }; -+ -+ CHECK_dict_new( DICT_COMMAND, &data, s6a_dict, &cmd); -+ PARSE_loc_rules( rules, cmd ); -+ } -+ } -+ -+ TRACE_DEBUG(INFO, "Dictionary Extension 'S6A from 3GPP standard v.10.5' initialized"); -+ return 0; -+} -+EXTENSION_ENTRY("dict_s6a", dict_s6a_init, "dict_nas_mipv6"); diff --git a/openair-cn/S6A/freediameter/install_freediameter.sh b/openair-cn/S6A/freediameter/install_freediameter.sh deleted file mode 100755 index 9a9c4899cf..0000000000 --- a/openair-cn/S6A/freediameter/install_freediameter.sh +++ /dev/null @@ -1,113 +0,0 @@ -# !/bin/sh -################################################################################ -# 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@eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ - -CURRENT_PATH=`pwd` - -sudo apt-get install autoconf automake gawk cmake make gcc flex bison libsctp1 libsctp-dev libidn2-0-dev \ -libidn11-dev libmysqlclient-dev libxml2-dev swig python-dev cmake-curses-gui \ -valgrind guile-2.0-dev libgmp-dev libgcrypt11-dev gdb unzip libtasn1-3-dev g++ \ -linux-headers-`uname -r` build-essential -y -source ../../SCRIPTS/utils.bash - -if [ -f install_log.txt ] - then - rm -f install_log.txt -fi - -if [ ! -d /usr/local/src/ ] - then - echo "/usr/local/src/ doesn't exist please create one" - exit -1 -fi - -if [ ! -w /usr/local/src/ ] - then - echo "You don't have permissions to write to /usr/local/src/" -# exit -1 -fi - -cd /usr/local/src/ - -# L.GAUTHIER: GNUTLS 3.1.23 compiles on 14.04 x64 with nettle comming with ubuntu -# see http://www.bauer-power.net/2014/06/how-to-install-gnutls-3123-from-source.html#.VD6LI4VxOPI -# if we have ubuntu 14.10 the default packages are ok - -[ -f /etc/os-release ] && source /etc/os-release -if echo $NAME $VERSION_ID | awk '{version=$2+0; if (version>14 && $1=="Ubuntu") exit 0} {exit 1}' - then - apt-get install -y gnutls-bin nettle-bin nettle-dev libssl-dev -else - echo "Downloading nettle archive" - - rm -rf nettle-2.5.tar.gz nettle-2.5.tar nettle-2.5 2> /dev/null - wget ftp://ftp.lysator.liu.se/pub/security/lsh/nettle-2.5.tar.gz > install_log.txt - echo "Uncompressing nettle archive" - tar xf nettle-2.5.tar.gz - cd nettle-2.5/ - ./configure --disable-openssl --enable-shared --prefix=/usr > install_log.txt || exit -1 - echo "Compiling nettle" - make -j4 > install_log.txt 2>&1 - make check > install_log.txt - sudo make install > install_log.txt - cd ../ - - echo "Downloading gnutls archive" - rm -rf gnutls-3.1.0.tar.xz gnutls-3.1.0 2> /dev/null - wget ftp://ftp.gnutls.org/gcrypt/gnutls/stable/gnutls-3.1.0.tar.xz > install_log.txt - echo "Uncompressing gnutls archive" - tar xf gnutls-3.1.0.tar.xz - cd gnutls-3.1.0/ - ./configure --prefix=/usr || exit -1 - echo "Compiling gnutls" - make -j2 > install_log.txt 2>&1 - sudo make install > install_log.txt - cd ../ -fi - -echo "Downloading freeDiameter archive" -apt-get install -y mercurial -rm -rf latest.tar.gz freeDiameter -wget http://www.freediameter.net/latest.tar.gz -echo "Uncompressing freeDiameter archive" -tar -xzf latest.tar.gz -cd freeDiameter -hg update 1.1.5 -patch -p1 < $OPENAIRCN_DIR/S6A/freediameter/freediameter-1.1.5.patch > install_log.txt -mkdir build -cd build -cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr ../ > install_log.txt || exit -1 -echo "Compiling freeDiameter" -sudo make -j2 > install_log.txt 2>&1 -#make help -sudo make test > install_log.txt -sudo make install > install_log.txt - -cd $CURRENT_PATH -./make_certs.sh diff --git a/openair-cn/S6A/freediameter/make_certs.sh b/openair-cn/S6A/freediameter/make_certs.sh deleted file mode 100755 index cf176940d3..0000000000 --- a/openair-cn/S6A/freediameter/make_certs.sh +++ /dev/null @@ -1,64 +0,0 @@ -#!/bin/bash -################################################################################ -# 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.frARG is -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ - -# ARG is REALM -# BY DEFAULT REALM IS "eur" - -DEFAULTREALMVALUE="eur" -REALM=${1:-$DEFAULTREALMVALUE} - -rm -rf demoCA -mkdir demoCA -echo 01 > demoCA/serial -touch demoCA/index.txt - -user=$(whoami) -HOSTNAME=$(hostname -f) - -echo "Creating MME certificate for user '$HOSTNAME'.'$REALM'" - -# CA self certificate -openssl req -new -batch -x509 -days 3650 -nodes -newkey rsa:1024 -out mme.cacert.pem -keyout mme.cakey.pem -subj /CN=$REALM/C=FR/ST=PACA/L=Aix/O=Eurecom/OU=CM - -openssl genrsa -out mme.key.pem 1024 -openssl req -new -batch -out mme.csr.pem -key mme.key.pem -subj /CN=$HOSTNAME.$REALM/C=FR/ST=PACA/L=Aix/O=Eurecom/OU=CM -openssl ca -cert mme.cacert.pem -keyfile mme.cakey.pem -in mme.csr.pem -out mme.cert.pem -outdir . -batch - -if [ ! -d /usr/local/etc/freeDiameter ] -then - echo "Creating non existing directory: /usr/local/etc/freeDiameter/" - sudo mkdir /usr/local/etc/freeDiameter/ -fi - -sudo cp -uv mme.key.pem mme.cert.pem mme.cacert.pem mme.cakey.pem /usr/local/etc/freeDiameter/ - -# openssl genrsa -out ubuntu.key.pem 1024 -# openssl req -new -batch -x509 -out ubuntu.csr.pem -key ubuntu.key.pem -subj /CN=ubuntu.localdomain/C=FR/ST=BdR/L=Aix/O=fD/OU=Tests -# openssl ca -cert cacert.pem -keyfile cakey.pem -in ubuntu.csr.pem -out ubuntu.cert.pem -outdir . -batch diff --git a/openair-cn/S6A/freediameter/s6a.conf b/openair-cn/S6A/freediameter/s6a.conf deleted file mode 100644 index fbf1fdf345..0000000000 --- a/openair-cn/S6A/freediameter/s6a.conf +++ /dev/null @@ -1,61 +0,0 @@ -# -------- Local --------- - -# Uncomment if the framework cannot resolv it. -Identity = "roux.test.fr"; -Realm = "test.fr"; - -# TLS configuration (see previous section) -TLS_Cred = "/homes/roux/lte-epc/openair3/OPENAIRHSS/conf/roux.cert.pem", -"/homes/roux/lte-epc/openair3/OPENAIRHSS/conf/roux.key.pem"; -TLS_CA = "/homes/roux/lte-epc/openair3/OPENAIRHSS/conf/cacert.pem"; - -# Disable use of TCP protocol (only listen and connect in SCTP) -# Default : TCP enabled -No_TCP; -#No_SCTP; - -# Limit the number of SCTP streams -SCTP_streams = 15; - -NoRelay; -TLS_old_method; -AppServThreads = 1; - -# -------- Extensions --------- - -# Uncomment (and create rtd.conf) to specify routing table for this peer. -#LoadExtension = "rt_default.fdx" : "rtd.conf"; - -# Uncomment (and create acl.conf) to allow incoming connections from other peers. -#LoadExtension = "acl_wl.fdx" : "acl.conf"; - -# Uncomment to display periodic state information -#LoadExtension = "dbg_monitor.fdx"; - -# Uncomment to enable an interactive Python interpreter session. -# (see doc/dbg_interactive.py.sample for more information) -#LoadExtension = "dbg_interactive.fdx"; - -# Load the RFC4005 dictionary objects -#LoadExtension = "dict_nasreq.fdx"; - -LoadExtension = "dict_nas_mipv6.fdx"; -LoadExtension = "dict_s6a.fdx"; - -# Load RFC4072 dictionary objects -#LoadExtension = "dict_eap.fdx"; - -# Load the Diameter EAP server extension (requires diameap.conf) -#LoadExtension = "app_diameap.fdx" : "diameap.conf"; - -# Load the Accounting Server extension (requires app_acct.conf) -#LoadExtension = "app_acct.fdx" : "app_acct.conf"; - -# -------- Peers --------- - -# The framework will actively attempt to establish and maintain a connection -# with the peers listed here. -# For only accepting incoming connections, see the acl_wl.fx extension. - -# ConnectPeer = "hss.test.fr" { ConnectTo = "192.168.56.101"; No_IPv6; No_TCP; Port = 3868; Realm = "test.fr"; }; -# ConnectPeer = "hss.test.fr" { ConnectTo = "192.168.56.1"; No_TLS; }; diff --git a/openair-cn/S6A/s6a_apn_conf.c b/openair-cn/S6A/s6a_apn_conf.c deleted file mode 100644 index cfa84e8777..0000000000 --- a/openair-cn/S6A/s6a_apn_conf.c +++ /dev/null @@ -1,28 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ diff --git a/openair-cn/S6A/s6a_auth_info.c b/openair-cn/S6A/s6a_auth_info.c deleted file mode 100644 index 499eacb4ee..0000000000 --- a/openair-cn/S6A/s6a_auth_info.c +++ /dev/null @@ -1,454 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -#include <stdio.h> -#include <stdint.h> - -#include "mme_config.h" - -#include "assertions.h" -#include "conversions.h" - -#include "intertask_interface.h" -#include "security_types.h" -#include "s6a_defs.h" -#include "s6a_messages.h" -#include "msc.h" - -static -int s6a_parse_rand(struct avp_hdr *hdr, uint8_t *rand_p) -{ - int ret = 0; - DevCheck(hdr->avp_value->os.len == RAND_LENGTH_OCTETS, RAND_LENGTH_OCTETS, - hdr->avp_value->os.len, 0); - DevAssert(rand_p != NULL); - - STRING_TO_RAND(hdr->avp_value->os.data, rand_p, ret); - return ret; -} - -static -int s6a_parse_xres(struct avp_hdr *hdr, res_t *xres) -{ - int ret = 0; - DevCheck(hdr->avp_value->os.len >= XRES_LENGTH_MIN && - hdr->avp_value->os.len <= XRES_LENGTH_MAX, XRES_LENGTH_MIN, - XRES_LENGTH_MAX, hdr->avp_value->os.len); - DevAssert(xres != NULL); - - STRING_TO_XRES(hdr->avp_value->os.data, hdr->avp_value->os.len, xres, ret); - return ret; -} - -static -int s6a_parse_autn(struct avp_hdr *hdr, uint8_t *autn) -{ - int ret = 0; - DevCheck(hdr->avp_value->os.len == AUTN_LENGTH_OCTETS, AUTN_LENGTH_OCTETS, - hdr->avp_value->os.len, 0); - DevAssert(autn != NULL); - - STRING_TO_AUTN(hdr->avp_value->os.data, autn, ret); - return ret; -} - -static -int s6a_parse_kasme(struct avp_hdr *hdr, uint8_t *kasme) -{ - int ret = 0; - DevCheck(hdr->avp_value->os.len == KASME_LENGTH_OCTETS, KASME_LENGTH_OCTETS, - hdr->avp_value->os.len, 0); - DevAssert(kasme != NULL); - - STRING_TO_KASME(hdr->avp_value->os.data, kasme, ret); - return ret; -} - -static inline -int s6a_parse_e_utran_vector(struct avp *avp_vector, eutran_vector_t *vector) -{ - int ret = 0x0f; - struct avp *avp; - struct avp_hdr *hdr; - - CHECK_FCT(fd_msg_avp_hdr(avp_vector, &hdr)); - - DevCheck(hdr->avp_code == AVP_CODE_E_UTRAN_VECTOR, - hdr->avp_code, AVP_CODE_E_UTRAN_VECTOR, 0); - - CHECK_FCT(fd_msg_browse(avp_vector, MSG_BRW_FIRST_CHILD, &avp, NULL)); - - while(avp) { - CHECK_FCT(fd_msg_avp_hdr(avp, &hdr)); - - switch(hdr->avp_code) { - case AVP_CODE_RAND: - CHECK_FCT(s6a_parse_rand(hdr, vector->rand)); - ret &= ~0x01; - break; - - case AVP_CODE_XRES: - CHECK_FCT(s6a_parse_xres(hdr, &vector->xres)); - ret &= ~0x02; - break; - - case AVP_CODE_AUTN: - CHECK_FCT(s6a_parse_autn(hdr, vector->autn)); - ret &= ~0x04; - break; - - case AVP_CODE_KASME: - CHECK_FCT(s6a_parse_kasme(hdr, vector->kasme)); - ret &= ~0x08; - break; - - default: - /* Unexpected AVP */ - S6A_ERROR("Unexpected AVP with code %d\n", hdr->avp_code); - return -1; - } - - /* Go to next AVP in the grouped AVP */ - CHECK_FCT(fd_msg_browse(avp, MSG_BRW_NEXT, &avp, NULL)); - } - - if (ret) { - S6A_ERROR("Missing AVP for E-UTRAN vector: %c%c%c%c\n", - ret & 0x01 ? 'R':'-', ret & 0x02 ? 'X':'-', - ret & 0x04 ? 'A':'-', ret & 0x08 ? 'K':'-'); - return -1; - } - - return 0; -} - -static inline -int s6a_parse_authentication_info_avp(struct avp *avp_auth_info, - authentication_info_t *authentication_info) -{ - struct avp *avp; - struct avp_hdr *hdr; - - CHECK_FCT(fd_msg_avp_hdr(avp_auth_info, &hdr)); - - DevCheck(hdr->avp_code == AVP_CODE_AUTHENTICATION_INFO, - hdr->avp_code, AVP_CODE_AUTHENTICATION_INFO, 0); - - authentication_info->nb_of_vectors = 0; - - CHECK_FCT(fd_msg_browse(avp_auth_info, MSG_BRW_FIRST_CHILD, &avp, NULL)); - - while(avp) { - CHECK_FCT(fd_msg_avp_hdr(avp, &hdr)); - - switch(hdr->avp_code) { - case AVP_CODE_E_UTRAN_VECTOR: { - DevAssert(authentication_info->nb_of_vectors == 0); - CHECK_FCT(s6a_parse_e_utran_vector(avp, &authentication_info->eutran_vector)); - authentication_info->nb_of_vectors ++; - } - break; - - default: - /* We should only receive E-UTRAN-Vectors */ - S6A_ERROR("Unexpected AVP with code %d\n", hdr->avp_code); - return -1; - } - - /* Go to next AVP in the grouped AVP */ - CHECK_FCT(fd_msg_browse(avp, MSG_BRW_NEXT, &avp, NULL)); - } - - return 0; -} - -int s6a_aia_cb(struct msg **msg, struct avp *paramavp, - struct session *sess, void *opaque, - enum disp_action *act) -{ - struct msg *ans = NULL; - struct msg *qry = NULL; - struct avp *avp = NULL; - struct avp_hdr *hdr = NULL; - - MessageDef *message_p = NULL; - s6a_auth_info_ans_t *s6a_auth_info_ans_p = NULL; - - int skip_auth_res = 0; - - DevAssert(msg != NULL); - - ans = *msg; - /* Retrieve the original query associated with the asnwer */ - CHECK_FCT(fd_msg_answ_getq(ans, &qry)); - - DevAssert(qry != NULL); - - message_p = itti_alloc_new_message(TASK_S6A, S6A_AUTH_INFO_ANS); - s6a_auth_info_ans_p = &message_p->ittiMsg.s6a_auth_info_ans; - - S6A_DEBUG("Received S6A Authentication Information Answer (AIA)\n"); - - CHECK_FCT(fd_msg_search_avp(qry, s6a_fd_cnf.dataobj_s6a_user_name, &avp)); - - if (avp) { - CHECK_FCT(fd_msg_avp_hdr(avp, &hdr)); - sprintf(s6a_auth_info_ans_p->imsi, "%*s", (int)hdr->avp_value->os.len, - hdr->avp_value->os.data); - } else { - DevMessage("Query has been freed before we received the answer\n"); - } - - /* Retrieve the result-code */ - CHECK_FCT(fd_msg_search_avp(ans, s6a_fd_cnf.dataobj_s6a_result_code, &avp)); - - if (avp) { - CHECK_FCT(fd_msg_avp_hdr(avp, &hdr)); - - s6a_auth_info_ans_p->result.present = S6A_RESULT_BASE; - s6a_auth_info_ans_p->result.choice.base = hdr->avp_value->u32; - - MSC_LOG_TX_MESSAGE( - MSC_S6A_MME, - MSC_MMEAPP_MME, - NULL,0, - "0 S6A_AUTH_INFO_ANS imsi %s %s", - s6a_auth_info_ans_p->imsi, - retcode_2_string(s6a_auth_info_ans_p->result.choice.base)); - - if (hdr->avp_value->u32 != ER_DIAMETER_SUCCESS) { - S6A_ERROR("Got error %u:%s\n", hdr->avp_value->u32, - retcode_2_string(hdr->avp_value->u32)); - goto err; - } else { - S6A_DEBUG("Received S6A Result code %u:%s\n", - s6a_auth_info_ans_p->result.choice.base, - retcode_2_string(s6a_auth_info_ans_p->result.choice.base)); - } - } else { - /* The result-code is not present, may be it is an experimental result - * avp indicating a 3GPP specific failure. - */ - CHECK_FCT(fd_msg_search_avp(ans, s6a_fd_cnf.dataobj_s6a_experimental_result, &avp)); - - if (avp) { - /* The procedure has failed within the HSS. - * NOTE: contrary to result-code, the experimental-result is a grouped - * AVP and requires parsing its childs to get the code back. - */ - s6a_auth_info_ans_p->result.present = S6A_RESULT_EXPERIMENTAL; - s6a_parse_experimental_result(avp, &s6a_auth_info_ans_p->result.choice.experimental); - - MSC_LOG_TX_MESSAGE( - MSC_S6A_MME, - MSC_MMEAPP_MME, - NULL,0, - "0 S6A_AUTH_INFO_ANS imsi %s %s", - s6a_auth_info_ans_p->imsi, - experimental_retcode_2_string(s6a_auth_info_ans_p->result.choice.experimental)); - - skip_auth_res = 1; - } else { - /* Neither result-code nor experimental-result is present -> - * totally incorrect behaviour here. - */ - MSC_LOG_TX_MESSAGE_FAILED( - MSC_S6A_MME, - MSC_MMEAPP_MME, - NULL,0, - "0 S6A_AUTH_INFO_ANS imsi %s", - s6a_auth_info_ans_p->imsi); - - S6A_ERROR("Experimental-Result and Result-Code are absent: " - "This is not a correct behaviour\n"); - goto err; - } - } - - if (skip_auth_res == 0) { - CHECK_FCT(fd_msg_search_avp(ans, s6a_fd_cnf.dataobj_s6a_authentication_info, &avp)); - - if (avp) { - CHECK_FCT(s6a_parse_authentication_info_avp(avp, &s6a_auth_info_ans_p->auth_info)); - } else { - DevMessage("We requested E-UTRAN vectors with an immediate response...\n"); - } - } - itti_send_msg_to_task(TASK_MME_APP, INSTANCE_DEFAULT, message_p); -err: - return 0; -} - -int s6a_generate_authentication_info_req(s6a_auth_info_req_t *air_p) -{ - struct avp *avp; - struct msg *msg; - struct session *sess; - - union avp_value value; - - DevAssert(air_p != NULL); - - /* Create the new update location request message */ - CHECK_FCT(fd_msg_new(s6a_fd_cnf.dataobj_s6a_air, 0, &msg)); - - /* Create a new session */ - CHECK_FCT(fd_sess_new(&sess, fd_g_config->cnf_diamid, - fd_g_config->cnf_diamid_len, (os0_t)"apps6a", 6)); - { - os0_t sid; - size_t sidlen; - CHECK_FCT(fd_sess_getsid(sess, &sid, &sidlen)); - CHECK_FCT(fd_msg_avp_new(s6a_fd_cnf.dataobj_s6a_session_id, 0, &avp)); - value.os.data = sid; - value.os.len = sidlen; - CHECK_FCT(fd_msg_avp_setvalue(avp, &value)); - CHECK_FCT(fd_msg_avp_add(msg, MSG_BRW_FIRST_CHILD, avp)); - } - - CHECK_FCT(fd_msg_avp_new(s6a_fd_cnf.dataobj_s6a_auth_session_state, 0, &avp)); - /* No State maintained */ - value.i32 = 1; - CHECK_FCT(fd_msg_avp_setvalue(avp, &value)); - CHECK_FCT(fd_msg_avp_add(msg, MSG_BRW_LAST_CHILD, avp)); - - /* Add Origin_Host & Origin_Realm */ - CHECK_FCT(fd_msg_add_origin(msg, 0)); - - config_read_lock(&mme_config); - - /* Destination Host */ - { - char host[100]; - size_t hostlen; - - memset(host, 0, 100); - strcat(host, mme_config.s6a_config.hss_host_name); - strcat(host, "."); - strcat(host, mme_config.realm); - - hostlen = strlen(host); - - CHECK_FCT(fd_msg_avp_new(s6a_fd_cnf.dataobj_s6a_destination_host, 0, &avp)); - value.os.data = (unsigned char *)host; - value.os.len = hostlen; - CHECK_FCT(fd_msg_avp_setvalue(avp, &value)); - - CHECK_FCT(fd_msg_avp_add(msg, MSG_BRW_LAST_CHILD, avp)); - } - /* Destination_Realm */ - { - char *realm = mme_config.realm; - size_t realmlen = strlen(realm); - - CHECK_FCT(fd_msg_avp_new(s6a_fd_cnf.dataobj_s6a_destination_realm, 0, &avp)); - value.os.data = (unsigned char *)realm; - value.os.len = realmlen; - CHECK_FCT(fd_msg_avp_setvalue(avp, &value)); - - CHECK_FCT(fd_msg_avp_add(msg, MSG_BRW_LAST_CHILD, avp)); - } - - config_unlock(&mme_config); - - /* Adding the User-Name (IMSI) */ - CHECK_FCT(fd_msg_avp_new(s6a_fd_cnf.dataobj_s6a_user_name, 0, &avp)); - value.os.data = (unsigned char *)air_p->imsi; - value.os.len = strlen(air_p->imsi); - CHECK_FCT(fd_msg_avp_setvalue(avp, &value)); - CHECK_FCT(fd_msg_avp_add(msg, MSG_BRW_LAST_CHILD, avp)); - - /* Adding the visited plmn id */ - { - uint8_t plmn[3] = { 0x00, 0x00, 0x00 }; //{ 0x02, 0xF8, 0x29 }; - - CHECK_FCT(fd_msg_avp_new(s6a_fd_cnf.dataobj_s6a_visited_plmn_id, 0, &avp)); - - - PLMN_T_TO_TBCD(air_p->visited_plmn, - plmn, - mme_config_find_mnc_length(air_p->visited_plmn.MCCdigit1, - air_p->visited_plmn.MCCdigit2, - air_p->visited_plmn.MCCdigit3, - air_p->visited_plmn.MNCdigit1, - air_p->visited_plmn.MNCdigit2, - air_p->visited_plmn.MNCdigit3 - ) - ); - value.os.data = plmn; - value.os.len = 3; - CHECK_FCT(fd_msg_avp_setvalue(avp, &value)); - - CHECK_FCT(fd_msg_avp_add(msg, MSG_BRW_LAST_CHILD, avp)); - S6A_DEBUG("%s plmn: %02X%02X%02X\n", - __FUNCTION__, - plmn[0], - plmn[1], - plmn[2]); - S6A_DEBUG("%s visited_plmn: %02X%02X%02X\n", - __FUNCTION__, - value.os.data[0], - value.os.data[1], - value.os.data[2]); - } - /* Adding the requested E-UTRAN authentication info AVP */ - { - struct avp *child_avp; - CHECK_FCT(fd_msg_avp_new(s6a_fd_cnf.dataobj_s6a_req_eutran_auth_info, 0, &avp)); - - /* Add the number of requested vectors */ - CHECK_FCT(fd_msg_avp_new(s6a_fd_cnf.dataobj_s6a_number_of_requested_vectors, 0, &child_avp)); - value.u32 = air_p->nb_of_vectors; - CHECK_FCT(fd_msg_avp_setvalue(child_avp, &value)); - CHECK_FCT(fd_msg_avp_add(avp, MSG_BRW_LAST_CHILD, child_avp)); - - /* We want to use the vectors immediately in HSS so we have to add - * the Immediate-Response-Preferred AVP. - * Value of this AVP is not significant. - */ - CHECK_FCT(fd_msg_avp_new(s6a_fd_cnf.dataobj_s6a_immediate_response_pref, 0, &child_avp)); - value.u32 = 0; - CHECK_FCT(fd_msg_avp_setvalue(child_avp, &value)); - CHECK_FCT(fd_msg_avp_add(avp, MSG_BRW_LAST_CHILD, child_avp)); - - /* Re-synchronization information containing the AUTS computed at USIM */ - if (air_p->re_synchronization) { - CHECK_FCT(fd_msg_avp_new(s6a_fd_cnf.dataobj_s6a_re_synchronization_info, 0, &child_avp)); - value.os.len = AUTS_LENGTH; - value.os.data = air_p->auts; - CHECK_FCT(fd_msg_avp_setvalue(child_avp, &value)); - CHECK_FCT(fd_msg_avp_add(avp, MSG_BRW_LAST_CHILD, child_avp)); - } - - CHECK_FCT(fd_msg_avp_add(msg, MSG_BRW_LAST_CHILD, avp)); - } - CHECK_FCT(fd_msg_send(&msg, NULL, NULL)); - - return 0; -} diff --git a/openair-cn/S6A/s6a_defs.h b/openair-cn/S6A/s6a_defs.h deleted file mode 100644 index c1a138b23e..0000000000 --- a/openair-cn/S6A/s6a_defs.h +++ /dev/null @@ -1,203 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -#if HAVE_CONFIG_H -# include "config.h" -#endif - -#include <freeDiameter/freeDiameter-host.h> -#include <freeDiameter/libfdcore.h> - -#include "mme_config.h" -#include "queue.h" - -#ifndef S6A_DEFS_H_ -#define S6A_DEFS_H_ - -#ifndef S6A_DEBUG -# define S6A_DEBUG(x, args...) do { fprintf(stdout, "[S6A] [D]"x, ##args); } while(0) -#endif -#ifndef S6A_ERROR -# define S6A_ERROR(x, args...) do { fprintf(stderr, "[S6A] [E]"x, ##args); } while(0) -#endif - -#define VENDOR_3GPP (10415) -#define APP_S6A (16777251) - -/* Errors that fall within the Permanent Failures category shall be used to - * inform the peer that the request has failed, and should not be attempted - * again. The Result-Code AVP values defined in Diameter Base Protocol RFC 3588 - * shall be applied. When one of the result codes defined here is included in a - * response, it shall be inside an Experimental-Result AVP and the Result-Code - * AVP shall be absent. - */ -#define DIAMETER_ERROR_USER_UNKNOWN (5001) -#define DIAMETER_ERROR_ROAMING_NOT_ALLOWED (5004) -#define DIAMETER_ERROR_UNKNOWN_EPS_SUBSCRIPTION (5420) -#define DIAMETER_ERROR_RAT_NOT_ALLOWED (5421) -#define DIAMETER_ERROR_EQUIPMENT_UNKNOWN (5422) -#define DIAMETER_ERROR_UNKOWN_SERVING_NODE (5423) - -/* Result codes that fall within the transient failures category shall be used - * to inform a peer that the request could not be satisfied at the time it was - * received, but may be able to satisfy the request in the future. The - * Result-Code AVP values defined in Diameter Base Protocol RFC 3588 shall be - * applied. When one of the result codes defined here is included in a response, - * it shall be inside an Experimental-Result AVP and the Result-Code AVP shall - * be absent. - */ -#define DIAMETER_AUTHENTICATION_DATA_UNAVAILABLE (4181) - -#define DIAMETER_ERROR_IS_VENDOR(x) \ - ((x == DIAMETER_ERROR_USER_UNKNOWN) || \ - (x == DIAMETER_ERROR_ROAMING_NOT_ALLOWED) || \ - (x == DIAMETER_ERROR_UNKNOWN_EPS_SUBSCRIPTION) || \ - (x == DIAMETER_ERROR_RAT_NOT_ALLOWED) || \ - (x == DIAMETER_ERROR_EQUIPMENT_UNKNOWN) || \ - (x == DIAMETER_AUTHENTICATION_DATA_UNAVAILABLE) || \ - (x == DIAMETER_ERROR_UNKOWN_SERVING_NODE)) - -typedef struct { - struct dict_object *dataobj_s6a_vendor; /* s6a vendor object */ - struct dict_object *dataobj_s6a_app; /* s6a application object */ - - /* Commands */ - struct dict_object *dataobj_s6a_air; /* s6a authentication request */ - struct dict_object *dataobj_s6a_aia; /* s6a authentication answer */ - struct dict_object *dataobj_s6a_ulr; /* s6a update location request */ - struct dict_object *dataobj_s6a_ula; /* s6a update location asnwer */ - struct dict_object *dataobj_s6a_pur; /* s6a purge ue request */ - struct dict_object *dataobj_s6a_pua; /* s6a purge ue answer */ - struct dict_object *dataobj_s6a_clr; /* s6a Cancel Location req */ - struct dict_object *dataobj_s6a_cla; /* s6a Cancel Location ans */ - - /* Some standard basic AVPs */ - struct dict_object *dataobj_s6a_destination_host; - struct dict_object *dataobj_s6a_destination_realm; - struct dict_object *dataobj_s6a_user_name; - struct dict_object *dataobj_s6a_session_id; - struct dict_object *dataobj_s6a_auth_session_state; - struct dict_object *dataobj_s6a_result_code; - struct dict_object *dataobj_s6a_experimental_result; - - /* S6A specific AVPs */ - struct dict_object *dataobj_s6a_visited_plmn_id; - struct dict_object *dataobj_s6a_rat_type; - struct dict_object *dataobj_s6a_ulr_flags; - struct dict_object *dataobj_s6a_ula_flags; - struct dict_object *dataobj_s6a_subscription_data; - struct dict_object *dataobj_s6a_req_eutran_auth_info; - struct dict_object *dataobj_s6a_number_of_requested_vectors; - struct dict_object *dataobj_s6a_immediate_response_pref; - struct dict_object *dataobj_s6a_authentication_info; - struct dict_object *dataobj_s6a_re_synchronization_info; - struct dict_object *dataobj_s6a_service_selection; - struct dict_object *dataobj_s6a_ue_srvcc_cap; - - /* Handlers */ - struct disp_hdl *aia_hdl; /* Authentication Information Answer Handle */ - struct disp_hdl *ula_hdl; /* Update Location Answer Handle */ - struct disp_hdl *pua_hdl; /* Purge UE Answer Handle */ - struct disp_hdl *clr_hdl; /* Cancel Location Request Handle */ -} s6a_fd_cnf_t; - -extern s6a_fd_cnf_t s6a_fd_cnf; - -#define ULR_SINGLE_REGISTRATION_IND (1U) -#define ULR_S6A_S6D_INDICATOR (1U << 1) -#define ULR_SKIP_SUBSCRIBER_DATA (1U << 2) -#define ULR_GPRS_SUBSCRIPTION_DATA_IND (1U << 3) -#define ULR_NODE_TYPE_IND (1U << 4) -#define ULR_INITIAL_ATTACH_IND (1U << 5) -#define ULR_PS_LCS_SUPPORTED_BY_UE (1U << 6) - -#define ULA_SEPARATION_IND (1U) - -#define FLAG_IS_SET(x, flag) \ - ((x) & (flag)) - -#define FLAGS_SET(x, flags) \ - ((x) |= (flags)) - -#define FLAGS_CLEAR(x, flags) \ - ((x) = (x) & ~(flags)) - -/* IANA defined IP address type */ -#define IANA_IPV4 (0x1) -#define IANA_IPV6 (0x2) - -#define AVP_CODE_VENDOR_ID (266) -#define AVP_CODE_EXPERIMENTAL_RESULT (297) -#define AVP_CODE_EXPERIMENTAL_RESULT_CODE (298) -#define AVP_CODE_SERVICE_SELECTION (493) -#define AVP_CODE_BANDWIDTH_UL (516) -#define AVP_CODE_BANDWIDTH_DL (515) -#define AVP_CODE_MSISDN (701) -#define AVP_CODE_SERVED_PARTY_IP_ADDRESS (848) -#define AVP_CODE_QCI (1028) -#define AVP_CODE_ALLOCATION_RETENTION_PRIORITY (1034) -#define AVP_CODE_PRIORITY_LEVEL (1046) -#define AVP_CODE_PRE_EMPTION_CAPABILITY (1047) -#define AVP_CODE_PRE_EMPTION_VULNERABILITY (1048) -#define AVP_CODE_SUBSCRIPTION_DATA (1400) -#define AVP_CODE_AUTHENTICATION_INFO (1413) -#define AVP_CODE_E_UTRAN_VECTOR (1414) -#define AVP_CODE_NETWORK_ACCESS_MODE (1417) -#define AVP_CODE_CONTEXT_IDENTIFIER (1423) -#define AVP_CODE_SUBSCRIBER_STATUS (1424) -#define AVP_CODE_ACCESS_RESTRICTION_DATA (1426) -#define AVP_CODE_ALL_APN_CONFIG_INC_IND (1428) -#define AVP_CODE_APN_CONFIGURATION_PROFILE (1429) -#define AVP_CODE_APN_CONFIGURATION (1430) -#define AVP_CODE_EPS_SUBSCRIBED_QOS_PROFILE (1431) -#define AVP_CODE_AMBR (1435) -#define AVP_CODE_RAND (1447) -#define AVP_CODE_XRES (1448) -#define AVP_CODE_AUTN (1449) -#define AVP_CODE_KASME (1450) -#define AVP_CODE_PDN_TYPE (1456) -#define AVP_CODE_SUBSCRIBED_PERIODIC_RAU_TAU_TIMER (1619) - -int s6a_init(const mme_config_t *mme_config); - -int s6a_fd_new_peer(void); - -void s6a_peer_connected_cb(struct peer_info *info, void *arg); - -int s6a_fd_init_dict_objs(void); - -int s6a_parse_subscription_data(struct avp *avp_subscription_data, - subscription_data_t *subscription_data); - -int s6a_parse_experimental_result(struct avp *avp, s6a_experimental_result_t *ptr); -char *experimental_retcode_2_string(uint32_t ret_code); -char *retcode_2_string(uint32_t ret_code); - - -#endif /* S6A_DEFS_H_ */ diff --git a/openair-cn/S6A/s6a_dict.c b/openair-cn/S6A/s6a_dict.c deleted file mode 100644 index 20a43a67e5..0000000000 --- a/openair-cn/S6A/s6a_dict.c +++ /dev/null @@ -1,182 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -#if HAVE_CONFIG_H -# include "config.h" -#endif - -#include "intertask_interface.h" -#include "s6a_defs.h" -#include "s6a_messages.h" -#include "assertions.h" - -#define CHECK_FD_FCT(fCT) DevAssert(fCT == 0); - -/*! \file s6a_dict.c - * \brief Initialize s6a dictionnary and setup callbacks for procedures - * \author Sebastien ROUX <sebastien.roux@eurecom.fr> - * \date 2013 - * \version 0.1 - */ - -int s6a_fd_init_dict_objs(void) -{ - struct disp_when when; - - vendor_id_t vendor_3gpp = VENDOR_3GPP; - application_id_t app_s6a = APP_S6A; - - /* Pre-loading vendor object */ - CHECK_FD_FCT(fd_dict_search(fd_g_config->cnf_dict, - DICT_VENDOR, - VENDOR_BY_ID, - (void *)&vendor_3gpp, - &s6a_fd_cnf.dataobj_s6a_vendor, - ENOENT)); - - /* Pre-loading application object */ - CHECK_FD_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_APPLICATION, - APPLICATION_BY_ID, (void *)&app_s6a, - &s6a_fd_cnf.dataobj_s6a_app, ENOENT)); - - /* Pre-loading commands objects */ - CHECK_FD_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_COMMAND, - CMD_BY_NAME, "Authentication-Information-Request", - &s6a_fd_cnf.dataobj_s6a_air, ENOENT)); - CHECK_FD_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_COMMAND, - CMD_BY_NAME, "Authentication-Information-Answer", - &s6a_fd_cnf.dataobj_s6a_aia, ENOENT)); - - CHECK_FD_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_COMMAND, - CMD_BY_NAME, "Update-Location-Request", - &s6a_fd_cnf.dataobj_s6a_ulr, ENOENT)); - CHECK_FD_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_COMMAND, - CMD_BY_NAME, "Update-Location-Answer", - &s6a_fd_cnf.dataobj_s6a_ula, ENOENT)); - - CHECK_FD_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_COMMAND, - CMD_BY_NAME, "Purge-UE-Request", - &s6a_fd_cnf.dataobj_s6a_pur, ENOENT)); - CHECK_FD_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_COMMAND, - CMD_BY_NAME, "Purge-UE-Answer", - &s6a_fd_cnf.dataobj_s6a_pua, ENOENT)); - - CHECK_FD_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_COMMAND, - CMD_BY_NAME, "Cancel-Location-Request", - &s6a_fd_cnf.dataobj_s6a_clr, ENOENT)); - CHECK_FD_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_COMMAND, - CMD_BY_NAME, "Cancel-Location-Answer", - &s6a_fd_cnf.dataobj_s6a_cla, ENOENT)); - - /* Pre-loading base avps */ - CHECK_FD_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME, "Destination-Host", - &s6a_fd_cnf.dataobj_s6a_destination_host, ENOENT)); - CHECK_FD_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME, "Destination-Realm", - &s6a_fd_cnf.dataobj_s6a_destination_realm, ENOENT)); - CHECK_FD_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME, "User-Name", - &s6a_fd_cnf.dataobj_s6a_user_name, ENOENT)); - CHECK_FD_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME, "Session-Id", - &s6a_fd_cnf.dataobj_s6a_session_id, ENOENT)); - CHECK_FD_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME, "Auth-Session-State", - &s6a_fd_cnf.dataobj_s6a_auth_session_state, ENOENT)); - CHECK_FD_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME, "Result-Code", - &s6a_fd_cnf.dataobj_s6a_result_code, ENOENT)); - CHECK_FD_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME, "Experimental-Result", - &s6a_fd_cnf.dataobj_s6a_experimental_result, ENOENT)); - - /* Pre-loading S6A specifics AVPs */ - CHECK_FD_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "Visited-PLMN-Id", - &s6a_fd_cnf.dataobj_s6a_visited_plmn_id, ENOENT)); - CHECK_FD_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "RAT-Type", - &s6a_fd_cnf.dataobj_s6a_rat_type, ENOENT)); - CHECK_FD_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "ULR-Flags", - &s6a_fd_cnf.dataobj_s6a_ulr_flags, ENOENT)); - CHECK_FD_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "ULA-Flags", - &s6a_fd_cnf.dataobj_s6a_ula_flags, ENOENT)); - CHECK_FD_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "Subscription-Data", - &s6a_fd_cnf.dataobj_s6a_subscription_data, ENOENT)); - CHECK_FD_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "Requested-EUTRAN-Authentication-Info", - &s6a_fd_cnf.dataobj_s6a_req_eutran_auth_info, ENOENT)); - CHECK_FD_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "Number-Of-Requested-Vectors", - &s6a_fd_cnf.dataobj_s6a_number_of_requested_vectors, ENOENT)); - CHECK_FD_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "Immediate-Response-Preferred", - &s6a_fd_cnf.dataobj_s6a_immediate_response_pref, ENOENT)); - CHECK_FD_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "Authentication-Info", - &s6a_fd_cnf.dataobj_s6a_authentication_info, ENOENT)); - CHECK_FD_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "Re-Synchronization-Info", - &s6a_fd_cnf.dataobj_s6a_re_synchronization_info, ENOENT)); - CHECK_FD_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "Service-Selection", - &s6a_fd_cnf.dataobj_s6a_service_selection, ENOENT)); - CHECK_FD_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, - AVP_BY_NAME_ALL_VENDORS, "UE-SRVCC-Capability", - &s6a_fd_cnf.dataobj_s6a_ue_srvcc_cap, ENOENT)); - - /* Register callbacks */ - memset(&when, 0, sizeof(when)); - - when.command = s6a_fd_cnf.dataobj_s6a_ula; - when.app = s6a_fd_cnf.dataobj_s6a_app; - - /* Register the callback for Update Location Answer S6A Application */ - CHECK_FD_FCT(fd_disp_register(s6a_ula_cb, DISP_HOW_CC, &when, NULL, - &s6a_fd_cnf.ula_hdl)); - DevAssert(s6a_fd_cnf.ula_hdl != NULL); - - when.command = s6a_fd_cnf.dataobj_s6a_aia; - when.app = s6a_fd_cnf.dataobj_s6a_app; - - /* Register the callback for Authentication Information Answer S6A Application */ - CHECK_FD_FCT(fd_disp_register(s6a_aia_cb, DISP_HOW_CC, &when, NULL, - &s6a_fd_cnf.aia_hdl)); - DevAssert(s6a_fd_cnf.aia_hdl != NULL); - - /* Advertise the support for the test application in the peer */ - CHECK_FD_FCT(fd_disp_app_support(s6a_fd_cnf.dataobj_s6a_app, - s6a_fd_cnf.dataobj_s6a_vendor, 1, 0)); - - return 0; -} diff --git a/openair-cn/S6A/s6a_error.c b/openair-cn/S6A/s6a_error.c deleted file mode 100644 index 28bf5dd4e2..0000000000 --- a/openair-cn/S6A/s6a_error.c +++ /dev/null @@ -1,129 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -#include <stdint.h> - -#include "common_types.h" -#include "s6a_defs.h" - -#include "assertions.h" - -int s6a_parse_experimental_result(struct avp *avp, s6a_experimental_result_t *ptr) -{ - struct avp_hdr *hdr; - struct avp *child_avp = NULL; - - if (!avp) { - return EINVAL; - } - - CHECK_FCT(fd_msg_avp_hdr(avp, &hdr)); - DevAssert(hdr->avp_code == AVP_CODE_EXPERIMENTAL_RESULT); - CHECK_FCT(fd_msg_browse(avp, MSG_BRW_FIRST_CHILD, &child_avp, NULL)); - - while(child_avp) { - CHECK_FCT(fd_msg_avp_hdr(child_avp, &hdr)); - - switch(hdr->avp_code) { - case AVP_CODE_EXPERIMENTAL_RESULT_CODE: - S6A_ERROR("Got experimental error %u:%s\n", hdr->avp_value->u32, - experimental_retcode_2_string(hdr->avp_value->u32)); - - if (ptr) { - *ptr = (s6a_experimental_result_t)hdr->avp_value->u32; - } - - break; - - case AVP_CODE_VENDOR_ID: - DevCheck(hdr->avp_value->u32 == 10415, hdr->avp_value->u32, - AVP_CODE_VENDOR_ID, 10415); - break; - - default: - return -1; - } - - /* Go to next AVP in the grouped AVP */ - CHECK_FCT(fd_msg_browse(child_avp, MSG_BRW_NEXT, &child_avp, NULL)); - } - - return 0; -} - -char *experimental_retcode_2_string(uint32_t ret_code) -{ - switch(ret_code) { - /* Experimental-Result-Codes */ - case DIAMETER_ERROR_USER_UNKNOWN: - return "DIAMETER_ERROR_USER_UNKNOWN"; - - case DIAMETER_ERROR_ROAMING_NOT_ALLOWED: - return "DIAMETER_ERROR_ROAMING_NOT_ALLOWED"; - - case DIAMETER_ERROR_UNKNOWN_EPS_SUBSCRIPTION: - return "DIAMETER_ERROR_UNKNOWN_EPS_SUBSCRIPTION"; - - case DIAMETER_ERROR_RAT_NOT_ALLOWED: - return "DIAMETER_ERROR_RAT_NOT_ALLOWED"; - - case DIAMETER_ERROR_EQUIPMENT_UNKNOWN: - return "DIAMETER_ERROR_EQUIPMENT_UNKNOWN"; - - case DIAMETER_ERROR_UNKOWN_SERVING_NODE: - return "DIAMETER_ERROR_UNKOWN_SERVING_NODE"; - - case DIAMETER_AUTHENTICATION_DATA_UNAVAILABLE: - return "DIAMETER_AUTHENTICATION_DATA_UNAVAILABLE"; - - default: - break; - } - - return "DIAMETER_AVP_UNSUPPORTED"; -} - -char *retcode_2_string(uint32_t ret_code) -{ - switch(ret_code) { - case ER_DIAMETER_SUCCESS: - return "DIAMETER_SUCCESS"; - - case ER_DIAMETER_MISSING_AVP: - return "DIAMETER_MISSING_AVP"; - - case ER_DIAMETER_INVALID_AVP_VALUE: - return "DIAMETER_INVALID_AVP_VALUE"; - - default: - break; - } - - return "DIAMETER_AVP_UNSUPPORTED"; -} diff --git a/openair-cn/S6A/s6a_messages.h b/openair-cn/S6A/s6a_messages.h deleted file mode 100644 index f98b4f827a..0000000000 --- a/openair-cn/S6A/s6a_messages.h +++ /dev/null @@ -1,46 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -#ifndef S6A_MESSAGES_H_ -#define S6A_MESSAGES_H_ - -int s6a_generate_update_location(s6a_update_location_req_t *ulr_p); -int s6a_generate_authentication_info_req(s6a_auth_info_req_t *uar_p); - -int s6a_ula_cb(struct msg **msg, struct avp *paramavp, - struct session *sess, void *opaque, - enum disp_action *act); -int s6a_aia_cb(struct msg **msg, struct avp *paramavp, - struct session *sess, void *opaque, - enum disp_action *act); - -int s6a_parse_subscription_data(struct avp *avp_subscription_data, - subscription_data_t *subscription_data); - -#endif /* S6A_MESSAGES_H_ */ diff --git a/openair-cn/S6A/s6a_peer.c b/openair-cn/S6A/s6a_peer.c deleted file mode 100644 index c611cb6981..0000000000 --- a/openair-cn/S6A/s6a_peer.c +++ /dev/null @@ -1,149 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -/*! \file s6a_peers.c - * \brief Add a new entity to the list of peers to connect - * \author Sebastien ROUX <sebastien.roux@eurecom.fr> - * \date 2013 - * \version 0.1 - */ - -#include <stdint.h> -#include <unistd.h> - -#include "common_types.h" -#include "intertask_interface.h" -#include "s6a_defs.h" -#include "s6a_messages.h" - -#include "assertions.h" - -void s6a_peer_connected_cb(struct peer_info *info, void *arg) -{ - if (info == NULL) { - S6A_ERROR("Failed to connect to HSS entity\n"); - } else { - MessageDef *message_p; - - S6A_DEBUG("Peer %*s is now connected...\n", - (int)info->pi_diamidlen, info->pi_diamid); - - /* Inform S1AP that connection to HSS is established */ - message_p = itti_alloc_new_message(TASK_S6A, ACTIVATE_MESSAGE); - - itti_send_msg_to_task(TASK_S1AP, INSTANCE_DEFAULT, message_p); - - } - - /* For test */ -#if 0 - s6a_auth_info_req_t s6a_air; - - memset(&s6a_air, 0, sizeof(s6a_auth_info_req_t)); - sprintf(s6a_air.imsi, "%14llu", 20834123456789ULL); - - s6a_air.nb_of_vectors = 1; - s6a_air.visited_plmn.MCCdigit2 = 0, - s6a_air.visited_plmn.MCCdigit1 = 8, - s6a_air.visited_plmn.MCCdigit3 = 2, - s6a_air.visited_plmn.MNCdigit1 = 0, - s6a_air.visited_plmn.MNCdigit2 = 3, - s6a_air.visited_plmn.MNCdigit3 = 4, - - s6a_generate_authentication_info_req(&s6a_air); - // #else - // s6a_update_location_req_t s6a_ulr; - // - // memset(&s6a_ulr, 0, sizeof(s6a_update_location_req_t)); - // - // sprintf(s6a_ulr.imsi, "%14llu", 20834123456789ULL); - // s6a_ulr.initial_attach = INITIAL_ATTACH; - // s6a_ulr.rat_type = RAT_EUTRAN; - // s6a_generate_update_location(&s6a_ulr); -#endif -} - -int s6a_fd_new_peer(void) -{ - char host_name[100]; - size_t host_name_len; - char *hss_name; - - int ret = 0; - struct peer_info info; - - memset(&info, 0, sizeof(struct peer_info)); - - if (config_read_lock(&mme_config) != 0) { - S6A_ERROR("Failed to lock configuration for reading\n"); - return -1; - } - - if(fd_g_config->cnf_diamid != NULL) { - free(fd_g_config->cnf_diamid); - fd_g_config->cnf_diamid_len = 0; - } - - DevAssert(gethostname(host_name, 100) == 0); - - host_name_len = strlen(host_name); - host_name[host_name_len] = '.'; - host_name[host_name_len+1] = '\0'; - - strcat(host_name, mme_config.realm); - fd_g_config->cnf_diamid = strdup(host_name); - fd_g_config->cnf_diamid_len = strlen(fd_g_config->cnf_diamid); - - S6A_DEBUG("Diameter identity of MME: %s with length: %zd\n", - fd_g_config->cnf_diamid, fd_g_config->cnf_diamid_len); - - hss_name = calloc(1,100); - strcat(hss_name, mme_config.s6a_config.hss_host_name); - strcat(hss_name, "."); - strcat(hss_name, mme_config.realm); - info.pi_diamid = hss_name; - info.pi_diamidlen = strlen(info.pi_diamid); - - S6A_DEBUG("Diameter identity of HSS: %s with length: %zd\n", - info.pi_diamid, info.pi_diamidlen); - - info.config.pic_flags.sec = PI_SEC_NONE; - info.config.pic_flags.pro4 = PI_P4_SCTP; - - info.config.pic_flags.persist = PI_PRST_NONE; - - CHECK_FCT(fd_peer_add(&info, "", s6a_peer_connected_cb, NULL)); - - if (config_unlock(&mme_config) != 0) { - S6A_ERROR("Failed to unlock configuration\n"); - return -1; - } - - return ret; -} diff --git a/openair-cn/S6A/s6a_subscription_data.c b/openair-cn/S6A/s6a_subscription_data.c deleted file mode 100644 index 75aed74b69..0000000000 --- a/openair-cn/S6A/s6a_subscription_data.c +++ /dev/null @@ -1,446 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -#include <stdint.h> - -#include "common_types.h" -#include "s6a_defs.h" - -#include "assertions.h" - -static inline -int s6a_parse_subscriber_status(struct avp_hdr *hdr_sub_status, - subscriber_status_t *sub_status) -{ - DevCheck(hdr_sub_status->avp_value->u32 < SS_MAX, - hdr_sub_status->avp_value->u32, SS_MAX, 0); - - *sub_status = hdr_sub_status->avp_value->u32; - - return 0; -} - -static inline -int s6a_parse_msisdn(struct avp_hdr *hdr_msisdn, char *msisdn, uint8_t *length) -{ - int ret; - - DevCheck(hdr_msisdn->avp_value->os.len <= MSISDN_LENGTH, - hdr_msisdn->avp_value->os.len, MSISDN_LENGTH, 0); - - if (hdr_msisdn->avp_value->os.len == 0) - return 0; - - ret = sprintf(msisdn, "%*s", (int)hdr_msisdn->avp_value->os.len, - hdr_msisdn->avp_value->os.data); - - *length = ret; - - return 0; -} - -static inline -int s6a_parse_network_access_mode(struct avp_hdr *hdr_network_am, - network_access_mode_t *access_mode) -{ - DevCheck(hdr_network_am->avp_value->u32 < NAM_MAX && - hdr_network_am->avp_value->u32 != NAM_RESERVED, - hdr_network_am->avp_value->u32, NAM_MAX, NAM_RESERVED); - - *access_mode = hdr_network_am->avp_value->u32; - - return 0; -} - -static inline -int s6a_parse_access_restriction_data(struct avp_hdr *hdr_access_restriction, - access_restriction_t *access_restriction) -{ - DevCheck(hdr_access_restriction->avp_value->u32 < ARD_MAX, - hdr_access_restriction->avp_value->u32, ARD_MAX, 0); - *access_restriction = hdr_access_restriction->avp_value->u32; - return 0; -} - -static inline -int s6a_parse_bitrate(struct avp_hdr *hdr_bitrate, bitrate_t *bitrate) -{ - *bitrate = hdr_bitrate->avp_value->u32; - return 0; -} - -static inline -int s6a_parse_ambr(struct avp *avp_ambr, ambr_t *ambr) -{ - struct avp *avp = NULL; - struct avp_hdr *hdr; - - CHECK_FCT(fd_msg_browse(avp_ambr, MSG_BRW_FIRST_CHILD, &avp, NULL)); - - if (!avp) { - /* Child avps for ambr are mandatory */ - return -1; - } - - while(avp) { - CHECK_FCT(fd_msg_avp_hdr(avp, &hdr)); - - switch(hdr->avp_code) { - case AVP_CODE_BANDWIDTH_UL: - CHECK_FCT(s6a_parse_bitrate(hdr, &ambr->br_ul)); - break; - - case AVP_CODE_BANDWIDTH_DL: - CHECK_FCT(s6a_parse_bitrate(hdr, &ambr->br_dl)); - break; - - default: - return -1; - } - - /* Go to next AVP in the grouped AVP */ - CHECK_FCT(fd_msg_browse(avp, MSG_BRW_NEXT, &avp, NULL)); - } - - return 0; -} - -static inline -int s6a_parse_all_apn_conf_inc_ind(struct avp_hdr *hdr, all_apn_conf_ind_t *ptr) -{ - DevCheck(hdr->avp_value->u32 < ALL_APN_MAX, - hdr->avp_value->u32, ALL_APN_MAX, 0); - *ptr = hdr->avp_value->u32; - return 0; -} - -static inline -int s6a_parse_pdn_type(struct avp_hdr *hdr, pdn_type_t *pdn_type) -{ - DevCheck(hdr->avp_value->u32 < IP_MAX, - hdr->avp_value->u32, IP_MAX, 0); - *pdn_type = hdr->avp_value->u32; - return 0; -} - -static inline -int s6a_parse_service_selection(struct avp_hdr *hdr_service_selection, - char *service_selection, int *length) -{ - DevCheck(hdr_service_selection->avp_value->os.len <= APN_MAX_LENGTH, - hdr_service_selection->avp_value->os.len, APN_MAX_LENGTH, 0); - *length = sprintf(service_selection, "%*s", - (int)hdr_service_selection->avp_value->os.len, - hdr_service_selection->avp_value->os.data); - return 0; -} - -static inline -int s6a_parse_qci(struct avp_hdr *hdr, qci_t *qci) -{ - DevCheck(hdr->avp_value->u32 < QCI_MAX, - hdr->avp_value->u32, QCI_MAX, 0); - *qci = hdr->avp_value->u32; - return 0; -} - -static inline -int s6a_parse_priority_level(struct avp_hdr *hdr, priority_level_t *priority_level) -{ - DevCheck(hdr->avp_value->u32 <= PRIORITY_LEVEL_MAX && - hdr->avp_value->u32 >= PRIORITY_LEVEL_MIN, hdr->avp_value->u32, - PRIORITY_LEVEL_MAX, PRIORITY_LEVEL_MIN); - *priority_level = (priority_level_t)hdr->avp_value->u32; - return 0; -} - -static inline -int s6a_parse_pre_emp_capability(struct avp_hdr *hdr, pre_emp_capability_t *pre_emp_capability) -{ - DevCheck(hdr->avp_value->u32 < PRE_EMPTION_CAPABILITY_MAX, hdr->avp_value->u32, - PRE_EMPTION_CAPABILITY_MAX, 0); - *pre_emp_capability = hdr->avp_value->u32; - return 0; -} - -static inline -int s6a_parse_pre_emp_vulnerability(struct avp_hdr *hdr, pre_emp_vulnerability_t *pre_emp_vulnerability) -{ - DevCheck(hdr->avp_value->u32 < PRE_EMPTION_VULNERABILITY_MAX, hdr->avp_value->u32, - PRE_EMPTION_VULNERABILITY_MAX, 0); - *pre_emp_vulnerability = hdr->avp_value->u32; - return 0; -} - -static inline -int s6a_parse_allocation_retention_priority(struct avp *avp_arp, - allocation_retention_priority_t *ptr) -{ - struct avp *avp = NULL; - struct avp_hdr *hdr; - - /* If the Pre-emption-Capability AVP is not present in the - * Allocation-Retention-Priority AVP, the default value shall be - * PRE-EMPTION_CAPABILITY_DISABLED (1). - */ - ptr->pre_emp_capability = PRE_EMPTION_CAPABILITY_DISABLED; - - /* If the Pre-emption-Vulnerability AVP is not present in the - * Allocation-Retention-Priority AVP, the default value shall be - * PRE-EMPTION_VULNERABILITY_ENABLED (0). - */ - ptr->pre_emp_vulnerability = PRE_EMPTION_VULNERABILITY_ENABLED; - - CHECK_FCT(fd_msg_browse(avp_arp, MSG_BRW_FIRST_CHILD, &avp, NULL)); - - while(avp) { - CHECK_FCT(fd_msg_avp_hdr(avp, &hdr)); - - switch(hdr->avp_code) { - case AVP_CODE_PRIORITY_LEVEL: - CHECK_FCT(s6a_parse_priority_level(hdr, &ptr->priority_level)); - break; - - case AVP_CODE_PRE_EMPTION_CAPABILITY: - CHECK_FCT(s6a_parse_pre_emp_capability(hdr, &ptr->pre_emp_capability)); - break; - - case AVP_CODE_PRE_EMPTION_VULNERABILITY: - CHECK_FCT(s6a_parse_pre_emp_vulnerability(hdr, &ptr->pre_emp_vulnerability)); - break; - - default: - return -1; - } - - /* Go to next AVP in the grouped AVP */ - CHECK_FCT(fd_msg_browse(avp, MSG_BRW_NEXT, &avp, NULL)); - } - - return 0; -} - -static inline -int s6a_parse_eps_subscribed_qos_profile(struct avp *avp_qos, - eps_subscribed_qos_profile_t *ptr) -{ - struct avp *avp = NULL; - struct avp_hdr *hdr; - - CHECK_FCT(fd_msg_browse(avp_qos, MSG_BRW_FIRST_CHILD, &avp, NULL)); - - while(avp) { - CHECK_FCT(fd_msg_avp_hdr(avp, &hdr)); - - switch(hdr->avp_code) { - case AVP_CODE_QCI: - CHECK_FCT(s6a_parse_qci(hdr, &ptr->qci)); - break; - - case AVP_CODE_ALLOCATION_RETENTION_PRIORITY: - CHECK_FCT(s6a_parse_allocation_retention_priority(avp, &ptr->allocation_retention_priority)); - break; - - default: - return -1; - } - - /* Go to next AVP in the grouped AVP */ - CHECK_FCT(fd_msg_browse(avp, MSG_BRW_NEXT, &avp, NULL)); - } - - return 0; -} - -static inline -int s6a_parse_ip_address(struct avp_hdr *hdr, ip_address_t *ip_address) -{ - uint16_t ip_type; - - DevCheck(hdr->avp_value->os.len >= 2, hdr->avp_value->os.len, 2, 0); - - ip_type = (hdr->avp_value->os.data[0] << 8) | (hdr->avp_value->os.data[1]); - - if (ip_type == IANA_IPV4) { - /* This is an IPv4 address */ - ip_address->pdn_type = IPv4; - DevCheck(hdr->avp_value->os.len == 6, hdr->avp_value->os.len, 6, ip_type); - memcpy(ip_address->address.ipv4_address, &hdr->avp_value->os.data[2], 4); - } else if (ip_type == IANA_IPV6) { - /* This is an IPv6 address */ - ip_address->pdn_type = IPv6; - DevCheck(hdr->avp_value->os.len == 18, hdr->avp_value->os.len, 18, ip_type); - memcpy(ip_address->address.ipv6_address, &hdr->avp_value->os.data[2], 16); - } else { - /* unhandled case... */ - return -1; - } - - return 0; -} - -static inline -int s6a_parse_apn_configuration(struct avp *avp_apn_conf_prof, apn_configuration_t *apn_config) -{ - struct avp *avp = NULL; - struct avp_hdr *hdr; - - CHECK_FCT(fd_msg_browse(avp_apn_conf_prof, MSG_BRW_FIRST_CHILD, &avp, NULL)); - - while(avp) { - CHECK_FCT(fd_msg_avp_hdr(avp, &hdr)); - - switch(hdr->avp_code) { - case AVP_CODE_CONTEXT_IDENTIFIER: - apn_config->context_identifier = hdr->avp_value->u32; - break; - - case AVP_CODE_SERVED_PARTY_IP_ADDRESS: - if (apn_config->nb_ip_address == 2) { - DevMessage("Only two IP addresses can be provided"); - } - - CHECK_FCT(s6a_parse_ip_address(hdr, &apn_config->ip_address[apn_config->nb_ip_address])); - apn_config->nb_ip_address++; - break; - - case AVP_CODE_PDN_TYPE: - CHECK_FCT(s6a_parse_pdn_type(hdr, &apn_config->pdn_type)); - break; - - case AVP_CODE_SERVICE_SELECTION: - CHECK_FCT(s6a_parse_service_selection(hdr, apn_config->service_selection, - &apn_config->service_selection_length)); - break; - - case AVP_CODE_EPS_SUBSCRIBED_QOS_PROFILE: - CHECK_FCT(s6a_parse_eps_subscribed_qos_profile(avp, &apn_config->subscribed_qos)); - break; - - case AVP_CODE_AMBR: - CHECK_FCT(s6a_parse_ambr(avp, &apn_config->ambr)); - break; - } - - /* Go to next AVP in the grouped AVP */ - CHECK_FCT(fd_msg_browse(avp, MSG_BRW_NEXT, &avp, NULL)); - } - - return 0; -} - -static inline -int s6a_parse_apn_configuration_profile(struct avp *avp_apn_conf_prof, - apn_config_profile_t *apn_config_profile) -{ - struct avp *avp = NULL; - struct avp_hdr *hdr; - - CHECK_FCT(fd_msg_browse(avp_apn_conf_prof, MSG_BRW_FIRST_CHILD, &avp, NULL)); - - while(avp) { - CHECK_FCT(fd_msg_avp_hdr(avp, &hdr)); - - switch(hdr->avp_code) { - case AVP_CODE_CONTEXT_IDENTIFIER: - apn_config_profile->context_identifier = hdr->avp_value->u32; - break; - - case AVP_CODE_ALL_APN_CONFIG_INC_IND: - CHECK_FCT(s6a_parse_all_apn_conf_inc_ind(hdr, &apn_config_profile->all_apn_conf_ind)); - break; - - case AVP_CODE_APN_CONFIGURATION: { - DevCheck(apn_config_profile->nb_apns < MAX_APN_PER_UE, - apn_config_profile->nb_apns, MAX_APN_PER_UE, 0); - CHECK_FCT(s6a_parse_apn_configuration( - avp, &apn_config_profile->apn_configuration[apn_config_profile->nb_apns])); - apn_config_profile->nb_apns++; - } - break; - } - - /* Go to next AVP in the grouped AVP */ - CHECK_FCT(fd_msg_browse(avp, MSG_BRW_NEXT, &avp, NULL)); - } - - return 0; -} - -int s6a_parse_subscription_data(struct avp *avp_subscription_data, - subscription_data_t *subscription_data) -{ - struct avp *avp = NULL; - struct avp_hdr *hdr; - - CHECK_FCT(fd_msg_browse(avp_subscription_data, MSG_BRW_FIRST_CHILD, &avp, NULL)); - - while(avp) { - CHECK_FCT(fd_msg_avp_hdr(avp, &hdr)); - - switch(hdr->avp_code) { - case AVP_CODE_SUBSCRIBER_STATUS: - CHECK_FCT(s6a_parse_subscriber_status(hdr, &subscription_data->subscriber_status)); - break; - - case AVP_CODE_MSISDN: - CHECK_FCT(s6a_parse_msisdn(hdr, subscription_data->msisdn, - &subscription_data->msisdn_length)); - break; - - case AVP_CODE_NETWORK_ACCESS_MODE: - CHECK_FCT(s6a_parse_network_access_mode(hdr, &subscription_data->access_mode)); - break; - - case AVP_CODE_ACCESS_RESTRICTION_DATA: - CHECK_FCT(s6a_parse_access_restriction_data(hdr, &subscription_data->access_restriction)); - break; - - case AVP_CODE_AMBR: - CHECK_FCT(s6a_parse_ambr(avp, &subscription_data->subscribed_ambr)); - break; - - case AVP_CODE_APN_CONFIGURATION_PROFILE: - CHECK_FCT(s6a_parse_apn_configuration_profile(avp, &subscription_data->apn_config_profile)); - break; - - case AVP_CODE_SUBSCRIBED_PERIODIC_RAU_TAU_TIMER: - subscription_data->rau_tau_timer = hdr->avp_value->u32; - break; - - default: - return -1; - } - - /* Go to next AVP in the grouped AVP */ - CHECK_FCT(fd_msg_browse(avp, MSG_BRW_NEXT, &avp, NULL)); - } - - return 0; -} diff --git a/openair-cn/S6A/s6a_task.c b/openair-cn/S6A/s6a_task.c deleted file mode 100644 index 2ee79ac3ab..0000000000 --- a/openair-cn/S6A/s6a_task.c +++ /dev/null @@ -1,187 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <signal.h> - -#if HAVE_CONFIG_H -# include "config.h" -#endif - -#include <freeDiameter/freeDiameter-host.h> -#include <freeDiameter/libfdcore.h> - -#include "intertask_interface.h" -#include "s6a_defs.h" -#include "s6a_messages.h" - -#include "assertions.h" -#include "msc.h" - -#if defined(DISABLE_USE_HSS) -# error "Disabling HSS support is currently not supported \ -Reconfigure with --enable-hss option to disable this error" -#endif - -static int gnutls_debug = 0; -struct session_handler *ts_sess_hdl; - -s6a_fd_cnf_t s6a_fd_cnf; - -void *s6a_thread(void *args); -static void fd_gnutls_debug(int level, const char *str); - -static void fd_gnutls_debug(int level, const char *str) -{ - S6A_DEBUG("[GTLS] %s", str); -} - -void *s6a_thread(void *args) -{ - itti_mark_task_ready(TASK_S6A); - MSC_START_USE(); - - while(1) { - MessageDef *received_message_p = NULL; - /* Trying to fetch a message from the message queue. - * If the queue is empty, this function will block till a - * message is sent to the task. - */ - itti_receive_msg(TASK_S6A, &received_message_p); - DevAssert(received_message_p != NULL); - - switch (ITTI_MSG_ID(received_message_p)) - { - case S6A_UPDATE_LOCATION_REQ: { - s6a_generate_update_location(&received_message_p->ittiMsg.s6a_update_location_req); - } break; - case S6A_AUTH_INFO_REQ: { - s6a_generate_authentication_info_req(&received_message_p->ittiMsg.s6a_auth_info_req); - } break; - case TERMINATE_MESSAGE: { - itti_exit_task(); - } break; - default: { - S6A_DEBUG("Unkwnon message ID %d: %s\n", - ITTI_MSG_ID(received_message_p), ITTI_MSG_NAME(received_message_p)); - } break; - } - itti_free(ITTI_MSG_ORIGIN_ID(received_message_p), received_message_p); - received_message_p = NULL; - } - return NULL; -} - -int s6a_init(const mme_config_t *mme_config_p) -{ - int ret; - - S6A_DEBUG("Initializing S6a interface\n"); - - memset(&s6a_fd_cnf, 0, sizeof(s6a_fd_cnf_t)); - - /*if (strcmp(fd_core_version(), FREE_DIAMETER_MINIMUM_VERSION) != 0) { - S6A_ERROR("Freediameter version %s found, expecting %s\n", fd_core_version(), - FREE_DIAMETER_MINIMUM_VERSION); - return -1; - } else { - S6A_DEBUG("Freediameter version %s\n", fd_core_version()); - }*/ - - - /* Initializing freeDiameter core */ - S6A_DEBUG("Initializing freeDiameter core...\n"); - ret = fd_core_initialize(); - if (ret != 0) { - S6A_ERROR("An error occurred during freeDiameter core library initialization: %d\n",ret); - return ret; - } else { - S6A_DEBUG("Initializing freeDiameter core done\n"); - } - - - - S6A_DEBUG("Default ext path: %s\n", DEFAULT_EXTENSIONS_PATH); - - ret = fd_core_parseconf(mme_config_p->s6a_config.conf_file); - if (ret != 0) { - S6A_ERROR("An error occurred during fd_core_parseconf file : %s.\n", mme_config_p->s6a_config.conf_file); - return ret; - } else { - S6A_DEBUG("fd_core_parseconf done\n"); - } - - /* Set gnutls debug level ? */ - if (gnutls_debug) { - gnutls_global_set_log_function((gnutls_log_func)fd_gnutls_debug); - gnutls_global_set_log_level (gnutls_debug); - S6A_DEBUG("Enabled GNUTLS debug at level %d", gnutls_debug); - } - - /* Starting freeDiameter core */ - ret = fd_core_start(); - if (ret != 0) { - S6A_ERROR("An error occurred during freeDiameter core library start\n"); - return ret; - } else { - S6A_DEBUG("fd_core_start done\n"); - } - - - - ret = fd_core_waitstartcomplete(); - if (ret != 0) { - S6A_ERROR("An error occurred during fd_core_waitstartcomplete.\n"); - return ret; - } else { - S6A_DEBUG("fd_core_waitstartcomplete done\n"); - } - - ret = s6a_fd_init_dict_objs(); - if (ret != 0) { - S6A_ERROR("An error occurred during s6a_fd_init_dict_objs.\n"); - return ret; - } else { - S6A_DEBUG("s6a_fd_init_dict_objs done\n"); - } - - /* Trying to connect to peers */ - CHECK_FCT(s6a_fd_new_peer()); - - if (itti_create_task(TASK_S6A, &s6a_thread, NULL) < 0) { - S6A_ERROR("s6a create task\n"); - return -1; - } - S6A_DEBUG("Initializing S6a interface: DONE\n"); - - return 0; -} diff --git a/openair-cn/S6A/s6a_up_loc.c b/openair-cn/S6A/s6a_up_loc.c deleted file mode 100644 index d1d2931d70..0000000000 --- a/openair-cn/S6A/s6a_up_loc.c +++ /dev/null @@ -1,317 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -#include <stdio.h> -#include <stdint.h> - -#include "mme_config.h" - -#include "assertions.h" -#include "conversions.h" - -#include "intertask_interface.h" -#include "s6a_defs.h" -#include "s6a_messages.h" -#include "msc.h" - - -int s6a_ula_cb( - struct msg **msg_pP, - struct avp *paramavp_pP, - struct session *sess_pP, - void *opaque_pP, - enum disp_action *act_pP) -{ - struct msg *ans_p = NULL; - struct msg *qry_p = NULL; - struct avp *avp_p = NULL; - struct avp_hdr *hdr_p = NULL; - MessageDef *message_p = NULL; - s6a_update_location_ans_t *s6a_update_location_ans_p = NULL; - - DevAssert(msg_pP != NULL); - - ans_p = *msg_pP; - /* Retrieve the original query associated with the asnwer */ - CHECK_FCT(fd_msg_answ_getq(ans_p, &qry_p)); - - DevAssert(qry_p != NULL); - - message_p = itti_alloc_new_message(TASK_S6A, S6A_UPDATE_LOCATION_ANS); - - s6a_update_location_ans_p = &message_p->ittiMsg.s6a_update_location_ans; - - CHECK_FCT(fd_msg_search_avp(qry_p, s6a_fd_cnf.dataobj_s6a_user_name, &avp_p)); - - if (avp_p) { - CHECK_FCT(fd_msg_avp_hdr(avp_p, &hdr_p)); - memcpy(s6a_update_location_ans_p->imsi, hdr_p->avp_value->os.data, hdr_p->avp_value->os.len); - s6a_update_location_ans_p->imsi[hdr_p->avp_value->os.len] = '\0'; - s6a_update_location_ans_p->imsi_length = hdr_p->avp_value->os.len; - S6A_DEBUG("Received s6a ula for imsi=%*s\n", - (int)hdr_p->avp_value->os.len, - hdr_p->avp_value->os.data); - } else { - DevMessage("Query has been freed before we received the answer\n"); - } - - /* Retrieve the result-code */ - CHECK_FCT(fd_msg_search_avp(ans_p, s6a_fd_cnf.dataobj_s6a_result_code, &avp_p)); - - if (avp_p) { - CHECK_FCT(fd_msg_avp_hdr(avp_p, &hdr_p)); - - s6a_update_location_ans_p->result.present = S6A_RESULT_BASE; - s6a_update_location_ans_p->result.choice.base = hdr_p->avp_value->u32; - - MSC_LOG_TX_MESSAGE( - MSC_S6A_MME, - MSC_MMEAPP_MME, - NULL,0, - "0 S6A_UPDATE_LOCATION_ANS imsi %SCNu64 %s", - s6a_update_location_ans_p->imsi, - retcode_2_string(hdr_p->avp_value->u32)); - - if (hdr_p->avp_value->u32 != ER_DIAMETER_SUCCESS) { - S6A_ERROR("Got error %u:%s\n", hdr_p->avp_value->u32, - retcode_2_string(hdr_p->avp_value->u32)); - goto err; - } - } else { - /* The result-code is not present, may be it is an experimental result - * avp_p indicating a 3GPP specific failure. - */ - CHECK_FCT(fd_msg_search_avp(ans_p, s6a_fd_cnf.dataobj_s6a_experimental_result, &avp_p)); - - if (avp_p) { - /* The procedure has failed within the HSS. - * NOTE: contrary to result-code, the experimental-result is a grouped - * AVP and requires parsing its childs to get the code back. - */ - s6a_update_location_ans_p->result.present = S6A_RESULT_EXPERIMENTAL; - s6a_parse_experimental_result(avp_p, &s6a_update_location_ans_p->result.choice.experimental); - - goto err; - } else { - /* Neither result-code nor experimental-result is present -> - * totally incorrect behaviour here. - */ - S6A_ERROR("Experimental-Result and Result-Code are absent: " - "This is not a correct behaviour\n"); - goto err; - } - } - - /* Retrieving the ULA flags */ - CHECK_FCT(fd_msg_search_avp(ans_p, s6a_fd_cnf.dataobj_s6a_ula_flags, &avp_p)); - - if (avp_p) { - CHECK_FCT(fd_msg_avp_hdr(avp_p, &hdr_p)); - - /* This bit, when set, indicates that the HSS stores SGSN number - * and MME number in separate memory. A Rel-8 HSS shall set - * the bit. - */ - if (!FLAG_IS_SET(hdr_p->avp_value->u32, ULA_SEPARATION_IND)) { - S6A_ERROR("ULA-Flags does not indicate the HSS is post Rel.8: " - "This behaviour is not compliant\n"); - goto err; - } - } else { - /* ULA-Flags is absent while the error code indicates DIAMETER_SUCCESS: - * this is not a compliant behaviour... - * TODO: handle this case. - */ - S6A_ERROR("ULA-Flags AVP is absent while result code indicates " - "DIAMETER_SUCCESS\n"); - goto err; - } - - CHECK_FCT(fd_msg_search_avp(ans_p, s6a_fd_cnf.dataobj_s6a_subscription_data, &avp_p)); - - if (avp_p) { - CHECK_FCT(s6a_parse_subscription_data(avp_p, &s6a_update_location_ans_p->subscription_data)); - -#if defined(DISABLE_USE_NAS) - -#else - // LG COMMENTED THIS (2014/04/01)-> DevParam(0, 0, 0); -#endif - } - -err: - - ans_p = NULL; - - itti_send_msg_to_task(TASK_MME_APP, INSTANCE_DEFAULT, message_p); - - S6A_DEBUG("Sending S6A_UPDATE_LOCATION_ANS to task MME_APP\n"); - - return 0; -} - - - -int s6a_generate_update_location(s6a_update_location_req_t *ulr_pP) -{ - struct avp *avp_p = NULL; - struct msg *msg_p = NULL; - struct session *sess_p = NULL; - - union avp_value value; - - DevAssert(ulr_pP != NULL); - - /* Create the new update location request message */ - CHECK_FCT(fd_msg_new(s6a_fd_cnf.dataobj_s6a_ulr, 0, &msg_p)); - - /* Create a new session */ - CHECK_FCT(fd_sess_new(&sess_p, fd_g_config->cnf_diamid, - fd_g_config->cnf_diamid_len, (os0_t)"apps6a", 6)); - { - os0_t sid; - size_t sidlen; - CHECK_FCT(fd_sess_getsid(sess_p, &sid, &sidlen)); - CHECK_FCT(fd_msg_avp_new(s6a_fd_cnf.dataobj_s6a_session_id, 0, &avp_p)); - value.os.data = sid; - value.os.len = sidlen; - CHECK_FCT(fd_msg_avp_setvalue(avp_p, &value)); - CHECK_FCT(fd_msg_avp_add(msg_p, MSG_BRW_FIRST_CHILD, avp_p)); - } - - CHECK_FCT(fd_msg_avp_new(s6a_fd_cnf.dataobj_s6a_auth_session_state, 0, &avp_p)); - /* No State maintained */ - value.i32 = 1; - CHECK_FCT(fd_msg_avp_setvalue(avp_p, &value)); - CHECK_FCT(fd_msg_avp_add(msg_p, MSG_BRW_LAST_CHILD, avp_p)); - - /* Add Origin_Host & Origin_Realm */ - CHECK_FCT(fd_msg_add_origin(msg_p, 0)); - - config_read_lock(&mme_config); - - /* Destination Host */ - { - char host[100]; - size_t hostlen; - - memset(host, 0, 100); - strcat(host, mme_config.s6a_config.hss_host_name); - strcat(host, "."); - strcat(host, mme_config.realm); - - hostlen = strlen(host); - - CHECK_FCT(fd_msg_avp_new(s6a_fd_cnf.dataobj_s6a_destination_host, 0, &avp_p)); - value.os.data = (unsigned char *)host; - value.os.len = hostlen; - CHECK_FCT(fd_msg_avp_setvalue(avp_p, &value)); - - CHECK_FCT(fd_msg_avp_add(msg_p, MSG_BRW_LAST_CHILD, avp_p)); - } - /* Destination_Realm */ - { - char *realm = mme_config.realm; - size_t realmlen = strlen(realm); - - CHECK_FCT(fd_msg_avp_new(s6a_fd_cnf.dataobj_s6a_destination_realm, 0, &avp_p)); - value.os.data = (unsigned char *)realm; - value.os.len = realmlen; - CHECK_FCT(fd_msg_avp_setvalue(avp_p, &value)); - - CHECK_FCT(fd_msg_avp_add(msg_p, MSG_BRW_LAST_CHILD, avp_p)); - } - - config_unlock(&mme_config); - - /* Adding the User-Name (IMSI) */ - CHECK_FCT(fd_msg_avp_new(s6a_fd_cnf.dataobj_s6a_user_name, 0, &avp_p)); - value.os.data = (unsigned char *)ulr_pP->imsi; - value.os.len = strlen(ulr_pP->imsi); - CHECK_FCT(fd_msg_avp_setvalue(avp_p, &value)); - CHECK_FCT(fd_msg_avp_add(msg_p, MSG_BRW_LAST_CHILD, avp_p)); - - /* Adding the visited plmn id */ - { - uint8_t plmn[3]; - - CHECK_FCT(fd_msg_avp_new(s6a_fd_cnf.dataobj_s6a_visited_plmn_id, 0, &avp_p)); - - PLMN_T_TO_TBCD(ulr_pP->visited_plmn, - plmn, - mme_config_find_mnc_length(ulr_pP->visited_plmn.MCCdigit1, - ulr_pP->visited_plmn.MCCdigit2, - ulr_pP->visited_plmn.MCCdigit3, - ulr_pP->visited_plmn.MNCdigit1, - ulr_pP->visited_plmn.MNCdigit2, - ulr_pP->visited_plmn.MNCdigit3 - ) - ); - - printf("PLMN: %3s\n", plmn); - - value.os.data = plmn; - value.os.len = 3; - CHECK_FCT(fd_msg_avp_setvalue(avp_p, &value)); - - CHECK_FCT(fd_msg_avp_add(msg_p, MSG_BRW_LAST_CHILD, avp_p)); - } - - /* Adding the RAT-Type */ - CHECK_FCT(fd_msg_avp_new(s6a_fd_cnf.dataobj_s6a_rat_type, 0, &avp_p)); - DevCheck(ulr_pP->rat_type == RAT_EUTRAN, ulr_pP->rat_type, 0, 0); - value.u32 = ulr_pP->rat_type; - CHECK_FCT(fd_msg_avp_setvalue(avp_p, &value)); - CHECK_FCT(fd_msg_avp_add(msg_p, MSG_BRW_LAST_CHILD, avp_p)); - - /* Adding ULR-Flags */ - CHECK_FCT(fd_msg_avp_new(s6a_fd_cnf.dataobj_s6a_ulr_flags, 0, &avp_p)); - value.u32 = 0; - - /* Identify the ULR as coming from S6A interface (i.e. from MME) */ - FLAGS_SET(value.u32, ULR_S6A_S6D_INDICATOR); - - /* Set the ulr-flags as indicated by upper layer */ - if (ulr_pP->skip_subscriber_data) { - FLAGS_SET(value.u32, ULR_SKIP_SUBSCRIBER_DATA); - } - - if (ulr_pP->initial_attach) { - FLAGS_SET(value.u32, ULR_INITIAL_ATTACH_IND); - } - - CHECK_FCT(fd_msg_avp_setvalue(avp_p, &value)); - CHECK_FCT(fd_msg_avp_add(msg_p, MSG_BRW_LAST_CHILD, avp_p)); - - CHECK_FCT(fd_msg_send(&msg_p, NULL, NULL)); - - S6A_DEBUG("Sending s6a ulr for imsi=%s\n", ulr_pP->imsi); - - return 0; -} diff --git a/openair-cn/SCTP/Makefile.am b/openair-cn/SCTP/Makefile.am deleted file mode 100644 index 6cdc16d869..0000000000 --- a/openair-cn/SCTP/Makefile.am +++ /dev/null @@ -1,52 +0,0 @@ -################################################################################ -# 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@eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ -noinst_LTLIBRARIES = libsctpserver.la libsctpclient.la -libsctpclient_la_LDFLAGS = -all-static -libsctpserver_la_LDFLAGS = -all-static - -AM_CFLAGS = \ - @ADD_CFLAGS@ \ - -I$(top_srcdir)/COMMON \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/api/network \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/include \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/ies \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/emm/msg \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/esm/msg \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/util \ - -I$(top_srcdir)/INTERTASK_INTERFACE \ - -I$(top_srcdir)/UTILS - -libsctpserver_la_SOURCES= \ - sctp_common.c sctp_common.h \ - sctp_itti_messaging.h sctp_itti_messaging.c \ - sctp_primitives_server.h sctp_primitives_server.c - -libsctpclient_la_SOURCES= \ - sctp_common.c sctp_common.h \ - sctp_primitives_client.h sctp_primitives_client.c \ No newline at end of file diff --git a/openair-cn/SCTP/Makefile.eNB b/openair-cn/SCTP/Makefile.eNB deleted file mode 100644 index c41d2911e2..0000000000 --- a/openair-cn/SCTP/Makefile.eNB +++ /dev/null @@ -1,71 +0,0 @@ -################################################################################ -# 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@eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ -# include $(OPENAIR_TARGETS)/SIMU/USER/Makerules - -OUTDIR = . - -libsctp_OBJECTS = \ - sctp_common.o \ - sctp_eNB_task.o \ - sctp_eNB_itti_messaging.o - -# pull in dependency info for *existing* .o files --include $(OUTDIR)/*.d - -CFLAGS = \ - -Wall \ - $(S1AP_CFLAGS) \ - -DENB_MODE \ - -Werror=uninitialized \ - -Werror=implicit-function-declaration - -$(OUTDIR)/%.o : %.c - @echo "Compiling $<" - @if [ ! -d $(dir $@) ]; then mkdir -p $(dir $@); fi; - @$(CC) -c $(CFLAGS) -o $@ $< - @$(CC) -MM $(CFLAGS) $< > $(basename $@).d - @mv -f $(basename $@).d $(basename $@).d.tmp - @sed -e 's|.*:|$@:|' < $(basename $@).d.tmp > $(basename $@).d - @sed -e 's/.*://' -e 's/\\$$//' < $(basename $@).d.tmp | fmt -1 | \ - sed -e 's/^ *//' -e 's/$$/:/' >> $(basename $@).d - @rm -f $(basename $@).d.tmp - -objsdir: - @if [ ! -d $(OUTDIR) ]; then mkdir -p $(OUTDIR); fi; - -$(OUTDIR)/libsctp.a: $(addprefix $(OUTDIR)/,$(libsctp_OBJECTS)) - @echo Creating SCTP archive - @$(AR) rcs $@ $(addprefix $(OUTDIR)/,$(libsctp_OBJECTS)) - -clean: - @$(RM_F_V) $(OUTDIR)/*.o - @$(RM_F_V) $(OUTDIR)/*.d - @$(RM_F_V) $(OUTDIR)/libsctp.a - -cleanall: clean diff --git a/openair-cn/SCTP/sctp_common.c b/openair-cn/SCTP/sctp_common.c index 5f29ef5c37..8e26679e6a 100644 --- a/openair-cn/SCTP/sctp_common.c +++ b/openair-cn/SCTP/sctp_common.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ /*! \file sctp_common.c * \brief eNB/MME SCTP related common procedures diff --git a/openair-cn/SCTP/sctp_common.h b/openair-cn/SCTP/sctp_common.h index 337f1fa90c..bffc61a919 100644 --- a/openair-cn/SCTP/sctp_common.h +++ b/openair-cn/SCTP/sctp_common.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ /*! \file sctp_common.h * \brief eNB/MME SCTP related common procedures diff --git a/openair-cn/SCTP/sctp_default_values.h b/openair-cn/SCTP/sctp_default_values.h index 28b6cc1fbf..4eaa4e88c2 100644 --- a/openair-cn/SCTP/sctp_default_values.h +++ b/openair-cn/SCTP/sctp_default_values.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #ifndef SCTP_DEFAULT_VALUES_H_ #define SCTP_DEFAULT_VALUES_H_ diff --git a/openair-cn/SCTP/sctp_eNB_defs.h b/openair-cn/SCTP/sctp_eNB_defs.h index 8f79d7f15f..6844b1be31 100644 --- a/openair-cn/SCTP/sctp_eNB_defs.h +++ b/openair-cn/SCTP/sctp_eNB_defs.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/SCTP/sctp_eNB_itti_messaging.c b/openair-cn/SCTP/sctp_eNB_itti_messaging.c index 5f27f88759..6e26b2c56d 100644 --- a/openair-cn/SCTP/sctp_eNB_itti_messaging.c +++ b/openair-cn/SCTP/sctp_eNB_itti_messaging.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/SCTP/sctp_eNB_itti_messaging.h b/openair-cn/SCTP/sctp_eNB_itti_messaging.h index 184c1b0095..37af2a9b19 100644 --- a/openair-cn/SCTP/sctp_eNB_itti_messaging.h +++ b/openair-cn/SCTP/sctp_eNB_itti_messaging.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/SCTP/sctp_eNB_task.c b/openair-cn/SCTP/sctp_eNB_task.c index c9039f714d..c1e7d989e9 100644 --- a/openair-cn/SCTP/sctp_eNB_task.c +++ b/openair-cn/SCTP/sctp_eNB_task.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/SCTP/sctp_eNB_task.h b/openair-cn/SCTP/sctp_eNB_task.h index 4397f7e42b..0953b63826 100644 --- a/openair-cn/SCTP/sctp_eNB_task.h +++ b/openair-cn/SCTP/sctp_eNB_task.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/SCTP/sctp_itti_messaging.c b/openair-cn/SCTP/sctp_itti_messaging.c deleted file mode 100644 index 9782c43d7d..0000000000 --- a/openair-cn/SCTP/sctp_itti_messaging.c +++ /dev/null @@ -1,85 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -#include <string.h> - -#include "intertask_interface.h" - -#include "sctp_itti_messaging.h" - -int sctp_itti_send_new_association(uint32_t assoc_id, uint16_t instreams, - uint16_t outstreams) -{ - MessageDef *message_p; - sctp_new_peer_t *sctp_new_peer_p; - - message_p = itti_alloc_new_message(TASK_SCTP, SCTP_NEW_ASSOCIATION); - - sctp_new_peer_p = &message_p->ittiMsg.sctp_new_peer; - - sctp_new_peer_p->assoc_id = assoc_id; - sctp_new_peer_p->instreams = instreams; - sctp_new_peer_p->outstreams = outstreams; - - return itti_send_msg_to_task(TASK_S1AP, INSTANCE_DEFAULT, message_p); -} - -int sctp_itti_send_new_message_ind(int n, uint8_t *buffer, uint32_t assoc_id, - uint16_t stream, - uint16_t instreams, uint16_t outstreams) -{ - MessageDef *message_p; - - message_p = itti_alloc_new_message(TASK_SCTP, SCTP_DATA_IND); - - SCTP_DATA_IND(message_p).buffer = malloc(sizeof(uint8_t) * n); - - memcpy((void *)SCTP_DATA_IND(message_p).buffer, (void *)buffer, n); - - SCTP_DATA_IND(message_p).stream = stream; - SCTP_DATA_IND(message_p).buf_length = n; - SCTP_DATA_IND(message_p).assoc_id = assoc_id; - SCTP_DATA_IND(message_p).instreams = instreams; - SCTP_DATA_IND(message_p).outstreams = outstreams; - - return itti_send_msg_to_task(TASK_S1AP, INSTANCE_DEFAULT, message_p); -} - -int sctp_itti_send_com_down_ind(uint32_t assoc_id) -{ - MessageDef *message_p; - sctp_close_association_t *sctp_close_association_p; - - message_p = itti_alloc_new_message(TASK_SCTP, SCTP_CLOSE_ASSOCIATION); - - sctp_close_association_p = &message_p->ittiMsg.sctp_close_association; - - sctp_close_association_p->assoc_id = assoc_id; - - return itti_send_msg_to_task(TASK_S1AP, INSTANCE_DEFAULT, message_p); -} diff --git a/openair-cn/SCTP/sctp_itti_messaging.h b/openair-cn/SCTP/sctp_itti_messaging.h deleted file mode 100644 index 69f06cb5ef..0000000000 --- a/openair-cn/SCTP/sctp_itti_messaging.h +++ /dev/null @@ -1,41 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -#ifndef SCTP_ITTI_MESSAGING_H_ -#define SCTP_ITTI_MESSAGING_H_ - -int sctp_itti_send_new_association(uint32_t assoc_id, uint16_t instreams, - uint16_t outstreams); - -int sctp_itti_send_new_message_ind(int n, uint8_t *buffer, uint32_t assoc_id, - uint16_t stream, - uint16_t instreams, uint16_t outstreams); - -int sctp_itti_send_com_down_ind(uint32_t assoc_id); - -#endif /* SCTP_ITTI_MESSAGING_H_ */ diff --git a/openair-cn/SCTP/sctp_primitives_client.c b/openair-cn/SCTP/sctp_primitives_client.c index b10848898d..762629d405 100644 --- a/openair-cn/SCTP/sctp_primitives_client.c +++ b/openair-cn/SCTP/sctp_primitives_client.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/SCTP/sctp_primitives_client.h b/openair-cn/SCTP/sctp_primitives_client.h index 37d55ecb9f..89cf9f1db2 100644 --- a/openair-cn/SCTP/sctp_primitives_client.h +++ b/openair-cn/SCTP/sctp_primitives_client.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/SCTP/sctp_primitives_server.c b/openair-cn/SCTP/sctp_primitives_server.c deleted file mode 100644 index 654d0b6f4d..0000000000 --- a/openair-cn/SCTP/sctp_primitives_server.c +++ /dev/null @@ -1,697 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -/*! \file sctp_primitives_server.c - * \brief Main server primitives - * \author Sebastien ROUX - * \date 2013 - * \version 1.0 - * @ingroup _sctp - */ - -#include <pthread.h> - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <string.h> -#include <errno.h> - -#include <sys/types.h> -#include <sys/socket.h> - -#include <netinet/in.h> -#include <netinet/sctp.h> - -#include <arpa/inet.h> - -#include "assertions.h" - -#include "intertask_interface.h" -#include "sctp_primitives_server.h" -#include "mme_config.h" -#include "conversions.h" - -#include "sctp_common.h" -#include "sctp_itti_messaging.h" -#include "msc.h" - -#define SCTP_DUMP_LIST - -#define SCTP_RC_ERROR -1 -#define SCTP_RC_NORMAL_READ 0 -#define SCTP_RC_DISCONNECT 1 - -struct sctp_association_s { - struct sctp_association_s *next_assoc; ///< Next association in the list - struct sctp_association_s *previous_assoc; ///< Previous association in the list - int sd; ///< Socket descriptor - uint32_t ppid; ///< Payload protocol Identifier - uint16_t instreams; ///< Number of input streams negociated for this connection - uint16_t outstreams; ///< Number of output strams negotiated for this connection - int32_t assoc_id; ///< SCTP association id for the connection - uint32_t messages_recv; ///< Number of messages received on this connection - uint32_t messages_sent; ///< Number of messages sent on this connection - - struct sockaddr *peer_addresses; ///< A list of peer addresses - int nb_peer_addresses; -}; - -struct sctp_descriptor_s { - // List of connected peers - struct sctp_association_s *available_connections_head; - struct sctp_association_s *available_connections_tail; - - uint32_t number_of_connections; - uint16_t nb_instreams; - uint16_t nb_outstreams; -}; - -struct sctp_arg_s { - int sd; - uint32_t ppid; -}; - -static struct sctp_descriptor_s sctp_desc; - -// Thread used to handle sctp messages -static pthread_t assoc_thread; - -// LOCAL FUNCTIONS prototypes -void *sctp_receiver_thread(void *args_p); -static int sctp_send_msg(int32_t sctp_assoc_id, uint16_t stream, - const uint8_t *buffer, const uint32_t length); - -// Association list related local functions prototypes -static struct sctp_association_s *sctp_is_assoc_in_list(int32_t assoc_id); -static struct sctp_association_s *sctp_add_new_peer(void); -static int sctp_handle_com_down(uint32_t assoc_id); -static void sctp_dump_list(void); - -static struct sctp_association_s *sctp_add_new_peer(void) -{ - struct sctp_association_s *new_sctp_descriptor = NULL; - - new_sctp_descriptor = calloc(1, sizeof(struct sctp_association_s)); - - if (new_sctp_descriptor == NULL) { - SCTP_ERROR("Failed to allocate memory for new peer (%s:%d)\n", - __FILE__, __LINE__); - return NULL; - } - - new_sctp_descriptor->next_assoc = NULL; - new_sctp_descriptor->previous_assoc = NULL; - - if (sctp_desc.available_connections_tail == NULL) { - sctp_desc.available_connections_head = new_sctp_descriptor; - sctp_desc.available_connections_tail = sctp_desc.available_connections_head; - } else { - new_sctp_descriptor->previous_assoc = sctp_desc.available_connections_tail; - sctp_desc.available_connections_tail->next_assoc = new_sctp_descriptor; - sctp_desc.available_connections_tail = new_sctp_descriptor; - } - - sctp_desc.number_of_connections++; - - sctp_dump_list(); - - return new_sctp_descriptor; -} - -static struct sctp_association_s *sctp_is_assoc_in_list(int32_t assoc_id) -{ - struct sctp_association_s *assoc_desc; - - if (assoc_id < 0) { - return NULL; - } - - for (assoc_desc = sctp_desc.available_connections_head; - assoc_desc; - assoc_desc = assoc_desc->next_assoc) { - if (assoc_desc->assoc_id == assoc_id) { - break; - } - } - - return assoc_desc; -} - -static int sctp_remove_assoc_from_list(int32_t assoc_id) -{ - struct sctp_association_s *assoc_desc; - - /* Association not in the list */ - if ((assoc_desc = sctp_is_assoc_in_list(assoc_id)) == NULL) { - return -1; - } - - if (assoc_desc->next_assoc == NULL) { - if (assoc_desc->previous_assoc == NULL) { - /* Head and tail */ - sctp_desc.available_connections_head = sctp_desc.available_connections_tail = NULL; - } else { - /* Not head but tail */ - sctp_desc.available_connections_tail = assoc_desc->previous_assoc; - assoc_desc->previous_assoc->next_assoc = NULL; - } - } else { - if (assoc_desc->previous_assoc == NULL) { - /* Head but not tail */ - sctp_desc.available_connections_head = assoc_desc->next_assoc; - assoc_desc->next_assoc->previous_assoc = NULL; - } else { - /* Not head and not tail */ - assoc_desc->previous_assoc->next_assoc = assoc_desc->next_assoc; - assoc_desc->next_assoc->previous_assoc = assoc_desc->previous_assoc; - } - } - - free(assoc_desc); - assoc_desc = NULL; - sctp_desc.number_of_connections --; - return 0; -} - -static void sctp_dump_assoc(struct sctp_association_s *sctp_assoc_p) -{ -#if defined(SCTP_DUMP_LIST) - int i; - - if (sctp_assoc_p == NULL) { - return; - } - - SCTP_DEBUG("sd : %d\n", sctp_assoc_p->sd); - SCTP_DEBUG("input streams: %d\n", sctp_assoc_p->instreams); - SCTP_DEBUG("out streams : %d\n", sctp_assoc_p->outstreams); - SCTP_DEBUG("assoc_id : %d\n", sctp_assoc_p->assoc_id); - SCTP_DEBUG("peer address :\n"); - - for (i = 0; i < sctp_assoc_p->nb_peer_addresses; i++) { - char address[40]; - - memset(address, 0, sizeof(address)); - - if (inet_ntop(sctp_assoc_p->peer_addresses[i].sa_family, - sctp_assoc_p->peer_addresses[i].sa_data, address, sizeof(address)) != NULL) { - SCTP_DEBUG(" - [%s]\n", address); - } - } - -#else - sctp_assoc_p = sctp_assoc_p; -#endif -} - -static void sctp_dump_list(void) -{ -#if defined(SCTP_DUMP_LIST) - struct sctp_association_s *sctp_assoc_p; - - sctp_assoc_p = sctp_desc.available_connections_head; - - SCTP_DEBUG("SCTP list contains %d associations\n", sctp_desc.number_of_connections); - - while (sctp_assoc_p != NULL) { - sctp_dump_assoc(sctp_assoc_p); - sctp_assoc_p = sctp_assoc_p->next_assoc; - } - -#else - sctp_dump_assoc(NULL); -#endif -} - -static int sctp_send_msg(int32_t sctp_assoc_id, uint16_t stream, - const uint8_t *buffer, const uint32_t length) -{ - struct sctp_association_s *assoc_desc = NULL; - - DevAssert(buffer != NULL); - - if ((assoc_desc = sctp_is_assoc_in_list(sctp_assoc_id)) == NULL) { - SCTP_DEBUG("This assoc id has not been fount in list (%d)\n", - sctp_assoc_id); - return -1; - } - - if (assoc_desc->sd == -1) { - /* The socket is invalid may be closed. - */ - return -1; - } - - SCTP_DEBUG("[%d][%d] Sending buffer %p of %d bytes on stream %d with ppid %d\n", - assoc_desc->sd, sctp_assoc_id, buffer, - length, stream, assoc_desc->ppid); - - /* Send message_p on specified stream of the sd association */ - if (sctp_sendmsg(assoc_desc->sd, - (const void *)buffer, - length, - NULL, - 0, - assoc_desc->ppid, 0, stream, 0, 0) < 0) { - SCTP_ERROR("send: %s:%d", strerror(errno), errno); - return -1; - } - - assoc_desc->messages_sent++; - - SCTP_DEBUG("Successfully sent %d bytes on stream %d\n", length, stream); - - return 0; -} - -static int sctp_create_new_listener(SctpInit *init_p) -{ - struct sctp_event_subscribe event; - struct sockaddr *addr; - - struct sctp_arg_s *sctp_arg_p; - - uint16_t i = 0, j; - int sd; - int used_addresses = 0; - - DevAssert(init_p != NULL); - - if (init_p->ipv4 == 0 && init_p->ipv6 == 0) { - SCTP_ERROR("Illegal IP configuration upper layer should request at" - "least ipv4 and/or ipv6 config\n"); - return -1; - } - - if ((used_addresses = init_p->nb_ipv4_addr + init_p->nb_ipv6_addr) == 0) { - SCTP_WARN("No address provided...\n"); - return -1; - } - - addr = calloc(used_addresses, sizeof(struct sockaddr)); - - SCTP_DEBUG("Creating new listen socket on port %u with\n", init_p->port); - - if (init_p->ipv4 == 1) { - struct sockaddr_in *ip4_addr; - - SCTP_DEBUG("ipv4 addresses:\n"); - - for (i = 0; i < init_p->nb_ipv4_addr; i++) { - SCTP_DEBUG("\t- "IPV4_ADDR"\n", - IPV4_ADDR_FORMAT(init_p->ipv4_address[i])); - ip4_addr = (struct sockaddr_in *)&addr[i]; - ip4_addr->sin_family = AF_INET; - ip4_addr->sin_port = htons(init_p->port); - ip4_addr->sin_addr.s_addr = init_p->ipv4_address[i]; - } - } - - if (init_p->ipv6 == 1) { - struct sockaddr_in6 *ip6_addr; - - SCTP_DEBUG("ipv6 addresses:\n"); - - for (j = 0; j < init_p->nb_ipv6_addr; j++) { - SCTP_DEBUG("\t- %s\n", init_p->ipv6_address[j]); - ip6_addr = (struct sockaddr_in6 *)&addr[i + j]; - ip6_addr->sin6_family = AF_INET6; - ip6_addr->sin6_port = htons(init_p->port); - - if (inet_pton(AF_INET6, init_p->ipv6_address[j], - ip6_addr->sin6_addr.s6_addr) <= 0) { - SCTP_WARN("Provided ipv6 address %s is not valid\n", - init_p->ipv6_address[j]); - } - } - } - - if ((sd = socket(AF_INET6, SOCK_STREAM, IPPROTO_SCTP)) < 0) { - SCTP_ERROR("socket: %s:%d\n", strerror(errno), errno); - return -1; - } - - memset((void *)&event, 1, sizeof(struct sctp_event_subscribe)); - - if (setsockopt(sd, IPPROTO_SCTP, SCTP_EVENTS, &event, - sizeof(struct sctp_event_subscribe)) < 0) { - SCTP_ERROR("setsockopt: %s:%d\n", strerror(errno), errno); - return -1; - } - - /* Some pre-bind socket configuration */ - if (sctp_set_init_opt(sd, sctp_desc.nb_instreams, sctp_desc.nb_outstreams, - 0, 0) < 0) { - goto err; - } - - if (sctp_bindx(sd, addr, used_addresses, SCTP_BINDX_ADD_ADDR) != 0) { - SCTP_ERROR("sctp_bindx: %s:%d\n", strerror(errno), errno); - return -1; - } - - if (listen(sd, 5) < 0) { - SCTP_ERROR("listen: %s:%d\n", strerror(errno), errno); - return -1; - } - - if ((sctp_arg_p = malloc(sizeof(struct sctp_arg_s))) == NULL) { - return -1; - } - - sctp_arg_p->sd = sd; - sctp_arg_p->ppid = init_p->ppid; - - if (pthread_create(&assoc_thread, NULL, &sctp_receiver_thread, - (void *)sctp_arg_p) < 0) { - SCTP_ERROR("pthread_create: %s:%d\n", strerror(errno), errno); - return -1; - } - - return sd; -err: - - if (sd != -1) { - close(sd); - sd = -1; - } - - return -1; -} - -static -inline int sctp_read_from_socket(int sd, int ppid) -{ - int flags = 0, n; - socklen_t from_len; - struct sctp_sndrcvinfo sinfo; - - struct sockaddr_in addr; - uint8_t buffer[SCTP_RECV_BUFFER_SIZE]; - - if (sd < 0) { - return -1; - } - - memset((void *)&addr, 0, sizeof(struct sockaddr_in)); - from_len = (socklen_t)sizeof(struct sockaddr_in); - memset((void *)&sinfo, 0, sizeof(struct sctp_sndrcvinfo)); - n = sctp_recvmsg(sd, (void *)buffer, SCTP_RECV_BUFFER_SIZE, - (struct sockaddr *)&addr, &from_len, - &sinfo, &flags); - - if (n < 0) { - SCTP_DEBUG("An error occured during read\n"); - SCTP_ERROR("sctp_recvmsg: %s:%d\n", strerror(errno), errno); - return SCTP_RC_ERROR; - } - - if (flags & MSG_NOTIFICATION) { - union sctp_notification *snp; - snp = (union sctp_notification *)buffer; - - /* Client deconnection */ - if (SCTP_SHUTDOWN_EVENT == snp->sn_header.sn_type) { - SCTP_DEBUG("SCTP_SHUTDOWN_EVENT received\n"); - return sctp_handle_com_down(snp->sn_shutdown_event.sse_assoc_id); - } - /* Association has changed. */ - else if (SCTP_ASSOC_CHANGE == snp->sn_header.sn_type) { - struct sctp_assoc_change *sctp_assoc_changed; - sctp_assoc_changed = &snp->sn_assoc_change; - - SCTP_DEBUG("Client association changed: %d\n", sctp_assoc_changed->sac_state); - - /* New physical association requested by a peer */ - switch (sctp_assoc_changed->sac_state) { - case SCTP_COMM_UP: { - struct sctp_association_s *new_association; - - sctp_get_sockinfo(sd, NULL, NULL, NULL); - - SCTP_DEBUG("New connection\n"); - - if ((new_association = sctp_add_new_peer()) == NULL) { - // TODO: handle this case - DevMessage("Unexpected error...\n"); - return SCTP_RC_ERROR; - } else { - new_association->sd = sd; - new_association->ppid = ppid; - new_association->instreams = sctp_assoc_changed->sac_inbound_streams; - new_association->outstreams = sctp_assoc_changed->sac_outbound_streams; - new_association->assoc_id = sctp_assoc_changed->sac_assoc_id; - - sctp_get_localaddresses(sd, NULL, NULL); - sctp_get_peeraddresses(sd, &new_association->peer_addresses, - &new_association->nb_peer_addresses); - - if (sctp_itti_send_new_association( - new_association->assoc_id, new_association->instreams, - new_association->outstreams) < 0) { - SCTP_ERROR("Failed to send message to S1AP\n"); - return SCTP_RC_ERROR; - } - } - } - break; - - default: - break; - } - } - } else { - /* Data payload received */ - struct sctp_association_s *association; - - if ((association = sctp_is_assoc_in_list(sinfo.sinfo_assoc_id)) == NULL) { - // TODO: handle this case - return SCTP_RC_ERROR; - } - - association->messages_recv++; - - if (ntohl(sinfo.sinfo_ppid) != association->ppid) { - /* Mismatch in Payload Protocol Identifier, - * may be we received unsollicited traffic from stack other than S1AP. - */ - SCTP_ERROR("Received data from peer with unsollicited PPID %d, expecting %d\n", - ntohl(sinfo.sinfo_ppid), association->ppid); - return SCTP_RC_ERROR; - } - - SCTP_DEBUG("[%d][%d] Msg of length %d received from port %u, on stream %d, PPID %d\n", - sinfo.sinfo_assoc_id, sd, n, ntohs(addr.sin_port), - sinfo.sinfo_stream, ntohl(sinfo.sinfo_ppid)); - - sctp_itti_send_new_message_ind(n, buffer, sinfo.sinfo_assoc_id, sinfo.sinfo_stream, - association->instreams, association->outstreams); - } - - return SCTP_RC_NORMAL_READ; -} - -static int sctp_handle_com_down(uint32_t assoc_id) -{ - SCTP_DEBUG("Sending close connection for assoc_id %u\n", assoc_id); - - if (sctp_itti_send_com_down_ind(assoc_id) < 0) { - SCTP_ERROR("Failed to send message to TASK_S1AP\n"); - } - - if (sctp_remove_assoc_from_list(assoc_id) < 0) { - SCTP_ERROR("Failed to find client in list\n"); - } - - return SCTP_RC_DISCONNECT; -} - -void *sctp_receiver_thread(void *args_p) -{ - struct sctp_arg_s *sctp_arg_p; - - /* maximum file descriptor number */ - int fdmax, clientsock, i; - /* master file descriptor list */ - fd_set master; - /* temp file descriptor list for select() */ - fd_set read_fds; - - if ((sctp_arg_p = (struct sctp_arg_s *)args_p) == NULL) { - pthread_exit(NULL); - } - - /* clear the master and temp sets */ - FD_ZERO(&master); - FD_ZERO(&read_fds); - - FD_SET(sctp_arg_p->sd, &master); - fdmax = sctp_arg_p->sd; /* so far, it's this one*/ - MSC_START_USE(); - - while(1) { - - memcpy(&read_fds, &master, sizeof(master)); - - if (select(fdmax+1, &read_fds, NULL, NULL, NULL) == -1) { - SCTP_ERROR("[%d] Select() error: %s", - sctp_arg_p->sd, strerror(errno)); - free(args_p); - args_p = NULL; - pthread_exit(NULL); - } - - for (i = 0; i <= fdmax; i++) { - if (FD_ISSET(i, &read_fds)) { - if (i == sctp_arg_p->sd) { - /* There is data to read on listener socket. This means we have to accept - * the connection. - */ - if ((clientsock = accept(sctp_arg_p->sd, NULL, NULL)) < 0) { - SCTP_ERROR("[%d] accept: %s:%d\n", sctp_arg_p->sd, strerror(errno), errno); - free(args_p); - args_p = NULL; - pthread_exit(NULL); - } else { - FD_SET(clientsock, &master); /* add to master set */ - - if(clientsock > fdmax) { - /* keep track of the maximum */ - fdmax = clientsock; - } - } - } else { - int ret; - - /* Read from socket */ - ret = sctp_read_from_socket(i, sctp_arg_p->ppid); - - /* When the socket is disconnected we have to update - * the fd_set. - */ - if (ret == SCTP_RC_DISCONNECT) { - /* Remove the socket from the FD set and update the max sd */ - FD_CLR(i, &master); - - if (i == fdmax) { - while (FD_ISSET(fdmax, &master) == FALSE) - fdmax -= 1; - } - } - } - } - } - } - - free(args_p); - args_p = NULL; - return NULL; -} - -static void *sctp_intertask_interface(void *args_p) -{ - itti_mark_task_ready(TASK_SCTP); - MSC_START_USE(); - - while(1) { - MessageDef *received_message_p; - itti_receive_msg(TASK_SCTP, &received_message_p); - - switch (ITTI_MSG_ID(received_message_p)) { - case SCTP_INIT_MSG: { - SCTP_DEBUG("Received SCTP_INIT_MSG\n"); - - /* We received a new connection request */ - if (sctp_create_new_listener(&received_message_p->ittiMsg.sctpInit) < 0) { - /* SCTP socket creation or bind failed... */ - SCTP_ERROR("Failed to create new SCTP listener\n"); - } - } - break; - - case SCTP_CLOSE_ASSOCIATION: { - - } break; - - case SCTP_DATA_REQ: { - if (sctp_send_msg(SCTP_DATA_REQ(received_message_p).assocId, - SCTP_DATA_REQ(received_message_p).stream, - SCTP_DATA_REQ(received_message_p).buffer, - SCTP_DATA_REQ(received_message_p).bufLen) < 0) { - SCTP_ERROR("Failed to send message over SCTP\n"); - } - } - break; - - case MESSAGE_TEST: { - // int i = 10000; - // while(i--); - } break; - - case TERMINATE_MESSAGE: { - itti_exit_task(); - } - break; - - default: { - SCTP_DEBUG("Unkwnon message ID %d:%s\n", - ITTI_MSG_ID(received_message_p), - ITTI_MSG_NAME(received_message_p)); - } - break; - } - - itti_free(ITTI_MSG_ORIGIN_ID(received_message_p), received_message_p); - received_message_p = NULL; - } - - return NULL; -} - -int sctp_init(const mme_config_t *mme_config_p) -{ - SCTP_DEBUG("Initializing SCTP task interface\n"); - - memset(&sctp_desc, 0, sizeof(struct sctp_descriptor_s)); - - /* Number of streams from configuration */ - sctp_desc.nb_instreams = mme_config_p->sctp_config.in_streams; - sctp_desc.nb_outstreams = mme_config_p->sctp_config.out_streams; - - if (itti_create_task(TASK_SCTP, &sctp_intertask_interface, - NULL) < 0) { - SCTP_ERROR("create task failed"); - SCTP_DEBUG("Initializing SCTP task interface: FAILED\n"); - return -1; - } - - SCTP_DEBUG("Initializing SCTP task interface: DONE\n"); - return 0; -} diff --git a/openair-cn/SCTP/sctp_primitives_server.h b/openair-cn/SCTP/sctp_primitives_server.h deleted file mode 100644 index 60d3178dc9..0000000000 --- a/openair-cn/SCTP/sctp_primitives_server.h +++ /dev/null @@ -1,69 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - -/*! \file sctp_primitives_server.c - * \brief Main server primitives - * \author Sebastien ROUX - * \date 2013 - * \version 1.0 - * @ingroup _sctp - * @{ - */ - -#if HAVE_CONFIG_H -# include "config.h" -#endif - -#include "mme_config.h" - -#if !defined(HAVE_LIBSCTP) -# error "You must install libsctp-dev" -#endif - -#include <netinet/in.h> -#include <netinet/sctp.h> - -#ifndef SCTP_PRIMITIVES_SERVER_H_ -#define SCTP_PRIMITIVES_SERVER_H_ - -/** \brief SCTP data received callback - \param buffer pointer to buffer received - \param length pointer to the length of buffer - **/ -typedef void (*sctp_recv_callback)(uint8_t *buffer, uint32_t length); - -/** \brief SCTP Init function. Initialize SCTP layer - \param mme_config The global MME configuration structure - @returns -1 on error, 0 otherwise. - **/ -int sctp_init(const mme_config_t *mme_config_p); - -#endif /* SCTP_PRIMITIVES_SERVER_H_ */ - -/* @} */ diff --git a/openair-cn/SECU/Makefile.am b/openair-cn/SECU/Makefile.am deleted file mode 100644 index 5fd67b18fe..0000000000 --- a/openair-cn/SECU/Makefile.am +++ /dev/null @@ -1,48 +0,0 @@ -################################################################################ -# 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@eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ -AM_CFLAGS = @ADD_CFLAGS@ \ - -I$(top_srcdir)/UTILS \ - -I$(top_srcdir)/INTERTASK_INTERFACE \ - -I$(top_srcdir)/COMMON - -noinst_LTLIBRARIES = libsecu.la - -libsecu_la_LDFLAGS = -all-static -lm -libsecu_la_SOURCES = \ - kdf.c \ - key_nas_deriver.c \ - nas_stream_eea1.c \ - nas_stream_eia1.c \ - nas_stream_eea2.c \ - nas_stream_eia2.c \ - rijndael.c \ - rijndael.h \ - snow3g.c \ - snow3g.h \ - secu_defs.h \ No newline at end of file diff --git a/openair-cn/SECU/Makefile.eNB b/openair-cn/SECU/Makefile.eNB deleted file mode 100644 index cd8ba01189..0000000000 --- a/openair-cn/SECU/Makefile.eNB +++ /dev/null @@ -1,77 +0,0 @@ -################################################################################ -# 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@eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ -# include $(OPENAIR_TARGETS)/SIMU/USER/Makerules - -OUTDIR = . - - -libsecu_OBJECTS = \ - kdf.o \ - rijndael.o \ - snow3g.o \ - key_nas_deriver.o \ - nas_stream_eea1.o \ - nas_stream_eia1.o \ - nas_stream_eea2.o \ - nas_stream_eia2.o - -# pull in dependency info for *existing* .o files --include $(OUTDIR)/*.d - -CFLAGS = \ - -Wall \ - $(SECU_CFLAGS) \ - -DENB_MODE \ - -Werror=uninitialized \ - -Werror=implicit-function-declaration - -$(OUTDIR)/%.o : %.c - @echo "Compiling $<" - @if [ ! -d $(dir $@) ]; then mkdir -p $(dir $@); fi; - @$(CC) -c $(CFLAGS) -o $@ $< - @$(CC) -MM $(CFLAGS) $< > $(basename $@).d - @mv -f $(basename $@).d $(basename $@).d.tmp - @sed -e 's|.*:|$@:|' < $(basename $@).d.tmp > $(basename $@).d - @sed -e 's/.*://' -e 's/\\$$//' < $(basename $@).d.tmp | fmt -1 | \ - sed -e 's/^ *//' -e 's/$$/:/' >> $(basename $@).d - @rm -f $(basename $@).d.tmp - -objsdir: - @if [ ! -d $(OUTDIR) ]; then mkdir -p $(OUTDIR); fi; - -$(OUTDIR)/libsecu.a: $(addprefix $(OUTDIR)/,$(libsecu_OBJECTS)) - @echo Creating SECU archive - @$(AR) rcs $@ $(addprefix $(OUTDIR)/,$(libsecu_OBJECTS)) - -clean: - @$(RM_F_V) $(OUTDIR)/*.o - @$(RM_F_V) $(OUTDIR)/*.d - @$(RM_F_V) $(OUTDIR)/libsecu.a - -cleanall: clean diff --git a/openair-cn/SECU/kdf.c b/openair-cn/SECU/kdf.c index 35066d0b60..13bd680ccb 100644 --- a/openair-cn/SECU/kdf.c +++ b/openair-cn/SECU/kdf.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/SECU/key_nas_deriver.c b/openair-cn/SECU/key_nas_deriver.c index c5c9d28266..6653d05ee7 100644 --- a/openair-cn/SECU/key_nas_deriver.c +++ b/openair-cn/SECU/key_nas_deriver.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/SECU/key_nas_encryption.c b/openair-cn/SECU/key_nas_encryption.c index 4aeba21dec..70e6ed6895 100644 --- a/openair-cn/SECU/key_nas_encryption.c +++ b/openair-cn/SECU/key_nas_encryption.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/SECU/nas_stream_eea1.c b/openair-cn/SECU/nas_stream_eea1.c index d658f6ecc7..4b69ae8231 100755 --- a/openair-cn/SECU/nas_stream_eea1.c +++ b/openair-cn/SECU/nas_stream_eea1.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/SECU/nas_stream_eea2.c b/openair-cn/SECU/nas_stream_eea2.c index 6a98beb011..25ef340f4e 100644 --- a/openair-cn/SECU/nas_stream_eea2.c +++ b/openair-cn/SECU/nas_stream_eea2.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/SECU/nas_stream_eia1.c b/openair-cn/SECU/nas_stream_eia1.c index 4442670e48..a0712754f6 100755 --- a/openair-cn/SECU/nas_stream_eia1.c +++ b/openair-cn/SECU/nas_stream_eia1.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/SECU/nas_stream_eia2.c b/openair-cn/SECU/nas_stream_eia2.c index 8300bb3a68..f1f64dd90a 100644 --- a/openair-cn/SECU/nas_stream_eia2.c +++ b/openair-cn/SECU/nas_stream_eia2.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/SECU/rijndael.h b/openair-cn/SECU/rijndael.h index 23c06b2b50..8014e828ef 100644 --- a/openair-cn/SECU/rijndael.h +++ b/openair-cn/SECU/rijndael.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/SECU/secu_defs.h b/openair-cn/SECU/secu_defs.h index 50fcfc7a0e..0f27d8d309 100644 --- a/openair-cn/SECU/secu_defs.h +++ b/openair-cn/SECU/secu_defs.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/SECU/snow3g.c b/openair-cn/SECU/snow3g.c index 6983f98ee0..78184af9c1 100644 --- a/openair-cn/SECU/snow3g.c +++ b/openair-cn/SECU/snow3g.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/SECU/snow3g.h b/openair-cn/SECU/snow3g.h index 71a86e1784..d278db2dcf 100644 --- a/openair-cn/SECU/snow3g.h +++ b/openair-cn/SECU/snow3g.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/SGW-LITE/COPYING b/openair-cn/SGW-LITE/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair-cn/SGW-LITE/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program 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. - - This program 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 this program. If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - <program> Copyright (C) <year> <name of author> - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<http://www.gnu.org/licenses/>. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<http://www.gnu.org/philosophy/why-not-lgpl.html>. diff --git a/openair-cn/SGW-LITE/Makefile.am b/openair-cn/SGW-LITE/Makefile.am deleted file mode 100644 index 54a36c14c7..0000000000 --- a/openair-cn/SGW-LITE/Makefile.am +++ /dev/null @@ -1,53 +0,0 @@ -################################################################################ -# 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@eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ -AM_CFLAGS = @ADD_CFLAGS@ \ - -I$(top_srcdir)/COMMON \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/api/network \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/include \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/ies \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/emm/msg \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/esm/msg \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/util \ - -I$(top_srcdir)/INTERTASK_INTERFACE \ - -I$(top_srcdir)/GTPV1-U \ - -I$(top_srcdir)/MME_APP \ - -I$(top_srcdir)/UTILS \ - -I$(top_srcdir)/UTILS/HASHTABLE - -noinst_LTLIBRARIES = libsgw_lite.la -libsgw_lite_la_LDFLAGS = -all-static -lconfig - -libsgw_lite_la_SOURCES= \ - spgw_config.c spgw_config.h \ - s11_causes.c s11_causes.h \ - sgw_lite_task.c \ - sgw_lite_handlers.c sgw_lite_handlers.h \ - sgw_lite_context_manager.c sgw_lite_context_manager.h \ - sgw_lite.h sgw_lite_defs.h sgw_lite_ie_defs.h \ - pgw_lite_paa.c pgw_lite_paa.h diff --git a/openair-cn/SGW-LITE/pgw_lite_paa.c b/openair-cn/SGW-LITE/pgw_lite_paa.c deleted file mode 100755 index 9a681162af..0000000000 --- a/openair-cn/SGW-LITE/pgw_lite_paa.c +++ /dev/null @@ -1,188 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/*! \file pgw_lite_paa.c -* \brief -* \author Lionel Gauthier -* \company Eurecom -* \email: lionel.gauthier@eurecom.fr -*/ -#include <stdint.h> -#include <errno.h> -#include <string.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/inet.h> - -#include "intertask_interface.h" -#include "assertions.h" -#include "queue.h" - -#include "pgw_lite_paa.h" -#include "sgw_lite_defs.h" -#include "spgw_config.h" -#include "sgw_lite.h" - - -//#define PGW_LITE_FREE_ADDR_POOL_CONFIG 1 - -extern pgw_app_t pgw_app; - - -// Load in PGW pool, configured PAA address pool -void pgw_lite_load_pool_ip_addresses(void) -{ - struct pgw_lite_conf_ipv4_list_elm_s *conf_ipv4_p = NULL; - struct pgw_lite_ipv4_list_elm_s *ipv4_p = NULL; - - struct pgw_lite_conf_ipv6_list_elm_s *conf_ipv6_p = NULL; - struct pgw_lite_ipv6_list_elm_s *ipv6_p = NULL; - char print_buffer[INET6_ADDRSTRLEN]; - - STAILQ_INIT(&pgw_app.pgw_lite_ipv4_list_free); - STAILQ_INIT(&pgw_app.pgw_lite_ipv4_list_allocated); - STAILQ_INIT(&pgw_app.pgw_lite_ipv6_list_free); - STAILQ_INIT(&pgw_app.pgw_lite_ipv6_list_allocated); - - STAILQ_FOREACH(conf_ipv4_p, &spgw_config.pgw_config.pgw_lite_ipv4_pool_list, ipv4_entries) { - ipv4_p = calloc(1, sizeof(struct pgw_lite_ipv4_list_elm_s)); - ipv4_p->addr.s_addr = ntohl(conf_ipv4_p->addr.s_addr); - STAILQ_INSERT_TAIL(&pgw_app.pgw_lite_ipv4_list_free, ipv4_p, ipv4_entries); - //SPGW_APP_DEBUG("Loaded IPv4 PAA address in pool: %s\n", - // inet_ntoa(conf_ipv4_p->addr)); - } - STAILQ_FOREACH(conf_ipv6_p, &spgw_config.pgw_config.pgw_lite_ipv6_pool_list, ipv6_entries) { - ipv6_p = calloc(1, sizeof(struct pgw_lite_ipv6_list_elm_s)); - ipv6_p->addr = conf_ipv6_p->addr; - ipv6_p->prefix_len = conf_ipv6_p->prefix_len; - ipv6_p->num_allocated = 0; - STAILQ_INSERT_TAIL(&pgw_app.pgw_lite_ipv6_list_free, ipv6_p, ipv6_entries); - - if (inet_ntop(AF_INET6, &ipv6_p->addr, print_buffer, INET6_ADDRSTRLEN) == NULL) { - SPGW_APP_ERROR("Could not Load IPv6 PAA address in pool: %s\n", strerror(errno)); - } /*else { - - SPGW_APP_DEBUG("Loaded IPv6 PAA prefix in pool: %s\n",print_buffer); - }*/ - } -#if defined(PGW_LITE_FREE_ADDR_POOL_CONFIG) - - while ((conf_ipv4_p = STAILQ_FIRST(&spgw_config.pgw_config.pgw_lite_ipv4_pool_list))) { - STAILQ_REMOVE_HEAD(&spgw_config.pgw_config.pgw_lite_ipv4_pool_list, ipv4_entries); - free(conf_ipv4_p); - } - - while ((conf_ipv6_p = STAILQ_FIRST(&spgw_config.pgw_config.pgw_lite_ipv6_pool_list))) { - STAILQ_REMOVE_HEAD(&spgw_config.pgw_config.pgw_lite_ipv6_pool_list, ipv6_entries); - free(conf_ipv6_p); - } - -#endif - -} - - - -int pgw_lite_get_free_ipv4_paa_address(struct in_addr * const addr_pP) -{ - struct pgw_lite_ipv4_list_elm_s *ipv4_p = NULL; - - if (STAILQ_EMPTY(&pgw_app.pgw_lite_ipv4_list_free)) { - addr_pP->s_addr = INADDR_ANY; - return -1; - } - - ipv4_p = STAILQ_FIRST(&pgw_app.pgw_lite_ipv4_list_free); - STAILQ_REMOVE(&pgw_app.pgw_lite_ipv4_list_free, ipv4_p, pgw_lite_ipv4_list_elm_s, ipv4_entries); - STAILQ_INSERT_TAIL(&pgw_app.pgw_lite_ipv4_list_allocated, ipv4_p, ipv4_entries); - addr_pP->s_addr = ipv4_p->addr.s_addr; - return 0; -} - -int pgw_lite_release_free_ipv4_paa_address(const struct in_addr * const addr_pP) -{ - struct pgw_lite_ipv4_list_elm_s *ipv4_p = NULL; - - STAILQ_FOREACH(ipv4_p, &pgw_app.pgw_lite_ipv4_list_allocated, ipv4_entries) { - if (ipv4_p->addr.s_addr == addr_pP->s_addr) { - STAILQ_REMOVE(&pgw_app.pgw_lite_ipv4_list_allocated, ipv4_p, pgw_lite_ipv4_list_elm_s, ipv4_entries); - STAILQ_INSERT_TAIL(&pgw_app.pgw_lite_ipv4_list_free, ipv4_p, ipv4_entries); - return 0; - } - } - return -1; -} - -int pgw_lite_get_free_ipv6_paa_prefix(struct in6_addr * const addr_pP) -{ - struct pgw_lite_ipv6_list_elm_s *ipv6_p = NULL; - - if (STAILQ_EMPTY(&pgw_app.pgw_lite_ipv6_list_free)) { - *addr_pP = in6addr_any; - return -1; - } - - ipv6_p = STAILQ_FIRST(&pgw_app.pgw_lite_ipv6_list_free); - ipv6_p->num_allocated += 1; - ipv6_p->num_free -= 1; - - if (ipv6_p->num_free == 0) { - STAILQ_REMOVE(&pgw_app.pgw_lite_ipv6_list_free, ipv6_p, pgw_lite_ipv6_list_elm_s, ipv6_entries); - STAILQ_INSERT_TAIL(&pgw_app.pgw_lite_ipv6_list_allocated, ipv6_p, ipv6_entries); - } - - *addr_pP = ipv6_p->addr; - return 0; -} - -int pgw_lite_release_free_ipv6_paa_prefix(const struct in6_addr * const addr_pP) -{ - struct pgw_lite_ipv6_list_elm_s *ipv6_p = NULL; - - ipv6_p = STAILQ_FIRST(&pgw_app.pgw_lite_ipv6_list_free); - - if (IN6_ARE_ADDR_EQUAL(&ipv6_p->addr, addr_pP)) { - ipv6_p->num_allocated -= 1; - ipv6_p->num_free += 1; - } - - STAILQ_FOREACH(ipv6_p, &pgw_app.pgw_lite_ipv6_list_allocated, ipv6_entries) { - if (IN6_ARE_ADDR_EQUAL(&ipv6_p->addr, addr_pP)) { - STAILQ_REMOVE(&pgw_app.pgw_lite_ipv6_list_allocated, ipv6_p, pgw_lite_ipv6_list_elm_s, ipv6_entries); - ipv6_p->num_allocated -= 1; - ipv6_p->num_free += 1; - STAILQ_INSERT_TAIL(&pgw_app.pgw_lite_ipv6_list_free, ipv6_p, ipv6_entries); - return 0; - } - } - return -1; -} - - - - diff --git a/openair-cn/SGW-LITE/pgw_lite_paa.h b/openair-cn/SGW-LITE/pgw_lite_paa.h deleted file mode 100755 index 0bab08514b..0000000000 --- a/openair-cn/SGW-LITE/pgw_lite_paa.h +++ /dev/null @@ -1,44 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/*! \file pgw_lite_paa.h -* \brief -* \author Lionel Gauthier -* \company Eurecom -* \email: lionel.gauthier@eurecom.fr -*/ -#ifndef PGW_LITE_PAA_H_ -#define PGW_LITE_PAA_H_ - -void pgw_lite_load_pool_ip_addresses (void); -int pgw_lite_get_free_ipv4_paa_address (struct in_addr * const addr_P); -int pgw_lite_release_free_ipv4_paa_address (const struct in_addr * const addr_P); -int pgw_lite_get_free_ipv6_paa_prefix (struct in6_addr * const addr_pP); -int pgw_lite_release_free_ipv6_paa_prefix (const struct in6_addr * const addr_pP); - -#endif diff --git a/openair-cn/SGW-LITE/s11_causes.c b/openair-cn/SGW-LITE/s11_causes.c deleted file mode 100644 index b74d9bf987..0000000000 --- a/openair-cn/SGW-LITE/s11_causes.c +++ /dev/null @@ -1,96 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/*! \file s11_causes.c -* \brief -* \author Sebastien ROUX, Lionel Gauthier -* \company Eurecom -* \email: lionel.gauthier@eurecom.fr -*/ -#define SGW_LITE -#define S11_CAUSES_C - -#include <stdio.h> -#include <stdlib.h> -#include <stdint.h> - -#include "s11_causes.h" -#include "common_types.h" -#include "sgw_lite_ie_defs.h" - -static const SGWCauseMapping_t causes[] = { - { LOCAL_DETACH, "Local detach", 0, 0, 0, 0 }, - { COMPLETE_DETACH, "Complete detach", 0, 0, 0, 0 }, - { RAT_CHANGE_3GPP_TO_NON_3GPP, "From 3GPP to non 3GPP RAT change", 0, 0, 0, 0 }, - { ISR_DEACTIVATION, "ISR deactivation", 0, 0, 0, 0 }, - { ERROR_IND_FROM_RNC_ENB_SGSN, "Error ind received from RNC/eNB/SGSN", 0, 0, 0, 0 }, - { IMSI_DETACH_ONLY, "IMSI detach only", 0, 0, 0, 0 }, - { REQUEST_ACCEPTED, "Request accepted", 1, 1, 1, 1 }, - { REQUEST_ACCEPTED_PARTIALLY, "Request accepted partially", 1, 1, 1, 0 }, - { NEW_PDN_TYPE_NW_PREF, "New PDN type network preference", 1, 0, 0, 0 }, - { NEW_PDN_TYPE_SAB_ONLY, "New PDN type single address bearer only", 1, 0, 0, 0 }, - { CONTEXT_NOT_FOUND, "Context not found", 0, 1, 1, 1 }, - { INVALID_MESSAGE_FORMAT, "Invalid message format", 1, 1, 1, 1 }, - { INVALID_LENGTH, "Invalid length", 1, 1, 1, 0 }, - { SERVICE_NOT_SUPPORTED, "Service not supported", 0, 0, 1, 0 }, - { SYSTEM_FAILURE, "System failure", 1, 1, 1, 0 }, - { NO_RESOURCES_AVAILABLE, "No resources available", 1, 0, 0, 0 }, - { MISSING_OR_UNKNOWN_APN, "Missing or unknown APN", 1, 0, 0, 0 }, - { GRE_KEY_NOT_FOUND, "GRE KEY not found", 1, 0, 0, 0 }, - { DENIED_IN_RAT, "Denied in RAT", 1, 1, 0, 0 }, - { UE_NOT_RESPONDING, "UE not responding", 0, 1, 0, 0 }, - { SERVICE_DENIED, "Service Denied", 0, 0, 0, 0 }, - { UNABLE_TO_PAGE_UE, "Unable to page UE", 0, 1, 0, 0 }, - { NO_MEMORY_AVAILABLE, "No memory available", 1, 1, 1, 0 }, - { REQUEST_REJECTED, "Request rejected", 1, 1, 1, 0 }, - { INVALID_PEER, "Invalid peer", 0, 0, 0, 1 }, - { TEMP_REJECT_HO_IN_PROGRESS, "Temporarily rejected due to HO in progress",0, 0, 0, 0 }, - { M_PDN_APN_NOT_ALLOWED, "Multiple PDN for a given APN not allowed", 1, 0, 0, 0 }, - { 0, NULL, 0, 0, 0, 0 }, -}; - -static int compare_cause_id(const void *m1, const void *m2) -{ - struct SGWCauseMapping_e *scm1 = (struct SGWCauseMapping_e*)m1; - struct SGWCauseMapping_e *scm2 = (struct SGWCauseMapping_e*)m2; - - return (scm1->value - scm2->value); -} - -char *sgw_cause_2_string(uint8_t cause_value) -{ - SGWCauseMapping_t *res, key; - key.value = cause_value; - res = bsearch(&key, causes, sizeof(causes), sizeof(SGWCauseMapping_t), compare_cause_id); - - if (res == NULL) { - return "Unknown cause"; - } else { - return res->name; - } -} diff --git a/openair-cn/SGW-LITE/s11_causes.h b/openair-cn/SGW-LITE/s11_causes.h deleted file mode 100644 index 2ae49d0cd7..0000000000 --- a/openair-cn/SGW-LITE/s11_causes.h +++ /dev/null @@ -1,51 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/*! \file s11_causes.h -* \brief -* \author Sebastien ROUX, Lionel Gauthier -* \company Eurecom -* \email: lionel.gauthier@eurecom.fr -*/ -#ifndef S11_CAUSES_H_ -#define S11_CAUSES_H_ - -typedef struct SGWCauseMapping_e { - uint8_t value; - /* Displayable cause name */ - char *name; - /* Possible cause in message? */ - unsigned create_session_response:1; - unsigned create_bearer_response:1; - unsigned modify_bearer_response:1; - unsigned delete_session_response:1; -} SGWCauseMapping_t; - -char *sgw_cause_2_string(uint8_t cause_value); - -#endif /* S11_CAUSES_H_ */ diff --git a/openair-cn/SGW-LITE/sgw_lite.h b/openair-cn/SGW-LITE/sgw_lite.h deleted file mode 100755 index d71db77257..0000000000 --- a/openair-cn/SGW-LITE/sgw_lite.h +++ /dev/null @@ -1,93 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/*! \file sgw_lite.h -* \brief -* \author Lionel Gauthier -* \company Eurecom -* \email: lionel.gauthier@eurecom.fr -*/ - -#ifndef SGW_LITE_H_ -#define SGW_LITE_H_ -#include <netinet/in.h> -#include "hashtable.h" -#include "tree.h" -#include "commonDef.h" -#include "common_types.h" -#include "sgw_lite_context_manager.h" - -typedef struct sgw_app_s { - - char *sgw_interface_name_for_S1u_S12_S4_up; - uint32_t sgw_ip_address_for_S1u_S12_S4_up; - - char *sgw_interface_name_for_S11_S4; // unused now - uint32_t sgw_ip_address_for_S11_S4; // unused now - - uint32_t sgw_ip_address_for_S5_S8_up; // unused now - - // key is S11 S-GW local teid - hash_table_t *s11teid2mme_hashtable; - - // key is S1-U S-GW local teid - hash_table_t *s1uteid2enb_hashtable; - - // the key of this hashtable is the S11 s-gw local teid. - hash_table_t *s11_bearer_context_information_hashtable; - - -} sgw_app_t; - - -struct pgw_lite_ipv4_list_elm_s { - STAILQ_ENTRY(pgw_lite_ipv4_list_elm_s) ipv4_entries; - struct in_addr addr; -}; - - -struct pgw_lite_ipv6_list_elm_s { - STAILQ_ENTRY(pgw_lite_ipv6_list_elm_s) ipv6_entries; - struct in6_addr addr; - int prefix_len; - int num_allocated; - int num_free; -} ; - - -typedef struct pgw_app_s { - - STAILQ_HEAD(pgw_lite_ipv4_list_free_head_s, pgw_lite_ipv4_list_elm_s) pgw_lite_ipv4_list_free; - STAILQ_HEAD(pgw_lite_ipv4_list_allocated_head_s, pgw_lite_ipv4_list_elm_s) pgw_lite_ipv4_list_allocated; - - STAILQ_HEAD(pgw_lite_ipv6_list_free_head_s, pgw_lite_ipv6_list_elm_s) pgw_lite_ipv6_list_free; - STAILQ_HEAD(pgw_lite_ipv6_list_allocated_head_s, pgw_lite_ipv6_list_elm_s) pgw_lite_ipv6_list_allocated; -} pgw_app_t; - -#endif - diff --git a/openair-cn/SGW-LITE/sgw_lite_context_manager.c b/openair-cn/SGW-LITE/sgw_lite_context_manager.c deleted file mode 100644 index 8f8fddea8c..0000000000 --- a/openair-cn/SGW-LITE/sgw_lite_context_manager.c +++ /dev/null @@ -1,386 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/*! \file sgw_lite_context_manager.c -* \brief -* \author Lionel Gauthier -* \company Eurecom -* \email: lionel.gauthier@eurecom.fr -*/ -#define SGW_LITE -#define SGW_LITE_CONTEXT_MANAGER_C - -#include <stdio.h> -#include <stdlib.h> -#include <stdint.h> -#include <string.h> - -#include "tree.h" -#include "hashtable.h" - -#include "intertask_interface.h" -#include "mme_config.h" -#include "sgw_lite_defs.h" -#include "sgw_lite_context_manager.h" -#include "sgw_lite.h" - -extern sgw_app_t sgw_app; - - -//----------------------------------------------------------------------------- -static void sgw_lite_display_s11teid2mme_mapping(uint64_t keyP, void *dataP, void* unusedParameterP) -//----------------------------------------------------------------------------- -{ - mme_sgw_tunnel_t * mme_sgw_tunnel= NULL; - - if (dataP != NULL) { - mme_sgw_tunnel = (mme_sgw_tunnel_t *)dataP; - SPGW_APP_DEBUG("| %u\t<------------->\t%u\n", mme_sgw_tunnel->remote_teid, mme_sgw_tunnel->local_teid); - } else { - SPGW_APP_DEBUG("INVALID S11 TEID MAPPING FOUND\n"); - } -} -//----------------------------------------------------------------------------- -void sgw_lite_display_s11teid2mme_mappings(void) -//----------------------------------------------------------------------------- -{ - SPGW_APP_DEBUG("+--------------------------------------+\n"); - SPGW_APP_DEBUG("| MME <--- S11 TE ID MAPPINGS ---> SGW |\n"); - SPGW_APP_DEBUG("+--------------------------------------+\n"); - hashtable_apply_funct_on_elements(sgw_app.s11teid2mme_hashtable, sgw_lite_display_s11teid2mme_mapping, NULL); - SPGW_APP_DEBUG("+--------------------------------------+\n"); -} -//----------------------------------------------------------------------------- -static void sgw_lite_display_pdn_connection_sgw_eps_bearers(uint64_t keyP, void *dataP, void* unusedParameterP) -//----------------------------------------------------------------------------- -{ - sgw_eps_bearer_entry_t *eps_bearer_entry = NULL; - - if (dataP != NULL) { - eps_bearer_entry = (sgw_eps_bearer_entry_t *)dataP; - SPGW_APP_DEBUG("|\t\t\t\t%"PRId64"\t<-> ebi: %u, enb_teid_for_S1u: %u, s_gw_teid_for_S1u_S12_S4_up: %u (tbc)\n", - keyP, - eps_bearer_entry->eps_bearer_id, - eps_bearer_entry->enb_teid_for_S1u, - eps_bearer_entry->s_gw_teid_for_S1u_S12_S4_up); - } else { - SPGW_APP_DEBUG("\t\t\t\tINVALID eps_bearer_entry FOUND\n"); - } -} - -//----------------------------------------------------------------------------- -static void sgw_lite_display_s11_bearer_context_information(uint64_t keyP, void *dataP, void* unusedParameterP) -//----------------------------------------------------------------------------- -{ - s_plus_p_gw_eps_bearer_context_information_t * sp_context_information= NULL; - hashtable_rc_t hash_rc; - - if (dataP != NULL) { - sp_context_information = (s_plus_p_gw_eps_bearer_context_information_t *)dataP; - SPGW_APP_DEBUG("| KEY %"PRId64": \n", keyP); - SPGW_APP_DEBUG("|\tsgw_eps_bearer_context_information: |\n"); - //Imsi_t imsi; ///< IMSI (International Mobile Subscriber Identity) is the subscriber permanent identity. - SPGW_APP_DEBUG("|\t\timsi_unauthenticated_indicator:\t%u\n", sp_context_information->sgw_eps_bearer_context_information.imsi_unauthenticated_indicator); - //char msisdn[MSISDN_LENGTH]; ///< The basic MSISDN of the UE. The presence is dictated by its storage in the HSS. - SPGW_APP_DEBUG("|\t\tmme_teid_for_S11: \t%u\n", sp_context_information->sgw_eps_bearer_context_information.mme_teid_for_S11); - //ip_address_t mme_ip_address_for_S11; ///< MME IP address the S11 interface. - SPGW_APP_DEBUG("|\t\ts_gw_teid_for_S11_S4: \t%u\n", sp_context_information->sgw_eps_bearer_context_information.s_gw_teid_for_S11_S4); - //ip_address_t s_gw_ip_address_for_S11_S4; ///< S-GW IP address for the S11 interface and the S4 Interface (control plane). - //cgi_t last_known_cell_Id; ///< This is the last location of the UE known by the network - - SPGW_APP_DEBUG("|\t\tpdn_connection:\n"); - SPGW_APP_DEBUG("|\t\t\tapn_in_use: %s\n", sp_context_information->sgw_eps_bearer_context_information.pdn_connection.apn_in_use); - SPGW_APP_DEBUG("|\t\t\tdefault_bearer: %u\n", sp_context_information->sgw_eps_bearer_context_information.pdn_connection.default_bearer); - SPGW_APP_DEBUG("|\t\t\teps_bearers:\n"); - - hash_rc = hashtable_apply_funct_on_elements(sp_context_information->sgw_eps_bearer_context_information.pdn_connection.sgw_eps_bearers, - sgw_lite_display_pdn_connection_sgw_eps_bearers, - NULL); - - if (hash_rc != HASH_TABLE_OK) { - SPGW_APP_DEBUG("Invalid sgw_eps_bearers hashtable for display\n"); - } - - //void *trxn; - //uint32_t peer_ip; - } else { - SPGW_APP_DEBUG("INVALID s_plus_p_gw_eps_bearer_context_information FOUND\n"); - } -} -//----------------------------------------------------------------------------- -void sgw_lite_display_s11_bearer_context_information_mapping(void) -//----------------------------------------------------------------------------- -{ - SPGW_APP_DEBUG("+-----------------------------------------+\n"); - SPGW_APP_DEBUG("| S11 BEARER CONTEXT INFORMATION MAPPINGS |\n"); - SPGW_APP_DEBUG("+-----------------------------------------+\n"); - hashtable_apply_funct_on_elements(sgw_app.s11_bearer_context_information_hashtable, sgw_lite_display_s11_bearer_context_information, NULL); - SPGW_APP_DEBUG("+--------------------------------------+\n"); -} -//----------------------------------------------------------------------------- -void pgw_lite_cm_free_apn(pgw_apn_t *apnP) -//----------------------------------------------------------------------------- -{ - if (apnP != NULL) { - if (apnP->pdn_connections != NULL) { - obj_hashtable_destroy(apnP->pdn_connections); - } - } -} -//----------------------------------------------------------------------------- -Teid_t sgw_lite_get_new_S11_tunnel_id(void) -//----------------------------------------------------------------------------- -{ - // TO DO: RANDOM - static Teid_t tunnel_id = 0; - tunnel_id += 1; - return tunnel_id; -} - -//----------------------------------------------------------------------------- -mme_sgw_tunnel_t *sgw_lite_cm_create_s11_tunnel(Teid_t remote_teid, Teid_t local_teid) -//----------------------------------------------------------------------------- -{ - - mme_sgw_tunnel_t *new_tunnel; - - new_tunnel = malloc(sizeof(mme_sgw_tunnel_t)); - - if (new_tunnel == NULL) { - /* Malloc failed, may be ENOMEM error */ - SPGW_APP_ERROR("Failed to create tunnel for remote_teid %u\n", remote_teid); - return NULL; - } - - new_tunnel->remote_teid = remote_teid; - new_tunnel->local_teid = local_teid; - - /* Trying to insert the new tunnel into the tree. - * If collision_p is not NULL (0), it means tunnel is already present. - */ - hashtable_insert(sgw_app.s11teid2mme_hashtable, local_teid, new_tunnel); - - return new_tunnel; -} - -//----------------------------------------------------------------------------- -int sgw_lite_cm_remove_s11_tunnel(Teid_t local_teid) -//----------------------------------------------------------------------------- -{ - int temp; - - temp = hashtable_remove(sgw_app.s11teid2mme_hashtable, local_teid); - - return temp; -} - -//----------------------------------------------------------------------------- -sgw_eps_bearer_entry_t * sgw_lite_cm_create_eps_bearer_entry(void) -//----------------------------------------------------------------------------- -{ - sgw_eps_bearer_entry_t *eps_bearer_entry; - - eps_bearer_entry = malloc(sizeof(sgw_eps_bearer_entry_t)); - - if (eps_bearer_entry == NULL) { - /* Malloc failed, may be ENOMEM error */ - SPGW_APP_ERROR("Failed to create new EPS bearer object\n"); - return NULL; - } - - return eps_bearer_entry; -} - - -//----------------------------------------------------------------------------- -sgw_pdn_connection_t * sgw_lite_cm_create_pdn_connection(void) -//----------------------------------------------------------------------------- -{ - sgw_pdn_connection_t *pdn_connection; - - pdn_connection = malloc(sizeof(sgw_pdn_connection_t)); - - if (pdn_connection == NULL) { - /* Malloc failed, may be ENOMEM error */ - SPGW_APP_ERROR("Failed to create new PDN connection object\n"); - return NULL; - } - - memset(pdn_connection, 0, sizeof(sgw_pdn_connection_t)); - - pdn_connection->sgw_eps_bearers = hashtable_create(12, NULL, NULL); - - if ( pdn_connection->sgw_eps_bearers == NULL) { - SPGW_APP_ERROR("Failed to create eps bearers collection object\n"); - free(pdn_connection); - pdn_connection = NULL; - return NULL; - } - - return pdn_connection; -} -//----------------------------------------------------------------------------- -void sgw_lite_cm_free_pdn_connection(sgw_pdn_connection_t *pdn_connectionP) -//----------------------------------------------------------------------------- -{ - if (pdn_connectionP != NULL) { - if (pdn_connectionP->sgw_eps_bearers != NULL) { - hashtable_destroy(pdn_connectionP->sgw_eps_bearers); - } - } -} -//----------------------------------------------------------------------------- -void sgw_lite_cm_free_s_plus_p_gw_eps_bearer_context_information(s_plus_p_gw_eps_bearer_context_information_t *contextP) -//----------------------------------------------------------------------------- -{ - if (contextP == NULL) { - return; - } - - /*if (contextP->sgw_eps_bearer_context_information.pdn_connections != NULL) { - obj_hashtable_destroy(contextP->sgw_eps_bearer_context_information.pdn_connections); - }*/ - if (contextP->sgw_eps_bearer_context_information.pdn_connection.sgw_eps_bearers != NULL) { - hashtable_destroy(contextP->sgw_eps_bearer_context_information.pdn_connection.sgw_eps_bearers); - } - - if (contextP->pgw_eps_bearer_context_information.apns != NULL) { - obj_hashtable_destroy(contextP->pgw_eps_bearer_context_information.apns); - } - - free(contextP); -} - -//----------------------------------------------------------------------------- -s_plus_p_gw_eps_bearer_context_information_t * sgw_lite_cm_create_bearer_context_information_in_collection(Teid_t teid) -//----------------------------------------------------------------------------- -{ - s_plus_p_gw_eps_bearer_context_information_t *new_bearer_context_information; - - new_bearer_context_information = malloc(sizeof(s_plus_p_gw_eps_bearer_context_information_t)); - - if (new_bearer_context_information == NULL) { - /* Malloc failed, may be ENOMEM error */ - SPGW_APP_ERROR("Failed to create new bearer context information object for S11 remote_teid %u\n", teid); - return NULL; - } - - memset(new_bearer_context_information, 0, sizeof(s_plus_p_gw_eps_bearer_context_information_t)); - SPGW_APP_DEBUG("sgw_lite_cm_create_bearer_context_information_in_collection %d\n", teid); - - /*new_bearer_context_information->sgw_eps_bearer_context_information.pdn_connections = obj_hashtable_create(32, NULL, NULL, sgw_lite_cm_free_pdn_connection); - - if ( new_bearer_context_information->sgw_eps_bearer_context_information.pdn_connections == NULL) { - SPGW_APP_ERROR("Failed to create PDN connections collection object entry for EPS bearer teid %u \n", teid); - sgw_lite_cm_free_s_plus_p_gw_eps_bearer_context_information(new_bearer_context_information); - return NULL; - }*/ - - new_bearer_context_information->pgw_eps_bearer_context_information.apns = obj_hashtable_create(32, NULL, NULL, pgw_lite_cm_free_apn); - - if ( new_bearer_context_information->pgw_eps_bearer_context_information.apns == NULL) { - SPGW_APP_ERROR("Failed to create APN collection object entry for EPS bearer S11 teid %u \n", teid); - sgw_lite_cm_free_s_plus_p_gw_eps_bearer_context_information(new_bearer_context_information); - return NULL; - } - - /* Trying to insert the new tunnel into the tree. - * If collision_p is not NULL (0), it means tunnel is already present. - */ - hashtable_insert(sgw_app.s11_bearer_context_information_hashtable, teid, new_bearer_context_information); - SPGW_APP_DEBUG("Added new s_plus_p_gw_eps_bearer_context_information_t in s11_bearer_context_information_hashtable key teid %u\n", teid); - - return new_bearer_context_information; -} - -int sgw_lite_cm_remove_bearer_context_information(Teid_t teid) -{ - int temp; - temp = hashtable_remove(sgw_app.s11_bearer_context_information_hashtable, teid); - return temp; -} - -//--- EPS Bearer Entry - -//----------------------------------------------------------------------------- -sgw_eps_bearer_entry_t * sgw_lite_cm_create_eps_bearer_entry_in_collection(hash_table_t *eps_bearersP, ebi_t eps_bearer_idP) -//----------------------------------------------------------------------------- -{ - sgw_eps_bearer_entry_t *new_eps_bearer_entry; - hashtable_rc_t hash_rc = HASH_TABLE_OK; - - if (eps_bearersP == NULL) { - SPGW_APP_ERROR("Failed to create EPS bearer entry for EPS bearer id %u. reason eps bearer hashtable is NULL \n", eps_bearer_idP); - return NULL; - } - - new_eps_bearer_entry = malloc(sizeof(sgw_eps_bearer_entry_t)); - - if (new_eps_bearer_entry == NULL) { - /* Malloc failed, may be ENOMEM error */ - SPGW_APP_ERROR("Failed to create EPS bearer entry for EPS bearer id %u \n", eps_bearer_idP); - return NULL; - } - - memset(new_eps_bearer_entry, 0, sizeof(sgw_eps_bearer_entry_t)); - - new_eps_bearer_entry->eps_bearer_id = eps_bearer_idP; - - hash_rc = hashtable_insert(eps_bearersP, eps_bearer_idP, new_eps_bearer_entry); - SPGW_APP_DEBUG("Inserted new EPS bearer entry for EPS bearer id %u status %s\n", eps_bearer_idP, hashtable_rc_code2string(hash_rc)); - - hash_rc = hashtable_apply_funct_on_elements(eps_bearersP, - sgw_lite_display_pdn_connection_sgw_eps_bearers, - NULL); - - if (hash_rc != HASH_TABLE_OK) { - SPGW_APP_DEBUG("Invalid sgw_eps_bearers hashtable for display\n"); - } - - /* CHECK DUPLICATES IN HASH TABLES ? if (temp == 1) { - SPGW_APP_WARN("This EPS bearer entry already exists: %u\n", eps_bearer_idP); - free(new_eps_bearer_entry); - new_eps_bearer_entry = collision_p; - }*/ - return new_eps_bearer_entry; -} -//----------------------------------------------------------------------------- -int sgw_lite_cm_remove_eps_bearer_entry(hash_table_t *eps_bearersP, ebi_t eps_bearer_idP) -//----------------------------------------------------------------------------- -{ - int temp; - - if (eps_bearersP == NULL) { - return -1; - } - - temp = hashtable_remove(eps_bearersP, eps_bearer_idP); - - return temp; -} - diff --git a/openair-cn/SGW-LITE/sgw_lite_context_manager.h b/openair-cn/SGW-LITE/sgw_lite_context_manager.h deleted file mode 100644 index 7cdd2676f4..0000000000 --- a/openair-cn/SGW-LITE/sgw_lite_context_manager.h +++ /dev/null @@ -1,241 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/*! \file sgw_lite_context_manager.h -* \brief -* \author Lionel Gauthier -* \company Eurecom -* \email: lionel.gauthier@eurecom.fr -*/ -#ifndef SGW_LITE_CONTEXT_MANAGER_H_ -#define SGW_LITE_CONTEXT_MANAGER_H_ - -#include "commonDef.h" -#include "common_types.h" -#include "mme_app_ue_context.h" // for cgi_t -#include "hashtable.h" -#include "obj_hashtable.h" - -/******************************** -* P-GW contexts * -*********************************/ -typedef struct pgw_eps_bearer_entry_gtp_based_S5_S8_only_s { - ebi_t eps_bearer_id; ///< An EPS bearer identity uniquely identifies an EPS bearer for one UE accessing via E-UTRAN - // TO DO traffic_flow_template_t tft; ///< Traffic Flow Template - - ip_address_t s_gw_address_in_use_up; ///< The IP address of the S-GW currently used for sending user plane traffic. - Teid_t s_gw_teid_for_S5_S8_up; ///< S-GW Tunnel Endpoint Identifier for the S5/S8 interface for the user plane. - - ip_address_t p_gw_ip_address_for_S5_S8_up; ///< P-GW IP address for user plane data received from PDN GW. - Teid_t p_gw_teid_for_S5_S8_up; ///< P-GW Tunnel Endpoint Identifier for the GTP Based S5/S8 interface for user plane. - - // TO BE CHECKED - BearerQOS_t eps_bearer_qos; ///< ARP, GBR, MBR, QCI. - // NOT NEEDED charging_id ///< Charging identifier, identifies charging records generated by S-GW and PDN GW. - -} pgw_eps_bearer_entry_t; - -typedef struct pgw_pdn_connection_s { - //ip_addresses; ///< IPv4 address and/or IPv6 prefix - pdn_type_t pdn_type; ///< IPv4, IPv6, or IPv4v6 - ip_address_t s_gw_address_in_use_cp; ///< The IP address of the S-GW currently used for sending control plane signalling. - Teid_t s_gw_teid_for_S5_S8_cp; ///< S-GW Tunnel Endpoint Identifier for the S5/S8 interface for the control plane. (For GTP-based S5/S8 only). - ip_address_t s_gw_address_in_use_up; ///< The IP address of the S-GW currently used for sending user plane traffic. (For PMIP-based S5/S8 only). - // NOT NEEDED s_gw_gre_key_for_dl_traffic_up ///< Serving GW assigned GRE Key for the S5/S8 interface for the user plane for downlink traffic. (For PMIP-based S5/S8 only). - ip_address_t p_gw_ip_address_for_S5_S8_cp; ///< P-GW IP address for the S5/S8 for the control plane signalling. - Teid_t p_gw_teid_for_S5_S8_cp; ///< P-GW Tunnel Endpoint Identifier for the S5/S8 control plane interface. (For GTP-based S5/S8 only). - ip_address_t p_gw_address_in_use_up; ///< The IP address of the P-GW currently used for sending user plane traffic. (For PMIP-based S5/S8 only). - // NOT NEEDED p_gw_gre_key_for_uplink_traffic_up ///< PDN GW assigned GRE Key for the S5/S8 interface for the user plane for uplink traffic. (For PMIP-based S5/S8 only). - // NOT NEEDED MS Info Change Reporting Action ///< Denotes whether the MME and/or the SGSN is/are requested to send changes in User Location Information change for this bearer. - // NOT NEEDED CSG Information Reporting Action ///< Denotes whether the MME and/or the SGSN is/are requested to send changes in User CSG Information change for this bearer. - /// This field denotes separately whether the MME/SGSN are requested to send changes in User CSG Information for (a) CSG cells, - /// (b) hybrid cells in which the subscriber is a CSG member, and (c) hybrid cells in which the subscriber is not a CSG member, or any combination of the above. - ebi_t - default_bearer; ///< Identifies the default bearer within the PDN connection by its EPS Bearer Id. The default bearer is the one which is established first within the PDN connection. (For GTP based - /// S5/S8 or for PMIP based S5/S8 if multiple PDN connections to the same APN are supported). - - hash_table_t *pgw_eps_bearers; -} pgw_pdn_connection_t; - - -typedef struct pgw_apn_s { - APN_t apn_in_use; ///< The APN currently used, as received from the S-GW. - ambr_t apn_ambr; ///< The maximum aggregated uplink and downlink MBR values to be shared across all Non-GBR bearers, - /// which are established for this APN. - obj_hash_table_t *pdn_connections; ///< For each PDN Connection within the APN - -} pgw_apn_t; - - -// The PDN GW maintains the following EPS bearer context information for UEs. -// For emergency attached UEs which are not authenticated, IMEI is stored in context. -typedef struct pgw_eps_bearer_context_information_s { - Imsi_t imsi; ///< IMSI (International Mobile Subscriber Identity) is the subscriber permanent identity. - int8_t imsi_unauthenticated_indicator; ///< This is an IMSI indicator to show the IMSI is unauthenticated. - // TO BE CHECKED me_identity_t me_identity; ///< Mobile Equipment Identity (e.g. IMEI/IMEISV). - char msisdn[MSISDN_LENGTH]; ///< The basic MSISDN of the UE. The presence is dictated by its storage in the HSS. - // NOT NEEDED selected_cn_operator_id ///< Selected core network operator identity (to support networksharing as defined in TS 23.251 - rat_type_t rat_type; ///< Current RAT - // NOT NEEDED Trace reference ///< Identifies a record or a collection of records for a particular trace. - // NOT NEEDED Trace type ///< Indicates the type of trace - // NOT NEEDED Trigger id ///< Identifies the entity that initiated the trace - // NOT NEEDED OMC identity ///< Identifies the OMC that shall receive the trace record(s). - - // TO BE CONTINUED... - obj_hash_table_t *apns; -} pgw_eps_bearer_context_information_t; - -/******************************** -* S-GW contexts * -*********************************/ -//-------------------------------- -// EPS Bearer entry -//-------------------------------- - -// A primary key for a EPS Bearer entry can be a tuple (eps bearer id, imsi) -typedef struct sgw_eps_bearer_entry_s { - PAA_t paa; - ebi_t eps_bearer_id; ///< An EPS bearer identity uniquely identifies an EPS bearer for one UE accessing via E-UTRAN - // TO DO traffic_flow_template_t tft; ///< Traffic Flow Template - - ip_address_t p_gw_address_in_use_up; ///< The IP address of the P-GW currently used for sending user plane traffic. (For GTP-based S5/S8 only). - Teid_t p_gw_teid_for_S5_S8_up; ///< P-GW Tunnel Endpoint Identifier for the S5/S8 interface for the user plane. (For GTP-based S5/S8 only). - - ip_address_t s_gw_ip_address_for_S5_S8_up; ///< S-GW IP address for user plane data received from PDN GW. (For GTP-based S5/S8 only). - Teid_t s_gw_teid_for_S5_S8_up; ///< S-GW Tunnel Endpoint Identifier for the S5/S8 interface for the user plane. (For GTP-based S5/S8 only). - - ip_address_t - s_gw_ip_address_for_S1u_S12_S4_up; ///< S-GW IP address for the S1-u interface (Used by the eNodeB), for the S12 interface (used by the RNC) and for the S4 interface (used by the SGSN). - Teid_t - s_gw_teid_for_S1u_S12_S4_up; ///< S-GW Tunnel Endpoint Identifier for the S1-u interface, for the S12 interface (used by the RNC) and for the S4 interface (used by the SGSN). - - ip_address_t enb_ip_address_for_S1u; ///< eNodeB IP address for the S1-u interface (Used by the S-GW). - Teid_t enb_teid_for_S1u; ///< eNodeB Tunnel Endpoint Identifier for the S1-u interface. - - // TO BE CHECKED - BearerQOS_t eps_bearer_qos; ///< ARP, GBR, MBR, QCI. - // NOT NEEDED charging_id ///< Charging identifier, identifies charging records generated by S-GW and PDN GW. - -} sgw_eps_bearer_entry_t; - - -typedef struct sgw_pdn_connection_s { - APN_t apn_in_use; ///< The APN currently used, as received from the MME or S4 SGSN. - // NOT NEEDED NOW eps_pdn_charging ///< The charging characteristics of this PDN connection, e.g.normal, prepaid, flat-rate and/or hot billing. - // NOT IMPLEMENTED NOW - ip_address_t p_gw_address_in_use_cp; ///< The IP address of the P-GW currently used for sending control plane signalling. - // NOT IMPLEMENTED NOW - Teid_t p_gw_teid_for_S5_S8_cp; ///< P-GW Tunnel Endpoint Identifier for the S5/S8 interface for the control plane. (For GTP-based S5/S8 only). - // NOT IMPLEMENTED NOW - ip_address_t p_gw_address_in_use_up; ///< The IP address of the P-GW currently used for sending user plane traffic. (For PMIP-based S5/S8 only) - // NOT NEEDED p_gw_gre_key_for_uplink_traffic_up ///< PDN GW assigned GRE Key for the S5/S8 interface for the user plane for uplink traffic. (For PMIP-based S5/S8 only) - ip_address_t s_gw_ip_address_for_S5_S8_cp; ///< S-GW IP address for the S5/S8 for the control plane signalling. - Teid_t s_gw_teid_for_S5_S8_cp; ///< S-GW Tunnel Endpoint Identifier for the S5/S8 control plane interface. (For GTP-based S5/S8 only). - ip_address_t s_gw_address_in_use_up; ///< The IP address of the S-GW currently used for sending user plane traffic. (For PMIP-based S5/S8 only) - // NOT NEEDED s_gw_gre_key_for_dl_traffic_up ///< user plane for downlink traffic. (For PMIP-based S5/S8 only) - ebi_t default_bearer; ///< Identifies the default bearer within the PDN connection by its EPS Bearer Id. (For PMIP based S5/S8.) - - // eps bearers - hash_table_t *sgw_eps_bearers; - -} sgw_pdn_connection_t; - -// The Serving GW maintains the following EPS bearer context information for UEs. -// Struct sgw_eps_bearer_context_information_t contain the context fields for one UE. -typedef struct sgw_eps_bearer_context_information_s { - Imsi_t imsi; ///< IMSI (International Mobile Subscriber Identity) is the subscriber permanent identity. - int8_t imsi_unauthenticated_indicator; /// This is an IMSI indicator to show the IMSI is unauthenticated. - // TO BE CHECKED me_identity_t me_identity; ///< Mobile Equipment Identity (e.g. IMEI/IMEISV). - char msisdn[MSISDN_LENGTH]; ///< The basic MSISDN of the UE. The presence is dictated by its storage in the HSS. - // NOT NEEDED selected_cn_operator_id ///< Selected core network operator identity (to support networksharing as defined in TS 23.251 - Teid_t mme_teid_for_S11; ///< MME Tunnel Endpoint Identifier for the S11 interface - ip_address_t mme_ip_address_for_S11; ///< MME IP address the S11 interface. - Teid_t s_gw_teid_for_S11_S4; ///< S-GW Tunnel Endpoint Identifier for the S11 Interface and the S4 Interface (control plane) - ip_address_t s_gw_ip_address_for_S11_S4; ///< S-GW IP address for the S11 interface and the S4 Interface (control plane). - // NOT NEEDED Trace reference ///< Identifies a record or a collection of records for a particular trace. - // NOT NEEDED Trace type ///< Indicates the type of trace - // NOT NEEDED Trigger id ///< Identifies the entity that initiated the trace - // NOT NEEDED OMC identity ///< Identifies the OMC that shall receive the trace record(s). - cgi_t last_known_cell_Id; ///< This is the last location of the UE known by the network - // NOT NEEDED NOW Last known Cell Id age ///< This is the age of the above UE location information - - // ONLY ONE PDN CONNECTION - // Do not know now what is the key for this hashtable - //obj_hash_table_t *pdn_connections; - sgw_pdn_connection_t pdn_connection; - - /* S11 specific parameter. Not used in standalone mode */ - void *trxn; - uint32_t peer_ip; - - SgwCreateSessionRequest saved_message; -} sgw_eps_bearer_context_information_t; - -/******************************** -* Paired contexts * -*********************************/ -// data entry for s11_bearer_context_information_hashtable -// like this if needed in future, the split of S and P GW should be easier. -typedef struct s_plus_p_gw_eps_bearer_context_information_s { - sgw_eps_bearer_context_information_t sgw_eps_bearer_context_information; - pgw_eps_bearer_context_information_t pgw_eps_bearer_context_information; -} s_plus_p_gw_eps_bearer_context_information_t; - - -// data entry for s11teid2mme_hashtable -typedef struct mme_sgw_tunnel_s { - uint32_t local_teid; ///< Tunnel endpoint Identifier - uint32_t remote_teid; ///< Tunnel endpoint Identifier -} mme_sgw_tunnel_t; - -// data entry for s1uteid2enb_hashtable -typedef struct enb_sgw_s1u_tunnel_s { - uint32_t local_teid; ///< S-GW Tunnel endpoint Identifier - uint32_t remote_teid; ///< eNB Tunnel endpoint Identifier - ip_address_t enb_ip_address_for_S11; ///< eNB IP address the S1U interface. -} enb_sgw_s1u_tunnel_t; - - -void sgw_lite_display_s11teid2mme_mappings(void); -void sgw_lite_display_s11_bearer_context_information_mapping(void); -void pgw_lite_cm_free_apn(pgw_apn_t *apnP); - - -Teid_t sgw_lite_get_new_S11_tunnel_id(void); -mme_sgw_tunnel_t * sgw_lite_cm_create_s11_tunnel(Teid_t remote_teid, Teid_t local_teid); -int sgw_lite_cm_remove_s11_tunnel(Teid_t local_teid); -sgw_eps_bearer_entry_t * sgw_lite_cm_create_eps_bearer_entry(void); -sgw_pdn_connection_t * sgw_lite_cm_create_pdn_connection(void); -void sgw_lite_cm_free_pdn_connection(sgw_pdn_connection_t *pdn_connectionP); -s_plus_p_gw_eps_bearer_context_information_t * sgw_lite_cm_create_bearer_context_information_in_collection(Teid_t teid); -void sgw_lite_cm_free_s_plus_p_gw_eps_bearer_context_information(s_plus_p_gw_eps_bearer_context_information_t *contextP); -int sgw_lite_cm_remove_bearer_context_information(Teid_t teid); -sgw_eps_bearer_entry_t * sgw_lite_cm_create_eps_bearer_entry_in_collection(hash_table_t *eps_bearersP, ebi_t eps_bearer_idP); -int sgw_lite_cm_remove_eps_bearer_entry(hash_table_t *eps_bearersP, ebi_t eps_bearer_idP); - -#endif /* SGW_LITE_CONTEXT_MANAGER_H_ */ diff --git a/openair-cn/SGW-LITE/sgw_lite_defs.h b/openair-cn/SGW-LITE/sgw_lite_defs.h deleted file mode 100644 index 5233fa927b..0000000000 --- a/openair-cn/SGW-LITE/sgw_lite_defs.h +++ /dev/null @@ -1,59 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/*! \file sgw_lite_defs.h -* \brief -* \author Lionel Gauthier -* \company Eurecom -* \email: lionel.gauthier@eurecom.fr -*/ - -#ifndef SGW_LITE_DEFS_H_ -#define SGW_LITE_DEFS_H_ - - - -#if defined(ENB_MODE) -# include "UTIL/LOG/log.h" -# define SPGW_APP_ERROR(x, args...) LOG_E(SPGW, x, ##args) -# define SPGW_APP_WARN(x, args...) LOG_W(SPGW, x, ##args) -# define SPGW_APP_TRACE(x, args...) LOG_T(SPGW, x, ##args) -# define SPGW_APP_INFO(x, args...) LOG_I(SPGW, x, ##args) -# define SPGW_APP_DEBUG(x, args...) LOG_I(SPGW, x, ##args) -#else -# define SPGW_APP_ERROR(x, args...) do { fprintf(stdout, "[SPGW-APP][E]"x, ##args); } while(0) -# define SPGW_APP_WARN(x, args...) do { fprintf(stdout, "[SPGW-APP][W]"x, ##args); } while(0) -# define SPGW_APP_TRACE(x, args...) do { fprintf(stdout, "[SPGW-APP][T]"x, ##args); } while(0) -# define SPGW_APP_INFO(x, args...) do { fprintf(stdout, "[SPGW-APP][I]"x, ##args); } while(0) -# define SPGW_APP_DEBUG(x, args...) do { fprintf(stdout, "[SPGW-APP][D]"x, ##args); } while(0) -#endif - - -int sgw_lite_init(char* config_file_name_pP); - -#endif /* SGW_LITE_DEFS_H_ */ diff --git a/openair-cn/SGW-LITE/sgw_lite_handlers.c b/openair-cn/SGW-LITE/sgw_lite_handlers.c deleted file mode 100644 index 66db5a9675..0000000000 --- a/openair-cn/SGW-LITE/sgw_lite_handlers.c +++ /dev/null @@ -1,1237 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/*! \file sgw_lite_handlers.c -* \brief -* \author Lionel Gauthier -* \company Eurecom -* \email: lionel.gauthier@eurecom.fr -*/ -#define SGW_LITE -#define SGW_LITE_HANDLERS_C - -#include <stdio.h> -#include <stdlib.h> -#include <stdint.h> -#include <string.h> -#include <netinet/in.h> - -#include "assertions.h" -#include "conversions.h" -#include "common_types.h" -#include "intertask_interface.h" -#include "mme_config.h" -#include "msc.h" - -#include "sgw_lite_defs.h" -#include "sgw_lite_handlers.h" -#include "sgw_lite_context_manager.h" -#include "sgw_lite.h" -#include "sgw_lite_ie_defs.h" -#include "pgw_lite_paa.h" -#include "spgw_config.h" - -extern sgw_app_t sgw_app; -extern spgw_config_t spgw_config; - -static uint32_t g_gtpv1u_teid = 0; - -uint32_t sgw_get_new_teid(void) -{ - g_gtpv1u_teid = g_gtpv1u_teid + 1; - return g_gtpv1u_teid; -} - -int -sgw_lite_handle_create_session_request( - const SgwCreateSessionRequest * const session_req_pP) -{ - mme_sgw_tunnel_t* new_endpoint_p = NULL; - s_plus_p_gw_eps_bearer_context_information_t* s_plus_p_gw_eps_bearer_ctxt_info_p = NULL; - sgw_eps_bearer_entry_t* eps_bearer_entry_p = NULL; - MessageDef* message_p = NULL; - - /* Upon reception of create session request from MME, - * S-GW should create UE, eNB and MME contexts and forward message to P-GW. - */ - if (session_req_pP->rat_type != RAT_EUTRAN) { - SPGW_APP_WARN("Received session request with RAT != RAT_TYPE_EUTRAN: type %d\n", - session_req_pP->rat_type); - } - - /* As we are abstracting GTP-C transport, FTeid ip address is useless. - * We just use the teid to identify MME tunnel. Normally we received either: - * - ipv4 address if ipv4 flag is set - * - ipv6 address if ipv6 flag is set - * - ipv4 and ipv6 if both flags are set - * Communication between MME and S-GW involves S11 interface so we are expecting - * S11_MME_GTP_C (11) as interface_type. - */ - if ((session_req_pP->sender_fteid_for_cp.teid == 0) && - (session_req_pP->sender_fteid_for_cp.interface_type != S11_MME_GTP_C)) { - /* MME sent request with teid = 0. This is not valid... */ - SPGW_APP_WARN("F-TEID parameter mismatch\n"); - return -1; - } - - new_endpoint_p = sgw_lite_cm_create_s11_tunnel( - session_req_pP->sender_fteid_for_cp.teid, - sgw_lite_get_new_S11_tunnel_id()); - - if (new_endpoint_p == NULL) { - SPGW_APP_WARN("Could not create new tunnel endpoint between S-GW and MME " - "for S11 abstraction\n"); - return -1; - } - - SPGW_APP_DEBUG("Rx CREATE-SESSION-REQUEST MME S11 teid %u S-GW S11 teid %u APN %s EPS bearer Id %d\n", - new_endpoint_p->remote_teid, - new_endpoint_p->local_teid, - session_req_pP->apn, - session_req_pP->bearer_to_create.eps_bearer_id); - SPGW_APP_DEBUG(" IMSI %c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n", - IMSI(&session_req_pP->imsi)); - - s_plus_p_gw_eps_bearer_ctxt_info_p = sgw_lite_cm_create_bearer_context_information_in_collection(new_endpoint_p->local_teid); - - if (s_plus_p_gw_eps_bearer_ctxt_info_p != NULL) { - /* We try to create endpoint for S11 interface. A NULL endpoint means that - * either the teid is already in list of known teid or ENOMEM error has been - * raised during malloc. - */ - - //-------------------------------------------------- - // copy informations from create session request to bearer context information - //-------------------------------------------------- - memcpy(s_plus_p_gw_eps_bearer_ctxt_info_p->sgw_eps_bearer_context_information.imsi.digit, session_req_pP->imsi.digit, IMSI_DIGITS_MAX); - memcpy(s_plus_p_gw_eps_bearer_ctxt_info_p->pgw_eps_bearer_context_information.imsi.digit, session_req_pP->imsi.digit, IMSI_DIGITS_MAX); - s_plus_p_gw_eps_bearer_ctxt_info_p->sgw_eps_bearer_context_information.imsi_unauthenticated_indicator = 1; - s_plus_p_gw_eps_bearer_ctxt_info_p->pgw_eps_bearer_context_information.imsi_unauthenticated_indicator = 1; - - s_plus_p_gw_eps_bearer_ctxt_info_p->sgw_eps_bearer_context_information.mme_teid_for_S11 = session_req_pP->sender_fteid_for_cp.teid; - s_plus_p_gw_eps_bearer_ctxt_info_p->sgw_eps_bearer_context_information.s_gw_teid_for_S11_S4 = new_endpoint_p->local_teid; - s_plus_p_gw_eps_bearer_ctxt_info_p->sgw_eps_bearer_context_information.trxn = session_req_pP->trxn; - s_plus_p_gw_eps_bearer_ctxt_info_p->sgw_eps_bearer_context_information.peer_ip = session_req_pP->peer_ip; - // may use ntohl or reverse, will see - - FTEID_T_2_IP_ADDRESS_T( - (&session_req_pP->sender_fteid_for_cp) , - (&s_plus_p_gw_eps_bearer_ctxt_info_p->sgw_eps_bearer_context_information.mme_ip_address_for_S11)); - - //-------------------------------------- - // PDN connection - //-------------------------------------- - /*pdn_connection = sgw_lite_cm_create_pdn_connection(); - - if (pdn_connection == NULL) { - // Malloc failed, may be ENOMEM error - SPGW_APP_ERROR("Failed to create new PDN connection\n"); - return -1; - }*/ - memset(&s_plus_p_gw_eps_bearer_ctxt_info_p->sgw_eps_bearer_context_information.pdn_connection, 0, sizeof(sgw_pdn_connection_t)); - s_plus_p_gw_eps_bearer_ctxt_info_p->sgw_eps_bearer_context_information.pdn_connection.sgw_eps_bearers = hashtable_create(12, NULL, NULL); - - if ( s_plus_p_gw_eps_bearer_ctxt_info_p->sgw_eps_bearer_context_information.pdn_connection.sgw_eps_bearers == NULL) { - SPGW_APP_ERROR("Failed to create eps bearers collection object\n"); - DevMessage("Failed to create eps bearers collection object\n"); - return -1; - } - - if (session_req_pP->apn) { - s_plus_p_gw_eps_bearer_ctxt_info_p->sgw_eps_bearer_context_information.pdn_connection.apn_in_use = strdup(session_req_pP->apn); - } else { - s_plus_p_gw_eps_bearer_ctxt_info_p->sgw_eps_bearer_context_information.pdn_connection.apn_in_use = "NO APN"; - } - - s_plus_p_gw_eps_bearer_ctxt_info_p->sgw_eps_bearer_context_information.pdn_connection.default_bearer = session_req_pP->bearer_to_create.eps_bearer_id; - - //obj_hashtable_insert(s_plus_p_gw_eps_bearer_ctxt_info_p->sgw_eps_bearer_context_information.pdn_connections, pdn_connection->apn_in_use, strlen(pdn_connection->apn_in_use), pdn_connection); - //-------------------------------------- - // EPS bearer entry - //-------------------------------------- - eps_bearer_entry_p = sgw_lite_cm_create_eps_bearer_entry_in_collection( - s_plus_p_gw_eps_bearer_ctxt_info_p->sgw_eps_bearer_context_information.pdn_connection.sgw_eps_bearers, - session_req_pP->bearer_to_create.eps_bearer_id); - - sgw_lite_display_s11teid2mme_mappings(); - sgw_lite_display_s11_bearer_context_information_mapping(); - - if (eps_bearer_entry_p == NULL) { - SPGW_APP_ERROR("Failed to create new EPS bearer entry\n"); - // TO DO FREE new_bearer_ctxt_info_p and by cascade... - return -1; - - } - - eps_bearer_entry_p->eps_bearer_qos = session_req_pP->bearer_to_create.bearer_level_qos; - - - //s_plus_p_gw_eps_bearer_ctxt_info_p->sgw_eps_bearer_context_informationteid = teid; - - /* Trying to insert the new tunnel into the tree. - * If collision_p is not NULL (0), it means tunnel is already present. - */ - - //s_plus_p_gw_eps_bearer_ctxt_info_p->sgw_eps_bearer_context_informations_gw_ip_address_for_S11_S4 = - - memcpy(&s_plus_p_gw_eps_bearer_ctxt_info_p->sgw_eps_bearer_context_information.saved_message, - session_req_pP, - sizeof(SgwCreateSessionRequest)); - - /* Establishing EPS bearer. Requesting S1-U (GTPV1-U) task to create a - * tunnel for S1 user plane interface. If status in response is successfull (0), - * the tunnel endpoint is locally ready. - */ - message_p = itti_alloc_new_message(TASK_SPGW_APP, GTPV1U_CREATE_TUNNEL_REQ); - - if (message_p == NULL) { - sgw_lite_cm_remove_s11_tunnel(new_endpoint_p->remote_teid); - return -1; - } - - { - Gtpv1uCreateTunnelResp createTunnelResp; - - createTunnelResp.context_teid = new_endpoint_p->local_teid; - createTunnelResp.eps_bearer_id = session_req_pP->bearer_to_create.eps_bearer_id; - createTunnelResp.status = 0x00; - createTunnelResp.S1u_teid = sgw_get_new_teid(); - sgw_lite_handle_gtpv1uCreateTunnelResp(&createTunnelResp); - } - } else { - SPGW_APP_WARN("Could not create new transaction for SESSION_CREATE message\n"); - free(new_endpoint_p); - new_endpoint_p = NULL; - return -1; - } -} - - - -int -sgw_lite_handle_sgi_endpoint_created( - const SGICreateEndpointResp * const resp_pP) -{ - task_id_t to_task; - - SgwCreateSessionResponse *create_session_response_p = NULL; - s_plus_p_gw_eps_bearer_context_information_t *new_bearer_ctxt_info_p = NULL; - MessageDef *message_p = NULL; - hashtable_rc_t hash_rc; - - - - - SPGW_APP_DEBUG("Rx SGI_CREATE_ENDPOINT_RESPONSE,Context: S11 teid %u, SGW S1U teid %u EPS bearer id %u\n", - resp_pP->context_teid, resp_pP->sgw_S1u_teid, resp_pP->eps_bearer_id); - hash_rc = hashtable_get(sgw_app.s11_bearer_context_information_hashtable, resp_pP->context_teid, (void**)&new_bearer_ctxt_info_p); - -#if defined(ENABLE_STANDALONE_EPC) - to_task = TASK_MME_APP; -#else - to_task = TASK_S11; -#endif - - message_p = itti_alloc_new_message(TASK_SPGW_APP, SGW_CREATE_SESSION_RESPONSE); - - if (message_p == NULL) { - return -1; - } - - create_session_response_p = &message_p->ittiMsg.sgwCreateSessionResponse; - memset(create_session_response_p, 0, sizeof(SgwCreateSessionResponse)); - - if (hash_rc == HASH_TABLE_OK) { - create_session_response_p->teid = new_bearer_ctxt_info_p->sgw_eps_bearer_context_information.mme_teid_for_S11; - - /* Preparing to send create session response on S11 abstraction interface. - * we set the cause value regarding the S1-U bearer establishment result status. - */ - if (resp_pP->status == 0) { - uint32_t address = sgw_app.sgw_ip_address_for_S1u_S12_S4_up; - create_session_response_p->bearer_context_created.s1u_sgw_fteid.teid = resp_pP->sgw_S1u_teid; - create_session_response_p->bearer_context_created.s1u_sgw_fteid.interface_type = S1_U_SGW_GTP_U; - create_session_response_p->bearer_context_created.s1u_sgw_fteid.ipv4 = 1; - /* Should be filled in with S-GW S1-U local address. Running everything on localhost for now */ - create_session_response_p->bearer_context_created.s1u_sgw_fteid.ipv4_address = address; - - - create_session_response_p->ambr.br_dl = 100000000; - create_session_response_p->ambr.br_ul = 40000000; - - { - sgw_eps_bearer_entry_t* eps_bearer_entry_p = NULL; - hash_rc = hashtable_get (new_bearer_ctxt_info_p->sgw_eps_bearer_context_information.pdn_connection.sgw_eps_bearers, - resp_pP->eps_bearer_id, - (void**)&eps_bearer_entry_p); - - if ((hash_rc == HASH_TABLE_KEY_NOT_EXISTS) || (hash_rc == HASH_TABLE_BAD_PARAMETER_HASHTABLE)) { - SPGW_APP_ERROR("ERROR UNABLE TO GET EPS BEARER ENTRY\n"); - } else { - AssertFatal(sizeof(eps_bearer_entry_p->paa) == sizeof(resp_pP->paa), "Mismatch in lengths"); // sceptic mode - memcpy(&eps_bearer_entry_p->paa, - &resp_pP->paa, - sizeof(PAA_t)); - } - } - memcpy(&create_session_response_p->paa, - &resp_pP->paa, - sizeof(PAA_t)); - - memcpy(&create_session_response_p->pco, - &resp_pP->pco, - sizeof(pco_flat_t)); - - /* Set the Cause information from bearer context created. - * "Request accepted" is returned when the GTPv2 entity has accepted a control plane request. - */ - create_session_response_p->cause = REQUEST_ACCEPTED; - create_session_response_p->bearer_context_created.cause = REQUEST_ACCEPTED; - } else { - create_session_response_p->cause = M_PDN_APN_NOT_ALLOWED; - create_session_response_p->bearer_context_created.cause = M_PDN_APN_NOT_ALLOWED; - } - - create_session_response_p->s11_sgw_teid.teid = resp_pP->context_teid; - create_session_response_p->bearer_context_created.eps_bearer_id = resp_pP->eps_bearer_id; - create_session_response_p->trxn = new_bearer_ctxt_info_p->sgw_eps_bearer_context_information.trxn; - create_session_response_p->peer_ip = new_bearer_ctxt_info_p->sgw_eps_bearer_context_information.peer_ip; - } else { - create_session_response_p->cause = CONTEXT_NOT_FOUND; - create_session_response_p->bearer_context_created.cause = CONTEXT_NOT_FOUND; - } - - SPGW_APP_DEBUG("Tx CREATE-SESSION-RESPONSE MME -> %s, S11 MME teid %u S11 S-GW teid %u S1U teid %u S1U addr 0x%x EPS bearer id %u status %d\n", - to_task == TASK_MME_APP ? "TASK_MME_APP" : "TASK_S11", - create_session_response_p->teid, - create_session_response_p->s11_sgw_teid.teid, - create_session_response_p->bearer_context_created.s1u_sgw_fteid.teid, - create_session_response_p->bearer_context_created.s1u_sgw_fteid.ipv4_address, - create_session_response_p->bearer_context_created.eps_bearer_id, - create_session_response_p->bearer_context_created.cause); - - MSC_LOG_TX_MESSAGE( - MSC_SP_GWAPP_MME, - (to_task == TASK_MME_APP) ? MSC_MMEAPP_MME:MSC_S11_MME, - NULL,0, - "0 SGW_CREATE_SESSION_RESPONSE S11 MME teid %u S11 S-GW teid %u S1U teid %u S1U@ 0x%x ebi %u status %d", - create_session_response_p->teid, - create_session_response_p->s11_sgw_teid.teid, - create_session_response_p->bearer_context_created.s1u_sgw_fteid.teid, - create_session_response_p->bearer_context_created.s1u_sgw_fteid.ipv4_address, - create_session_response_p->bearer_context_created.eps_bearer_id, - create_session_response_p->bearer_context_created.cause); - - return itti_send_msg_to_task(to_task, INSTANCE_DEFAULT, message_p); -} - - - -int -sgw_lite_handle_gtpv1uCreateTunnelResp( - const Gtpv1uCreateTunnelResp * const endpoint_created_pP) -{ - task_id_t to_task; - - SgwCreateSessionResponse *create_session_response_p = NULL; - s_plus_p_gw_eps_bearer_context_information_t *new_bearer_ctxt_info_p = NULL; - SGICreateEndpointReq *sgi_create_endpoint_req_p = NULL; - MessageDef *message_p = NULL; - sgw_eps_bearer_entry_t *eps_bearer_entry_p = NULL; - hashtable_rc_t hash_rc; - struct in_addr inaddr ; - struct in6_addr in6addr = IN6ADDR_ANY_INIT; - SGICreateEndpointResp sgi_create_endpoint_resp; - - unsigned int pco_in_index = 0; - unsigned int pco_out_index = 0; - signed int length_in_pco = 0; - uint16_t pi_or_ci = 0; // protocol identifier or container identifier; - uint8_t length_pi_or_ci = 0; - uint8_t length_out_pi_or_ci = 0; - - uint16_t ipcp_length = 0; - uint16_t ipcp_out_length = 0; - signed int ipcp_remaining_length = 0; - uint8_t ipcp_option = 0; - uint8_t ipcp_option_length = 0; - uint8_t ipcp_code = 0; - uint8_t ipcp_out_code = IPCP_CODE_CONFIGURE_ACK; - uint8_t ipcp_identifier = 0; - uint32_t ipcp_dns_prim_ipv4_addr = 0xFFFFFFFF; - uint32_t ipcp_dns_sec_ipv4_addr = 0xFFFFFFFF; - uint32_t ipcp_out_dns_prim_ipv4_addr = 0xFFFFFFFF; - uint32_t ipcp_out_dns_sec_ipv4_addr = 0xFFFFFFFF; - pco_flat_t *in_pco_p = NULL; - pco_flat_t out_pco ; - - uint8_t address_allocation_via_nas_signalling = FALSE; - uint8_t address_allocation_via_dhcpv4 = FALSE; - - -#if defined(ENABLE_STANDALONE_EPC) - to_task = TASK_MME_APP; -#else - to_task = TASK_S11; -#endif - - SPGW_APP_DEBUG("Rx GTPV1U_CREATE_TUNNEL_RESP, Context S-GW S11 teid %u, S-GW S1U teid %u EPS bearer id %u status %d\n", - endpoint_created_pP->context_teid, - endpoint_created_pP->S1u_teid, - endpoint_created_pP->eps_bearer_id, - endpoint_created_pP->status); - hash_rc = hashtable_get( - sgw_app.s11_bearer_context_information_hashtable, - endpoint_created_pP->context_teid, - (void**)&new_bearer_ctxt_info_p); - - if (hash_rc == HASH_TABLE_OK) { - - hash_rc = hashtable_get ( - new_bearer_ctxt_info_p->sgw_eps_bearer_context_information.pdn_connection.sgw_eps_bearers, - endpoint_created_pP->eps_bearer_id, - (void**)&eps_bearer_entry_p); - - DevAssert(hash_rc == HASH_TABLE_OK); - - SPGW_APP_DEBUG("Updated eps_bearer_entry_p eps_b_id %u with SGW S1U teid %u\n", - endpoint_created_pP->eps_bearer_id, - endpoint_created_pP->S1u_teid); - eps_bearer_entry_p->s_gw_teid_for_S1u_S12_S4_up = endpoint_created_pP->S1u_teid; - - sgw_lite_display_s11_bearer_context_information_mapping(); - - memset(&sgi_create_endpoint_resp, 0, sizeof(SGICreateEndpointResp)); - - - //-------------------------------------------------------------------------- - // PCO processing - //-------------------------------------------------------------------------- - in_pco_p = &new_bearer_ctxt_info_p->sgw_eps_bearer_context_information.saved_message.pco; - - length_in_pco = in_pco_p->byte[1]; - if ((length_in_pco+1+1) != in_pco_p->length) { - SPGW_APP_DEBUG("PCO: mismatch in lengths length_pco+1+1 %u != in_pco_p->length %u\n", - length_in_pco+1+1, in_pco_p->length); - } - sgi_create_endpoint_resp.pco.byte[0] = in_pco_p->byte[0]; - pco_out_index = 2; - - if ((length_in_pco > 0) && (in_pco_p->byte[2] & 0x80)) { - sgi_create_endpoint_resp.pco.byte[pco_out_index++] = in_pco_p->byte[2]; - - pco_in_index = PCO_MIN_LENGTH; - while (length_in_pco >= 3) { - SPGW_APP_DEBUG("PCO: Protocol identifier in length_in_pco %d\n", length_in_pco); - pi_or_ci = (((uint16_t)in_pco_p->byte[pco_in_index]) << 8) | (uint16_t)in_pco_p->byte[pco_in_index+1]; - pco_in_index += 2; - length_pi_or_ci = in_pco_p->byte[pco_in_index++]; - switch (pi_or_ci) { - case PCO_PI_LCP: - case PCO_PI_PAP: - case PCO_PI_CHAP: - pco_in_index += length_pi_or_ci; - SPGW_APP_WARN("PCO: Protocol identifier 0x%X not supported now\n", pi_or_ci); - break; - - case PCO_PI_IPCP: - ipcp_code = in_pco_p->byte[pco_in_index++]; - ipcp_identifier = in_pco_p->byte[pco_in_index++]; - ipcp_length = (((uint16_t)in_pco_p->byte[pco_in_index]) << 8) | ((uint16_t)in_pco_p->byte[pco_in_index+1]); - SPGW_APP_DEBUG("PCO: Protocol identifier IPCP (0x%x) code 0x%x identifier 0x%x length %u\n", - pi_or_ci, ipcp_code, ipcp_identifier, ipcp_length); - pco_in_index += 2; - ipcp_remaining_length = ipcp_length - 1 - 1 - 2; - ipcp_out_length = 1 + 1 + 2; - - // Protocol Id: Internet Protocol Control Protocol ... - sgi_create_endpoint_resp.pco.byte[pco_out_index++] = (uint8_t)(pi_or_ci >> 8); - sgi_create_endpoint_resp.pco.byte[pco_out_index++] = (uint8_t)(pi_or_ci & 0x00FF); - - while (ipcp_remaining_length >= 2) { - ipcp_option = in_pco_p->byte[pco_in_index]; - ipcp_option_length = in_pco_p->byte[pco_in_index+1]; - ipcp_remaining_length = ipcp_remaining_length - ipcp_option_length; - SPGW_APP_DEBUG("PCO: Protocol identifier IPCP ipcp_option %u ipcp_option_length %u ipcp_remaining_length %u pco_in_index %u\n", - ipcp_option, ipcp_option_length, ipcp_remaining_length, pco_in_index); - - switch (ipcp_option) { - case IPCP_OPTION_PRIMARY_DNS_SERVER_IP_ADDRESS: - SPGW_APP_DEBUG("PCO: Protocol identifier IPCP option PRIMARY_DNS_SERVER_IP_ADDRESS length %u\n", ipcp_option_length); - if (ipcp_option_length >= 6) { - ipcp_dns_prim_ipv4_addr = (((uint32_t)in_pco_p->byte[pco_in_index+2]) << 24 ) | - (((uint32_t)in_pco_p->byte[pco_in_index+3]) << 16 ) | - (((uint32_t)in_pco_p->byte[pco_in_index+4]) << 8 ) | - (((uint32_t)in_pco_p->byte[pco_in_index+5]) ); - - SPGW_APP_DEBUG("PCO: Protocol identifier IPCP option SECONDARY_DNS_SERVER_IP_ADDRESS ipcp_dns_prim_ipv4_addr 0x%x\n", ipcp_dns_prim_ipv4_addr); - if ((ipcp_dns_prim_ipv4_addr == 0) || - (spgw_config.pgw_config.ipv4.default_dns_v4 != ipcp_dns_prim_ipv4_addr)){ - ipcp_out_code = IPCP_CODE_CONFIGURE_NACK; - ipcp_out_dns_prim_ipv4_addr = spgw_config.pgw_config.ipv4.default_dns_v4; - } else { - ipcp_out_dns_prim_ipv4_addr = ipcp_dns_prim_ipv4_addr; - } - SPGW_APP_DEBUG("PCO: Protocol identifier IPCP option SECONDARY_DNS_SERVER_IP_ADDRESS ipcp_out_dns_prim_ipv4_addr 0x%x\n", ipcp_out_dns_prim_ipv4_addr); - } else { - ipcp_out_code = IPCP_CODE_CONFIGURE_NACK;// not sure - } - ipcp_out_length += 6; - break; - case IPCP_OPTION_SECONDARY_DNS_SERVER_IP_ADDRESS: - SPGW_APP_DEBUG("PCO: Protocol identifier IPCP option SECONDARY_DNS_SERVER_IP_ADDRESS length %u\n", ipcp_option_length); - if (ipcp_option_length >= 6) { - ipcp_dns_sec_ipv4_addr = (((uint32_t)in_pco_p->byte[pco_in_index+2]) << 24 ) | - (((uint32_t)in_pco_p->byte[pco_in_index+3]) << 16 ) | - (((uint32_t)in_pco_p->byte[pco_in_index+4]) << 8 ) | - (((uint32_t)in_pco_p->byte[pco_in_index+5]) ); - SPGW_APP_DEBUG("PCO: Protocol identifier IPCP option SECONDARY_DNS_SERVER_IP_ADDRESS ipcp_dns_sec_ipv4_addr 0x%x\n", ipcp_dns_sec_ipv4_addr); - if ((ipcp_dns_prim_ipv4_addr == 0) || - (spgw_config.pgw_config.ipv4.default_dns_sec_v4 != ipcp_dns_sec_ipv4_addr)){ - ipcp_out_code = IPCP_CODE_CONFIGURE_NACK; - ipcp_out_dns_sec_ipv4_addr = spgw_config.pgw_config.ipv4.default_dns_sec_v4; - } else { - ipcp_out_dns_sec_ipv4_addr = ipcp_dns_sec_ipv4_addr; - } - SPGW_APP_DEBUG("PCO: Protocol identifier IPCP option SECONDARY_DNS_SERVER_IP_ADDRESS ipcp_out_dns_sec_ipv4_addr 0x%x\n", ipcp_out_dns_sec_ipv4_addr); - } else { - ipcp_out_code = IPCP_CODE_CONFIGURE_NACK; // not sure - } - ipcp_out_length += 6; - break; - default: - SPGW_APP_WARN("PCO: Protocol identifier IPCP option 0x%04X unknown\n", ipcp_option); - } - pco_in_index += ipcp_option_length; - } - // ... continuing Protocol Id: Internet Protocol Control Protocol - sgi_create_endpoint_resp.pco.byte[pco_out_index++] = ipcp_out_length; // option length - - break; - - case PCO_CI_P_CSCF_IPV6_ADDRESS_REQUEST: - case PCO_CI_DNS_SERVER_IPV6_ADDRESS_REQUEST: - case PCO_CI_MS_SUPPORT_OF_NETWORK_REQUESTED_BEARER_CONTROL_INDICATOR: - case PCO_CI_DSMIPV6_HOME_AGENT_ADDRESS_REQUEST: - case PCO_CI_DSMIPV6_HOME_NETWORK_PREFIX_REQUEST: - case PCO_CI_DSMIPV6_IPV4_HOME_AGENT_ADDRESS_REQUEST: - case PCO_CI_P_CSCF_IPV4_ADDRESS_REQUEST: - case PCO_CI_MSISDN_REQUEST: - case PCO_CI_IFOM_SUPPORT_REQUEST: - pco_in_index += length_pi_or_ci; - SPGW_APP_WARN("PCO: Container identifier 0x%X not supported now\n", pi_or_ci); - break; - - case PCO_CI_DNS_SERVER_IPV4_ADDRESS_REQUEST: - // PPP IP Control Protocol - sgi_create_endpoint_resp.pco.byte[pco_out_index++] = ipcp_out_code; - sgi_create_endpoint_resp.pco.byte[pco_out_index++] = ipcp_identifier; - sgi_create_endpoint_resp.pco.byte[pco_out_index++] = (uint8_t)(ipcp_out_length >> 8); - sgi_create_endpoint_resp.pco.byte[pco_out_index++] = (uint8_t)(ipcp_out_length & 0x00FF); - - if (ipcp_out_dns_prim_ipv4_addr != 0xFFFFFFFF) { - sgi_create_endpoint_resp.pco.byte[pco_out_index++] = IPCP_OPTION_PRIMARY_DNS_SERVER_IP_ADDRESS; - sgi_create_endpoint_resp.pco.byte[pco_out_index++] = 6; - sgi_create_endpoint_resp.pco.byte[pco_out_index++] = (uint8_t)(ipcp_out_dns_prim_ipv4_addr & 0x000000FF); - sgi_create_endpoint_resp.pco.byte[pco_out_index++] = (uint8_t)((ipcp_out_dns_prim_ipv4_addr >> 8 ) & 0x000000FF); - sgi_create_endpoint_resp.pco.byte[pco_out_index++] = (uint8_t)((ipcp_out_dns_prim_ipv4_addr >> 16 ) & 0x000000FF); - sgi_create_endpoint_resp.pco.byte[pco_out_index++] = (uint8_t)((ipcp_out_dns_prim_ipv4_addr >> 24 ) & 0x000000FF); - } - if (ipcp_out_dns_sec_ipv4_addr != 0xFFFFFFFF) { - sgi_create_endpoint_resp.pco.byte[pco_out_index++] = IPCP_OPTION_SECONDARY_DNS_SERVER_IP_ADDRESS; - sgi_create_endpoint_resp.pco.byte[pco_out_index++] = 6; - sgi_create_endpoint_resp.pco.byte[pco_out_index++] = (uint8_t)(ipcp_out_dns_sec_ipv4_addr & 0x000000FF); - sgi_create_endpoint_resp.pco.byte[pco_out_index++] = (uint8_t)((ipcp_out_dns_sec_ipv4_addr >> 8 ) & 0x000000FF); - sgi_create_endpoint_resp.pco.byte[pco_out_index++] = (uint8_t)((ipcp_out_dns_sec_ipv4_addr >> 16 ) & 0x000000FF); - sgi_create_endpoint_resp.pco.byte[pco_out_index++] = (uint8_t)((ipcp_out_dns_sec_ipv4_addr >> 24 ) & 0x000000FF); - } - break; - - case PCO_CI_IP_ADDRESS_ALLOCATION_VIA_NAS_SIGNALLING: - address_allocation_via_nas_signalling = TRUE; - break; - - case PCO_CI_IPV4_ADDRESS_ALLOCATION_VIA_DHCPV4: - address_allocation_via_dhcpv4 = TRUE; - break; - - case PCO_CI_IPV4_LINK_MTU_REQUEST: - SPGW_APP_WARN("PCO: Container identifier IPV4_LINK_MTU_REQUEST TODO\n"); - break; - } - length_in_pco = length_in_pco - (length_pi_or_ci + 2 + 1); - SPGW_APP_DEBUG("PCO: Protocol identifier out length_in_pco %d\n", length_in_pco); - } // while (length_in_pco >= 3) { - } // if ((length_in_pco > 0) && (in_pco_p->byte[2] & 0x80)) { - sgi_create_endpoint_resp.pco.length = pco_out_index; - sgi_create_endpoint_resp.pco.byte[1] = pco_out_index - 2; - //-------------------------------------------------------------------------- - - - // IP forward will forward packets to this teid - sgi_create_endpoint_resp.context_teid = endpoint_created_pP->context_teid; - sgi_create_endpoint_resp.sgw_S1u_teid = endpoint_created_pP->S1u_teid; - sgi_create_endpoint_resp.eps_bearer_id = endpoint_created_pP->eps_bearer_id; - - // TO DO NOW - sgi_create_endpoint_resp.paa.pdn_type = new_bearer_ctxt_info_p->sgw_eps_bearer_context_information.saved_message.pdn_type; - - switch (sgi_create_endpoint_resp.paa.pdn_type) { - case IPv4_OR_v6: - if (pgw_lite_get_free_ipv4_paa_address(&inaddr) == 0) { - IN_ADDR_TO_BUFFER(inaddr, sgi_create_endpoint_resp.paa.ipv4_address); - } else { - SPGW_APP_WARN("Failed to allocate IPv4 PAA for PDN type IPv4_OR_v6\n"); - - if (pgw_lite_get_free_ipv6_paa_prefix(&in6addr) == 0) { - IN6_ADDR_TO_BUFFER(in6addr, sgi_create_endpoint_resp.paa.ipv6_address); - } else { - SPGW_APP_ERROR("Failed to allocate IPv6 PAA for PDN type IPv4_OR_v6\n"); - } - } - - break; - - case IPv4: - if (address_allocation_via_nas_signalling == TRUE) { - if (pgw_lite_get_free_ipv4_paa_address(&inaddr) == 0) { - IN_ADDR_TO_BUFFER(inaddr, sgi_create_endpoint_resp.paa.ipv4_address); - } else { - SPGW_APP_ERROR("Failed to allocate IPv4 PAA for PDN type IPv4\n"); - } - } /*else { - // TODO - }*/ - - break; - - case IPv6: - if (pgw_lite_get_free_ipv6_paa_prefix(&in6addr) == 0) { - IN6_ADDR_TO_BUFFER(in6addr, sgi_create_endpoint_resp.paa.ipv6_address); - } else { - SPGW_APP_ERROR("Failed to allocate IPv6 PAA for PDN type IPv6\n"); - } - - break; - - case IPv4_AND_v6: - if (pgw_lite_get_free_ipv4_paa_address(&inaddr) == 0) { - IN_ADDR_TO_BUFFER(inaddr, sgi_create_endpoint_resp.paa.ipv4_address); - } else { - SPGW_APP_ERROR("Failed to allocate IPv4 PAA for PDN type IPv4_AND_v6\n"); - } - - if (pgw_lite_get_free_ipv6_paa_prefix(&in6addr) == 0) { - IN6_ADDR_TO_BUFFER(in6addr, sgi_create_endpoint_resp.paa.ipv6_address); - } else { - SPGW_APP_ERROR("Failed to allocate IPv6 PAA for PDN type IPv4_AND_v6\n"); - } - - break; - - default: - AssertFatal(0,"BAD paa.pdn_type %d", sgi_create_endpoint_resp.paa.pdn_type); - break; - } - - sgi_create_endpoint_resp.status = SGI_STATUS_OK; - sgw_lite_handle_sgi_endpoint_created(&sgi_create_endpoint_resp); - } else { // if (hash_rc == HASH_TABLE_OK) { - SPGW_APP_DEBUG("Rx SGW_S1U_ENDPOINT_CREATED, Context: teid %u NOT FOUND\n", endpoint_created_pP->context_teid); - message_p = itti_alloc_new_message(TASK_SPGW_APP, SGW_CREATE_SESSION_RESPONSE); - - if (message_p == NULL) { - return -1; - } - - create_session_response_p = &message_p->ittiMsg.sgwCreateSessionResponse; - memset(create_session_response_p, 0, sizeof(SgwCreateSessionResponse)); - create_session_response_p->cause = CONTEXT_NOT_FOUND; - create_session_response_p->bearer_context_created.cause = CONTEXT_NOT_FOUND; - - - MSC_LOG_TX_MESSAGE( - MSC_SP_GWAPP_MME, - (to_task == TASK_MME_APP) ? MSC_MMEAPP_MME:MSC_S11_MME, - NULL,0, - "0 SGW_CREATE_SESSION_RESPONSE teid %u CONTEXT_NOT_FOUND", endpoint_created_pP->context_teid); - return itti_send_msg_to_task(to_task, INSTANCE_DEFAULT, message_p); - } -} - - - -int -sgw_lite_handle_gtpv1uUpdateTunnelResp( - const Gtpv1uUpdateTunnelResp * const endpoint_updated_pP) -{ - SgwModifyBearerResponse *modify_response_p = NULL; - SGIUpdateEndpointReq *update_request_p = NULL; - s_plus_p_gw_eps_bearer_context_information_t *new_bearer_ctxt_info_p = NULL; - MessageDef *message_p = NULL; - sgw_eps_bearer_entry_t *eps_bearer_entry_p = NULL; - hashtable_rc_t hash_rc; - task_id_t to_task; - -#if defined(ENABLE_STANDALONE_EPC) - to_task = TASK_MME_APP; -#else - to_task = TASK_S11; -#endif - - SPGW_APP_DEBUG("Rx GTPV1U_UPDATE_TUNNEL_RESP, Context teid %u, SGW S1U teid %u, eNB S1U teid %u, EPS bearer id %u, status %d\n", - endpoint_updated_pP->context_teid, - endpoint_updated_pP->sgw_S1u_teid, - endpoint_updated_pP->enb_S1u_teid, - endpoint_updated_pP->eps_bearer_id, - endpoint_updated_pP->status); - - - hash_rc = hashtable_get(sgw_app.s11_bearer_context_information_hashtable, endpoint_updated_pP->context_teid, (void**)&new_bearer_ctxt_info_p); - - if (hash_rc == HASH_TABLE_OK) { - hash_rc = hashtable_get (new_bearer_ctxt_info_p->sgw_eps_bearer_context_information.pdn_connection.sgw_eps_bearers, endpoint_updated_pP->eps_bearer_id, (void**)&eps_bearer_entry_p); - - if ((hash_rc == HASH_TABLE_KEY_NOT_EXISTS) || (hash_rc == HASH_TABLE_BAD_PARAMETER_HASHTABLE)) { - SPGW_APP_DEBUG("Sending SGW_MODIFY_BEARER_RESPONSE trxn %p bearer %u CONTEXT_NOT_FOUND (sgw_eps_bearers)\n", - new_bearer_ctxt_info_p->sgw_eps_bearer_context_information.trxn, - endpoint_updated_pP->eps_bearer_id); - - message_p = itti_alloc_new_message(TASK_SPGW_APP, SGW_MODIFY_BEARER_RESPONSE); - - if (message_p == NULL) { - return -1; - } - - modify_response_p = &message_p->ittiMsg.sgwModifyBearerResponse; - memset(modify_response_p, 0, sizeof(SgwModifyBearerResponse)); - modify_response_p->bearer_present = MODIFY_BEARER_RESPONSE_REM; - modify_response_p->bearer_choice.bearer_for_removal.eps_bearer_id = endpoint_updated_pP->eps_bearer_id; - modify_response_p->bearer_choice.bearer_for_removal.cause = CONTEXT_NOT_FOUND; - modify_response_p->cause = CONTEXT_NOT_FOUND; - modify_response_p->trxn = new_bearer_ctxt_info_p->sgw_eps_bearer_context_information.trxn; - - return itti_send_msg_to_task(to_task, INSTANCE_DEFAULT, message_p); - } else if (hash_rc == HASH_TABLE_OK) { - - message_p = itti_alloc_new_message(TASK_SPGW_APP, SGI_UPDATE_ENDPOINT_REQUEST); - - if (message_p == NULL) { - return -1; - } - - update_request_p = &message_p->ittiMsg.sgiUpdateEndpointReq; - memset(update_request_p, 0, sizeof(SGIUpdateEndpointReq)); - update_request_p->context_teid = endpoint_updated_pP->context_teid; - update_request_p->sgw_S1u_teid = endpoint_updated_pP->sgw_S1u_teid; - update_request_p->enb_S1u_teid = endpoint_updated_pP->enb_S1u_teid; - update_request_p->eps_bearer_id = endpoint_updated_pP->eps_bearer_id; - - return itti_send_msg_to_task(TASK_FW_IP, INSTANCE_DEFAULT, message_p); - } - } else { - SPGW_APP_DEBUG("Sending SGW_MODIFY_BEARER_RESPONSE trxn %p bearer %u CONTEXT_NOT_FOUND (s11_bearer_context_information_hashtable)\n", - new_bearer_ctxt_info_p->sgw_eps_bearer_context_information.trxn, - endpoint_updated_pP->eps_bearer_id); - - message_p = itti_alloc_new_message(TASK_SPGW_APP, SGW_MODIFY_BEARER_RESPONSE); - - if (message_p == NULL) { - return -1; - } - - modify_response_p = &message_p->ittiMsg.sgwModifyBearerResponse; - memset(modify_response_p, 0, sizeof(SgwModifyBearerResponse)); - - modify_response_p->bearer_present = MODIFY_BEARER_RESPONSE_REM; - modify_response_p->bearer_choice.bearer_for_removal.eps_bearer_id = endpoint_updated_pP->eps_bearer_id; - modify_response_p->bearer_choice.bearer_for_removal.cause = CONTEXT_NOT_FOUND; - modify_response_p->cause = CONTEXT_NOT_FOUND; - modify_response_p->trxn = new_bearer_ctxt_info_p->sgw_eps_bearer_context_information.trxn; - - MSC_LOG_TX_MESSAGE( - MSC_SP_GWAPP_MME, - (to_task == TASK_MME_APP) ? MSC_MMEAPP_MME:MSC_S11_MME, - NULL,0, - "0 SGW_MODIFY_BEARER_RESPONSE ebi %u CONTEXT_NOT_FOUND trxn %u", - modify_response_p->bearer_choice.bearer_for_removal.eps_bearer_id, - modify_response_p->trxn); - - return itti_send_msg_to_task(to_task, INSTANCE_DEFAULT, message_p); - } - - return -1; -} - - - -int -sgw_lite_handle_sgi_endpoint_updated( - const SGIUpdateEndpointResp * const resp_pP) -{ - SgwModifyBearerResponse *modify_response_p = NULL; - s_plus_p_gw_eps_bearer_context_information_t *new_bearer_ctxt_info_p = NULL; - MessageDef *message_p = NULL; - sgw_eps_bearer_entry_t *eps_bearer_entry_p = NULL; - hashtable_rc_t hash_rc; - task_id_t to_task; - static uint8_t iptable_uplink_remove_gtpu = FALSE; - char cmd[256]; - int ret; - -#if defined(ENABLE_STANDALONE_EPC) - to_task = TASK_MME_APP; -#else - to_task = TASK_S11; -#endif - - SPGW_APP_DEBUG("Rx SGI_UPDATE_ENDPOINT_RESPONSE, Context teid %u, SGW S1U teid %u, eNB S1U teid %u, EPS bearer id %u, status %d\n", - resp_pP->context_teid, - resp_pP->sgw_S1u_teid, - resp_pP->enb_S1u_teid, - resp_pP->eps_bearer_id, - resp_pP->status); - - message_p = itti_alloc_new_message(TASK_SPGW_APP, SGW_MODIFY_BEARER_RESPONSE); - - if (message_p == NULL) { - return -1; - } - - modify_response_p = &message_p->ittiMsg.sgwModifyBearerResponse; - memset(modify_response_p, 0, sizeof(SgwModifyBearerResponse)); - - hash_rc = hashtable_get(sgw_app.s11_bearer_context_information_hashtable, - resp_pP->context_teid, - (void**)&new_bearer_ctxt_info_p); - - - if (hash_rc == HASH_TABLE_OK) { - hash_rc = hashtable_get (new_bearer_ctxt_info_p->sgw_eps_bearer_context_information.pdn_connection.sgw_eps_bearers, - resp_pP->eps_bearer_id, - (void**)&eps_bearer_entry_p); - - if ((hash_rc == HASH_TABLE_KEY_NOT_EXISTS) || (hash_rc == HASH_TABLE_BAD_PARAMETER_HASHTABLE)) { - SPGW_APP_DEBUG("Rx SGI_UPDATE_ENDPOINT_RESPONSE: CONTEXT_NOT_FOUND (pdn_connection.sgw_eps_bearers context)\n"); - modify_response_p->teid = resp_pP->context_teid; // TO BE CHECKED IF IT IS THIS TEID - modify_response_p->bearer_present = MODIFY_BEARER_RESPONSE_REM; - modify_response_p->bearer_choice.bearer_for_removal.eps_bearer_id = resp_pP->eps_bearer_id; - modify_response_p->bearer_choice.bearer_for_removal.cause = CONTEXT_NOT_FOUND; - modify_response_p->cause = CONTEXT_NOT_FOUND; - modify_response_p->trxn = 0; - - MSC_LOG_TX_MESSAGE( - MSC_SP_GWAPP_MME, - (to_task == TASK_MME_APP) ? MSC_MMEAPP_MME:MSC_S11_MME, - NULL,0, - "0 SGW_MODIFY_BEARER_RESPONSE ebi %u CONTEXT_NOT_FOUND trxn %u", - modify_response_p->bearer_choice.bearer_for_removal.eps_bearer_id, - modify_response_p->trxn); - - return itti_send_msg_to_task(to_task, INSTANCE_DEFAULT, message_p); - } else if (hash_rc == HASH_TABLE_OK) { - SPGW_APP_DEBUG("Rx SGI_UPDATE_ENDPOINT_RESPONSE: REQUEST_ACCEPTED\n"); - - // accept anyway - modify_response_p->teid = resp_pP->context_teid; // TO BE CHECKED IF IT IS THIS TEID - modify_response_p->bearer_present = MODIFY_BEARER_RESPONSE_MOD; - modify_response_p->bearer_choice.bearer_contexts_modified.eps_bearer_id = resp_pP->eps_bearer_id; - modify_response_p->bearer_choice.bearer_contexts_modified.cause = REQUEST_ACCEPTED; - modify_response_p->cause = REQUEST_ACCEPTED; - modify_response_p->trxn = new_bearer_ctxt_info_p->sgw_eps_bearer_context_information.trxn; - // if default bearer -#warning "TODO define constant for default eps_bearer id" - - //if ((resp_pP->eps_bearer_id == 5) && (spgw_config.pgw_config.pgw_masquerade_SGI == 0)) { - if (resp_pP->eps_bearer_id == 5) { - ret = snprintf(cmd, - 256, // mangle -I - "iptables -t mangle -A %s -d %u.%u.%u.%u -m mark --mark 0 -j GTPUSP --own-ip %u.%u.%u.%u --own-tun %u --peer-ip %u.%u.%u.%u --peer-tun %u --action add", - (spgw_config.sgw_config.local_to_eNB) ? "FORWARD":"FORWARD", // test - eps_bearer_entry_p->paa.ipv4_address[0], - eps_bearer_entry_p->paa.ipv4_address[1], - eps_bearer_entry_p->paa.ipv4_address[2], - eps_bearer_entry_p->paa.ipv4_address[3], - sgw_app.sgw_ip_address_for_S1u_S12_S4_up & 0x000000FF, - (sgw_app.sgw_ip_address_for_S1u_S12_S4_up & 0x0000FF00) >> 8, - (sgw_app.sgw_ip_address_for_S1u_S12_S4_up & 0x00FF0000) >> 16, - (sgw_app.sgw_ip_address_for_S1u_S12_S4_up & 0xFF000000) >> 24, - eps_bearer_entry_p->s_gw_teid_for_S1u_S12_S4_up, - eps_bearer_entry_p->enb_ip_address_for_S1u.address.ipv4_address[0], - eps_bearer_entry_p->enb_ip_address_for_S1u.address.ipv4_address[1], - eps_bearer_entry_p->enb_ip_address_for_S1u.address.ipv4_address[2], - eps_bearer_entry_p->enb_ip_address_for_S1u.address.ipv4_address[3], - eps_bearer_entry_p->enb_teid_for_S1u - ); - - if ((ret < 0) || (ret > 256)) { - SPGW_APP_ERROR("ERROR in preparing default downlink tunnel, tune string length\n"); - exit (-1); - } - //use API when prototype validated - ret = spgw_system(cmd, SPGW_ABORT_ON_ERROR, __FILE__, __LINE__); - if (ret < 0) { - SPGW_APP_ERROR("ERROR in setting up default downlink TUNNEL\n"); - } - } - //------------------------- - ret = snprintf(cmd, - 256, - "iptables -t mangle -I %s -d %u.%u.%u.%u -m mark --mark %u -j GTPUSP --own-ip %u.%u.%u.%u --own-tun %u --peer-ip %u.%u.%u.%u --peer-tun %u --action add", - (spgw_config.sgw_config.local_to_eNB) ? "FORWARD":"FORWARD", // test - eps_bearer_entry_p->paa.ipv4_address[0], - eps_bearer_entry_p->paa.ipv4_address[1], - eps_bearer_entry_p->paa.ipv4_address[2], - eps_bearer_entry_p->paa.ipv4_address[3], - eps_bearer_entry_p->s_gw_teid_for_S1u_S12_S4_up, - sgw_app.sgw_ip_address_for_S1u_S12_S4_up & 0x000000FF, - (sgw_app.sgw_ip_address_for_S1u_S12_S4_up & 0x0000FF00) >> 8, - (sgw_app.sgw_ip_address_for_S1u_S12_S4_up & 0x00FF0000) >> 16, - (sgw_app.sgw_ip_address_for_S1u_S12_S4_up & 0xFF000000) >> 24, - eps_bearer_entry_p->s_gw_teid_for_S1u_S12_S4_up, - eps_bearer_entry_p->enb_ip_address_for_S1u.address.ipv4_address[0], - eps_bearer_entry_p->enb_ip_address_for_S1u.address.ipv4_address[1], - eps_bearer_entry_p->enb_ip_address_for_S1u.address.ipv4_address[2], - eps_bearer_entry_p->enb_ip_address_for_S1u.address.ipv4_address[3], - eps_bearer_entry_p->enb_teid_for_S1u - ); - - if ((ret < 0) || (ret > 256)) { - SPGW_APP_ERROR("ERROR in preparing downlink tunnel, tune string length\n"); - exit (-1); - } - - //use API when prototype validated - ret = spgw_system(cmd, SPGW_ABORT_ON_ERROR, __FILE__, __LINE__); - - if (ret < 0) { - SPGW_APP_ERROR("ERROR in setting up downlink TUNNEL\n"); - } - - } - MSC_LOG_TX_MESSAGE( - MSC_SP_GWAPP_MME, - (to_task == TASK_MME_APP) ? MSC_MMEAPP_MME:MSC_S11_MME, - NULL,0, - "0 SGW_MODIFY_BEARER_RESPONSE ebi %u trxn %u", - modify_response_p->bearer_choice.bearer_contexts_modified.eps_bearer_id, - modify_response_p->trxn); - - return itti_send_msg_to_task(to_task, INSTANCE_DEFAULT, message_p); - } else { - SPGW_APP_DEBUG("Rx SGI_UPDATE_ENDPOINT_RESPONSE: CONTEXT_NOT_FOUND (S11 context)\n"); - - modify_response_p->teid = resp_pP->context_teid; // TO BE CHECKED IF IT IS THIS TEID - modify_response_p->bearer_present = MODIFY_BEARER_RESPONSE_REM; - modify_response_p->bearer_choice.bearer_for_removal.eps_bearer_id = resp_pP->eps_bearer_id; - modify_response_p->bearer_choice.bearer_for_removal.cause = CONTEXT_NOT_FOUND; - modify_response_p->cause = CONTEXT_NOT_FOUND; - modify_response_p->trxn = 0; - - MSC_LOG_TX_MESSAGE( - MSC_SP_GWAPP_MME, - (to_task == TASK_MME_APP) ? MSC_MMEAPP_MME:MSC_S11_MME, - NULL,0, - "0 SGW_MODIFY_BEARER_RESPONSE ebi %u CONTEXT_NOT_FOUND trxn %u", - modify_response_p->bearer_choice.bearer_contexts_modified.eps_bearer_id, - modify_response_p->trxn); - return itti_send_msg_to_task(to_task, INSTANCE_DEFAULT, message_p); - } -} - - - -int -sgw_lite_handle_modify_bearer_request( - const SgwModifyBearerRequest * const modify_bearer_pP) -{ - SgwModifyBearerResponse *modify_response_p = NULL; - Gtpv1uUpdateTunnelReq *gtpv1u_update_tunnel_req_p = NULL; - s_plus_p_gw_eps_bearer_context_information_t *new_bearer_ctxt_info_p = NULL; - MessageDef *message_p = NULL; - sgw_eps_bearer_entry_t *eps_bearer_entry_p = NULL; - hashtable_rc_t hash_rc; - task_id_t to_task; - -#if defined(ENABLE_STANDALONE_EPC) - to_task = TASK_MME_APP; -#else - to_task = TASK_S11; -#endif - - SPGW_APP_DEBUG("Rx MODIFY_BEARER_REQUEST, teid %u, EPS bearer id %u\n", - modify_bearer_pP->teid, - modify_bearer_pP->bearer_context_to_modify.eps_bearer_id); - - sgw_lite_display_s11teid2mme_mappings(); - sgw_lite_display_s11_bearer_context_information_mapping(); - - hash_rc = hashtable_get( - sgw_app.s11_bearer_context_information_hashtable, - modify_bearer_pP->teid, - (void**)&new_bearer_ctxt_info_p); - - if (hash_rc == HASH_TABLE_OK) { - - new_bearer_ctxt_info_p->sgw_eps_bearer_context_information.pdn_connection.default_bearer = modify_bearer_pP->bearer_context_to_modify.eps_bearer_id; - new_bearer_ctxt_info_p->sgw_eps_bearer_context_information.trxn = modify_bearer_pP->trxn; - - hash_rc = hashtable_is_key_exists ( - new_bearer_ctxt_info_p->sgw_eps_bearer_context_information.pdn_connection.sgw_eps_bearers, - modify_bearer_pP->bearer_context_to_modify.eps_bearer_id); - - if (hash_rc == HASH_TABLE_KEY_NOT_EXISTS) { - message_p = itti_alloc_new_message(TASK_SPGW_APP, SGW_MODIFY_BEARER_RESPONSE); - - if (message_p == NULL) { - return -1; - } - - modify_response_p = &message_p->ittiMsg.sgwModifyBearerResponse; - memset(modify_response_p, 0, sizeof(SgwModifyBearerResponse)); - modify_response_p->bearer_present = MODIFY_BEARER_RESPONSE_REM; - modify_response_p->bearer_choice.bearer_for_removal.eps_bearer_id = modify_bearer_pP->bearer_context_to_modify.eps_bearer_id; - modify_response_p->bearer_choice.bearer_for_removal.cause = CONTEXT_NOT_FOUND; - modify_response_p->cause = CONTEXT_NOT_FOUND; - modify_response_p->trxn = modify_bearer_pP->trxn; - SPGW_APP_DEBUG("Rx MODIFY_BEARER_REQUEST, eps_bearer_id %u CONTEXT_NOT_FOUND\n", - modify_bearer_pP->bearer_context_to_modify.eps_bearer_id); - - MSC_LOG_TX_MESSAGE( - MSC_SP_GWAPP_MME, - (to_task == TASK_MME_APP) ? MSC_MMEAPP_MME:MSC_S11_MME, - NULL,0, - "0 SGW_MODIFY_BEARER_RESPONSE ebi %u CONTEXT_NOT_FOUND trxn %u", - modify_response_p->bearer_choice.bearer_for_removal.eps_bearer_id, - modify_response_p->trxn); - - return itti_send_msg_to_task(to_task, INSTANCE_DEFAULT, message_p); - } else if (hash_rc == HASH_TABLE_OK) { - // TO DO - hash_rc = hashtable_get ( - new_bearer_ctxt_info_p->sgw_eps_bearer_context_information.pdn_connection.sgw_eps_bearers, - modify_bearer_pP->bearer_context_to_modify.eps_bearer_id, - (void**)&eps_bearer_entry_p); - - FTEID_T_2_IP_ADDRESS_T( (&modify_bearer_pP->bearer_context_to_modify.s1_eNB_fteid) , (&eps_bearer_entry_p->enb_ip_address_for_S1u) ); - eps_bearer_entry_p->enb_teid_for_S1u = modify_bearer_pP->bearer_context_to_modify.s1_eNB_fteid.teid; - - { - SGIUpdateEndpointResp sgi_update_end_point_resp; - sgi_update_end_point_resp.context_teid = modify_bearer_pP->teid; - sgi_update_end_point_resp.sgw_S1u_teid = eps_bearer_entry_p->s_gw_teid_for_S1u_S12_S4_up; - sgi_update_end_point_resp.enb_S1u_teid = eps_bearer_entry_p->enb_teid_for_S1u; - sgi_update_end_point_resp.eps_bearer_id = eps_bearer_entry_p->eps_bearer_id; - sgi_update_end_point_resp.status = 0x00; - sgw_lite_handle_sgi_endpoint_updated(&sgi_update_end_point_resp); - } - } - } else { - message_p = itti_alloc_new_message(TASK_SPGW_APP, SGW_MODIFY_BEARER_RESPONSE); - - if (message_p == NULL) { - return -1; - } - - modify_response_p = &message_p->ittiMsg.sgwModifyBearerResponse; - - modify_response_p->bearer_present = MODIFY_BEARER_RESPONSE_REM; - modify_response_p->bearer_choice.bearer_for_removal.eps_bearer_id = modify_bearer_pP->bearer_context_to_modify.eps_bearer_id; - modify_response_p->bearer_choice.bearer_for_removal.cause = CONTEXT_NOT_FOUND; - modify_response_p->cause = CONTEXT_NOT_FOUND; - modify_response_p->trxn = modify_bearer_pP->trxn; - - SPGW_APP_DEBUG("Rx MODIFY_BEARER_REQUEST, teid %u CONTEXT_NOT_FOUND\n", - modify_bearer_pP->teid); - return itti_send_msg_to_task(to_task, INSTANCE_DEFAULT, message_p); - } - - return -1; -} - - - -int -sgw_lite_handle_delete_session_request( - const SgwDeleteSessionRequest * const delete_session_req_pP) -{ - task_id_t to_task; - hashtable_rc_t hash_rc; - - SgwDeleteSessionResponse *delete_session_resp_p = NULL; - MessageDef *message_p = NULL; - s_plus_p_gw_eps_bearer_context_information_t *ctx_p = NULL; - -#if defined(ENABLE_STANDALONE_EPC) - to_task = TASK_MME_APP; -#else - to_task = TASK_S11; -#endif - - message_p = itti_alloc_new_message(TASK_SPGW_APP, SGW_DELETE_SESSION_RESPONSE); - - if (message_p == NULL) { - return -1; - } - - delete_session_resp_p = &message_p->ittiMsg.sgwDeleteSessionResponse; - - SPGW_APP_WARN("Delete session handler needs to be completed...\n"); - - if (delete_session_req_pP->indication_flags & OI_FLAG) { - SPGW_APP_DEBUG("OI flag is set for this message indicating the request" - "should be forwarded to P-GW entity\n"); - } - - hash_rc = hashtable_get(sgw_app.s11_bearer_context_information_hashtable, - delete_session_req_pP->teid, - (void**)&ctx_p); - - if (hash_rc == HASH_TABLE_OK) { - if ((delete_session_req_pP->sender_fteid_for_cp.ipv4 != 0) && - (delete_session_req_pP->sender_fteid_for_cp.ipv6 != 0)) { - /* Sender F-TEID IE present */ - if (delete_session_resp_p->teid != ctx_p->sgw_eps_bearer_context_information.mme_teid_for_S11) { - delete_session_resp_p->teid = ctx_p->sgw_eps_bearer_context_information.mme_teid_for_S11; - delete_session_resp_p->cause = INVALID_PEER; - SPGW_APP_DEBUG("Mismatch in MME Teid for CP\n"); - } else { - delete_session_resp_p->teid = delete_session_req_pP->sender_fteid_for_cp.teid; - } - } else { - delete_session_resp_p->cause = REQUEST_ACCEPTED; - delete_session_resp_p->teid = ctx_p->sgw_eps_bearer_context_information.mme_teid_for_S11; - } - - delete_session_resp_p->trxn = delete_session_req_pP->trxn; - delete_session_resp_p->peer_ip = delete_session_req_pP->peer_ip; - - MSC_LOG_TX_MESSAGE( - MSC_SP_GWAPP_MME, - (to_task == TASK_MME_APP) ? MSC_MMEAPP_MME:MSC_S11_MME, - NULL,0, - "0 SGW_DELETE_SESSION_RESPONSE teid %u cause %u trxn %u", - delete_session_resp_p->teid, - delete_session_resp_p->cause, - delete_session_resp_p->trxn); - - - return itti_send_msg_to_task(to_task, INSTANCE_DEFAULT, message_p); - } else { - /* Context not found... set the cause to CONTEXT_NOT_FOUND - * 3GPP TS 29.274 #7.2.10.1 - */ - message_p = itti_alloc_new_message(TASK_SPGW_APP, SGW_DELETE_SESSION_RESPONSE); - - if (message_p == NULL) { - return -1; - } - - delete_session_resp_p = &message_p->ittiMsg.sgwDeleteSessionResponse; - - if ((delete_session_req_pP->sender_fteid_for_cp.ipv4 == 0) && - (delete_session_req_pP->sender_fteid_for_cp.ipv6 == 0)) { - delete_session_resp_p->teid = 0; - } else { - delete_session_resp_p->teid = delete_session_req_pP->sender_fteid_for_cp.teid; - } - - delete_session_resp_p->cause = CONTEXT_NOT_FOUND; - delete_session_resp_p->trxn = delete_session_req_pP->trxn; - delete_session_resp_p->peer_ip = delete_session_req_pP->peer_ip; - - MSC_LOG_TX_MESSAGE( - MSC_SP_GWAPP_MME, - (to_task == TASK_MME_APP) ? MSC_MMEAPP_MME:MSC_S11_MME, - NULL,0, - "0 SGW_DELETE_SESSION_RESPONSE CONTEXT_NOT_FOUND trxn %u", - delete_session_resp_p->trxn); - - return itti_send_msg_to_task(to_task, INSTANCE_DEFAULT, message_p); - } - - return -1; -} - - -int -sgw_lite_handle_release_access_bearers_request( - const SgwReleaseAccessBearersRequest * const release_access_bearers_req_pP) -{ - task_id_t to_task; - hashtable_rc_t hash_rc; - SgwReleaseAccessBearersResponse *release_access_bearers_resp_p = NULL; - MessageDef *message_p = NULL; - s_plus_p_gw_eps_bearer_context_information_t *ctx_p = NULL; - -#if defined(ENABLE_STANDALONE_EPC) - to_task = TASK_MME_APP; -#else - to_task = TASK_S11; -#endif - message_p = itti_alloc_new_message(TASK_SPGW_APP, SGW_RELEASE_ACCESS_BEARERS_RESPONSE); - - if (message_p == NULL) { - return -1; - } - - release_access_bearers_resp_p = &message_p->ittiMsg.sgwReleaseAccessBearersResponse; - - - hash_rc = hashtable_get(sgw_app.s11_bearer_context_information_hashtable, - release_access_bearers_req_pP->teid, - (void**)&ctx_p); - - if (hash_rc == HASH_TABLE_OK) { - release_access_bearers_resp_p->cause = REQUEST_ACCEPTED; - release_access_bearers_resp_p->teid = ctx_p->sgw_eps_bearer_context_information.mme_teid_for_S11; - -#warning "TODO Here the release (sgw_lite_handle_release_access_bearers_request)" - - MSC_LOG_TX_MESSAGE( - MSC_SP_GWAPP_MME, - (to_task == TASK_MME_APP) ? MSC_MMEAPP_MME:MSC_S11_MME, - NULL,0, - "0 SGW_RELEASE_ACCESS_BEARERS_RESPONSE S11 MME teid %u cause REQUEST_ACCEPTED", - release_access_bearers_resp_p->teid); - - return itti_send_msg_to_task(to_task, INSTANCE_DEFAULT, message_p); - } else { - release_access_bearers_resp_p->cause = CONTEXT_NOT_FOUND; - release_access_bearers_resp_p->teid = 0; - MSC_LOG_TX_MESSAGE( - MSC_SP_GWAPP_MME, - (to_task == TASK_MME_APP) ? MSC_MMEAPP_MME:MSC_S11_MME, - NULL,0, - "0 SGW_RELEASE_ACCESS_BEARERS_RESPONSE cause CONTEXT_NOT_FOUND"); - - return itti_send_msg_to_task(to_task, INSTANCE_DEFAULT, message_p); - } - return -1; -} - diff --git a/openair-cn/SGW-LITE/sgw_lite_handlers.h b/openair-cn/SGW-LITE/sgw_lite_handlers.h deleted file mode 100644 index 1f74f802bd..0000000000 --- a/openair-cn/SGW-LITE/sgw_lite_handlers.h +++ /dev/null @@ -1,47 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/*! \file sgw_lite_handlers.h -* \brief -* \author Lionel Gauthier -* \company Eurecom -* \email: lionel.gauthier@eurecom.fr -*/ - -#ifndef SGW_LITE_HANDLERS_H_ -#define SGW_LITE_HANDLERS_H_ - -int sgw_lite_handle_create_session_request(const SgwCreateSessionRequest * const session_req_p); -int sgw_lite_handle_sgi_endpoint_created (const SGICreateEndpointResp * const resp_p); -int sgw_lite_handle_sgi_endpoint_updated (const SGIUpdateEndpointResp * const resp_p); -int sgw_lite_handle_gtpv1uCreateTunnelResp(const Gtpv1uCreateTunnelResp * const endpoint_created_p); -int sgw_lite_handle_gtpv1uUpdateTunnelResp(const Gtpv1uUpdateTunnelResp * const endpoint_updated_p); -int sgw_lite_handle_modify_bearer_request (const SgwModifyBearerRequest * const modify_bearer_p); -int sgw_lite_handle_delete_session_request(const SgwDeleteSessionRequest * const delete_session_p); -int sgw_lite_handle_release_access_bearers_request(const SgwReleaseAccessBearersRequest * const release_access_bearers_req_pP); -#endif /* SGW_LITE_HANDLERS_H_ */ diff --git a/openair-cn/SGW-LITE/sgw_lite_ie_defs.h b/openair-cn/SGW-LITE/sgw_lite_ie_defs.h deleted file mode 100644 index 68683272fb..0000000000 --- a/openair-cn/SGW-LITE/sgw_lite_ie_defs.h +++ /dev/null @@ -1,641 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/*! \file sgw_lite_ie_defs.h -* \brief -* \author Lionel Gauthier -* \company Eurecom -* \email: lionel.gauthier@eurecom.fr -*/ - -#include "common_types.h" - -#ifndef SGW_LITE_IE_DEFS_H_ -#define SGW_LITE_IE_DEFS_H_ - -typedef uint8_t EBI_t; -typedef uint8_t APNRestriction_t; -typedef uint8_t DelayValue_t; -typedef uint32_t Teid_t; -typedef uint32_t SequenceNumber_t; - -/* Only one type of address can be present at the same time - * This type is applicable to IP address Information Element defined - * in 3GPP TS 29.274 #8.9 - */ -typedef struct { -#define GTP_IP_ADDR_v4 0x0 -#define GTP_IP_ADDR_v6 0x1 - unsigned present:1; - union { - uint8_t v4[4]; - uint8_t v6[16]; - } address; -} gtp_ip_address_t; - -/* 3GPP TS 29.274 Figure 8.12 */ - -typedef uint32_t indication_flags_t; - -/* Bit mask for octet 7 in indication IE */ -#if defined(UPDATE_RELEASE_10) -# define S6AF_FLAG (1U << 20) -# define S4AF_FLAG (1U << 19) -# define MBMDT_FLAG (1U << 18) -#endif -#define ISRAU_FLAG (1U << 17) -#define CCRSI_FLAG (1U << 16) - -/* Bit mask for octet 6 in indication IE */ -#define SQSI_FLAG (1U << 15) -#define UIMSI_FLAG (1U << 14) -#define CFSI_FLAG (1U << 13) -#define CRSI_FLAG (1U << 12) -#define P_FLAG (1U << 11) -#define PT_FLAG (1U << 10) -#define SI_FLAG (1U << 9) -#define MSV_FLAG (1U << 8) - -/* Bit mask for octet 5 in indication IE */ -#define DAF_FLAG (1U << 7) -#define DTF_FLAG (1U << 6) -#define HI_FLAG (1U << 5) -#define DFI_FLAG (1U << 4) -#define OI_FLAG (1U << 3) -#define ISRSI_FLAG (1U << 2) -#define ISRAI_FLAG (1U << 1) -#define SGW_CI_FLAG (1U << 0) - -typedef struct { - pdn_type_t pdn_type; - uint8_t ipv4_address[4]; - uint8_t ipv6_address[16]; - /* Note in rel.8 the ipv6 prefix length has a fixed value of /64 */ - uint8_t ipv6_prefix_length; -} PAA_t; - -/* Protocol configuration options from ts124008*/ -#define PCO_MIN_LENGTH 3 -#define PCO_MAX_LENGTH 253 -#define PCO_CONFIGURATION_PROTOCOL_PPP_FOR_USE_WITH_IP_PDP_TYPE_OR_IP_PDN_TYPE 000b - -#define PCO_PI_LCP (0xC021) -#define PCO_PI_PAP (0xC023) -#define PCO_PI_CHAP (0xC223) -#define PCO_PI_IPCP (0x8021) - -#define IPCP_CODE_CONFIGURE_REQUEST (0x01) -#define IPCP_CODE_CONFIGURE_ACK (0x02) -#define IPCP_CODE_CONFIGURE_NACK (0x03) -#define IPCP_CODE_CONFIGURE_REJECT (0x04) -#define IPCP_CODE_TERMINATE_REQUEST (0x05) -#define IPCP_CODE_TERMINATE_ACK (0x06) -#define IPCP_CODE_REJECT (0x07) - -#define IPCP_OPTION_PRIMARY_DNS_SERVER_IP_ADDRESS (0x81) -#define IPCP_OPTION_SECONDARY_DNS_SERVER_IP_ADDRESS (0x83) - -/* CONTAINER IDENTIFIER MS to network direction:*/ -#define PCO_CI_P_CSCF_IPV6_ADDRESS_REQUEST (0x0001) -#define PCO_CI_DNS_SERVER_IPV6_ADDRESS_REQUEST (0x0003) -#define PCO_CI_MS_SUPPORT_OF_NETWORK_REQUESTED_BEARER_CONTROL_INDICATOR (0x0005) -#define PCO_CI_DSMIPV6_HOME_AGENT_ADDRESS_REQUEST (0x0007) -#define PCO_CI_DSMIPV6_HOME_NETWORK_PREFIX_REQUEST (0x0008) -#define PCO_CI_DSMIPV6_IPV4_HOME_AGENT_ADDRESS_REQUEST (0x0009) -#define PCO_CI_IP_ADDRESS_ALLOCATION_VIA_NAS_SIGNALLING (0x000A) -#define PCO_CI_IPV4_ADDRESS_ALLOCATION_VIA_DHCPV4 (0x000B) -#define PCO_CI_P_CSCF_IPV4_ADDRESS_REQUEST (0x000C) -#define PCO_CI_DNS_SERVER_IPV4_ADDRESS_REQUEST (0x000D) -#define PCO_CI_MSISDN_REQUEST (0x000E) -#define PCO_CI_IFOM_SUPPORT_REQUEST (0x000F) -#define PCO_CI_IPV4_LINK_MTU_REQUEST (0x0010) - -/* CONTAINER IDENTIFIER Network to MS direction:*/ -#define PCO_CI_P_CSCF_IPV6_ADDRESS (0x0001) -#define PCO_CI_IM_CN_SUBSYSTEM_SIGNALING_FLAG (0x0002) -#define PCO_CI_DNS_SERVER_IPV6_ADDRESS (0x0003) -#define PCO_CI_POLICY_CONTROL_REJECTION_CODE (0x0004) -#define PCO_CI_SELECTED_BEARER_CONTROL_MODE (0x0005) -#define PCO_CI_DSMIPV6_HOME_AGENT_ADDRESS (0x0007) -#define PCO_CI_DSMIPV6_HOME_NETWORK_PREFIX (0x0008) -#define PCO_CI_DSMIPV6_IPV4_HOME_AGENT_ADDRESS (0x0009) -#define PCO_CI_P_CSCF_IPV4_ADDRESS (0x000C) -#define PCO_CI_DNS_SERVER_IPV4_ADDRESS (0x000D) -#define PCO_CI_MSISDN (0x000E) -#define PCO_CI_IFOM_SUPPORT (0x000F) -#define PCO_CI_IPV4_LINK_MTU (0x0010) - -/* Both directions:*/ -#define PCO_CI_IM_CN_SUBSYSTEM_SIGNALING_FLAG (0x0002) - -typedef struct pco_flat_s{ - uint8_t byte[PCO_MAX_LENGTH]; - uint8_t length; -} pco_flat_t; - - -#define IMSI(imsi) \ - (imsi)->digit[0], \ - (imsi)->digit[1], \ - (imsi)->digit[2], \ - (imsi)->digit[3], \ - (imsi)->digit[4], \ - (imsi)->digit[5], \ - (imsi)->digit[6], \ - (imsi)->digit[7], \ - (imsi)->digit[8], \ - (imsi)->digit[9], \ - (imsi)->digit[10], \ - (imsi)->digit[11], \ - (imsi)->digit[12], \ - (imsi)->digit[13], \ - (imsi)->digit[14] - -typedef struct { - uint8_t digit[IMSI_DIGITS_MAX+1]; // +1 for '\0` macro sprintf changed in snprintf - uint8_t length; -} Imsi_t; - -typedef struct { - uint8_t digit[MSISDN_LENGTH]; - uint8_t length; -} Msisdn_t; - -#define MEI_IMEI 0x0 -#define MEI_IMEISV 0x1 - -typedef struct { - uint8_t present; - union { - unsigned imei:15; - unsigned imeisv:16; - } choice; -} Mei_t; - -typedef struct { - uint8_t mcc[3]; - uint8_t mnc[3]; - uint16_t lac; - uint16_t ci; -} Cgi_t; - -typedef struct { - uint8_t mcc[3]; - uint8_t mnc[3]; - uint16_t lac; - uint16_t sac; -} Sai_t; - -typedef struct { - uint8_t mcc[3]; - uint8_t mnc[3]; - uint16_t lac; - uint16_t rac; -} Rai_t; - -typedef struct { - uint8_t mcc[3]; - uint8_t mnc[3]; - uint16_t tac; -} Tai_t; - -typedef struct { - uint8_t mcc[3]; - uint8_t mnc[3]; - uint32_t eci; -} Ecgi_t; - -typedef struct { - uint8_t mcc[3]; - uint8_t mnc[3]; - uint16_t lac; -} Lai_t; - -#define ULI_CGI 0x01 -#define ULI_SAI 0x02 -#define ULI_RAI 0x04 -#define ULI_TAI 0x08 -#define ULI_ECGI 0x10 -#define ULI_LAI 0x20 - -typedef struct { - uint8_t present; - struct { - Cgi_t cgi; - Sai_t sai; - Rai_t rai; - Tai_t tai; - Ecgi_t ecgi; - Lai_t lai; - } s; -} Uli_t; - -typedef struct { - uint8_t mcc[3]; - uint8_t mnc[3]; -} ServingNetwork_t; -/* -typedef enum RatType_e { - RAT_TYPE_UTRAN = 1, - RAT_TYPE_GERAN, - RAT_TYPE_WLAN, - RAT_TYPE_GAN, - RAT_TYPE_HSPA_EVOLUTION, - RAT_TYPE_EUTRAN, -} RatType_t;*/ - -/* WARNING: not complete... */ -typedef enum InterfaceType_e { - S1_U_ENODEB_GTP_U = 0, - S1_U_SGW_GTP_U = 1, - S12_RNC_GTP_U = 2, - S12_SGW_GTP_U = 3, - S5_S8_SGW_GTP_U = 4, - S5_S8_PGW_GTP_U = 5, - S5_S8_SGW_GTP_C = 6, - S5_S8_PGW_GTP_C = 7, - S11_MME_GTP_C = 10, - S11_SGW_GTP_C = 11, -} InterfaceType_t; - -typedef struct { - unsigned ipv4:1; - unsigned ipv6:1; - InterfaceType_t interface_type; - Teid_t teid; ///< TEID or GRE Key - uint32_t ipv4_address; - uint8_t ipv6_address[16]; -} FTeid_t; -/* - * typedef struct { - pdn_type_t pdn_type; - union { - uint8_t ipv4_address[4]; - uint8_t ipv6_address[16]; - } address; - } ip_address_t; - - */ -#define FTEID_T_2_IP_ADDRESS_T(fte_p,ip_p) \ -do { \ - if (fte_p->ipv4) { \ - ip_p->pdn_type = IPv4; \ - ip_p->address.ipv4_address[0] = (uint8_t)(fte_p->ipv4_address & 0x000000FF); \ - ip_p->address.ipv4_address[1] = (uint8_t)((fte_p->ipv4_address & 0x0000FF00) >> 8); \ - ip_p->address.ipv4_address[2] = (uint8_t)((fte_p->ipv4_address & 0x00FF0000) >> 16); \ - ip_p->address.ipv4_address[3] = (uint8_t)((fte_p->ipv4_address & 0xFF000000) >> 24); \ - } \ - if (fte_p->ipv6) { \ - if (fte_p->ipv4) { \ - ip_p->pdn_type = IPv4_AND_v6; \ - } else { \ - ip_p->pdn_type = IPv6; \ - } \ - memcpy(ip_p->address.ipv6_address, fte_p->ipv6_address, 16); \ - } \ -} while (0) - -typedef enum { - TARGET_ID_RNC_ID = 0, - TARGET_ID_MACRO_ENB_ID = 1, - TARGET_ID_CELL_ID = 2, - TARGET_ID_HOME_ENB_ID = 3 - /* Other values are spare */ -} target_type_t; - -typedef struct { - uint16_t lac; - uint8_t rac; - - /* Length of RNC Id can be 2 bytes if length of element is 8 - * or 4 bytes long if length is 10. - */ - uint32_t rnc_id; -} rnc_id_t; - -typedef struct { - unsigned enb_id:20; - uint16_t tac; -} macro_enb_id_t; - -typedef struct { - unsigned enb_id:28; - uint16_t tac; -} home_enb_id_t; - -typedef struct { - /* Common part */ - uint8_t target_type; - - uint8_t mcc[3]; - uint8_t mnc[3]; - union { - rnc_id_t rnc_id; - macro_enb_id_t macro_enb_id; - home_enb_id_t home_enb_id; - } target_id; -} target_identification_t; - -typedef enum SelectionMode_e { - MS_O_N_P_APN_S_V = 0, ///< MS or network provided APN, subscribed verified - MS_P_APN_S_N_V = 1, ///< MS provided APN, subscription not verified - N_P_APN_S_N_V = 2, ///< Network provided APN, subscription not verified -} SelectionMode_t; - -typedef struct { - uint32_t uplink_ambr; - uint32_t downlink_ambr; -} AMBR_t; - -typedef enum node_id_type_e { - GLOBAL_UNICAST_IPv4 = 0, - GLOBAL_UNICAST_IPv6 = 1, - TYPE_EXOTIC = 2, ///< (MCC * 1000 + MNC) << 12 + Integer value assigned to MME by operator -} node_id_type_t; - -typedef struct { - node_id_type_t node_id_type; - uint16_t csid; ///< Connection Set Identifier - union { - uint32_t unicast_ipv4; - uint8_t unicast_ipv6[16]; - struct { - uint16_t mcc; - uint16_t mnc; - uint16_t operator_specific_id; - } exotic; - } node_id; -} FQ_CSID_t; - -typedef struct { - uint8_t time_zone; - unsigned daylight_saving_time:2; -} UETimeZone_t; - -typedef enum AccessMode_e { - CLOSED_MODE = 0, - HYBRID_MODE = 1, -} AccessMode_t; - -typedef struct { - uint8_t mcc[3]; - uint8_t mnc[3]; - uint32_t csg_id; - AccessMode_t access_mode; - unsigned lcsg:1; - unsigned cmi:1; -} UCI_t; - -typedef struct { - /* PPC (Prohibit Payload Compression): - * This flag is used to determine whether an SGSN should attempt to - * compress the payload of user data when the users asks for it - * to be compressed (PPC = 0), or not (PPC = 1). - */ - unsigned ppc:1; - - /* VB (Voice Bearer): - * This flag is used to indicate a voice bearer when doing PS-to-CS - * SRVCC handover. - */ - unsigned vb:1; -} bearer_flags_t; - -#define PRE_EMPTION_CAPABILITY_ENABLED (0x0) -#define PRE_EMPTION_CAPABILITY_DISABLED (0x1) -#define PRE_EMPTION_VULNERABILITY_ENABLED (0x0) -#define PRE_EMPTION_VULNERABILITY_DISABLED (0x1) - -typedef struct { - /* PCI (Pre-emption Capability) - * The following values are defined: - * - PRE-EMPTION_CAPABILITY_ENABLED (0) - * This value indicates that the service data flow or bearer is allowed - * to get resources that were already assigned to another service data - * flow or bearer with a lower priority level. - * - PRE-EMPTION_CAPABILITY_DISABLED (1) - * This value indicates that the service data flow or bearer is not - * allowed to get resources that were already assigned to another service - * data flow or bearer with a lower priority level. - * Default value: PRE-EMPTION_CAPABILITY_DISABLED - */ - unsigned pci:1; - /* PL (Priority Level): defined in 3GPP TS.29.212 #5.3.45 - * Values 1 to 15 are defined, with value 1 as the highest level of priority. - * Values 1 to 8 should only be assigned for services that are authorized to - * receive prioritized treatment within an operator domain. Values 9 to 15 - * may be assigned to resources that are authorized by the home network and - * thus applicable when a UE is roaming. - */ - unsigned pl:4; - /* PVI (Pre-emption Vulnerability): defined in 3GPP TS.29.212 #5.3.47 - * Defines whether a service data flow can lose the resources assigned to it - * in order to admit a service data flow with higher priority level. - * The following values are defined: - * - PRE-EMPTION_VULNERABILITY_ENABLED (0) - * This value indicates that the resources assigned to the service data - * flow or bearer can be pre-empted and allocated to a service data flow - * or bearer with a higher priority level. - * - PRE-EMPTION_VULNERABILITY_DISABLED (1) - * This value indicates that the resources assigned to the service data - * flow or bearer shall not be pre-empted and allocated to a service data - * flow or bearer with a higher priority level. - * Default value: EMPTION_VULNERABILITY_ENABLED - */ - unsigned pvi:1; - uint8_t qci; - ambr_t gbr; ///< Guaranteed bit rate - ambr_t mbr; ///< Maximum bit rate -} BearerQOS_t; - -/* TFT operation Code */ -typedef enum { - /* 0 = spare */ - - CREATE_NEW_TFT = 0x1, - DELETE_EXISTING_TFT = 0x2, - ADD_PACKET_FILTERS_TO_EXISTING_TFT = 0x3, - REPLACE_PACKET_FILTERS_IN_EXISTING_TFT = 0x4, - DELETE_PACKET_FILTERS_FROM_EXISTING_TFT = 0x5, - NO_TFT_OPERATION = 0x6, - - TFT_OPERATION_CODE_MAX - - /* Other Values Reserved */ -} tft_operation_code_t; - -/* Defined in 3GPP TS 24.008 Table 10.5.162 */ -typedef enum { - PACKET_FILTER_PRE_REL_7 = 0, - PACKET_FILTER_DIRECTION_DL_ONLY = 1, - PACKET_FILTER_DIRECTION_UL_ONLY = 2, - PACKET_FILTER_BIDIRECTIONAL = 3, -} packet_filter_direction_t; - -/* The Traffic Flow Template is specified in 3GPP TS 24.008 #10.5.6.12 - */ -typedef struct { - /* The TFT operation code "No TFT operation" shall be used - * if a parameters list is included but no packet filter - * list is included in the traffic flow template information - * element. - */ - tft_operation_code_t tft_operation_code; - - /* The E bit indicates if a parameters list is included - * in the TFT IE and it is encoded as follows: - * - 0 parameters list is not included - * - 1 parameters list is included - */ - unsigned e_bit:1; - - /* For the "delete existing TFT" operation and for the "no TFT - * operation", the number of packet filters shall be coded - * as 0. For all other operations, the number of packet filters - * shall be greater than 0 and less than or equal to 15. - */ - uint8_t number_of_packet_filters; - - /* TODO: add packet filter list as defined in 3GPP TS 29.274 Table 10.5.162 */ -} tft_t; - -typedef enum node_type_e { - NODE_TYPE_MME = 0, - NODE_TYPE_SGSN = 1 -} node_type_t; - - -/* Cause as defined in 3GPP TS 29.274 #8.4 */ -typedef enum SGWCause_e { - /* Request / Initial message */ - LOCAL_DETACH = 2, - COMPLETE_DETACH = 3, - RAT_CHANGE_3GPP_TO_NON_3GPP = 4, ///< RAT changed from 3GPP to Non-3GPP - ISR_DEACTIVATION = 5, - ERROR_IND_FROM_RNC_ENB_SGSN = 6, - IMSI_DETACH_ONLY = 7, - /* Acceptance in a Response/Triggered message */ - REQUEST_ACCEPTED = 16, - REQUEST_ACCEPTED_PARTIALLY = 17, - NEW_PDN_TYPE_NW_PREF = 18, ///< New PDN type due to network preference - NEW_PDN_TYPE_SAB_ONLY = 19, ///< New PDN type due to single address bearer only - /* Rejection in a Response triggered message. */ - CONTEXT_NOT_FOUND = 64, - INVALID_MESSAGE_FORMAT = 65, - INVALID_LENGTH = 67, - SERVICE_NOT_SUPPORTED = 68, - MANDATORY_IE_INCORRECT = 69, - MANDATORY_IE_MISSING = 70, - SYSTEM_FAILURE = 72, - NO_RESOURCES_AVAILABLE = 73, - SEMANTIC_ERROR_IN_TFT = 74, - SYNTACTIC_ERROR_IN_TFT = 75, - SEMANTIC_ERRORS_IN_PF = 76, - SYNTACTIC_ERRORS_IN_PF = 77, - MISSING_OR_UNKNOWN_APN = 78, - GRE_KEY_NOT_FOUND = 80, - RELOCATION_FAILURE = 81, - DENIED_IN_RAT = 82, - UE_NOT_RESPONDING = 87, - UE_REFUSES = 88, - SERVICE_DENIED = 89, - UNABLE_TO_PAGE_UE = 90, - NO_MEMORY_AVAILABLE = 91, - REQUEST_REJECTED = 94, - DATA_FORWARDING_NOT_SUPPORTED = 106, - INVALID_REPLY_FROM_REMOTE_PEER = 107, - FALLBACK_TO_GTPV1 = 108, - INVALID_PEER = 109, - TEMP_REJECT_HO_IN_PROGRESS = 110, ///< Temporarily rejected due to handover procedure in progress - REJECTED_FOR_PMIPv6_REASON = 112, ///< Request rejected for a PMIPv6 reason (see 3GPP TS 29.275 [26]). - M_PDN_APN_NOT_ALLOWED = 116, ///< Multiple PDN connections for a given APN not allowed. - SGW_CAUSE_MAX -} SGWCause_t; - -typedef struct { - uint8_t cause_value; - uint8_t pce:1; - uint8_t bce:1; - uint8_t cs:1; - - uint8_t offending_ie_type; - uint16_t offending_ie_length; - uint8_t offending_ie_instance; -} gtp_cause_t; - -typedef struct { - uint8_t eps_bearer_id; ///< EPS Bearer ID - BearerQOS_t bearer_level_qos; - tft_t tft; ///< Bearer TFT -} bearer_to_create_t; - -typedef struct { - uint8_t eps_bearer_id; ///< EPS Bearer ID - SGWCause_t cause; - - /* This parameter is used on S11 interface only */ - FTeid_t s1u_sgw_fteid; ///< S1-U SGW F-TEID - - /* This parameter is used on S4 interface only */ - FTeid_t s4u_sgw_fteid; ///< S4-U SGW F-TEID - - /* This parameter is used on S11 and S5/S8 interface only for a - * GTP-based S5/S8 interface and during: - * - E-UTRAN Inintial attch - * - PDP Context Activation - * - UE requested PDN connectivity - */ - FTeid_t s5_s8_u_pgw_fteid; ///< S4-U SGW F-TEID - - /* This parameter is used on S4 interface only and when S12 interface is used */ - FTeid_t s12_sgw_fteid; ///< S12 SGW F-TEID - - /* This parameter is received only if the QoS parameters have been modified */ - BearerQOS_t *bearer_level_qos; - - tft_t tft; ///< Bearer TFT -} bearer_context_created_t; - -typedef struct { - uint8_t eps_bearer_id; ///< EPS Bearer ID - SGWCause_t cause; - FTeid_t s1u_sgw_fteid; ///< Sender F-TEID for user plane -} bearer_context_modified_t; - -typedef struct { - uint8_t eps_bearer_id; ///< EPS bearer ID - SGWCause_t cause; -} bearer_for_removal_t; - -typedef struct { - uint8_t eps_bearer_id; ///< EPS Bearer ID - FTeid_t s1_eNB_fteid; ///< S1 eNodeB F-TEID -} bearer_context_to_modify_t; - -#endif /* SGW_LITE_IE_DEFS_H_ */ - diff --git a/openair-cn/SGW-LITE/sgw_lite_task.c b/openair-cn/SGW-LITE/sgw_lite_task.c deleted file mode 100644 index 27f5836bb4..0000000000 --- a/openair-cn/SGW-LITE/sgw_lite_task.c +++ /dev/null @@ -1,229 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/*! \file sgw_lite_task.c -* \brief -* \author Lionel Gauthier -* \company Eurecom -* \email: lionel.gauthier@eurecom.fr -*/ -#define SGW_LITE -#define SGW_LITE_TASK_C - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <string.h> -#include <assert.h> - -#include "intertask_interface.h" -#include "mme_config.h" -#include "sgw_lite_defs.h" -#include "sgw_lite_handlers.h" -#include "sgw_lite.h" -#include "hashtable.h" -#include "spgw_config.h" -#include "pgw_lite_paa.h" -#include "msc.h" - -spgw_config_t spgw_config; -sgw_app_t sgw_app; -pgw_app_t pgw_app; - -static void *sgw_lite_intertask_interface(void *args_p) -{ - itti_mark_task_ready(TASK_SPGW_APP); - MSC_START_USE(); - - while(1) { - MessageDef *received_message_p; - itti_receive_msg(TASK_SPGW_APP, &received_message_p); - - switch (ITTI_MSG_ID(received_message_p)) { - case SGW_CREATE_SESSION_REQUEST: { - /* We received a create session request from MME (with GTP abstraction here) - * procedures might be: - * E-UTRAN Initial Attach - * UE requests PDN connectivity - */ - sgw_lite_handle_create_session_request(&received_message_p->ittiMsg.sgwCreateSessionRequest); - } - break; - - case SGW_MODIFY_BEARER_REQUEST: { - sgw_lite_handle_modify_bearer_request(&received_message_p->ittiMsg.sgwModifyBearerRequest); - } - break; - - case SGW_RELEASE_ACCESS_BEARERS_REQUEST: { - sgw_lite_handle_release_access_bearers_request(&received_message_p->ittiMsg.sgwReleaseAccessBearersRequest); - } - break; - - case SGW_DELETE_SESSION_REQUEST: { - sgw_lite_handle_delete_session_request(&received_message_p->ittiMsg.sgwDeleteSessionRequest); - } - break; - - case GTPV1U_CREATE_TUNNEL_RESP: { - SPGW_APP_DEBUG("Received teid for S1-U: %u and status: %s\n", - received_message_p->ittiMsg.gtpv1uCreateTunnelResp.S1u_teid , - received_message_p->ittiMsg.gtpv1uCreateTunnelResp.status == 0 ? "Success" : - "Failure"); - sgw_lite_handle_gtpv1uCreateTunnelResp(&received_message_p->ittiMsg.gtpv1uCreateTunnelResp); - } - break; - - case GTPV1U_UPDATE_TUNNEL_RESP: { - sgw_lite_handle_gtpv1uUpdateTunnelResp(&received_message_p->ittiMsg.gtpv1uUpdateTunnelResp); - } - break; - - case SGI_CREATE_ENDPOINT_RESPONSE: { - sgw_lite_handle_sgi_endpoint_created(&received_message_p->ittiMsg.sgiCreateEndpointResp); - } - break; - - case SGI_UPDATE_ENDPOINT_RESPONSE: { - sgw_lite_handle_sgi_endpoint_updated(&received_message_p->ittiMsg.sgiUpdateEndpointResp); - } - break; - - case TERMINATE_MESSAGE: { - itti_exit_task(); - } - break; - - default: { - SPGW_APP_DEBUG("Unkwnon message ID %d:%s\n", - ITTI_MSG_ID(received_message_p), - ITTI_MSG_NAME(received_message_p)); - } - break; - } - - itti_free(ITTI_MSG_ORIGIN_ID(received_message_p), received_message_p); - received_message_p = NULL; - } - - return NULL; -} - - - -int sgw_lite_init(char* config_file_name_pP) -{ - SPGW_APP_DEBUG("Initializing SPGW-APP task interface\n"); - spgw_system("modprobe ip_tables", SPGW_ABORT_ON_ERROR, __FILE__, __LINE__); - spgw_system("modprobe x_tables", SPGW_ABORT_ON_ERROR, __FILE__, __LINE__); - spgw_system("iptables -P INPUT ACCEPT", SPGW_WARN_ON_ERROR, __FILE__, __LINE__); - spgw_system("iptables -F INPUT", SPGW_WARN_ON_ERROR, __FILE__, __LINE__); - spgw_system("iptables -P OUTPUT ACCEPT", SPGW_WARN_ON_ERROR, __FILE__, __LINE__); - spgw_system("iptables -F OUTPUT", SPGW_WARN_ON_ERROR, __FILE__, __LINE__); - spgw_system("iptables -P FORWARD ACCEPT", SPGW_WARN_ON_ERROR, __FILE__, __LINE__); - spgw_system("iptables -F FORWARD", SPGW_WARN_ON_ERROR, __FILE__, __LINE__); - spgw_system("iptables -t nat -F", SPGW_WARN_ON_ERROR, __FILE__, __LINE__); - spgw_system("iptables -t mangle -F", SPGW_WARN_ON_ERROR, __FILE__, __LINE__); - spgw_system("iptables -t filter -F", SPGW_WARN_ON_ERROR, __FILE__, __LINE__); - spgw_system("iptables -t raw -F", SPGW_WARN_ON_ERROR, __FILE__, __LINE__); - spgw_system("iptables -t nat -Z", SPGW_WARN_ON_ERROR, __FILE__, __LINE__); - spgw_system("iptables -t mangle -Z", SPGW_WARN_ON_ERROR, __FILE__, __LINE__); - spgw_system("iptables -t filter -Z", SPGW_WARN_ON_ERROR, __FILE__, __LINE__); - spgw_system("iptables -t raw -Z", SPGW_WARN_ON_ERROR, __FILE__, __LINE__); - spgw_system("ip route flush cache", SPGW_WARN_ON_ERROR, __FILE__, __LINE__); - spgw_system("rmmod iptable_raw > /dev/null 2>&1", SPGW_WARN_ON_ERROR, __FILE__, __LINE__); - spgw_system("rmmod iptable_mangle > /dev/null 2>&1", SPGW_WARN_ON_ERROR, __FILE__, __LINE__); - spgw_system("rmmod iptable_nat > /dev/null 2>&1", SPGW_WARN_ON_ERROR, __FILE__, __LINE__); - spgw_system("rmmod iptable_filter > /dev/null 2>&1", SPGW_WARN_ON_ERROR, __FILE__, __LINE__); - spgw_system("rmmod ip_tables > /dev/null 2>&1", SPGW_WARN_ON_ERROR, __FILE__, __LINE__); - spgw_system("rmmod xt_state xt_mark xt_tcpudp xt_connmark ipt_LOG ipt_MASQUERADE > /dev/null 2>&1", SPGW_WARN_ON_ERROR, __FILE__, __LINE__); - spgw_system("rmmod x_tables > /dev/null 2>&1", SPGW_WARN_ON_ERROR, __FILE__, __LINE__); - spgw_system("rmmod nf_conntrack_netlink nfnetlink nf_nat nf_conntrack_ipv4 nf_conntrack > /dev/null 2>&1", SPGW_WARN_ON_ERROR, __FILE__, __LINE__); - spgw_system("modprobe ip_tables", SPGW_ABORT_ON_ERROR, __FILE__, __LINE__); - spgw_system("modprobe iptable_filter", SPGW_ABORT_ON_ERROR, __FILE__, __LINE__); - spgw_system("modprobe iptable_mangle", SPGW_ABORT_ON_ERROR, __FILE__, __LINE__); - spgw_system("modprobe iptable_nat", SPGW_ABORT_ON_ERROR, __FILE__, __LINE__); - spgw_system("modprobe iptable_raw", SPGW_ABORT_ON_ERROR, __FILE__, __LINE__); - spgw_system("modprobe ipt_MASQUERADE", SPGW_ABORT_ON_ERROR, __FILE__, __LINE__); - spgw_system("modprobe ipt_LOG", SPGW_ABORT_ON_ERROR, __FILE__, __LINE__); - spgw_system("modprobe nf_conntrack", SPGW_ABORT_ON_ERROR, __FILE__, __LINE__); - spgw_system("modprobe nf_conntrack_ipv4", SPGW_ABORT_ON_ERROR, __FILE__, __LINE__); - spgw_system("modprobe nf_nat", SPGW_ABORT_ON_ERROR, __FILE__, __LINE__); - spgw_system("modprobe x_tables", SPGW_ABORT_ON_ERROR, __FILE__, __LINE__); - spgw_system("sysctl -w net.ipv4.ip_forward=1", SPGW_WARN_ON_ERROR, __FILE__, __LINE__); - spgw_system("sysctl -w net.ipv4.conf.all.accept_local=1",SPGW_WARN_ON_ERROR, __FILE__, __LINE__); - spgw_system("sysctl -w net.ipv4.conf.all.log_martians=1",SPGW_WARN_ON_ERROR, __FILE__, __LINE__); - spgw_system("sysctl -w net.ipv4.conf.all.route_localnet=1",SPGW_WARN_ON_ERROR, __FILE__, __LINE__); - spgw_system("sysctl -w net.ipv4.conf.all.rp_filter=0",SPGW_WARN_ON_ERROR, __FILE__, __LINE__); - spgw_system("sync", SPGW_ABORT_ON_ERROR, __FILE__, __LINE__); - - spgw_config_init(config_file_name_pP, &spgw_config); - pgw_lite_load_pool_ip_addresses(); - - sgw_app.s11teid2mme_hashtable = hashtable_create (8192, NULL, NULL); - - if (sgw_app.s11teid2mme_hashtable == NULL) { - perror("hashtable_create"); - SPGW_APP_DEBUG("Initializing SPGW-APP task interface: ERROR\n"); - return -1; - } - - sgw_app.s1uteid2enb_hashtable = hashtable_create (8192, NULL, NULL); - - if (sgw_app.s1uteid2enb_hashtable == NULL) { - perror("hashtable_create"); - SPGW_APP_DEBUG("Initializing SPGW-APP task interface: ERROR\n"); - return -1; - } - - - sgw_app.s11_bearer_context_information_hashtable = hashtable_create (8192, NULL, sgw_lite_cm_free_s_plus_p_gw_eps_bearer_context_information); - - if (sgw_app.s11_bearer_context_information_hashtable == NULL) { - perror("hashtable_create"); - SPGW_APP_DEBUG("Initializing SPGW-APP task interface: ERROR\n"); - return -1; - } - - sgw_app.sgw_interface_name_for_S1u_S12_S4_up = spgw_config.sgw_config.ipv4.sgw_interface_name_for_S1u_S12_S4_up; - sgw_app.sgw_ip_address_for_S1u_S12_S4_up = spgw_config.sgw_config.ipv4.sgw_ipv4_address_for_S1u_S12_S4_up; - sgw_app.sgw_interface_name_for_S11_S4 = spgw_config.sgw_config.ipv4.sgw_interface_name_for_S11; - sgw_app.sgw_ip_address_for_S11_S4 = spgw_config.sgw_config.ipv4.sgw_ipv4_address_for_S11; - //sgw_app.sgw_ip_address_for_S5_S8_cp = spgw_config.sgw_config.ipv4.sgw_ip_address_for_S5_S8_cp; - sgw_app.sgw_ip_address_for_S5_S8_up = spgw_config.sgw_config.ipv4.sgw_ipv4_address_for_S5_S8_up; - - if (itti_create_task(TASK_SPGW_APP, - &sgw_lite_intertask_interface, NULL) < 0) { - perror("pthread_create"); - SPGW_APP_DEBUG("Initializing SPGW-APP task interface: ERROR\n"); - return -1; - } - - SPGW_APP_DEBUG("Initializing SPGW-APP task interface: DONE\n"); - return 0; -} diff --git a/openair-cn/SGW-LITE/spgw_config.c b/openair-cn/SGW-LITE/spgw_config.c deleted file mode 100755 index 6a490e772d..0000000000 --- a/openair-cn/SGW-LITE/spgw_config.c +++ /dev/null @@ -1,601 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/*! \file spgw_config.c -* \brief -* \author Lionel Gauthier -* \company Eurecom -* \email: lionel.gauthier@eurecom.fr -*/ -#define SGW_LITE -#define SPGW_CONFIG_C - -#include <string.h> -#include <libconfig.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/inet.h> -#include <sys/types.h> -#include <stdlib.h> -#include <unistd.h> -#include <netdb.h> - -#include "log.h" -#include "assertions.h" -#include "spgw_config.h" -#include "sgw_lite_defs.h" -#include "intertask_interface.h" - -#ifdef LIBCONFIG_LONG -#define libconfig_int long -#else -#define libconfig_int int -#endif - -#define NIPADDR(addr) \ - (uint8_t)(addr & 0x000000FF), \ - (uint8_t)((addr & 0x0000FF00) >> 8), \ - (uint8_t)((addr & 0x00FF0000) >> 16), \ - (uint8_t)((addr & 0xFF000000) >> 24) - -#define HIPADDR(addr) \ - (uint8_t)((addr & 0xFF000000) >> 24),\ - (uint8_t)((addr & 0x00FF0000) >> 16),\ - (uint8_t)((addr & 0x0000FF00) >> 8), \ - (uint8_t)(addr & 0x000000FF) - -#define NIP6ADDR(addr) \ - ntohs((addr)->s6_addr16[0]), \ - ntohs((addr)->s6_addr16[1]), \ - ntohs((addr)->s6_addr16[2]), \ - ntohs((addr)->s6_addr16[3]), \ - ntohs((addr)->s6_addr16[4]), \ - ntohs((addr)->s6_addr16[5]), \ - ntohs((addr)->s6_addr16[6]), \ - ntohs((addr)->s6_addr16[7]) - -#define IN6_ARE_ADDR_MASKED_EQUAL(a,b,m) \ - (((((__const uint32_t *) (a))[0] & (((__const uint32_t *) (m))[0])) == (((__const uint32_t *) (b))[0] & (((__const uint32_t *) (m))[0]))) \ - && ((((__const uint32_t *) (a))[1] & (((__const uint32_t *) (m))[1])) == (((__const uint32_t *) (b))[1] & (((__const uint32_t *) (m))[1]))) \ - && ((((__const uint32_t *) (a))[2] & (((__const uint32_t *) (m))[2])) == (((__const uint32_t *) (b))[2] & (((__const uint32_t *) (m))[2]))) \ - && ((((__const uint32_t *) (a))[3] & (((__const uint32_t *) (m))[3])) == (((__const uint32_t *) (b))[3] & (((__const uint32_t *) (m))[3])))) - -void trim(char* srcP, int sizeP); -void sgw_ipv6_mask_in6_addr( struct in6_addr *addr6_pP, int maskP); - - -void -trim( - char* srcP, - int sizeP) -{ - if(srcP == NULL) - return; - - const char* current = srcP; - unsigned int i = 0; - - while((*current) != '\0' && (i < (sizeP-1))) { - if((*current != ' ') && (*current != '\t')) { - srcP[i++] = *current; - } - - ++current; - } - - srcP[i] = '\0'; -} - - - -void -sgw_ipv6_mask_in6_addr( - struct in6_addr *addr6_pP, - int maskP) -{ - int addr8_idx; - - addr8_idx = maskP / 8; - maskP = maskP % 8; - - if (maskP > 0) { - addr6_pP->s6_addr[addr8_idx] = addr6_pP->s6_addr[addr8_idx] & (0xFF << (8 - maskP)); - addr8_idx += 1; - } - - while (addr8_idx < 16) { - addr6_pP->s6_addr[addr8_idx++] = 0; - } -} - - -int spgw_system(char *command_pP, spgw_system_abort_control_e abort_on_errorP, const char * const file_nameP, const int line_numberP) -{ - int ret = -1; - - if (command_pP) { - SPGW_APP_INFO("system command: %s\n",command_pP); - ret = system(command_pP); - - if (ret != 0) { - SPGW_APP_ERROR("ERROR in system command %s: %d at %s:%u\n", - command_pP,ret, file_nameP, line_numberP); - - if (abort_on_errorP) { - exit(-1); // may be not exit - } - } - } - - return ret; -} - -int spgw_config_process(spgw_config_t* config_pP) -{ - char system_cmd[256]; - struct in_addr inaddr; - int ret = 0; - - inaddr.s_addr = config_pP->sgw_config.ipv4.sgw_ipv4_address_for_S1u_S12_S4_up; - - if (strncasecmp("lo",config_pP->sgw_config.ipv4.sgw_interface_name_for_S1u_S12_S4_up, strlen("lo")) == 0) { - config_pP->sgw_config.local_to_eNB = TRUE; - - } else { - config_pP->sgw_config.local_to_eNB = FALSE; - - if (snprintf(system_cmd, 256, - "insmod $OPENAIR_TARGETS/bin/xt_GTPUSP.ko gtpu_enb_port=2152 gtpu_sgw_port=%u sgw_addr=\"%s\" ", - config_pP->sgw_config.sgw_udp_port_for_S1u_S12_S4_up, - inet_ntoa(inaddr)) > 0) { - ret += spgw_system(system_cmd, SPGW_WARN_ON_ERROR, __FILE__, __LINE__); - } else { - SPGW_APP_ERROR("GTPUSP kernel module\n"); - ret = -1; - } - } - - if (config_pP->sgw_config.local_to_eNB == TRUE) { - - if (snprintf(system_cmd, 256, - "iptables -t filter -I INPUT -i lo -d %s --protocol sctp -j DROP", - inet_ntoa(inaddr)) > 0) { - ret += spgw_system(system_cmd, SPGW_ABORT_ON_ERROR, __FILE__, __LINE__); - } else { - SPGW_APP_ERROR("Drop SCTP traffic on S1U\n"); - ret = -1; - } - - if (snprintf(system_cmd, 256, - "iptables -t filter -I INPUT -i lo -s %s --protocol sctp -j DROP", - inet_ntoa(inaddr)) > 0) { - ret += spgw_system(system_cmd, SPGW_ABORT_ON_ERROR, __FILE__, __LINE__); - } else { - SPGW_APP_ERROR("Drop SCTP traffic on S1U\n"); - ret = -1; - } - - if (snprintf(system_cmd, 256, - "insmod $OPENAIR_TARGETS/bin/xt_GTPUSP.ko gtpu_enb_port=2153 gtpu_sgw_port=%u sgw_addr=\"%s\" ", - config_pP->sgw_config.sgw_udp_port_for_S1u_S12_S4_up, - inet_ntoa(inaddr)) > 0) { - ret += spgw_system(system_cmd, SPGW_WARN_ON_ERROR, __FILE__, __LINE__); - } else { - SPGW_APP_ERROR("GTPUSP kernel module\n"); - ret = -1; - } - } - - - ret += spgw_system("echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects", SPGW_ABORT_ON_ERROR, __FILE__, __LINE__); - - - if (snprintf(system_cmd, 256, - "ethtool -K %s tso off gso off gro off", - config_pP->pgw_config.ipv4.pgw_interface_name_for_SGI) > 0) { - SPGW_APP_INFO("Disable tcp segmentation offload, generic segmentation offload: %s\n",system_cmd); - ret += spgw_system(system_cmd, SPGW_WARN_ON_ERROR, __FILE__, __LINE__); - } else { - SPGW_APP_ERROR("Disable tcp segmentation offload, generic segmentation offload\n"); - ret = -1; - } - - return ret; -} - - -int spgw_config_init(char* lib_config_file_name_pP, spgw_config_t* config_pP) -{ - - config_t cfg; - config_setting_t *setting_sgw = NULL; - char *sgw_interface_name_for_S1u_S12_S4_up = NULL; - char *sgw_ipv4_address_for_S1u_S12_S4_up = NULL; - char *sgw_interface_name_for_S5_S8_up = NULL; - char *sgw_ipv4_address_for_S5_S8_up = NULL; - char *sgw_interface_name_for_S11 = NULL; - char *sgw_ipv4_address_for_S11 = NULL; - char *sgw_drop_uplink_s1u_traffic = NULL; - char *sgw_drop_downlink_s1u_traffic = NULL; - libconfig_int sgw_udp_port_for_S1u_S12_S4_up = 2152; - - config_setting_t *setting_pgw = NULL; - config_setting_t *subsetting = NULL; - config_setting_t *sub2setting = NULL; - char *pgw_interface_name_for_S5_S8 = NULL; - char *pgw_ipv4_address_for_S5_S8 = NULL; - char *pgw_interface_name_for_SGI = NULL; - char *pgw_ipv4_address_for_SGI = NULL; - char *pgw_masquerade_SGI = NULL; - char *pgw_default_dns_ipv4_address = NULL; - char *pgw_default_dns_sec_ipv4_address = NULL; - - char *astring = NULL; - char *atoken = NULL; - char *atoken2 = NULL; - char *address = NULL; - char *cidr = NULL; - char *mask = NULL; - int num = 0; - int i = 0; - unsigned char buf_in6_addr[sizeof(struct in6_addr)]; - struct in6_addr addr6_start; - struct in6_addr addr6_mask; - int prefix_mask = 0; - uint64_t counter64 = 0; - unsigned char buf_in_addr[sizeof(struct in_addr)]; - struct in_addr addr_start,in_addr_var; - struct in_addr addr_mask; - pgw_lite_conf_ipv4_list_elm_t *ip4_ref = NULL; - pgw_lite_conf_ipv6_list_elm_t *ip6_ref = NULL; - char system_cmd[256]; - - memset((char*)config_pP, 0 , sizeof(spgw_config_t)); - STAILQ_INIT(&config_pP->pgw_config.pgw_lite_ipv4_pool_list); - STAILQ_INIT(&config_pP->pgw_config.pgw_lite_ipv6_pool_list); - - config_init(&cfg); - - if(lib_config_file_name_pP != NULL) { - /* Read the file. If there is an error, report it and exit. */ - if(! config_read_file(&cfg, lib_config_file_name_pP)) { - SPGW_APP_ERROR("%s:%d - %s\n", lib_config_file_name_pP, config_error_line(&cfg), config_error_text(&cfg)); - config_destroy(&cfg); - AssertFatal (1 == 0, "Failed to parse SP-GW configuration file %s!\n", lib_config_file_name_pP); - } - } else { - SPGW_APP_ERROR("No SP-GW configuration file provided!\n"); - config_destroy(&cfg); - AssertFatal (0, "No SP-GW configuration file provided!\n"); - } - - SPGW_APP_INFO("Parsing configuration file provided %s\n", lib_config_file_name_pP); - - setting_sgw = config_lookup(&cfg, SGW_CONFIG_STRING_SGW_CONFIG); - - if(setting_sgw != NULL) { - subsetting = config_setting_get_member (setting_sgw, SGW_CONFIG_STRING_NETWORK_INTERFACES_CONFIG); - - if(subsetting != NULL) { - if( ( - config_setting_lookup_string( subsetting, SGW_CONFIG_STRING_SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP, (const char **)&sgw_interface_name_for_S1u_S12_S4_up) - && config_setting_lookup_string( subsetting, SGW_CONFIG_STRING_SGW_IPV4_ADDRESS_FOR_S1U_S12_S4_UP, (const char **)&sgw_ipv4_address_for_S1u_S12_S4_up) - && config_setting_lookup_string( subsetting, SGW_CONFIG_STRING_SGW_INTERFACE_NAME_FOR_S5_S8_UP, (const char **)&sgw_interface_name_for_S5_S8_up) - && config_setting_lookup_string( subsetting, SGW_CONFIG_STRING_SGW_IPV4_ADDRESS_FOR_S5_S8_UP, (const char **)&sgw_ipv4_address_for_S5_S8_up) - && config_setting_lookup_string( subsetting, SGW_CONFIG_STRING_SGW_INTERFACE_NAME_FOR_S11, (const char **)&sgw_interface_name_for_S11) - && config_setting_lookup_string( subsetting, SGW_CONFIG_STRING_SGW_IPV4_ADDRESS_FOR_S11, (const char **)&sgw_ipv4_address_for_S11) - ) - ) { - config_pP->sgw_config.ipv4.sgw_interface_name_for_S1u_S12_S4_up = strdup(sgw_interface_name_for_S1u_S12_S4_up); - cidr = strdup(sgw_ipv4_address_for_S1u_S12_S4_up); - address = strtok(cidr, "/"); - mask = strtok(NULL, "/"); - IPV4_STR_ADDR_TO_INT_NWBO ( address, config_pP->sgw_config.ipv4.sgw_ipv4_address_for_S1u_S12_S4_up, "BAD IP ADDRESS FORMAT FOR S1u_S12_S4 !\n" ) - config_pP->sgw_config.ipv4.sgw_ip_netmask_for_S1u_S12_S4_up = atoi(mask); - free(cidr); - - in_addr_var.s_addr = config_pP->sgw_config.ipv4.sgw_ipv4_address_for_S1u_S12_S4_up; - SPGW_APP_INFO("Parsing configuration file found sgw_ipv4_address_for_S1u_S12_S4_up: %s/%d on %s\n", - inet_ntoa(in_addr_var), - config_pP->sgw_config.ipv4.sgw_ip_netmask_for_S1u_S12_S4_up, - config_pP->sgw_config.ipv4.sgw_interface_name_for_S1u_S12_S4_up); - - - config_pP->sgw_config.ipv4.sgw_interface_name_for_S5_S8_up = strdup(sgw_interface_name_for_S5_S8_up); - cidr = strdup(sgw_ipv4_address_for_S5_S8_up); - address = strtok(cidr, "/"); - mask = strtok(NULL, "/"); - IPV4_STR_ADDR_TO_INT_NWBO ( address, config_pP->sgw_config.ipv4.sgw_ipv4_address_for_S5_S8_up, "BAD IP ADDRESS FORMAT FOR S5_S8 !\n" ) - config_pP->sgw_config.ipv4.sgw_ip_netmask_for_S5_S8_up = atoi(mask); - free(cidr); - in_addr_var.s_addr = config_pP->sgw_config.ipv4.sgw_ipv4_address_for_S5_S8_up; - SPGW_APP_INFO("Parsing configuration file found sgw_ipv4_address_for_S5_S8_up: %s/%d on %s\n", - inet_ntoa(in_addr_var), - config_pP->sgw_config.ipv4.sgw_ip_netmask_for_S5_S8_up, - config_pP->sgw_config.ipv4.sgw_interface_name_for_S5_S8_up); - - config_pP->sgw_config.ipv4.sgw_interface_name_for_S11 = strdup(sgw_interface_name_for_S11); - cidr = strdup(sgw_ipv4_address_for_S11); - address = strtok(cidr, "/"); - mask = strtok(NULL, "/"); - IPV4_STR_ADDR_TO_INT_NWBO ( address, config_pP->sgw_config.ipv4.sgw_ipv4_address_for_S11, "BAD IP ADDRESS FORMAT FOR S11 !\n" ) - config_pP->sgw_config.ipv4.sgw_ip_netmask_for_S11 = atoi(mask); - free(cidr); - in_addr_var.s_addr = config_pP->sgw_config.ipv4.sgw_ipv4_address_for_S11; - SPGW_APP_INFO("Parsing configuration file found sgw_ipv4_address_for_S11: %s/%d on %s\n", - inet_ntoa(in_addr_var), - config_pP->sgw_config.ipv4.sgw_ip_netmask_for_S11, - config_pP->sgw_config.ipv4.sgw_interface_name_for_S11); - } - - - if(config_setting_lookup_int( - subsetting, - SGW_CONFIG_STRING_SGW_PORT_FOR_S1U_S12_S4_UP, - &sgw_udp_port_for_S1u_S12_S4_up) - ) { - config_pP->sgw_config.sgw_udp_port_for_S1u_S12_S4_up = sgw_udp_port_for_S1u_S12_S4_up; - } else { - config_pP->sgw_config.sgw_udp_port_for_S1u_S12_S4_up = sgw_udp_port_for_S1u_S12_S4_up; - } - - } - } - - setting_pgw = config_lookup(&cfg, PGW_CONFIG_STRING_PGW_CONFIG); - - if(setting_pgw != NULL) { - subsetting = config_setting_get_member (setting_pgw, PGW_CONFIG_STRING_NETWORK_INTERFACES_CONFIG); - - if(subsetting != NULL) { - if( ( - config_setting_lookup_string(subsetting, - PGW_CONFIG_STRING_PGW_INTERFACE_NAME_FOR_S5_S8, - (const char **)&pgw_interface_name_for_S5_S8) - && config_setting_lookup_string(subsetting, - PGW_CONFIG_STRING_PGW_IPV4_ADDRESS_FOR_S5_S8, - (const char **)&pgw_ipv4_address_for_S5_S8) - && config_setting_lookup_string(subsetting, - PGW_CONFIG_STRING_PGW_INTERFACE_NAME_FOR_SGI, - (const char **)&pgw_interface_name_for_SGI) - && config_setting_lookup_string(subsetting, - PGW_CONFIG_STRING_PGW_IPV4_ADDR_FOR_SGI, - (const char **)&pgw_ipv4_address_for_SGI) - && config_setting_lookup_string(subsetting, - PGW_CONFIG_STRING_PGW_MASQUERADE_SGI, - (const char **)&pgw_masquerade_SGI) - ) - ) { - config_pP->pgw_config.ipv4.pgw_interface_name_for_S5_S8 = strdup(pgw_interface_name_for_S5_S8); - cidr = strdup(pgw_ipv4_address_for_S5_S8); - address = strtok(cidr, "/"); - mask = strtok(NULL, "/"); - IPV4_STR_ADDR_TO_INT_NWBO ( address, config_pP->pgw_config.ipv4.pgw_ipv4_address_for_S5_S8, "BAD IP ADDRESS FORMAT FOR S5_S8 !\n" ) - config_pP->pgw_config.ipv4.pgw_ip_netmask_for_S5_S8 = atoi(mask); - free(cidr); - in_addr_var.s_addr = config_pP->pgw_config.ipv4.pgw_ipv4_address_for_S5_S8; - SPGW_APP_INFO("Parsing configuration file found pgw_ipv4_address_for_S5_S8: %s/%d on %s\n", - inet_ntoa(in_addr_var), - config_pP->pgw_config.ipv4.pgw_ip_netmask_for_S5_S8, - config_pP->pgw_config.ipv4.pgw_interface_name_for_S5_S8); - - config_pP->pgw_config.ipv4.pgw_interface_name_for_SGI = strdup(pgw_interface_name_for_SGI); - cidr = strdup(pgw_ipv4_address_for_SGI); - address = strtok(cidr, "/"); - mask = strtok(NULL, "/"); - IPV4_STR_ADDR_TO_INT_NWBO ( address, config_pP->pgw_config.ipv4.pgw_ipv4_address_for_SGI, "BAD IP ADDRESS FORMAT FOR SGI !\n" ) - config_pP->pgw_config.ipv4.pgw_ip_netmask_for_SGI = atoi(mask); - free(cidr); - in_addr_var.s_addr = config_pP->pgw_config.ipv4.pgw_ipv4_address_for_SGI; - SPGW_APP_INFO("Parsing configuration file found pgw_ipv4_address_for_SGI: %s/%d on %s\n", - inet_ntoa(in_addr_var), - config_pP->pgw_config.ipv4.pgw_ip_netmask_for_SGI, - config_pP->pgw_config.ipv4.pgw_interface_name_for_SGI); - - if (strcasecmp(pgw_masquerade_SGI, "yes") == 0) { - config_pP->pgw_config.pgw_masquerade_SGI=1; - } else { - config_pP->pgw_config.pgw_masquerade_SGI=0; - SPGW_APP_INFO("No masquerading for SGI\n"); - } - } else { - SPGW_APP_WARN("CONFIG P-GW / NETWORK INTERFACES parsing failed\n"); - } - } else { - SPGW_APP_WARN("CONFIG P-GW / NETWORK INTERFACES not found\n"); - } - - //!!!------------------------------------!!! - spgw_config_process(config_pP); - //!!!------------------------------------!!! - - subsetting = config_setting_get_member (setting_pgw, PGW_CONFIG_STRING_IP_ADDRESS_POOL); - - if(subsetting != NULL) { - sub2setting = config_setting_get_member (subsetting, PGW_CONFIG_STRING_IPV4_ADDRESS_LIST); - - if(sub2setting != NULL) { - num = config_setting_length(sub2setting); - - for (i = 0; i < num; i++) { - astring = config_setting_get_string_elem(sub2setting,i); - - if (astring != NULL) { - trim(astring, strlen(astring)+1); - // failure, test if there is a range specified in the string - atoken = strtok(astring, PGW_CONFIG_STRING_IPV4_PREFIX_DELIMITER); - - if (inet_pton(AF_INET, atoken, buf_in_addr) == 1) { - memcpy (&addr_start, buf_in_addr, sizeof(struct in_addr)); - // valid address - atoken2 = strtok(NULL, PGW_CONFIG_STRING_IPV4_PREFIX_DELIMITER); - prefix_mask = atoi(atoken2); - - in_addr_var.s_addr = config_pP->sgw_config.ipv4.sgw_ipv4_address_for_S1u_S12_S4_up; - - if (snprintf(system_cmd, 256, - "iptables -I PREROUTING -t mangle -i %s -d %s/%s ! --protocol sctp -j CONNMARK --restore-mark", - config_pP->pgw_config.ipv4.pgw_interface_name_for_SGI, astring, atoken2) > 0) { - spgw_system(system_cmd, SPGW_ABORT_ON_ERROR, __FILE__, __LINE__); - } else { - SPGW_APP_ERROR("Restore mark\n"); - } - - if (snprintf(system_cmd, 256, - "iptables -I OUTPUT -t mangle -s %s/%s -m mark ! --mark 0 -j CONNMARK --save-mark", - astring, atoken2) > 0) { - spgw_system(system_cmd, SPGW_ABORT_ON_ERROR, __FILE__, __LINE__); - } else { - SPGW_APP_ERROR("Save mark\n"); - } - if (snprintf(system_cmd, 256, - "ip route add %s/%s dev %s", - astring, atoken2, config_pP->sgw_config.ipv4.sgw_interface_name_for_S1u_S12_S4_up) > 0) { - spgw_system(system_cmd, SPGW_WARN_ON_ERROR, __FILE__, __LINE__); - } else { - SPGW_APP_ERROR("Route for UEs\n"); - } - - - if ((prefix_mask >= 2)&&(prefix_mask < 32)) { - memcpy (&addr_start, buf_in_addr, sizeof(struct in_addr)); - memcpy (&addr_mask, buf_in_addr, sizeof(struct in_addr)); - - addr_mask.s_addr = addr_mask.s_addr & htonl(0xFFFFFFFF << (32 - prefix_mask)); - - if (memcmp(&addr_start, &addr_mask, sizeof(struct in_addr)) != 0) { - AssertFatal(0, "BAD IPV4 ADDR CONFIG/MASK PAIRING %s/%d addr %X mask %X\n", - astring, prefix_mask, addr_start.s_addr, addr_mask.s_addr); - } - - counter64 = 0x00000000FFFFFFFF >> prefix_mask; // address Prefix_mask/0..0 not valid - counter64 = counter64 - 2; - - do { - addr_start.s_addr = addr_start.s_addr + htonl(2); - ip4_ref = calloc(1, sizeof(pgw_lite_conf_ipv4_list_elm_t)); - ip4_ref->addr = addr_start; - - STAILQ_INSERT_TAIL(&config_pP->pgw_config.pgw_lite_ipv4_pool_list, ip4_ref, ipv4_entries); - counter64 = counter64 - 1; - } while (counter64 > 0); - - //--------------- - if (config_pP->pgw_config.pgw_masquerade_SGI) { - in_addr_var.s_addr = config_pP->pgw_config.ipv4.pgw_ipv4_address_for_SGI; - - if (snprintf(system_cmd, 256, - //"iptables -t nat -I POSTROUTING -s %s/%s -o %s ! --protocol sctp -j SNAT --to-source %s", - "iptables -t nat -I POSTROUTING -s %s/%s ! --protocol sctp -j SNAT --to-source %s", - astring, - atoken2, - //config_pP->pgw_config.ipv4.pgw_interface_name_for_SGI, - inet_ntoa(in_addr_var)) > 0) { - SPGW_APP_INFO("Masquerade SGI: %s\n",system_cmd); - spgw_system(system_cmd, SPGW_ABORT_ON_ERROR, __FILE__, __LINE__); - } else { - SPGW_APP_ERROR("Masquerade SGI\n"); - } - } - } else { - SPGW_APP_ERROR("CONFIG POOL ADDR IPV4: BAD MASQ: %s\n", atoken2); - } - } - } - } - } else { - SPGW_APP_WARN("CONFIG POOL ADDR IPV4: NO IPV4 ADDRESS FOUND\n"); - } - - sub2setting = config_setting_get_member (subsetting, PGW_CONFIG_STRING_IPV6_ADDRESS_LIST); - - if(sub2setting != NULL) { - num = config_setting_length(sub2setting); - - for (i = 0; i < num; i++) { - astring = config_setting_get_string_elem(sub2setting,i); - - if (astring != NULL) { - trim(astring, strlen(astring)+1); - - if (inet_pton(AF_INET6, astring, buf_in6_addr) < 1) { - // failure, test if there is a range specified in the string - atoken = strtok(astring, PGW_CONFIG_STRING_IPV6_PREFIX_DELIMITER); - - if (inet_pton(AF_INET6, astring, buf_in6_addr) == 1) { - atoken2 = strtok(NULL, PGW_CONFIG_STRING_IPV6_PREFIX_DELIMITER); - prefix_mask = atoi(atoken2); - // arbitrary values - DevAssert((prefix_mask < 128) && (prefix_mask >= 64)); - - memcpy (&addr6_start, buf_in6_addr, sizeof(struct in6_addr)); - memcpy (&addr6_mask, buf_in6_addr, sizeof(struct in6_addr)); - sgw_ipv6_mask_in6_addr(&addr6_mask, prefix_mask); - - if (memcmp(&addr6_start, &addr6_mask, sizeof(struct in6_addr)) != 0) { - AssertFatal(0, "BAD IPV6 ADDR CONFIG/MASK PAIRING %s/%d\n", astring, prefix_mask); - } - - - ip6_ref = calloc(1, sizeof(pgw_lite_conf_ipv6_list_elm_t)); - ip6_ref->addr = addr6_start; - ip6_ref->prefix_len = prefix_mask; - STAILQ_INSERT_TAIL(&config_pP->pgw_config.pgw_lite_ipv6_pool_list, ip6_ref, ipv6_entries); - - } - } else { - SPGW_APP_WARN("CONFIG POOL ADDR IPV6: FAILED WHILE PARSING %s\n", astring); - } - } - } - } - - if( - config_setting_lookup_string(setting_pgw, - PGW_CONFIG_STRING_DEFAULT_DNS_IPV4_ADDRESS, - (const char **)&pgw_default_dns_ipv4_address) - && config_setting_lookup_string(setting_pgw, - PGW_CONFIG_STRING_DEFAULT_DNS_SEC_IPV4_ADDRESS, - (const char **)&pgw_default_dns_sec_ipv4_address)) { - config_pP->pgw_config.ipv4.pgw_interface_name_for_S5_S8 = strdup(pgw_interface_name_for_S5_S8); - IPV4_STR_ADDR_TO_INT_NWBO ( pgw_default_dns_ipv4_address, config_pP->pgw_config.ipv4.default_dns_v4, "BAD IPv4 ADDRESS FORMAT FOR DEFAULT DNS !\n" ) - IPV4_STR_ADDR_TO_INT_NWBO ( pgw_default_dns_sec_ipv4_address, config_pP->pgw_config.ipv4.default_dns_sec_v4, "BAD IPv4 ADDRESS FORMAT FOR DEFAULT DNS SEC!\n" ) - SPGW_APP_INFO("Parsing configuration file default primary DNS IPv4 address: %x\n", - config_pP->pgw_config.ipv4.default_dns_v4); - SPGW_APP_INFO("Parsing configuration file default secondary DNS IPv4 address: %x\n", - config_pP->pgw_config.ipv4.default_dns_sec_v4); - } else { - SPGW_APP_WARN("NO DNS CONFIGURATION FOUND\n"); - } - } - } else { - SPGW_APP_WARN("CONFIG P-GW not found\n"); - } - - return 0; -} diff --git a/openair-cn/SGW-LITE/spgw_config.h b/openair-cn/SGW-LITE/spgw_config.h deleted file mode 100755 index 5a201e4482..0000000000 --- a/openair-cn/SGW-LITE/spgw_config.h +++ /dev/null @@ -1,153 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/*! \file spgw_config.h -* \brief -* \author Lionel Gauthier -* \company Eurecom -* \email: lionel.gauthier@eurecom.fr -*/ - -#ifndef SPGW_CONFIG_H_ -#define SPGW_CONFIG_H_ -#include <sys/socket.h> // inet_aton -#include <netinet/in.h> // inet_aton -#include <arpa/inet.h> // inet_aton - -#include "queue.h" - -#define SGW_CONFIG_STRING_SGW_CONFIG "S-GW" -#define SGW_CONFIG_STRING_NETWORK_INTERFACES_CONFIG "NETWORK_INTERFACES" -#define SGW_CONFIG_STRING_SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP "SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP" -#define SGW_CONFIG_STRING_SGW_IPV4_ADDRESS_FOR_S1U_S12_S4_UP "SGW_IPV4_ADDRESS_FOR_S1U_S12_S4_UP" -#define SGW_CONFIG_STRING_SGW_PORT_FOR_S1U_S12_S4_UP "SGW_IPV4_PORT_FOR_S1U_S12_S4_UP" -#define SGW_CONFIG_STRING_SGW_INTERFACE_NAME_FOR_S5_S8_UP "SGW_INTERFACE_NAME_FOR_S5_S8_UP" -#define SGW_CONFIG_STRING_SGW_IPV4_ADDRESS_FOR_S5_S8_UP "SGW_IPV4_ADDRESS_FOR_S5_S8_UP" -#define SGW_CONFIG_STRING_SGW_INTERFACE_NAME_FOR_S11 "SGW_INTERFACE_NAME_FOR_S11" -#define SGW_CONFIG_STRING_SGW_IPV4_ADDRESS_FOR_S11 "SGW_IPV4_ADDRESS_FOR_S11" - -#define PGW_CONFIG_STRING_PGW_CONFIG "P-GW" -#define PGW_CONFIG_STRING_NETWORK_INTERFACES_CONFIG "NETWORK_INTERFACES" -#define PGW_CONFIG_STRING_PGW_INTERFACE_NAME_FOR_S5_S8 "PGW_INTERFACE_NAME_FOR_S5_S8" -#define PGW_CONFIG_STRING_PGW_IPV4_ADDRESS_FOR_S5_S8 "PGW_IPV4_ADDRESS_FOR_S5_S8" -#define PGW_CONFIG_STRING_PGW_INTERFACE_NAME_FOR_SGI "PGW_INTERFACE_NAME_FOR_SGI" -#define PGW_CONFIG_STRING_PGW_IPV4_ADDR_FOR_SGI "PGW_IPV4_ADDRESS_FOR_SGI" -#define PGW_CONFIG_STRING_PGW_MASQUERADE_SGI "PGW_MASQUERADE_SGI" - -#define PGW_CONFIG_STRING_IP_ADDRESS_POOL "IP_ADDRESS_POOL" -#define PGW_CONFIG_STRING_IPV4_ADDRESS_LIST "IPV4_LIST" -#define PGW_CONFIG_STRING_IPV6_ADDRESS_LIST "IPV6_LIST" -#define PGW_CONFIG_STRING_IPV4_PREFIX_DELIMITER " /" -#define PGW_CONFIG_STRING_IPV6_PREFIX_DELIMITER " /" -#define PGW_CONFIG_STRING_DEFAULT_DNS_IPV4_ADDRESS "DEFAULT_DNS_IPV4_ADDRESS" -#define PGW_CONFIG_STRING_DEFAULT_DNS_SEC_IPV4_ADDRESS "DEFAULT_DNS_SEC_IPV4_ADDRESS" - -#define PGW_CONFIG_STRING_INTERFACE_DISABLED "none" - -#define IPV4_STR_ADDR_TO_INT_NWBO(AdDr_StR,NwBo,MeSsAgE ) do {\ - struct in_addr inp;\ - if ( inet_aton(AdDr_StR, &inp ) < 0 ) {\ - AssertFatal (0, MeSsAgE);\ - } else {\ - NwBo = inp.s_addr;\ - }\ - } while (0); - -typedef struct sgw_config_s { - struct { - char *sgw_interface_name_for_S1u_S12_S4_up; - uint32_t sgw_ipv4_address_for_S1u_S12_S4_up; - int sgw_ip_netmask_for_S1u_S12_S4_up; - - char *sgw_interface_name_for_S5_S8_up; - uint32_t sgw_ipv4_address_for_S5_S8_up; - int sgw_ip_netmask_for_S5_S8_up; - - char *sgw_interface_name_for_S11; - uint32_t sgw_ipv4_address_for_S11; - int sgw_ip_netmask_for_S11; - } ipv4; - int sgw_udp_port_for_S1u_S12_S4_up; - - uint8_t sgw_drop_uplink_traffic; - uint8_t sgw_drop_downlink_traffic; - uint8_t local_to_eNB; -} sgw_config_t; - -// may be more -#define PGW_MAX_ALLOCATED_PDN_ADDRESSES 1024 - - -typedef struct pgw_lite_conf_ipv4_list_elm_s { - STAILQ_ENTRY(pgw_lite_conf_ipv4_list_elm_s) ipv4_entries; - struct in_addr addr; -} pgw_lite_conf_ipv4_list_elm_t; - - -typedef struct pgw_lite_conf_ipv6_list_elm_s { - STAILQ_ENTRY(pgw_lite_conf_ipv6_list_elm_s) ipv6_entries; - struct in6_addr addr; - int prefix_len; -} pgw_lite_conf_ipv6_list_elm_t; - - -typedef struct pgw_config_s { - struct { - char *pgw_interface_name_for_S5_S8; - uint32_t pgw_ipv4_address_for_S5_S8; - int pgw_ip_netmask_for_S5_S8; - - char *pgw_interface_name_for_SGI; - uint32_t pgw_ipv4_address_for_SGI; - int pgw_ip_netmask_for_SGI; - - uint32_t default_dns_v4; // NBO - uint32_t default_dns_sec_v4;// NBO - } ipv4; - uint8_t pgw_masquerade_SGI; - - STAILQ_HEAD(pgw_lite_ipv4_pool_head_s, pgw_lite_conf_ipv4_list_elm_s) pgw_lite_ipv4_pool_list; - STAILQ_HEAD(pgw_lite_ipv6_pool_head_s, pgw_lite_conf_ipv6_list_elm_s) pgw_lite_ipv6_pool_list; -} pgw_config_t; - -typedef struct spgw_config_s { - sgw_config_t sgw_config; - pgw_config_t pgw_config; -} spgw_config_t; - -#ifndef SGW_LITE -extern spgw_config_t spgw_config; -#endif - -typedef enum { SPGW_WARN_ON_ERROR = 0, SPGW_ABORT_ON_ERROR} spgw_system_abort_control_e; - -int spgw_system(char *command_pP, spgw_system_abort_control_e abort_on_errorP, const char * const file_nameP, const int line_numberP); -int spgw_config_process(spgw_config_t* config_pP); -int spgw_config_init(char* lib_config_file_name_pP, spgw_config_t* config_pP); - -#endif /* ENB_CONFIG_H_ */ diff --git a/openair-cn/TEST/EPC_TEST/generate_scenario.c b/openair-cn/TEST/EPC_TEST/generate_scenario.c index bda35e413a..44a38a57c6 100644 --- a/openair-cn/TEST/EPC_TEST/generate_scenario.c +++ b/openair-cn/TEST/EPC_TEST/generate_scenario.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair-cn/TEST/Makefile.am b/openair-cn/TEST/Makefile.am index 29aca6ce15..7bc55fe600 100644 --- a/openair-cn/TEST/Makefile.am +++ b/openair-cn/TEST/Makefile.am @@ -21,7 +21,7 @@ # Contact Information # OpenAirInterface Admin: openair_admin@eurecom.fr # OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@eurecom.fr +# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr # # Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. # diff --git a/openair-cn/TEST/oaisim_mme_client_test.c b/openair-cn/TEST/oaisim_mme_client_test.c index 6fe0329d8f..b2eea62424 100644 --- a/openair-cn/TEST/oaisim_mme_client_test.c +++ b/openair-cn/TEST/oaisim_mme_client_test.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/TEST/oaisim_mme_itti_test.c b/openair-cn/TEST/oaisim_mme_itti_test.c index 599a089d8c..06fb3e191c 100644 --- a/openair-cn/TEST/oaisim_mme_itti_test.c +++ b/openair-cn/TEST/oaisim_mme_itti_test.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/TEST/oaisim_mme_list_benchmark.c b/openair-cn/TEST/oaisim_mme_list_benchmark.c index 5396a151bc..8aaf8d1ddd 100644 --- a/openair-cn/TEST/oaisim_mme_list_benchmark.c +++ b/openair-cn/TEST/oaisim_mme_list_benchmark.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/TEST/oaisim_mme_s1ap_test.c b/openair-cn/TEST/oaisim_mme_s1ap_test.c index d03e1bbed6..af3585ded0 100644 --- a/openair-cn/TEST/oaisim_mme_s1ap_test.c +++ b/openair-cn/TEST/oaisim_mme_s1ap_test.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/TEST/oaisim_mme_sctp_test.c b/openair-cn/TEST/oaisim_mme_sctp_test.c index 8dd5b192b8..4c433c8bf3 100644 --- a/openair-cn/TEST/oaisim_mme_sctp_test.c +++ b/openair-cn/TEST/oaisim_mme_sctp_test.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/TEST/oaisim_mme_test_s1c.c b/openair-cn/TEST/oaisim_mme_test_s1c.c index 0f1d1e6428..d7af00086b 100644 --- a/openair-cn/TEST/oaisim_mme_test_s1c.c +++ b/openair-cn/TEST/oaisim_mme_test_s1c.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair-cn/TEST/oaisim_mme_test_s1c.h b/openair-cn/TEST/oaisim_mme_test_s1c.h index af59dd1a23..0927ab6ad6 100644 --- a/openair-cn/TEST/oaisim_mme_test_s1c.h +++ b/openair-cn/TEST/oaisim_mme_test_s1c.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair-cn/TEST/oaisim_mme_test_s1c_s1ap.c b/openair-cn/TEST/oaisim_mme_test_s1c_s1ap.c index a46c8fa6b4..836a54b42f 100755 --- a/openair-cn/TEST/oaisim_mme_test_s1c_s1ap.c +++ b/openair-cn/TEST/oaisim_mme_test_s1c_s1ap.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair-cn/TEST/oaisim_mme_test_s1c_s1ap.h b/openair-cn/TEST/oaisim_mme_test_s1c_s1ap.h index 3e3c186d19..a4570b97bc 100755 --- a/openair-cn/TEST/oaisim_mme_test_s1c_s1ap.h +++ b/openair-cn/TEST/oaisim_mme_test_s1c_s1ap.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair-cn/TEST/oaisim_mme_test_s1c_scenario.c b/openair-cn/TEST/oaisim_mme_test_s1c_scenario.c index 416ac99904..1cf9208870 100755 --- a/openair-cn/TEST/oaisim_mme_test_s1c_scenario.c +++ b/openair-cn/TEST/oaisim_mme_test_s1c_scenario.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair-cn/TEST/oaisim_mme_test_s1c_scenario.h b/openair-cn/TEST/oaisim_mme_test_s1c_scenario.h index 25bbdb9c87..6187f02d7f 100644 --- a/openair-cn/TEST/oaisim_mme_test_s1c_scenario.h +++ b/openair-cn/TEST/oaisim_mme_test_s1c_scenario.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair-cn/TEST/oaisim_mme_test_s1c_scenario1.c b/openair-cn/TEST/oaisim_mme_test_s1c_scenario1.c index 93d7e5fedf..3fc1fbad7b 100644 --- a/openair-cn/TEST/oaisim_mme_test_s1c_scenario1.c +++ b/openair-cn/TEST/oaisim_mme_test_s1c_scenario1.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair-cn/TEST/test_aes128_cmac_encrypt.c b/openair-cn/TEST/test_aes128_cmac_encrypt.c index af5b864f67..22eb244579 100644 --- a/openair-cn/TEST/test_aes128_cmac_encrypt.c +++ b/openair-cn/TEST/test_aes128_cmac_encrypt.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/TEST/test_aes128_ctr_decrypt.c b/openair-cn/TEST/test_aes128_ctr_decrypt.c index c33fc36241..f3740b48ff 100644 --- a/openair-cn/TEST/test_aes128_ctr_decrypt.c +++ b/openair-cn/TEST/test_aes128_ctr_decrypt.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/TEST/test_aes128_ctr_encrypt.c b/openair-cn/TEST/test_aes128_ctr_encrypt.c index 6558e49792..a089ac549d 100644 --- a/openair-cn/TEST/test_aes128_ctr_encrypt.c +++ b/openair-cn/TEST/test_aes128_ctr_encrypt.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/TEST/test_kdf.c b/openair-cn/TEST/test_kdf.c index 414520b651..2a66527773 100644 --- a/openair-cn/TEST/test_kdf.c +++ b/openair-cn/TEST/test_kdf.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/TEST/test_s1ap.c b/openair-cn/TEST/test_s1ap.c index d6413f1341..e070e7018d 100644 --- a/openair-cn/TEST/test_s1ap.c +++ b/openair-cn/TEST/test_s1ap.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/TEST/test_secu.c b/openair-cn/TEST/test_secu.c index 316d90c825..ac3788eebd 100644 --- a/openair-cn/TEST/test_secu.c +++ b/openair-cn/TEST/test_secu.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/TEST/test_secu_kenb.c b/openair-cn/TEST/test_secu_kenb.c index 3ba2cdc937..16f6a8eadc 100644 --- a/openair-cn/TEST/test_secu_kenb.c +++ b/openair-cn/TEST/test_secu_kenb.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/TEST/test_secu_knas.c b/openair-cn/TEST/test_secu_knas.c index 92d3743788..ecf213f7b3 100644 --- a/openair-cn/TEST/test_secu_knas.c +++ b/openair-cn/TEST/test_secu_knas.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/TEST/test_secu_knas_encrypt_eea1.c b/openair-cn/TEST/test_secu_knas_encrypt_eea1.c index 6a110a63cb..9c54828ff4 100755 --- a/openair-cn/TEST/test_secu_knas_encrypt_eea1.c +++ b/openair-cn/TEST/test_secu_knas_encrypt_eea1.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/TEST/test_secu_knas_encrypt_eea2.c b/openair-cn/TEST/test_secu_knas_encrypt_eea2.c index bb26ce5a88..712da6d947 100644 --- a/openair-cn/TEST/test_secu_knas_encrypt_eea2.c +++ b/openair-cn/TEST/test_secu_knas_encrypt_eea2.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/TEST/test_secu_knas_encrypt_eia1.c b/openair-cn/TEST/test_secu_knas_encrypt_eia1.c index b634a2ea49..9a53079098 100755 --- a/openair-cn/TEST/test_secu_knas_encrypt_eia1.c +++ b/openair-cn/TEST/test_secu_knas_encrypt_eia1.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/TEST/test_secu_knas_encrypt_eia2.c b/openair-cn/TEST/test_secu_knas_encrypt_eia2.c index 03a510c146..f85ddc0fea 100644 --- a/openair-cn/TEST/test_secu_knas_encrypt_eia2.c +++ b/openair-cn/TEST/test_secu_knas_encrypt_eia2.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/TEST/test_secu_knas_stream_int.c b/openair-cn/TEST/test_secu_knas_stream_int.c index 7f1ba2df1c..731af2df8a 100644 --- a/openair-cn/TEST/test_secu_knas_stream_int.c +++ b/openair-cn/TEST/test_secu_knas_stream_int.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/UDP/Makefile.am b/openair-cn/UDP/Makefile.am deleted file mode 100644 index 907bc2099a..0000000000 --- a/openair-cn/UDP/Makefile.am +++ /dev/null @@ -1,45 +0,0 @@ -################################################################################ -# 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@eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ -noinst_LTLIBRARIES = libudpserver.la -libudpserver_la_LDFLAGS = -all-static - -AM_CFLAGS = \ - @ADD_CFLAGS@ \ - -I$(top_srcdir)/COMMON \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/api/network \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/include \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/ies \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/emm/msg \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/esm/msg \ - -I$(top_srcdir)/NAS/EURECOM-NAS/src/util \ - -I$(top_srcdir)/INTERTASK_INTERFACE \ - -I$(top_srcdir)/UTILS - -libudpserver_la_SOURCES = \ - udp_primitives_server.h udp_primitives_server.c \ No newline at end of file diff --git a/openair-cn/UDP/Makefile.eNB b/openair-cn/UDP/Makefile.eNB deleted file mode 100644 index 2d34681408..0000000000 --- a/openair-cn/UDP/Makefile.eNB +++ /dev/null @@ -1,69 +0,0 @@ -################################################################################ -# 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@eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ -# include $(OPENAIR_TARGETS)/SIMU/USER/Makerules - -OUTDIR = . - -libudp_OBJECTS = \ - udp_eNB_task.o - -# pull in dependency info for *existing* .o files --include $(OUTDIR)/*.d - -CFLAGS = \ - -Wall \ - $(UDP_CFLAGS) \ - -DENB_MODE \ - -Werror=uninitialized \ - -Werror=implicit-function-declaration - -$(OUTDIR)/%.o : %.c - @echo "Compiling $<" - @if [ ! -d $(dir $@) ]; then mkdir -p $(dir $@); fi; - @$(CC) -c $(CFLAGS) -o $@ $< - @$(CC) -MM $(CFLAGS) $< > $(basename $@).d - @mv -f $(basename $@).d $(basename $@).d.tmp - @sed -e 's|.*:|$@:|' < $(basename $@).d.tmp > $(basename $@).d - @sed -e 's/.*://' -e 's/\\$$//' < $(basename $@).d.tmp | fmt -1 | \ - sed -e 's/^ *//' -e 's/$$/:/' >> $(basename $@).d - @rm -f $(basename $@).d.tmp - -objsdir: - @if [ ! -d $(OUTDIR) ]; then mkdir -p $(OUTDIR); fi; - -$(OUTDIR)/libudp.a: $(addprefix $(OUTDIR)/,$(libudp_OBJECTS)) - @echo Creating UDP archive - @$(AR) rcs $@ $(addprefix $(OUTDIR)/,$(libudp_OBJECTS)) - -clean: - @$(RM_F_V) $(OUTDIR)/*.o - @$(RM_F_V) $(OUTDIR)/*.d - @$(RM_F_V) $(OUTDIR)/libudp.a - -cleanall: clean diff --git a/openair-cn/UDP/udp_eNB_task.c b/openair-cn/UDP/udp_eNB_task.c index 32b3317fcf..3e53f9f62f 100644 --- a/openair-cn/UDP/udp_eNB_task.c +++ b/openair-cn/UDP/udp_eNB_task.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/UDP/udp_eNB_task.h b/openair-cn/UDP/udp_eNB_task.h index 89a79e57a4..37ff413bf7 100644 --- a/openair-cn/UDP/udp_eNB_task.h +++ b/openair-cn/UDP/udp_eNB_task.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair-cn/UDP/udp_primitives_server.c b/openair-cn/UDP/udp_primitives_server.c deleted file mode 100644 index 6639331ee8..0000000000 --- a/openair-cn/UDP/udp_primitives_server.c +++ /dev/null @@ -1,457 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/*! \file udp_primitives_server.c -* \brief -* \author Sebastien ROUX, Lionel Gauthier -* \company Eurecom -* \email: lionel.gauthier@eurecom.fr -*/ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <errno.h> -#include <sys/time.h> - -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/inet.h> -#include <fcntl.h> - - -#include <pthread.h> - -#include "intertask_interface.h" -#include "udp_primitives_server.h" - -#include "assertions.h" -#include "conversions.h" -#include "msc.h" - -#define UDP_DEBUG(x, args...) do { fprintf(stdout, "[UDP] [D]"x, ##args); } while(0) -#define UDP_ERROR(x, args...) do { fprintf(stderr, "[UDP] [E]"x, ##args); } while(0) - -//void *udp_receiver_thread(void *args_p); - -struct udp_socket_desc_s { - uint8_t buffer[4096]; - int sd; /* Socket descriptor to use */ - - pthread_t listener_thread; /* Thread affected to recv */ - - char *local_address; /* Local ipv4 address to use */ - uint16_t local_port; /* Local port to use */ - - task_id_t task_id; /* Task who has requested the new endpoint */ - - STAILQ_ENTRY(udp_socket_desc_s) entries; -}; - -static STAILQ_HEAD(udp_socket_list_s, udp_socket_desc_s) udp_socket_list; -static pthread_mutex_t udp_socket_list_mutex = PTHREAD_MUTEX_INITIALIZER; - -//----------------------------------------------------------------------------- -void udp_print_hex_octets(unsigned char* dataP, unsigned long sizeP) -//----------------------------------------------------------------------------- -{ - unsigned long octet_index = 0; - unsigned long buffer_marker = 0; - unsigned char aindex; -#define UDP_2_PRINT_BUFFER_LEN 8000 - char udp_2_print_buffer[UDP_2_PRINT_BUFFER_LEN]; - struct timeval tv; - struct timezone tz; - char timeofday[64]; - - unsigned int h,m,s; - - if (dataP == NULL) { - return; - } - - gettimeofday(&tv, &tz); - h = tv.tv_sec/3600/24; - m = (tv.tv_sec / 60) % 60; - s = tv.tv_sec % 60; - snprintf(timeofday, 64, "%02d:%02d:%02d.%06d", h,m,s,tv.tv_usec); - - UDP_DEBUG("%s------+-------------------------------------------------|\n",timeofday); - UDP_DEBUG("%s | 0 1 2 3 4 5 6 7 8 9 a b c d e f |\n",timeofday); - UDP_DEBUG("%s------+-------------------------------------------------|\n",timeofday); - - for (octet_index = 0; octet_index < sizeP; octet_index++) { - if (UDP_2_PRINT_BUFFER_LEN < (buffer_marker + 32)) { - buffer_marker+=snprintf(&udp_2_print_buffer[buffer_marker], UDP_2_PRINT_BUFFER_LEN - buffer_marker, - "... (print buffer overflow)"); - UDP_DEBUG("%s%s",timeofday,udp_2_print_buffer); - return; - } - - if ((octet_index % 16) == 0) { - if (octet_index != 0) { - buffer_marker+=snprintf(&udp_2_print_buffer[buffer_marker], UDP_2_PRINT_BUFFER_LEN - buffer_marker, " |\n"); - UDP_DEBUG("%s%s",timeofday, udp_2_print_buffer); - buffer_marker = 0; - } - - buffer_marker+=snprintf(&udp_2_print_buffer[buffer_marker], UDP_2_PRINT_BUFFER_LEN - buffer_marker, " %04ld |", octet_index); - } - - /* - * Print every single octet in hexadecimal form - */ - buffer_marker+=snprintf(&udp_2_print_buffer[buffer_marker], UDP_2_PRINT_BUFFER_LEN - buffer_marker, " %02x", dataP[octet_index]); - /* - * Align newline and pipes according to the octets in groups of 2 - */ - } - - /* - * Append enough spaces and put final pipe - */ - for (aindex = octet_index; aindex < 16; ++aindex) - buffer_marker+=snprintf(&udp_2_print_buffer[buffer_marker], UDP_2_PRINT_BUFFER_LEN - buffer_marker, " "); - - //GTPU_DEBUG(" "); - buffer_marker+=snprintf(&udp_2_print_buffer[buffer_marker], UDP_2_PRINT_BUFFER_LEN - buffer_marker, " |\n"); - UDP_DEBUG("%s%s",timeofday,udp_2_print_buffer); -} - - -static void udp_server_receive_and_process(struct udp_socket_desc_s *udp_sock_pP); - - -/* @brief Retrieve the descriptor associated with the task_id - */ -static -struct udp_socket_desc_s *udp_server_get_socket_desc(task_id_t task_id) -{ - struct udp_socket_desc_s *udp_sock_p = NULL; - - UDP_DEBUG("Looking for task %d\n", task_id); - - STAILQ_FOREACH(udp_sock_p, &udp_socket_list, entries) { - if (udp_sock_p->task_id == task_id) { - UDP_DEBUG("Found matching task desc\n"); - break; - } - } - return udp_sock_p; -} -static -struct udp_socket_desc_s *udp_server_get_socket_desc_by_sd(int sdP) -{ - struct udp_socket_desc_s *udp_sock_p = NULL; - - UDP_DEBUG("Looking for sd %d\n", sdP); - - STAILQ_FOREACH(udp_sock_p, &udp_socket_list, entries) { - if (udp_sock_p->sd == sdP) { - UDP_DEBUG("Found matching task desc\n"); - break; - } - } - return udp_sock_p; -} - -static -int udp_server_create_socket(int port, char *address, task_id_t task_id) -{ - struct sockaddr_in addr; - int sd; - - struct udp_socket_desc_s *socket_desc_p = NULL; - - UDP_DEBUG("Creating new listen socket on address "IPV4_ADDR" and port %u\n", - IPV4_ADDR_FORMAT(inet_addr(address)), port); - - /* Create UDP socket */ - if ((sd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { - /* Socket creation has failed... */ - UDP_ERROR("Socket creation failed (%s)\n", strerror(errno)); - return sd; - } - - memset(&addr, 0, sizeof(struct sockaddr_in)); - addr.sin_family = AF_INET; - addr.sin_port = htons(port); - addr.sin_addr.s_addr = inet_addr(address); - - if (bind(sd, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) < 0) { - /* Bind failed */ - UDP_ERROR("Socket bind failed (%s) for address "IPV4_ADDR" and port %u\n", - strerror(errno), IPV4_ADDR_FORMAT(inet_addr(address)), port); - close(sd); - return -1; - } - - /* Add the socket to list of fd monitored by ITTI */ - /* Mark the socket as non-blocking */ - if (fcntl(sd, F_SETFL, O_NONBLOCK) < 0) { - UDP_ERROR("fcntl F_SETFL O_NONBLOCK failed: %s\n", - strerror(errno)); - close(sd); - return -1; - } - - socket_desc_p = calloc(1, sizeof(struct udp_socket_desc_s)); - DevAssert(socket_desc_p != NULL); - socket_desc_p->sd = sd; - socket_desc_p->local_address = address; - socket_desc_p->local_port = port; - socket_desc_p->task_id = task_id; - UDP_DEBUG("Inserting new descriptor for task %d, sd %d\n", - socket_desc_p->task_id, socket_desc_p->sd); - pthread_mutex_lock(&udp_socket_list_mutex); - STAILQ_INSERT_TAIL(&udp_socket_list, socket_desc_p, entries); - pthread_mutex_unlock(&udp_socket_list_mutex); - - itti_subscribe_event_fd(TASK_UDP, sd); - - return sd; -} - -static void udp_server_flush_sockets(struct epoll_event *events, int nb_events) -{ - int event; - struct udp_socket_desc_s *udp_sock_p = NULL; - - UDP_DEBUG("Received %d events\n", nb_events); - - for (event = 0; event < nb_events; event++) { - if (events[event].events != 0) { - /* If the event has not been yet been processed (not an itti message) */ - pthread_mutex_lock(&udp_socket_list_mutex); - udp_sock_p = udp_server_get_socket_desc_by_sd(events[event].data.fd); - - if (udp_sock_p != NULL) { - udp_server_receive_and_process(udp_sock_p); - } else { - UDP_ERROR("Failed to retrieve the udp socket descriptor %d", - events[event].data.fd); - } - - pthread_mutex_unlock(&udp_socket_list_mutex); - } - } -} - -static void udp_server_receive_and_process(struct udp_socket_desc_s *udp_sock_pP) -{ - UDP_DEBUG("Inserting new descriptor for task %d, sd %d\n", - udp_sock_pP->task_id, udp_sock_pP->sd); - - { - int bytes_received = 0; - socklen_t from_len; - struct sockaddr_in addr; - - from_len = (socklen_t)sizeof(struct sockaddr_in); - - if ((bytes_received = recvfrom(udp_sock_pP->sd, udp_sock_pP->buffer, sizeof(udp_sock_pP->buffer), 0, - (struct sockaddr *)&addr, &from_len)) <= 0) { - UDP_ERROR("Recvfrom failed %s\n", strerror(errno)); - //break; - } else { - MessageDef *message_p = NULL; - udp_data_ind_t *udp_data_ind_p; - uint8_t *forwarded_buffer = NULL; - - AssertFatal(sizeof(udp_sock_pP->buffer) >= bytes_received, "UDP BUFFER OVERFLOW"); - - forwarded_buffer = itti_malloc(TASK_UDP, udp_sock_pP->task_id, bytes_received); - - DevAssert(forwarded_buffer != NULL); - - memcpy(forwarded_buffer, udp_sock_pP->buffer, bytes_received); - - message_p = itti_alloc_new_message(TASK_UDP, UDP_DATA_IND); - - DevAssert(message_p != NULL); - - udp_data_ind_p = &message_p->ittiMsg.udp_data_ind; - - udp_data_ind_p->buffer = forwarded_buffer; - udp_data_ind_p->buffer_length = bytes_received; - udp_data_ind_p->peer_port = htons(addr.sin_port); - udp_data_ind_p->peer_address = addr.sin_addr.s_addr; - - UDP_DEBUG("Msg of length %d received from %s:%u\n", - bytes_received, inet_ntoa(addr.sin_addr), ntohs(addr.sin_port)); - - if (itti_send_msg_to_task(udp_sock_pP->task_id, INSTANCE_DEFAULT, message_p) < 0) { - UDP_DEBUG("Failed to send message %d to task %d\n", - UDP_DATA_IND, udp_sock_pP->task_id); - //break; - } - } - } - //close(udp_sock_pP->sd); - //udp_sock_pP->sd = -1; - - //pthread_mutex_lock(&udp_socket_list_mutex); - //STAILQ_REMOVE(&udp_socket_list, udp_sock_pP, udp_socket_desc_s, entries); - //pthread_mutex_unlock(&udp_socket_list_mutex); - - //return NULL; -} - - -static void *udp_intertask_interface(void *args_p) -{ - int rc = 0; - int nb_events = 0; - struct epoll_event *events = NULL; - - itti_mark_task_ready(TASK_UDP); - MSC_START_USE(); - - while(1) { - MessageDef *received_message_p = NULL; - itti_receive_msg(TASK_UDP, &received_message_p); - - if (received_message_p != NULL) { - - switch (ITTI_MSG_ID(received_message_p)) { - case UDP_INIT: { - udp_init_t *udp_init_p; - udp_init_p = &received_message_p->ittiMsg.udp_init; - rc = udp_server_create_socket( - udp_init_p->port, - udp_init_p->address, - ITTI_MSG_ORIGIN_ID(received_message_p)); - } - break; - - case UDP_DATA_REQ: { - int udp_sd = -1; - ssize_t bytes_written; - - struct udp_socket_desc_s *udp_sock_p = NULL; - udp_data_req_t *udp_data_req_p; - struct sockaddr_in peer_addr; - - udp_data_req_p = &received_message_p->ittiMsg.udp_data_req; - - //UDP_DEBUG("-- UDP_DATA_REQ -----------------------------------------------------\n%s :\n", - // __FUNCTION__); - //udp_print_hex_octets(&udp_data_req_p->buffer[udp_data_req_p->buffer_offset], - // udp_data_req_p->buffer_length); - - memset(&peer_addr, 0, sizeof(struct sockaddr_in)); - - peer_addr.sin_family = AF_INET; - peer_addr.sin_port = htons(udp_data_req_p->peer_port); - peer_addr.sin_addr.s_addr = udp_data_req_p->peer_address; - - pthread_mutex_lock(&udp_socket_list_mutex); - udp_sock_p = udp_server_get_socket_desc(ITTI_MSG_ORIGIN_ID(received_message_p)); - - if (udp_sock_p == NULL) { - UDP_ERROR("Failed to retrieve the udp socket descriptor " - "associated with task %d\n", ITTI_MSG_ORIGIN_ID(received_message_p)); - pthread_mutex_unlock(&udp_socket_list_mutex); - - if (udp_data_req_p->buffer) { - itti_free(ITTI_MSG_ORIGIN_ID(received_message_p),udp_data_req_p->buffer); - } - - goto on_error; - } - - udp_sd = udp_sock_p->sd; - pthread_mutex_unlock(&udp_socket_list_mutex); - - UDP_DEBUG("[%d] Sending message of size %u to "IPV4_ADDR" and port %u\n", - udp_sd, udp_data_req_p->buffer_length, - IPV4_ADDR_FORMAT(udp_data_req_p->peer_address), - udp_data_req_p->peer_port); - - bytes_written = sendto(udp_sd, &udp_data_req_p->buffer[udp_data_req_p->buffer_offset], - udp_data_req_p->buffer_length, 0, - (struct sockaddr *)&peer_addr, - sizeof(struct sockaddr_in)); - - itti_free(ITTI_MSG_ORIGIN_ID(received_message_p),udp_data_req_p->buffer); - - if (bytes_written != udp_data_req_p->buffer_length) { - UDP_ERROR("There was an error while writing to socket " - "(%d:%s)\n", errno, strerror(errno)); - } - } - break; - - case TERMINATE_MESSAGE: { - itti_exit_task(); - } - break; - - case MESSAGE_TEST: { - } break; - - default: { - UDP_DEBUG("Unkwnon message ID %d:%s\n", - ITTI_MSG_ID(received_message_p), ITTI_MSG_NAME(received_message_p)); - } - break; - } - -on_error: - rc = itti_free(ITTI_MSG_ORIGIN_ID(received_message_p), received_message_p); - AssertFatal(rc == EXIT_SUCCESS, "Failed to free memory (%d)!\n", rc); - received_message_p = NULL; - } - - nb_events = itti_get_events(TASK_UDP, &events); - - if ((nb_events > 0) && (events != NULL)) { - /* Now handle notifications for other sockets */ - udp_server_flush_sockets(events, nb_events); - } - } - - return NULL; -} - -int udp_init(const mme_config_t *mme_config_p) -{ - UDP_DEBUG("Initializing UDP task interface\n"); - - STAILQ_INIT(&udp_socket_list); - - if (itti_create_task(TASK_UDP, &udp_intertask_interface, - NULL) < 0) { - UDP_ERROR("udp pthread_create (%s)\n", strerror(errno)); - return -1; - } - - UDP_DEBUG("Initializing UDP task interface: DONE\n"); - return 0; -} diff --git a/openair-cn/UDP/udp_primitives_server.h b/openair-cn/UDP/udp_primitives_server.h deleted file mode 100644 index 7ab514c068..0000000000 --- a/openair-cn/UDP/udp_primitives_server.h +++ /dev/null @@ -1,45 +0,0 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/*! \file udp_primitives_server.c -* \brief -* \author Sebastien ROUX -* \company Eurecom -* \email: -*/ -#include "mme_config.h" - -#ifndef UDP_PRIMITIVES_SERVER_H_ -#define UDP_PRIMITIVES_SERVER_H_ - -/** \brief UDP task init function. - @returns -1 on error, 0 otherwise. - **/ -int udp_init(const mme_config_t *mme_config); - -#endif /* UDP_PRIMITIVES_SERVER_H_ */ diff --git a/openair-cn/UTILS/CONF/COPYING b/openair-cn/UTILS/CONF/COPYING index 94a9ed024d..e69de29bb2 100644 --- a/openair-cn/UTILS/CONF/COPYING +++ b/openair-cn/UTILS/CONF/COPYING @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program 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. - - This program 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 this program. If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - <program> Copyright (C) <year> <name of author> - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<http://www.gnu.org/licenses/>. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<http://www.gnu.org/philosophy/why-not-lgpl.html>. diff --git a/openair-cn/UTILS/COPYING b/openair-cn/UTILS/COPYING index 94a9ed024d..c888423064 100644 --- a/openair-cn/UTILS/COPYING +++ b/openair-cn/UTILS/COPYING @@ -1,674 +1,28 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program 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. - - This program 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 this program. If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - <program> Copyright (C) <year> <name of author> - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<http://www.gnu.org/licenses/>. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<http://www.gnu.org/philosophy/why-not-lgpl.html>. +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ \ No newline at end of file diff --git a/openair-cn/UTILS/HASHTABLE/COPYING b/openair-cn/UTILS/HASHTABLE/COPYING index 94a9ed024d..e69de29bb2 100644 --- a/openair-cn/UTILS/HASHTABLE/COPYING +++ b/openair-cn/UTILS/HASHTABLE/COPYING @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program 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. - - This program 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 this program. If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - <program> Copyright (C) <year> <name of author> - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<http://www.gnu.org/licenses/>. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<http://www.gnu.org/philosophy/why-not-lgpl.html>. diff --git a/openair-cn/UTILS/HASHTABLE/Makefile.am b/openair-cn/UTILS/HASHTABLE/Makefile.am index 3eb39c51e3..d6bdbbc3c8 100755 --- a/openair-cn/UTILS/HASHTABLE/Makefile.am +++ b/openair-cn/UTILS/HASHTABLE/Makefile.am @@ -1,31 +1,4 @@ -################################################################################ -# 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@eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ + AM_CFLAGS = @ADD_CFLAGS@ \ -I$(top_srcdir)/COMMON diff --git a/openair-cn/UTILS/HASHTABLE/Makefile.eNB b/openair-cn/UTILS/HASHTABLE/Makefile.eNB index 795ceabdea..2cde7da837 100755 --- a/openair-cn/UTILS/HASHTABLE/Makefile.eNB +++ b/openair-cn/UTILS/HASHTABLE/Makefile.eNB @@ -1,31 +1,4 @@ -################################################################################ -# 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@eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ + all: libhashtable.a libhashtable_OBJECTS = \ diff --git a/openair-cn/UTILS/HASHTABLE/hashtable.c b/openair-cn/UTILS/HASHTABLE/hashtable.c index 48d806cd0f..a557211b23 100755 --- a/openair-cn/UTILS/HASHTABLE/hashtable.c +++ b/openair-cn/UTILS/HASHTABLE/hashtable.c @@ -1,5 +1,33 @@ /* from: http://en.literateprograms.org/Hash_table_%28C%29#chunk%20def:node + * Original licence Creative Commons CC0 1.0 Waiver. + */ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. */ #include <string.h> #include <stdio.h> diff --git a/openair-cn/UTILS/HASHTABLE/hashtable.h b/openair-cn/UTILS/HASHTABLE/hashtable.h index 83b5d310b5..051a2929b0 100755 --- a/openair-cn/UTILS/HASHTABLE/hashtable.h +++ b/openair-cn/UTILS/HASHTABLE/hashtable.h @@ -1,3 +1,34 @@ +/* from: http://en.literateprograms.org/Hash_table_%28C%29#chunk%20def:node + * Original licence Creative Commons CC0 1.0 Waiver.(http://creativecommons.org/publicdomain/zero/1.0/) + */ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #ifndef _UTILS_COLLECTION_HASH_TABLE_H_ #define _UTILS_COLLECTION_HASH_TABLE_H_ #include<stdlib.h> diff --git a/openair-cn/UTILS/HASHTABLE/obj_hashtable.c b/openair-cn/UTILS/HASHTABLE/obj_hashtable.c index 12b49577c4..55e86cd8f3 100755 --- a/openair-cn/UTILS/HASHTABLE/obj_hashtable.c +++ b/openair-cn/UTILS/HASHTABLE/obj_hashtable.c @@ -1,5 +1,30 @@ -/* from: http://en.literateprograms.org/Hash_table_%28C%29#chunk%20def:node +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. */ #include <string.h> #include <stdio.h> diff --git a/openair-cn/UTILS/HASHTABLE/obj_hashtable.h b/openair-cn/UTILS/HASHTABLE/obj_hashtable.h index d11a67e264..d74e1e97d4 100755 --- a/openair-cn/UTILS/HASHTABLE/obj_hashtable.h +++ b/openair-cn/UTILS/HASHTABLE/obj_hashtable.h @@ -1,3 +1,31 @@ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #ifndef _OBJ_HASH_TABLE_H_ #define _OBJ_HASH_TABLE_H_ #include<stdlib.h> diff --git a/openair-cn/UTILS/Makefile.am b/openair-cn/UTILS/Makefile.am index f2a5d57fee..2e0e686086 100644 --- a/openair-cn/UTILS/Makefile.am +++ b/openair-cn/UTILS/Makefile.am @@ -1,31 +1,4 @@ -################################################################################ -# 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@eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ + SUBDIRS = . HASHTABLE AM_CFLAGS = @ADD_CFLAGS@ \ diff --git a/openair-cn/UTILS/conversions.c b/openair-cn/UTILS/conversions.c index 0cb30f10eb..f2c324568f 100644 --- a/openair-cn/UTILS/conversions.c +++ b/openair-cn/UTILS/conversions.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdlib.h> #include <stdint.h> #include <ctype.h> diff --git a/openair-cn/UTILS/conversions.h b/openair-cn/UTILS/conversions.h index 4762f93873..aaa2b9714f 100644 --- a/openair-cn/UTILS/conversions.h +++ b/openair-cn/UTILS/conversions.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include "assertions.h" diff --git a/openair-cn/UTILS/enum_string.c b/openair-cn/UTILS/enum_string.c index 29d0774776..cab5b0319e 100644 --- a/openair-cn/UTILS/enum_string.c +++ b/openair-cn/UTILS/enum_string.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/openair-cn/UTILS/enum_string.h b/openair-cn/UTILS/enum_string.h index 3b2c0d3621..c0a921c98e 100644 --- a/openair-cn/UTILS/enum_string.h +++ b/openair-cn/UTILS/enum_string.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #ifndef ENUM_STRING_H_ #define ENUM_STRING_H_ diff --git a/openair-cn/UTILS/log.c b/openair-cn/UTILS/log.c index 85577c35d6..6aebde8280 100644 --- a/openair-cn/UTILS/log.c +++ b/openair-cn/UTILS/log.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #if HAVE_CONFIG_H # include "config.h" #endif diff --git a/openair-cn/UTILS/log.h b/openair-cn/UTILS/log.h index 1147d9e8c2..34700522af 100644 --- a/openair-cn/UTILS/log.h +++ b/openair-cn/UTILS/log.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include "mme_config.h" #ifndef LOG_H_ diff --git a/openair-cn/UTILS/mcc_mnc_itu.c b/openair-cn/UTILS/mcc_mnc_itu.c index f842334aee..8c59b8e53a 100755 --- a/openair-cn/UTILS/mcc_mnc_itu.c +++ b/openair-cn/UTILS/mcc_mnc_itu.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <stdlib.h> #include <stdint.h> diff --git a/openair-cn/UTILS/mcc_mnc_itu.h b/openair-cn/UTILS/mcc_mnc_itu.h index 84daca6a42..b59db73720 100755 --- a/openair-cn/UTILS/mcc_mnc_itu.h +++ b/openair-cn/UTILS/mcc_mnc_itu.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ /***************************************************************************** Source mcc_mnc.h diff --git a/openair-cn/UTILS/mme_config.c b/openair-cn/UTILS/mme_config.c index c162199bb4..bc1a408312 100644 --- a/openair-cn/UTILS/mme_config.c +++ b/openair-cn/UTILS/mme_config.c @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #if HAVE_CONFIG_H # include "config.h" diff --git a/openair-cn/UTILS/mme_config.h b/openair-cn/UTILS/mme_config.h index 36ce25b169..5301a9c59d 100644 --- a/openair-cn/UTILS/mme_config.h +++ b/openair-cn/UTILS/mme_config.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #include <pthread.h> #include <stdint.h> diff --git a/openair-cn/UTILS/mme_default_values.h b/openair-cn/UTILS/mme_default_values.h index 25111aea60..779e5a4661 100644 --- a/openair-cn/UTILS/mme_default_values.h +++ b/openair-cn/UTILS/mme_default_values.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ #ifndef MME_DEFAULT_VALUES_H_ #define MME_DEFAULT_VALUES_H_ diff --git a/openair-cn/autogen.sh b/openair-cn/autogen.sh deleted file mode 100755 index dc425bedc0..0000000000 --- a/openair-cn/autogen.sh +++ /dev/null @@ -1,8 +0,0 @@ -#! /bin/sh - -(cd GTPV2-C/nwgtpv2c-0.11 && libtoolize && autoreconf --install --force) - -aclocal \ -&& autoheader \ -&& automake --add-missing \ -&& autoconf \ No newline at end of file diff --git a/openair-cn/configure.ac b/openair-cn/configure.ac deleted file mode 100644 index 0d5b740fe6..0000000000 --- a/openair-cn/configure.ac +++ /dev/null @@ -1,427 +0,0 @@ -################################################################################ -# 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@eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ -AC_PREREQ([2.68]) - -define([svnversion], esyscmd([sh -c "svnversion ..|tr -d '\n'"])) - -AC_DEFINE(SVN_REVISION, "svnversion", [SVN Revision]) - -AC_INIT([oai_epc], [0.3.svnversion], [openair_admin@eurecom.fr]) -AC_CANONICAL_BUILD -AC_CANONICAL_TARGET - -AM_INIT_AUTOMAKE([1.11 silent-rules]) - -AC_CONFIG_MACRO_DIR([m4]) - -AC_CONFIG_HEADERS([config.h]) - -AM_MAINTAINER_MODE - -AM_SILENT_RULES([yes]) - -AM_PROG_LIBTOOL -AM_PROG_LEX - -dnl *** Autoconf support *** -AC_ARG_ENABLE(autoconf, - [ --disable-autoconf disable automatic generation of configure script ], - enable_autoconf=$enableval, enable_autoconf=yes -) -AC_PATH_PROG(AUTOCONF, autoconf, @echo autoconf not available) -AC_PATH_PROG(AUTOHEADER, autoheader, @echo autoheader not available) -if test -z "$AUTOCONF"; then enable_autoconf=no ; fi -if test -z "$AUTOHEADER"; then enable_autoconf=no ; fi -if test x$enable_autoconf = xyes; then - CONFIGURE_DEPENDS="configure.in aclocal.m4" -fi -AC_SUBST(CONFIGURE_DEPENDS) - -AC_CHECK_PROGS([DOXYGEN], [doxygen]) -if test -z "$DOXYGEN"; then - AC_MSG_WARN([Doxygen not found - continuing without Doxygen support]) -else - # Check for presence of pdfLaTeX - AC_CHECK_PROG(PDFLATEX, pdflatex, pdflatex) - if test -z "$PDFLATEX"; then - AC_MSG_WARN([Unable to create PDF version of the user manual.]) - fi -fi -AM_CONDITIONAL([HAVE_PDFLATEX], test -n "$PDFLATEX") - -dnl ***asn1c support*** -AC_CHECK_PROG(ASN1C_CHECK, asn1c, yes, [AC_MSG_ERROR(Please install asn1c before going further.)]) - -# Checks for programs. -AC_PROG_CXX -AC_PROG_AWK -AC_PROG_CC -AC_PROG_CPP -AC_PROG_INSTALL -AC_PROG_LN_S -AC_PROG_MAKE_SET -AC_PROG_MKDIR_P -AC_PROG_YACC -AC_PROG_RANLIB - -AC_CHECK_HEADERS([arpa/inet.h fcntl.h float.h inttypes.h limits.h malloc.h]) -AC_CHECK_HEADERS([netinet/in.h stddef.h stdint.h stdlib.h string.h libintl.h]) -AC_CHECK_HEADERS([sys/time.h sys/ioctl.h sys/socket.h unistd.h]) -AC_CHECK_HEADERS([netdb.h termios.h]) - -# Checks for library functions. -AC_FUNC_MMAP -AC_FUNC_MALLOC -AC_FUNC_ALLOCA -AC_FUNC_REALLOC -AC_FUNC_STRTOD -AC_CHECK_FUNCS([ftruncate inet_ntoa memchr memmove memset munmap select socket]) -AC_CHECK_FUNCS([strdup strerror strspn strchr strstr]) -AC_CHECK_FUNCS([gethostname gethostbyname]) - -# Checks for typedefs, structures, and compiler characteristics. -AC_C_INLINE -AC_TYPE_INT8_T -AC_TYPE_INT16_T -AC_TYPE_INT32_T -AC_TYPE_INT64_T -AC_TYPE_OFF_T -AC_TYPE_SIZE_T -AC_TYPE_SSIZE_T -AC_TYPE_UINT8_T -AC_TYPE_UINT16_T -AC_TYPE_UINT32_T -AC_TYPE_UINT64_T - -AC_CHECK_TYPES([ptrdiff_t]) - -dnl *** libsctp-dev support *** -AC_CHECK_LIB([sctp], [sctp_sendmsg], [], - [AC_MSG_ERROR([libsctp-dev needed!])]) - -dnl *** pthread support *** -AC_CHECK_LIB([pthread], [pthread_mutex_init], [], - [AC_MSG_ERROR(pthread library needed!)]) - -dnl *** real time support *** -AC_CHECK_LIB([rt], [timer_create], [], - [AC_MSG_ERROR(rt library needed!)]) - -dnl *** Cryptographic lib nettle support *** -PKG_CHECK_MODULES(nettle, [nettle >= 2.5], - [HAVE_NETTLE=true], - [AC_MSG_ERROR("Please install nettle >= 2.5")]) -CFLAGS="$CFLAGS $nettle_CFLAGS" -LIBS="$LIBS $nettle_LIBS" - -AC_ARG_ENABLE([standalone-epc], - AS_HELP_STRING([--enable-standalone-epc], - [Compile MME, SGW and PGW in a single executable]), - [], - [STANDALONE_EPC="yes"]) -AM_CONDITIONAL([STANDALONE_EPC], [test "x$enable_standalone_epc" = "xyes"]) -if test "x$enable_standalone_epc" = "xyes"; then - CFLAGS="$CFLAGS -DENABLE_STANDALONE_EPC" -else - CFLAGS="$CFLAGS -DDISABLE_STANDALONE_EPC" -fi - -dnl *** Add freediameter dependencies *** -AC_CHECK_LIB([fdcore], [fd_core_initialize], [], - [AC_MSG_ERROR(Free diameter lib not installed)]) -AC_CHECK_LIB([fdproto], [fd_msg_search_avp], [], - [AC_MSG_ERROR(Free diameter lib not installed)]) - -dnl *** Freediameter requirements *** -AC_CHECK_HEADERS([signalent.h]) -AC_CHECK_FUNCS([ntohll strndup]) -AC_DEFINE([HAVE_AI_ADDRCONFIG], [], - [Define to 1 if you have AI_ADDRCONFIG defined in netdb.h]) -AC_DEFINE([HAVE_CLOCK_GETTIME], [], - [Define to 1 if you have clock_gettime in librt]) -AC_DEFINE([HAVE_PTHREAD_BAR], [], - [Define to 1 if you have pthread_barrier_wait in libpthread]) -AC_DEFINE([SCTP_CONNECTX_4_ARGS], [], - [Define to 1 if sctp_connectx function accepts 4 arguments]) -AC_CHECK_LIB([rt], [clock_gettime], [AC_DEFINE(HAVE_CLOCK_GETTIME, 1)], []) -AC_CHECK_LIB([pthread], [pthread_barrier_wait], - [AC_DEFINE(HAVE_PTHREAD_BAR, 1)], []) -AC_CHECK_DECL([AI_ADDRCONFIG], - [AC_DEFINE(HAVE_AI_ADDRCONFIG, 1)], - [], [[#include <netdb.h>]]) -AC_MSG_CHECKING(if sctp_connectx accepts 4 arguments) -AC_LINK_IFELSE([ - AC_LANG_SOURCE( - [[int main() { return sctp_connectx(0, NULL, 0, NULL); }]]) -], [AC_DEFINE(SCTP_CONNECTX_4_ARGS, 1)]) -AC_CHECK_LIB([gnutls], - [gnutls_hash], - [AC_DEFINE(GNUTLS_VERSION_210, 1, - [Define to 1 if you have gnutls 2.10 installed])], - []) -AC_CHECK_LIB([gnutls], - [gnutls_x509_trust_list_verify_crt], - [AC_DEFINE(GNUTLS_VERSION_300, 1, - [Define to 1 if you have gnutls 3.0 installed])], - []) -AC_CHECK_LIB([gnutls], - [gnutls_handshake_set_timeout], - [AC_DEFINE(GNUTLS_VERSION_310, 1, - [Define to 1 if you have gnutls 3.1 installed])], - []) - -AC_DEFINE(FREE_DIAMETER_MINIMUM_VERSION, "1.1.5", [freeDiameter minimum version]) - -AC_SUBST(ADD_CFLAGS) - -dnl *** Enable r8 update *** -AC_ARG_ENABLE([r8], - AS_HELP_STRING([--enable-r8], [Disable 3GPP release 9 and 10 updates]), - [], - []) - -dnl *** Enable r9 update *** -AC_ARG_ENABLE([r9], - AS_HELP_STRING([--enable-r9], [Disable 3GPP release 10 updates]), - [], - []) - -dnl *** Disable NAS layer *** -AC_ARG_ENABLE([nas], - AS_HELP_STRING([--disable-nas], [Disable NAS layer]), - [CFLAGS="$CFLAGS -DDISABLE_USE_NAS"], - []) -AM_CONDITIONAL([DISABLE_USE_NAS], [test x$enable_nas == xno]) - -AC_ARG_ENABLE([s11], - AS_HELP_STRING([--disable-s11], [Disable S11 layer]), - [CFLAGS="$CFLAGS -DDISABLE_S11"], - []) -AM_CONDITIONAL([DISABLE_S11], [test x$enable_s11 == xno]) - - -dnl *** Enable GTPU IN KERNEL *** -AC_ARG_ENABLE([gtp1u_in_kernel], - AS_HELP_STRING([--enable-gtp1u-in-kernel], [Enable GTPU IN KERNEL]), - [case "${enableval}" in - yes) gtp1u_in_kernel=true; CFLAGS="$CFLAGS -DENABLE_USE_GTPU_IN_KERNEL" ;; - no ) gtp1u_in_kernel=false;; - *) AC_MSG_ERROR(bad value ${enableval} for --enable-gtp1u-in-kernel) ;; - esac], - [gtp1u_in_kernel=false]) - -dnl *** Enable PCAP for SGI *** -AC_ARG_ENABLE([pcap_for_sgi], - AS_HELP_STRING([--enable-pcap-for-sgi], [Enable PCAP for SGI layer]), - [case "${enableval}" in - yes) pcap_for_sgi=true; CFLAGS="$CFLAGS -DENABLE_USE_PCAP_FOR_SGI" ;; - no ) pcap_for_sgi=false;; - *) AC_MSG_ERROR(bad value ${enableval} for --enable-pcap-for-sgi) ;; - esac], - [pcap_for_sgi=false]) - -dnl *** Enable NETFILTER for SGI *** -AC_ARG_ENABLE([netfilter_for_sgi], - AS_HELP_STRING([--enable-netfilter-for-sgi], [Enable netfilter for SGI layer]), - [case "${enableval}" in - yes) netfilter_for_sgi=true; CFLAGS="$CFLAGS -DENABLE_USE_NETFILTER_FOR_SGI" ;; - no ) netfilter_for_sgi=false;; - *) AC_MSG_ERROR(bad value ${enableval} for --enable-netfilter-for-sgi) ;; - esac], - [netfilter_for_sgi=false]) - -dnl *** Enable RAW socket for SGI *** -AC_ARG_ENABLE([raw_socket_for_sgi], - AS_HELP_STRING([--enable-raw-socket-for-sgi], [Enable netfilter for SGI layer]), - [case "${enableval}" in - yes) raw_socket_for_sgi=true; CFLAGS="$CFLAGS -DENABLE_USE_RAW_SOCKET_FOR_SGI" ;; - no ) raw_socket_for_sgi=false;; - *) AC_MSG_ERROR(bad value ${enableval} for --enable-raw-socket-for-sgi) ;; - esac], - [if test x$pcap_for_sgi != xtrue && test x$netfilter_for_sgi != xtrue && test x$gtp1u_in_kernel != xtrue; then - raw_socket_for_sgi=true; CFLAGS="$CFLAGS -DENABLE_USE_RAW_SOCKET_FOR_SGI" - else - raw_socket_for_sgi=false - fi]) - -AM_CONDITIONAL([ENABLE_USE_PCAP_FOR_SGI], [test x$pcap_for_sgi == xtrue]) -AM_CONDITIONAL([ENABLE_USE_NETFILTER_FOR_SGI], [test x$netfilter_for_sgi == xtrue]) -AM_CONDITIONAL([ENABLE_USE_RAW_SOCKET_FOR_SGI], [test x$raw_socket_for_sgi == xtrue]) -AM_CONDITIONAL([ENABLE_USE_RAW_SOCKET_FOR_SGI], [ test x$pcap_for_sgi != xtrue && test x$netfilter_for_sgi != xtrue ]) -AM_CONDITIONAL([ENABLE_USE_GTPU_IN_KERNEL], [ test x$gtp1u_in_kernel == xtrue ]) -AM_CONDITIONAL([ENABLE_USE_GTPU_IN_KERNEL], [ test x$raw_socket_for_sgi == xtrue && x$pcap_for_sgi != xtrue && test x$netfilter_for_sgi != xtrue ]) - -AS_IF([test "x$enable_pcap_for_sgi" == "xyes"], [ - dnl *** libpcap support *** - AC_CHECK_LIB([pcap], [pcap_compile], [], [ - AC_MSG_ERROR([PCAP library needed.]) - ]) -]) - -AS_IF([test "x$enable_netfilter_for_sgi" == "xyes"], [ - dnl *** libnfnetlink support *** - AC_CHECK_LIB([nfnetlink], [nfnl_fd], [], - [AC_MSG_ERROR([libnfnetlink needed!])]) - - dnl *** libnetfilter_queue support *** - AC_CHECK_LIB([netfilter_queue], [nfq_open], [], - [AC_MSG_ERROR([libnetfilter_queue needed!])]) -]) - - -if test x$enable_r8 == xyes; then - ASN1DIR=R8.10 -else - if test x$enable_r9 == xyes; then - ASN1DIR=R9.8 - CFLAGS="$CFLAGS -DUPDATE_RELEASE_9" - else - ASN1DIR=R10.5 - CFLAGS="$CFLAGS -DUPDATE_RELEASE_9 -DUPDATE_RELEASE_10" - fi -fi -AC_DEFINE(ASN1_MINIMUM_VERSION, 924, [asn1c minimum version]) -AM_CONDITIONAL([UPDATE_RELEASE_9], [test x$enable_r8 != xyes]) -AM_CONDITIONAL([UPDATE_RELEASE_10], [test x$enable_r8 != xyes && test x$enable_r9 != xyes]) - -AC_SUBST(ASN1DIR) - -PKG_CHECK_MODULES(OPENSSL, - [openssl >= 1.0.1], - [HAVE_OPENSSL=true], - [AC_MSG_ERROR("Please install libcrypto >= 1.0.1")]) -CFLAGS="$CFLAGS $OPENSSL_CFLAGS" -LIBS="$LIBS $OPENSSL_LIBS" - -PKG_CHECK_MODULES(CHECK, [check >= 0.9.4], [HAVE_CHECK=true], [HAVE_CHECK=false]) -AM_CONDITIONAL(HAVE_CHECK, test x$HAVE_CHECK = xtrue) - -AC_CHECK_PROG(HAVE_GCCXML,gccxml,yes,no) -AM_CONDITIONAL(HAVE_GCCXML, test x$HAVE_GCCXML = xyes) - -dnl Add these flags -CFLAGS="$CFLAGS -Wall -g -O" -CFLAGS="$CFLAGS -Wcast-align" -CFLAGS="$CFLAGS -Wchar-subscripts" -CFLAGS="$CFLAGS -Wmissing-prototypes" -CFLAGS="$CFLAGS -Wmissing-declarations" -CFLAGS="$CFLAGS -Werror=shadow" -CFLAGS="$CFLAGS -Werror=implicit-function-declaration" - -dnl *** Check for endianness of platform *** -AC_C_BIGENDIAN -if test "x$ac_cv_c_bigendian" = "xyes"; then - CFLAGS="$CFLAGS -DBYTE_ORDER=BIG_ENDIAN" -else - CFLAGS="$CFLAGS -DBYTE_ORDER=LITTLE_ENDIAN" -fi - -dnl AC_SUBST([AM_CFLAGS]) - -dnl Doxygen section -AM_CONDITIONAL([HAVE_DOXYGEN], [test -n "$DOXYGEN"]) -AM_COND_IF([HAVE_DOXYGEN], [AC_CONFIG_FILES([DOCS/DOXYGEN/Doxyfile])]) - -dnl *** Retrieving hostname for substition in freediameter configuration file *** -HOSTNAME=$(uname -n) -AC_MSG_CHECKING([host name]) -AC_MSG_RESULT([$HOSTNAME]) -AC_SUBST([HOSTNAME]) - -AC_CONFIG_FILES( \ - GTPV1-U/Makefile \ - GTPV2-C/Makefile \ - INTERTASK_INTERFACE/Makefile \ - SGI/Makefile \ - NAS/Makefile \ - S11/Makefile \ - S1AP/MESSAGES/ASN1/Makefile \ - S1AP/MESSAGES/Makefile \ - S1AP/Makefile \ - S6A/Makefile \ - SCTP/Makefile \ - SECU/Makefile \ - SGW-LITE/Makefile \ - UTILS/CONF/s6a.conf \ - UTILS/HASHTABLE/Makefile \ - UTILS/Makefile \ - UDP/Makefile \ - MME_APP/Makefile \ - OAISIM_MME/Makefile \ - OAI_EPC/Makefile \ - OAI_SGW/Makefile \ - DOCS/DOXYGEN/Makefile \ - DOCS/Makefile \ - TEST/Makefile \ - Makefile \ -) - -dnl Call for configure script in gtpv2c subdir -AC_CONFIG_SUBDIRS([GTPV2-C/nwgtpv2c-0.11]) - -dnl configure makefiles -AC_OUTPUT - -echo " -($PACKAGE_NAME) version $PACKAGE_VERSION -Prefix.........: $prefix -C Compiler.....: $CC $CFLAGS -Linker.........: $LD $LDFLAGS $LIBS -Doxygen........: ${DOXYGEN:-no} -Tests..........: ${HAVE_CHECK} -GCCXML.........: ${HAVE_GCCXML} -Standalone ....: ${enable_standalone_epc:-no}" - -if test x$enable_r8 == xyes; then - echo "Release........: 8.10" -else - if test x$enable_r9 == xyes; then - echo "Release........: 9.8" - else - echo "Release........: 10.5" - fi -fi - -if test x$pcap_for_sgi == xtrue; then - echo "SGI pcap.......: yes" -fi - -if test x$netfilter_for_sgi == xtrue; then - echo "SGI netfilter..: yes" -fi - -if test x$raw_socket_for_sgi == xtrue; then - echo "SGI raw socket.: yes" -fi - -if test x$gtp1u_in_kernel == xtrue; then - echo "GTPU in kernel.: yes" -fi - - diff --git a/openair-cn/cppcheck.sh b/openair-cn/cppcheck.sh deleted file mode 100644 index ac79da8f2c..0000000000 --- a/openair-cn/cppcheck.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -cppcheck . --enable=all --xml --verbose --xml-version=2 -j4 2> err.xml diff --git a/openair1/MAC_INTERFACE/defs.h b/openair1/MAC_INTERFACE/defs.h index 8815a26430..dbaab57fcc 100755 --- a/openair1/MAC_INTERFACE/defs.h +++ b/openair1/MAC_INTERFACE/defs.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/MAC_INTERFACE/extern.h b/openair1/MAC_INTERFACE/extern.h index f1b3390db2..a7444939ee 100755 --- a/openair1/MAC_INTERFACE/extern.h +++ b/openair1/MAC_INTERFACE/extern.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/MAC_INTERFACE/init.c b/openair1/MAC_INTERFACE/init.c index 79c8b9d6b6..480d365f09 100644 --- a/openair1/MAC_INTERFACE/init.c +++ b/openair1/MAC_INTERFACE/init.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/MAC_INTERFACE/register.c b/openair1/MAC_INTERFACE/register.c index cb595b6577..0c3c611817 100644 --- a/openair1/MAC_INTERFACE/register.c +++ b/openair1/MAC_INTERFACE/register.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/MAC_INTERFACE/vars.h b/openair1/MAC_INTERFACE/vars.h index fece5ec4d6..e3ef7f6ab1 100755 --- a/openair1/MAC_INTERFACE/vars.h +++ b/openair1/MAC_INTERFACE/vars.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/CODING/3gpplte.c b/openair1/PHY/CODING/3gpplte.c index fd33bf999c..c1a862ebb3 100644 --- a/openair1/PHY/CODING/3gpplte.c +++ b/openair1/PHY/CODING/3gpplte.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/CODING/3gpplte_sse.c b/openair1/PHY/CODING/3gpplte_sse.c index c66a42016d..41c0f65dc3 100755 --- a/openair1/PHY/CODING/3gpplte_sse.c +++ b/openair1/PHY/CODING/3gpplte_sse.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/CODING/3gpplte_turbo_decoder.c b/openair1/PHY/CODING/3gpplte_turbo_decoder.c index ac70e94edd..9fba2ba899 100644 --- a/openair1/PHY/CODING/3gpplte_turbo_decoder.c +++ b/openair1/PHY/CODING/3gpplte_turbo_decoder.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse.c b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse.c index 6c5be7de91..67df01c437 100644 --- a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse.c +++ b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c index 96813c1072..702aee8656 100644 --- a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c +++ b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c index 6e1ae73d6e..ee78dd0773 100644 --- a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c +++ b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/CODING/TESTBENCH/ltetest.c b/openair1/PHY/CODING/TESTBENCH/ltetest.c index 3bd5871b76..b7b9fb4aab 100644 --- a/openair1/PHY/CODING/TESTBENCH/ltetest.c +++ b/openair1/PHY/CODING/TESTBENCH/ltetest.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/CODING/TESTBENCH/pdcch_test.c b/openair1/PHY/CODING/TESTBENCH/pdcch_test.c index adbecf3401..84ed605411 100644 --- a/openair1/PHY/CODING/TESTBENCH/pdcch_test.c +++ b/openair1/PHY/CODING/TESTBENCH/pdcch_test.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/CODING/TESTBENCH/viterbi_test.c b/openair1/PHY/CODING/TESTBENCH/viterbi_test.c index cc5ba08d29..efc07820f3 100644 --- a/openair1/PHY/CODING/TESTBENCH/viterbi_test.c +++ b/openair1/PHY/CODING/TESTBENCH/viterbi_test.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/CODING/ccoding_byte.c b/openair1/PHY/CODING/ccoding_byte.c index c6489008eb..cd626a8553 100755 --- a/openair1/PHY/CODING/ccoding_byte.c +++ b/openair1/PHY/CODING/ccoding_byte.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/CODING/ccoding_byte_lte.c b/openair1/PHY/CODING/ccoding_byte_lte.c index b399d0186b..12271fdceb 100644 --- a/openair1/PHY/CODING/ccoding_byte_lte.c +++ b/openair1/PHY/CODING/ccoding_byte_lte.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/CODING/crc_byte.c b/openair1/PHY/CODING/crc_byte.c index 747f94b0d7..e7ed05f411 100755 --- a/openair1/PHY/CODING/crc_byte.c +++ b/openair1/PHY/CODING/crc_byte.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/CODING/defs.h b/openair1/PHY/CODING/defs.h index 21767a1f33..acb6e8dd29 100644 --- a/openair1/PHY/CODING/defs.h +++ b/openair1/PHY/CODING/defs.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/CODING/extern.h b/openair1/PHY/CODING/extern.h index cf67c6c67b..0108dab386 100644 --- a/openair1/PHY/CODING/extern.h +++ b/openair1/PHY/CODING/extern.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/CODING/extern_3GPPinterleaver.h b/openair1/PHY/CODING/extern_3GPPinterleaver.h index a6a0fd02c6..bc521a59a3 100755 --- a/openair1/PHY/CODING/extern_3GPPinterleaver.h +++ b/openair1/PHY/CODING/extern_3GPPinterleaver.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/CODING/lte_interleaver.h b/openair1/PHY/CODING/lte_interleaver.h index 449a7c9efa..1199933a53 100644 --- a/openair1/PHY/CODING/lte_interleaver.h +++ b/openair1/PHY/CODING/lte_interleaver.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/CODING/lte_interleaver2.h b/openair1/PHY/CODING/lte_interleaver2.h index b573b373be..67b696a15f 100644 --- a/openair1/PHY/CODING/lte_interleaver2.h +++ b/openair1/PHY/CODING/lte_interleaver2.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/CODING/lte_interleaver_inline.h b/openair1/PHY/CODING/lte_interleaver_inline.h index 311dc0da25..5e71bd7081 100644 --- a/openair1/PHY/CODING/lte_interleaver_inline.h +++ b/openair1/PHY/CODING/lte_interleaver_inline.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/CODING/lte_rate_matching.c b/openair1/PHY/CODING/lte_rate_matching.c index 837665ceda..69697fc2e0 100644 --- a/openair1/PHY/CODING/lte_rate_matching.c +++ b/openair1/PHY/CODING/lte_rate_matching.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/CODING/lte_segmentation.c b/openair1/PHY/CODING/lte_segmentation.c index d0875cb883..a4409ee414 100644 --- a/openair1/PHY/CODING/lte_segmentation.c +++ b/openair1/PHY/CODING/lte_segmentation.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/CODING/rate_matching.c b/openair1/PHY/CODING/rate_matching.c index 619c5dae69..c14f22e2ac 100644 --- a/openair1/PHY/CODING/rate_matching.c +++ b/openair1/PHY/CODING/rate_matching.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/CODING/scrambler.h b/openair1/PHY/CODING/scrambler.h index f753289279..3718d8b456 100755 --- a/openair1/PHY/CODING/scrambler.h +++ b/openair1/PHY/CODING/scrambler.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/CODING/vars.h b/openair1/PHY/CODING/vars.h index 7caef4b403..98e63a43dc 100644 --- a/openair1/PHY/CODING/vars.h +++ b/openair1/PHY/CODING/vars.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/CODING/viterbi.c b/openair1/PHY/CODING/viterbi.c index 118e0ef2d8..cacc9ab2ff 100755 --- a/openair1/PHY/CODING/viterbi.c +++ b/openair1/PHY/CODING/viterbi.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/CODING/viterbi_lte.c b/openair1/PHY/CODING/viterbi_lte.c index 230b933f79..f5a174e53e 100644 --- a/openair1/PHY/CODING/viterbi_lte.c +++ b/openair1/PHY/CODING/viterbi_lte.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/INIT/defs.h b/openair1/PHY/INIT/defs.h index b63b31302e..f08ca678db 100644 --- a/openair1/PHY/INIT/defs.h +++ b/openair1/PHY/INIT/defs.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/INIT/extern.h b/openair1/PHY/INIT/extern.h index 7a5b283a8e..5c046434e6 100644 --- a/openair1/PHY/INIT/extern.h +++ b/openair1/PHY/INIT/extern.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/INIT/init_top.c b/openair1/PHY/INIT/init_top.c index c730654e6d..e0de14bbb8 100755 --- a/openair1/PHY/INIT/init_top.c +++ b/openair1/PHY/INIT/init_top.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/INIT/lte_init.c b/openair1/PHY/INIT/lte_init.c index 72c5d95629..c819704bd2 100644 --- a/openair1/PHY/INIT/lte_init.c +++ b/openair1/PHY/INIT/lte_init.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/INIT/lte_parms.c b/openair1/PHY/INIT/lte_parms.c index 6318c1625b..55bd964aa7 100644 --- a/openair1/PHY/INIT/lte_parms.c +++ b/openair1/PHY/INIT/lte_parms.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/INIT/vars.h b/openair1/PHY/INIT/vars.h index 7a5b283a8e..5c046434e6 100644 --- a/openair1/PHY/INIT/vars.h +++ b/openair1/PHY/INIT/vars.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_ESTIMATION/adjust_gain.c b/openair1/PHY/LTE_ESTIMATION/adjust_gain.c index dc1365734d..412f7cbae9 100644 --- a/openair1/PHY/LTE_ESTIMATION/adjust_gain.c +++ b/openair1/PHY/LTE_ESTIMATION/adjust_gain.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_ESTIMATION/defs.h b/openair1/PHY/LTE_ESTIMATION/defs.h index bc76c8a38a..10dc558c9b 100644 --- a/openair1/PHY/LTE_ESTIMATION/defs.h +++ b/openair1/PHY/LTE_ESTIMATION/defs.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_ESTIMATION/extern.h b/openair1/PHY/LTE_ESTIMATION/extern.h index f6edc6bb34..7f3cc6e31f 100644 --- a/openair1/PHY/LTE_ESTIMATION/extern.h +++ b/openair1/PHY/LTE_ESTIMATION/extern.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_ESTIMATION/filt96_32.h b/openair1/PHY/LTE_ESTIMATION/filt96_32.h index c92be225bd..a29a8c26fb 100644 --- a/openair1/PHY/LTE_ESTIMATION/filt96_32.h +++ b/openair1/PHY/LTE_ESTIMATION/filt96_32.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_ESTIMATION/freq_equalization.c b/openair1/PHY/LTE_ESTIMATION/freq_equalization.c index 595d1e7a48..8f1ffe0441 100755 --- a/openair1/PHY/LTE_ESTIMATION/freq_equalization.c +++ b/openair1/PHY/LTE_ESTIMATION/freq_equalization.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c b/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c index 63b3f27319..9425e94d02 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c b/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c index 6e853e6c58..10c0cef42a 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation_emos.c b/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation_emos.c index ea82b15aee..63223e5ff5 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation_emos.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation_emos.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_ESTIMATION/lte_dl_mbsfn_channel_estimation.c b/openair1/PHY/LTE_ESTIMATION/lte_dl_mbsfn_channel_estimation.c index 74072dc20a..dbb2ba231f 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_dl_mbsfn_channel_estimation.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_dl_mbsfn_channel_estimation.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_ESTIMATION/lte_eNB_measurements.c b/openair1/PHY/LTE_ESTIMATION/lte_eNB_measurements.c index 43ebd83941..9564b7842c 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_eNB_measurements.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_eNB_measurements.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_ESTIMATION/lte_est_freq_offset.c b/openair1/PHY/LTE_ESTIMATION/lte_est_freq_offset.c index b11ba532f5..6f1279b5b8 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_est_freq_offset.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_est_freq_offset.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c b/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c index 7c6254090f..9864a50ee2 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_ESTIMATION/lte_sync_timefreq.c b/openair1/PHY/LTE_ESTIMATION/lte_sync_timefreq.c index 37f5d26315..493583214a 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_sync_timefreq.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_sync_timefreq.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c b/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c index 0fa0fc4ce1..65c4214427 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c b/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c index 9a47a6b355..1d23bdca38 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_ESTIMATION/pss6144.h b/openair1/PHY/LTE_ESTIMATION/pss6144.h index aea275f77e..4903c84d62 100644 --- a/openair1/PHY/LTE_ESTIMATION/pss6144.h +++ b/openair1/PHY/LTE_ESTIMATION/pss6144.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_ESTIMATION/vars.h b/openair1/PHY/LTE_ESTIMATION/vars.h index f6edc6bb34..7f3cc6e31f 100644 --- a/openair1/PHY/LTE_ESTIMATION/vars.h +++ b/openair1/PHY/LTE_ESTIMATION/vars.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_REFSIG/defs.h b/openair1/PHY/LTE_REFSIG/defs.h index 2127380565..b48403ff99 100644 --- a/openair1/PHY/LTE_REFSIG/defs.h +++ b/openair1/PHY/LTE_REFSIG/defs.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_REFSIG/lte_dl_cell_spec.c b/openair1/PHY/LTE_REFSIG/lte_dl_cell_spec.c index 1a09c83372..6faf2e1ed0 100644 --- a/openair1/PHY/LTE_REFSIG/lte_dl_cell_spec.c +++ b/openair1/PHY/LTE_REFSIG/lte_dl_cell_spec.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_REFSIG/lte_dl_mbsfn.c b/openair1/PHY/LTE_REFSIG/lte_dl_mbsfn.c index 54b9a5442d..c3b141841a 100644 --- a/openair1/PHY/LTE_REFSIG/lte_dl_mbsfn.c +++ b/openair1/PHY/LTE_REFSIG/lte_dl_mbsfn.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_REFSIG/lte_dl_uespec.c b/openair1/PHY/LTE_REFSIG/lte_dl_uespec.c index b40f6ddfda..e7b3dd2ed1 100644 --- a/openair1/PHY/LTE_REFSIG/lte_dl_uespec.c +++ b/openair1/PHY/LTE_REFSIG/lte_dl_uespec.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_REFSIG/lte_gold.c b/openair1/PHY/LTE_REFSIG/lte_gold.c index 2463d73b79..567851a51a 100644 --- a/openair1/PHY/LTE_REFSIG/lte_gold.c +++ b/openair1/PHY/LTE_REFSIG/lte_gold.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_REFSIG/lte_gold_mbsfn.c b/openair1/PHY/LTE_REFSIG/lte_gold_mbsfn.c index 17f95cb9ee..0d14515776 100644 --- a/openair1/PHY/LTE_REFSIG/lte_gold_mbsfn.c +++ b/openair1/PHY/LTE_REFSIG/lte_gold_mbsfn.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_REFSIG/lte_ul_ref.c b/openair1/PHY/LTE_REFSIG/lte_ul_ref.c index be3902ec47..75599f4b71 100644 --- a/openair1/PHY/LTE_REFSIG/lte_ul_ref.c +++ b/openair1/PHY/LTE_REFSIG/lte_ul_ref.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_REFSIG/mod_table.h b/openair1/PHY/LTE_REFSIG/mod_table.h index e63be32c6f..5ae3efdea2 100644 --- a/openair1/PHY/LTE_REFSIG/mod_table.h +++ b/openair1/PHY/LTE_REFSIG/mod_table.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_REFSIG/primary_synch.h b/openair1/PHY/LTE_REFSIG/primary_synch.h index ff069e046b..f9cf6fc171 100644 --- a/openair1/PHY/LTE_REFSIG/primary_synch.h +++ b/openair1/PHY/LTE_REFSIG/primary_synch.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_TRANSPORT/dci.c b/openair1/PHY/LTE_TRANSPORT/dci.c index 43d2410cbb..2fd89c8f64 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci.c +++ b/openair1/PHY/LTE_TRANSPORT/dci.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_TRANSPORT/dci.h b/openair1/PHY/LTE_TRANSPORT/dci.h index d98984b2a1..e65352f5a0 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci.h +++ b/openair1/PHY/LTE_TRANSPORT/dci.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_TRANSPORT/dci_tools.c b/openair1/PHY/LTE_TRANSPORT/dci_tools.c index a0b4cba24e..a77501e14c 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/dci_tools.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_TRANSPORT/defs.h b/openair1/PHY/LTE_TRANSPORT/defs.h index 0d3d028c8a..a21693fea0 100644 --- a/openair1/PHY/LTE_TRANSPORT/defs.h +++ b/openair1/PHY/LTE_TRANSPORT/defs.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c index 46abdc8169..83066480b4 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c index 532570adf2..6ab784aa18 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c index 09210c64f0..3dc325861c 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c index f0a32e09b8..7425a4ed65 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c index 376ba35ed3..3b9c58ca1b 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c b/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c index 721a2e8cac..dd971748cb 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_tbs.h b/openair1/PHY/LTE_TRANSPORT/dlsch_tbs.h index 9d9c458e70..4a5520c371 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_tbs.h +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_tbs.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_tbs_full.h b/openair1/PHY/LTE_TRANSPORT/dlsch_tbs_full.h index e570ae950b..b2c32b8643 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_tbs_full.h +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_tbs_full.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_TRANSPORT/drs_modulation.c b/openair1/PHY/LTE_TRANSPORT/drs_modulation.c index b9baf48996..1b9df8046f 100644 --- a/openair1/PHY/LTE_TRANSPORT/drs_modulation.c +++ b/openair1/PHY/LTE_TRANSPORT/drs_modulation.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_TRANSPORT/extern.h b/openair1/PHY/LTE_TRANSPORT/extern.h index b4ca0a8bac..1fc6f7cb28 100644 --- a/openair1/PHY/LTE_TRANSPORT/extern.h +++ b/openair1/PHY/LTE_TRANSPORT/extern.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_TRANSPORT/group_hopping.c b/openair1/PHY/LTE_TRANSPORT/group_hopping.c index 6ab739abfc..992ac3088d 100644 --- a/openair1/PHY/LTE_TRANSPORT/group_hopping.c +++ b/openair1/PHY/LTE_TRANSPORT/group_hopping.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_TRANSPORT/initial_sync.c b/openair1/PHY/LTE_TRANSPORT/initial_sync.c index 69351e297f..bc2a00d8e6 100644 --- a/openair1/PHY/LTE_TRANSPORT/initial_sync.c +++ b/openair1/PHY/LTE_TRANSPORT/initial_sync.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_TRANSPORT/lte_mcs.c b/openair1/PHY/LTE_TRANSPORT/lte_mcs.c index 6e253c3b63..41d9ec72a6 100644 --- a/openair1/PHY/LTE_TRANSPORT/lte_mcs.c +++ b/openair1/PHY/LTE_TRANSPORT/lte_mcs.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_TRANSPORT/mcs_tbs_tools.h b/openair1/PHY/LTE_TRANSPORT/mcs_tbs_tools.h index 3ea5672336..36f965a5ff 100644 --- a/openair1/PHY/LTE_TRANSPORT/mcs_tbs_tools.h +++ b/openair1/PHY/LTE_TRANSPORT/mcs_tbs_tools.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_TRANSPORT/pbch.c b/openair1/PHY/LTE_TRANSPORT/pbch.c index 0582a63956..0eee263a10 100755 --- a/openair1/PHY/LTE_TRANSPORT/pbch.c +++ b/openair1/PHY/LTE_TRANSPORT/pbch.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_TRANSPORT/pcfich.c b/openair1/PHY/LTE_TRANSPORT/pcfich.c index 8e9038666b..f289fd3bd0 100644 --- a/openair1/PHY/LTE_TRANSPORT/pcfich.c +++ b/openair1/PHY/LTE_TRANSPORT/pcfich.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_TRANSPORT/phich.c b/openair1/PHY/LTE_TRANSPORT/phich.c index 68f625365a..e08ad239bd 100644 --- a/openair1/PHY/LTE_TRANSPORT/phich.c +++ b/openair1/PHY/LTE_TRANSPORT/phich.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_TRANSPORT/pilots.c b/openair1/PHY/LTE_TRANSPORT/pilots.c index 772a47e131..ba1eee293d 100644 --- a/openair1/PHY/LTE_TRANSPORT/pilots.c +++ b/openair1/PHY/LTE_TRANSPORT/pilots.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_TRANSPORT/pilots_mbsfn.c b/openair1/PHY/LTE_TRANSPORT/pilots_mbsfn.c index 7ddd0d9ca8..a81eb38480 100644 --- a/openair1/PHY/LTE_TRANSPORT/pilots_mbsfn.c +++ b/openair1/PHY/LTE_TRANSPORT/pilots_mbsfn.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_TRANSPORT/pmch.c b/openair1/PHY/LTE_TRANSPORT/pmch.c index fc5dee1db7..fbcec50333 100644 --- a/openair1/PHY/LTE_TRANSPORT/pmch.c +++ b/openair1/PHY/LTE_TRANSPORT/pmch.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_TRANSPORT/power_control.c b/openair1/PHY/LTE_TRANSPORT/power_control.c index e09af40bd9..339a1faefd 100644 --- a/openair1/PHY/LTE_TRANSPORT/power_control.c +++ b/openair1/PHY/LTE_TRANSPORT/power_control.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_TRANSPORT/prach.c b/openair1/PHY/LTE_TRANSPORT/prach.c index 527733cca5..25ecc392e8 100644 --- a/openair1/PHY/LTE_TRANSPORT/prach.c +++ b/openair1/PHY/LTE_TRANSPORT/prach.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_TRANSPORT/prach.h b/openair1/PHY/LTE_TRANSPORT/prach.h index a0a5dee254..98e8db2508 100644 --- a/openair1/PHY/LTE_TRANSPORT/prach.h +++ b/openair1/PHY/LTE_TRANSPORT/prach.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_TRANSPORT/print_stats.c b/openair1/PHY/LTE_TRANSPORT/print_stats.c index 2bc4fca53c..53ca875953 100644 --- a/openair1/PHY/LTE_TRANSPORT/print_stats.c +++ b/openair1/PHY/LTE_TRANSPORT/print_stats.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_TRANSPORT/proto.h b/openair1/PHY/LTE_TRANSPORT/proto.h index 4d8b2389fc..eb32aab24e 100644 --- a/openair1/PHY/LTE_TRANSPORT/proto.h +++ b/openair1/PHY/LTE_TRANSPORT/proto.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_TRANSPORT/pss.c b/openair1/PHY/LTE_TRANSPORT/pss.c index 859e297546..cb954dedb4 100644 --- a/openair1/PHY/LTE_TRANSPORT/pss.c +++ b/openair1/PHY/LTE_TRANSPORT/pss.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_TRANSPORT/pucch.c b/openair1/PHY/LTE_TRANSPORT/pucch.c index 4a72538dc0..2ed5694dd1 100644 --- a/openair1/PHY/LTE_TRANSPORT/pucch.c +++ b/openair1/PHY/LTE_TRANSPORT/pucch.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_TRANSPORT/rar_tools.c b/openair1/PHY/LTE_TRANSPORT/rar_tools.c index 7fa684e87a..1b789e1144 100644 --- a/openair1/PHY/LTE_TRANSPORT/rar_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/rar_tools.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_TRANSPORT/srs_modulation.c b/openair1/PHY/LTE_TRANSPORT/srs_modulation.c index 99ebc0582e..1edc98cf2c 100644 --- a/openair1/PHY/LTE_TRANSPORT/srs_modulation.c +++ b/openair1/PHY/LTE_TRANSPORT/srs_modulation.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_TRANSPORT/sss.c b/openair1/PHY/LTE_TRANSPORT/sss.c index ecc2661d75..e1e6463b37 100644 --- a/openair1/PHY/LTE_TRANSPORT/sss.c +++ b/openair1/PHY/LTE_TRANSPORT/sss.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_TRANSPORT/sss.h b/openair1/PHY/LTE_TRANSPORT/sss.h index 88f9b1ceb4..5b79f95610 100644 --- a/openair1/PHY/LTE_TRANSPORT/sss.h +++ b/openair1/PHY/LTE_TRANSPORT/sss.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_TRANSPORT/uci.h b/openair1/PHY/LTE_TRANSPORT/uci.h index d645b343fa..03580cf4c9 100644 --- a/openair1/PHY/LTE_TRANSPORT/uci.h +++ b/openair1/PHY/LTE_TRANSPORT/uci.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_TRANSPORT/uci_tools.c b/openair1/PHY/LTE_TRANSPORT/uci_tools.c index ef6a6767d7..1cccc4aaac 100644 --- a/openair1/PHY/LTE_TRANSPORT/uci_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/uci_tools.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c index 0dbe0874b7..606f2d8dfc 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c index 5774bc50be..25dae3ed63 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c index 9c3fcae306..606b2692d5 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_modulation.c b/openair1/PHY/LTE_TRANSPORT/ulsch_modulation.c index 46a49fb793..e9780ee92b 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_modulation.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_modulation.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/LTE_TRANSPORT/vars.h b/openair1/PHY/LTE_TRANSPORT/vars.h index d6dadbfcbf..c40633aff3 100644 --- a/openair1/PHY/LTE_TRANSPORT/vars.h +++ b/openair1/PHY/LTE_TRANSPORT/vars.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/MODULATION/defs.h b/openair1/PHY/MODULATION/defs.h index 3c2e1cad05..8d45c15e00 100644 --- a/openair1/PHY/MODULATION/defs.h +++ b/openair1/PHY/MODULATION/defs.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/MODULATION/extern.h b/openair1/PHY/MODULATION/extern.h index 80e61fcdce..f5be5682aa 100644 --- a/openair1/PHY/MODULATION/extern.h +++ b/openair1/PHY/MODULATION/extern.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/MODULATION/kHz_7_5.h b/openair1/PHY/MODULATION/kHz_7_5.h index 321991d4a2..2c07627b66 100644 --- a/openair1/PHY/MODULATION/kHz_7_5.h +++ b/openair1/PHY/MODULATION/kHz_7_5.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/MODULATION/ofdm_mod.c b/openair1/PHY/MODULATION/ofdm_mod.c index 11b3252558..61e5f9fb5b 100755 --- a/openair1/PHY/MODULATION/ofdm_mod.c +++ b/openair1/PHY/MODULATION/ofdm_mod.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/MODULATION/prach625Hz.h b/openair1/PHY/MODULATION/prach625Hz.h index 0c79fea9f4..5a114181e6 100644 --- a/openair1/PHY/MODULATION/prach625Hz.h +++ b/openair1/PHY/MODULATION/prach625Hz.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/MODULATION/slot_fep.c b/openair1/PHY/MODULATION/slot_fep.c index d97401903d..feb2d885b2 100644 --- a/openair1/PHY/MODULATION/slot_fep.c +++ b/openair1/PHY/MODULATION/slot_fep.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/MODULATION/slot_fep_mbsfn.c b/openair1/PHY/MODULATION/slot_fep_mbsfn.c index cca3c7f261..94dc4b3ef1 100644 --- a/openair1/PHY/MODULATION/slot_fep_mbsfn.c +++ b/openair1/PHY/MODULATION/slot_fep_mbsfn.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/MODULATION/slot_fep_ul.c b/openair1/PHY/MODULATION/slot_fep_ul.c index b6b606e968..32bae2c036 100644 --- a/openair1/PHY/MODULATION/slot_fep_ul.c +++ b/openair1/PHY/MODULATION/slot_fep_ul.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/MODULATION/ul_7_5_kHz.c b/openair1/PHY/MODULATION/ul_7_5_kHz.c index 0e7c1785fa..4a50ad395e 100755 --- a/openair1/PHY/MODULATION/ul_7_5_kHz.c +++ b/openair1/PHY/MODULATION/ul_7_5_kHz.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/MODULATION/vars.h b/openair1/PHY/MODULATION/vars.h index bbbdde9633..5fa9b96776 100644 --- a/openair1/PHY/MODULATION/vars.h +++ b/openair1/PHY/MODULATION/vars.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/TOOLS/8bit_rxdemux.c b/openair1/PHY/TOOLS/8bit_rxdemux.c index 691125ff01..c9406c10ce 100644 --- a/openair1/PHY/TOOLS/8bit_rxdemux.c +++ b/openair1/PHY/TOOLS/8bit_rxdemux.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/TOOLS/8bit_txmux.c b/openair1/PHY/TOOLS/8bit_txmux.c index d9d14055de..b31da10198 100644 --- a/openair1/PHY/TOOLS/8bit_txmux.c +++ b/openair1/PHY/TOOLS/8bit_txmux.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/TOOLS/angle.c b/openair1/PHY/TOOLS/angle.c index 5d75893f44..f2c71ea742 100644 --- a/openair1/PHY/TOOLS/angle.c +++ b/openair1/PHY/TOOLS/angle.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/TOOLS/cadd_sv.c b/openair1/PHY/TOOLS/cadd_sv.c index 1ca91b7969..2fa052f6c9 100644 --- a/openair1/PHY/TOOLS/cadd_sv.c +++ b/openair1/PHY/TOOLS/cadd_sv.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/TOOLS/cadd_vv.c b/openair1/PHY/TOOLS/cadd_vv.c index 70ec37e50b..3bc349463e 100644 --- a/openair1/PHY/TOOLS/cadd_vv.c +++ b/openair1/PHY/TOOLS/cadd_vv.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/TOOLS/cdot_prod.c b/openair1/PHY/TOOLS/cdot_prod.c index ee8425fd1a..2e52e63f7e 100644 --- a/openair1/PHY/TOOLS/cdot_prod.c +++ b/openair1/PHY/TOOLS/cdot_prod.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/TOOLS/cmult_mm.c b/openair1/PHY/TOOLS/cmult_mm.c index f7ae7b1ab2..328958af29 100644 --- a/openair1/PHY/TOOLS/cmult_mm.c +++ b/openair1/PHY/TOOLS/cmult_mm.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/TOOLS/cmult_sv.c b/openair1/PHY/TOOLS/cmult_sv.c index c9d3a8a50e..31ad77be82 100644 --- a/openair1/PHY/TOOLS/cmult_sv.c +++ b/openair1/PHY/TOOLS/cmult_sv.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/TOOLS/cmult_vv.c b/openair1/PHY/TOOLS/cmult_vv.c index 900d661341..d7b7275508 100755 --- a/openair1/PHY/TOOLS/cmult_vv.c +++ b/openair1/PHY/TOOLS/cmult_vv.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/TOOLS/cmult_vvh.c b/openair1/PHY/TOOLS/cmult_vvh.c index 7e360d9728..64cf163d09 100644 --- a/openair1/PHY/TOOLS/cmult_vvh.c +++ b/openair1/PHY/TOOLS/cmult_vvh.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/TOOLS/costable.h b/openair1/PHY/TOOLS/costable.h index c0c65bb90b..86627a4707 100644 --- a/openair1/PHY/TOOLS/costable.h +++ b/openair1/PHY/TOOLS/costable.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/TOOLS/dB_routines.c b/openair1/PHY/TOOLS/dB_routines.c index 8a7aac7e27..ae792c4dd6 100755 --- a/openair1/PHY/TOOLS/dB_routines.c +++ b/openair1/PHY/TOOLS/dB_routines.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/TOOLS/dB_routines.h b/openair1/PHY/TOOLS/dB_routines.h index 2a79a70f0a..36040dc28a 100644 --- a/openair1/PHY/TOOLS/dB_routines.h +++ b/openair1/PHY/TOOLS/dB_routines.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/TOOLS/defs.h b/openair1/PHY/TOOLS/defs.h index 0ea1af57e4..6960fcda4c 100644 --- a/openair1/PHY/TOOLS/defs.h +++ b/openair1/PHY/TOOLS/defs.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/TOOLS/extern.h b/openair1/PHY/TOOLS/extern.h index 7a5b283a8e..5c046434e6 100644 --- a/openair1/PHY/TOOLS/extern.h +++ b/openair1/PHY/TOOLS/extern.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/TOOLS/file_output.c b/openair1/PHY/TOOLS/file_output.c index bdfc45f50a..e3a92696fe 100755 --- a/openair1/PHY/TOOLS/file_output.c +++ b/openair1/PHY/TOOLS/file_output.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/TOOLS/invSqrt.c b/openair1/PHY/TOOLS/invSqrt.c index 2220142b8b..40a576eb30 100644 --- a/openair1/PHY/TOOLS/invSqrt.c +++ b/openair1/PHY/TOOLS/invSqrt.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/TOOLS/log2_approx.c b/openair1/PHY/TOOLS/log2_approx.c index 24cb411d0d..bfff65cb03 100644 --- a/openair1/PHY/TOOLS/log2_approx.c +++ b/openair1/PHY/TOOLS/log2_approx.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/TOOLS/lte_dfts.c b/openair1/PHY/TOOLS/lte_dfts.c index 22649ae7b3..c031d5d384 100644 --- a/openair1/PHY/TOOLS/lte_dfts.c +++ b/openair1/PHY/TOOLS/lte_dfts.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/TOOLS/lte_phy_scope.c b/openair1/PHY/TOOLS/lte_phy_scope.c index 99035b046f..49cafa19b5 100644 --- a/openair1/PHY/TOOLS/lte_phy_scope.c +++ b/openair1/PHY/TOOLS/lte_phy_scope.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/TOOLS/lte_phy_scope.h b/openair1/PHY/TOOLS/lte_phy_scope.h index f41f501838..877934fc7a 100644 --- a/openair1/PHY/TOOLS/lte_phy_scope.h +++ b/openair1/PHY/TOOLS/lte_phy_scope.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/TOOLS/lut.c b/openair1/PHY/TOOLS/lut.c index 344e38995b..5e6602c7f2 100644 --- a/openair1/PHY/TOOLS/lut.c +++ b/openair1/PHY/TOOLS/lut.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/TOOLS/memory_routines.c b/openair1/PHY/TOOLS/memory_routines.c index b4a4676a6d..4da4d89cb6 100755 --- a/openair1/PHY/TOOLS/memory_routines.c +++ b/openair1/PHY/TOOLS/memory_routines.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/TOOLS/signal_energy.c b/openair1/PHY/TOOLS/signal_energy.c index f9de85674e..323a1831dc 100755 --- a/openair1/PHY/TOOLS/signal_energy.c +++ b/openair1/PHY/TOOLS/signal_energy.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/TOOLS/smbv.c b/openair1/PHY/TOOLS/smbv.c index 426fb5b68e..b7de63f483 100644 --- a/openair1/PHY/TOOLS/smbv.c +++ b/openair1/PHY/TOOLS/smbv.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/TOOLS/smbv.h b/openair1/PHY/TOOLS/smbv.h index 916083ff01..c52b50f038 100644 --- a/openair1/PHY/TOOLS/smbv.h +++ b/openair1/PHY/TOOLS/smbv.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/TOOLS/sqrt.c b/openair1/PHY/TOOLS/sqrt.c index 51a9071263..247cfa138f 100755 --- a/openair1/PHY/TOOLS/sqrt.c +++ b/openair1/PHY/TOOLS/sqrt.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/TOOLS/time_meas.c b/openair1/PHY/TOOLS/time_meas.c index 675de01d31..ba1014e9a0 100644 --- a/openair1/PHY/TOOLS/time_meas.c +++ b/openair1/PHY/TOOLS/time_meas.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/TOOLS/time_meas.h b/openair1/PHY/TOOLS/time_meas.h index 900c5b3f9a..a3df897053 100644 --- a/openair1/PHY/TOOLS/time_meas.h +++ b/openair1/PHY/TOOLS/time_meas.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/TOOLS/twiddle12288.h b/openair1/PHY/TOOLS/twiddle12288.h index 412746a13d..bc1226c67e 100644 --- a/openair1/PHY/TOOLS/twiddle12288.h +++ b/openair1/PHY/TOOLS/twiddle12288.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/TOOLS/twiddle1536.h b/openair1/PHY/TOOLS/twiddle1536.h index 864b5b1aea..b74534aabf 100644 --- a/openair1/PHY/TOOLS/twiddle1536.h +++ b/openair1/PHY/TOOLS/twiddle1536.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/TOOLS/twiddle24576.h b/openair1/PHY/TOOLS/twiddle24576.h index d3f5622f98..46cdb97a5b 100644 --- a/openair1/PHY/TOOLS/twiddle24576.h +++ b/openair1/PHY/TOOLS/twiddle24576.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/TOOLS/twiddle6144.h b/openair1/PHY/TOOLS/twiddle6144.h index d1241ab5fa..3f9c3684dc 100644 --- a/openair1/PHY/TOOLS/twiddle6144.h +++ b/openair1/PHY/TOOLS/twiddle6144.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/TOOLS/vars.h b/openair1/PHY/TOOLS/vars.h index f6edc6bb34..7f3cc6e31f 100644 --- a/openair1/PHY/TOOLS/vars.h +++ b/openair1/PHY/TOOLS/vars.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index 1fee82a3fa..398861cabf 100755 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/extern.h b/openair1/PHY/extern.h index 8631d759cf..a7450e3e21 100755 --- a/openair1/PHY/extern.h +++ b/openair1/PHY/extern.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/impl_defs_lte.h b/openair1/PHY/impl_defs_lte.h index 66b30ffda0..a0ef6c005a 100644 --- a/openair1/PHY/impl_defs_lte.h +++ b/openair1/PHY/impl_defs_lte.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/impl_defs_top.h b/openair1/PHY/impl_defs_top.h index a0302fd526..c84b7d3ece 100755 --- a/openair1/PHY/impl_defs_top.h +++ b/openair1/PHY/impl_defs_top.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/spec_defs.h b/openair1/PHY/spec_defs.h index ac0ee07428..c8a1e86e5e 100755 --- a/openair1/PHY/spec_defs.h +++ b/openair1/PHY/spec_defs.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/spec_defs_top.h b/openair1/PHY/spec_defs_top.h index f0ec7b4548..8f647f1eac 100755 --- a/openair1/PHY/spec_defs_top.h +++ b/openair1/PHY/spec_defs_top.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/sse_intrin.h b/openair1/PHY/sse_intrin.h index cfd3d0b653..dbeb21dff1 100644 --- a/openair1/PHY/sse_intrin.h +++ b/openair1/PHY/sse_intrin.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/types.h b/openair1/PHY/types.h index dedc15adb0..7a362c5270 100755 --- a/openair1/PHY/types.h +++ b/openair1/PHY/types.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/PHY/vars.h b/openair1/PHY/vars.h index c7a8d1d78e..294105affa 100755 --- a/openair1/PHY/vars.h +++ b/openair1/PHY/vars.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SCHED/defs.h b/openair1/SCHED/defs.h index 4855774494..bebe476dcd 100644 --- a/openair1/SCHED/defs.h +++ b/openair1/SCHED/defs.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SCHED/extern.h b/openair1/SCHED/extern.h index a9f826ce8a..dd3892a290 100644 --- a/openair1/SCHED/extern.h +++ b/openair1/SCHED/extern.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SCHED/phy_procedures_emos.h b/openair1/SCHED/phy_procedures_emos.h index 81b2a7062f..b34730bddb 100644 --- a/openair1/SCHED/phy_procedures_emos.h +++ b/openair1/SCHED/phy_procedures_emos.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SCHED/phy_procedures_lte_common.c b/openair1/SCHED/phy_procedures_lte_common.c index e92396989a..ce659a60f8 100755 --- a/openair1/SCHED/phy_procedures_lte_common.c +++ b/openair1/SCHED/phy_procedures_lte_common.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 2fd7aa52c8..165f2fbac6 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c index 54fee5a1a4..7dcd71ce47 100755 --- a/openair1/SCHED/phy_procedures_lte_ue.c +++ b/openair1/SCHED/phy_procedures_lte_ue.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SCHED/pucch_pc.c b/openair1/SCHED/pucch_pc.c index 3cfb5f9bce..feeff71598 100644 --- a/openair1/SCHED/pucch_pc.c +++ b/openair1/SCHED/pucch_pc.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SCHED/pusch_pc.c b/openair1/SCHED/pusch_pc.c index 5a3390d677..2af8771afe 100644 --- a/openair1/SCHED/pusch_pc.c +++ b/openair1/SCHED/pusch_pc.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SCHED/rt_compat.h b/openair1/SCHED/rt_compat.h index a6a43891eb..14b5e8cb52 100755 --- a/openair1/SCHED/rt_compat.h +++ b/openair1/SCHED/rt_compat.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SCHED/vars.h b/openair1/SCHED/vars.h index 7dcff8d727..532251a2f0 100644 --- a/openair1/SCHED/vars.h +++ b/openair1/SCHED/vars.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SIMULATION/ETH_TRANSPORT/bypass_session_layer.c b/openair1/SIMULATION/ETH_TRANSPORT/bypass_session_layer.c index ba66382f96..765952133a 100644 --- a/openair1/SIMULATION/ETH_TRANSPORT/bypass_session_layer.c +++ b/openair1/SIMULATION/ETH_TRANSPORT/bypass_session_layer.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SIMULATION/ETH_TRANSPORT/defs.h b/openair1/SIMULATION/ETH_TRANSPORT/defs.h index cfc3aa0774..790a0adc2d 100755 --- a/openair1/SIMULATION/ETH_TRANSPORT/defs.h +++ b/openair1/SIMULATION/ETH_TRANSPORT/defs.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SIMULATION/ETH_TRANSPORT/emu_transport.c b/openair1/SIMULATION/ETH_TRANSPORT/emu_transport.c index eabf519ae7..8c5516eabd 100644 --- a/openair1/SIMULATION/ETH_TRANSPORT/emu_transport.c +++ b/openair1/SIMULATION/ETH_TRANSPORT/emu_transport.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SIMULATION/ETH_TRANSPORT/extern.h b/openair1/SIMULATION/ETH_TRANSPORT/extern.h index c98e45d5e4..c368fa7229 100755 --- a/openair1/SIMULATION/ETH_TRANSPORT/extern.h +++ b/openair1/SIMULATION/ETH_TRANSPORT/extern.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SIMULATION/ETH_TRANSPORT/multicast_link.c b/openair1/SIMULATION/ETH_TRANSPORT/multicast_link.c index 15b36bae92..b919d979d8 100755 --- a/openair1/SIMULATION/ETH_TRANSPORT/multicast_link.c +++ b/openair1/SIMULATION/ETH_TRANSPORT/multicast_link.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SIMULATION/ETH_TRANSPORT/multicast_link.h b/openair1/SIMULATION/ETH_TRANSPORT/multicast_link.h index c847569328..0ac2ceb336 100755 --- a/openair1/SIMULATION/ETH_TRANSPORT/multicast_link.h +++ b/openair1/SIMULATION/ETH_TRANSPORT/multicast_link.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SIMULATION/ETH_TRANSPORT/netlink_init.c b/openair1/SIMULATION/ETH_TRANSPORT/netlink_init.c index aaa8e9c32a..d7fc98348c 100644 --- a/openair1/SIMULATION/ETH_TRANSPORT/netlink_init.c +++ b/openair1/SIMULATION/ETH_TRANSPORT/netlink_init.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SIMULATION/ETH_TRANSPORT/pgm_link.c b/openair1/SIMULATION/ETH_TRANSPORT/pgm_link.c index 3e964e965e..e76b50f61b 100644 --- a/openair1/SIMULATION/ETH_TRANSPORT/pgm_link.c +++ b/openair1/SIMULATION/ETH_TRANSPORT/pgm_link.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SIMULATION/ETH_TRANSPORT/pgm_link.h b/openair1/SIMULATION/ETH_TRANSPORT/pgm_link.h index 9fd1598961..6fc14fdc99 100644 --- a/openair1/SIMULATION/ETH_TRANSPORT/pgm_link.h +++ b/openair1/SIMULATION/ETH_TRANSPORT/pgm_link.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SIMULATION/ETH_TRANSPORT/proto.h b/openair1/SIMULATION/ETH_TRANSPORT/proto.h index 1f0c7133a4..aa87a53ab7 100644 --- a/openair1/SIMULATION/ETH_TRANSPORT/proto.h +++ b/openair1/SIMULATION/ETH_TRANSPORT/proto.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SIMULATION/ETH_TRANSPORT/socket.c b/openair1/SIMULATION/ETH_TRANSPORT/socket.c index b8ec14b9f3..39195c2206 100755 --- a/openair1/SIMULATION/ETH_TRANSPORT/socket.c +++ b/openair1/SIMULATION/ETH_TRANSPORT/socket.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SIMULATION/ETH_TRANSPORT/socket.h b/openair1/SIMULATION/ETH_TRANSPORT/socket.h index ed1510d693..a1cc11e5c2 100755 --- a/openair1/SIMULATION/ETH_TRANSPORT/socket.h +++ b/openair1/SIMULATION/ETH_TRANSPORT/socket.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SIMULATION/ETH_TRANSPORT/vars.h b/openair1/SIMULATION/ETH_TRANSPORT/vars.h index ab585813d3..fecf347d28 100755 --- a/openair1/SIMULATION/ETH_TRANSPORT/vars.h +++ b/openair1/SIMULATION/ETH_TRANSPORT/vars.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SIMULATION/LTE_PHY/LTE_Configuration.c b/openair1/SIMULATION/LTE_PHY/LTE_Configuration.c index abe19e0fd9..cf6f81597f 100644 --- a/openair1/SIMULATION/LTE_PHY/LTE_Configuration.c +++ b/openair1/SIMULATION/LTE_PHY/LTE_Configuration.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SIMULATION/LTE_PHY/LTE_Configuration.h b/openair1/SIMULATION/LTE_PHY/LTE_Configuration.h index 2ff38f7b0a..ee5eeb5ae5 100644 --- a/openair1/SIMULATION/LTE_PHY/LTE_Configuration.h +++ b/openair1/SIMULATION/LTE_PHY/LTE_Configuration.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c index 16cdd9b6e7..28e7bc8216 100644 --- a/openair1/SIMULATION/LTE_PHY/dlsim.c +++ b/openair1/SIMULATION/LTE_PHY/dlsim.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SIMULATION/LTE_PHY/framegen.c b/openair1/SIMULATION/LTE_PHY/framegen.c index 21124eba8d..578fec7d0e 100644 --- a/openair1/SIMULATION/LTE_PHY/framegen.c +++ b/openair1/SIMULATION/LTE_PHY/framegen.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SIMULATION/LTE_PHY/gpib_send.c b/openair1/SIMULATION/LTE_PHY/gpib_send.c index db7f89552b..fd9543aa21 100644 --- a/openair1/SIMULATION/LTE_PHY/gpib_send.c +++ b/openair1/SIMULATION/LTE_PHY/gpib_send.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SIMULATION/LTE_PHY/gpib_send.h b/openair1/SIMULATION/LTE_PHY/gpib_send.h index 2bccfcfcd8..4cc568edc8 100644 --- a/openair1/SIMULATION/LTE_PHY/gpib_send.h +++ b/openair1/SIMULATION/LTE_PHY/gpib_send.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SIMULATION/LTE_PHY/mbmssim.c b/openair1/SIMULATION/LTE_PHY/mbmssim.c index 474d37a2ec..862edaa864 100644 --- a/openair1/SIMULATION/LTE_PHY/mbmssim.c +++ b/openair1/SIMULATION/LTE_PHY/mbmssim.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SIMULATION/LTE_PHY/pbchsim.c b/openair1/SIMULATION/LTE_PHY/pbchsim.c index 67080836b7..5aa3fac997 100644 --- a/openair1/SIMULATION/LTE_PHY/pbchsim.c +++ b/openair1/SIMULATION/LTE_PHY/pbchsim.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SIMULATION/LTE_PHY/pdcchsim.c b/openair1/SIMULATION/LTE_PHY/pdcchsim.c index 1852e349ec..caa7e1248d 100644 --- a/openair1/SIMULATION/LTE_PHY/pdcchsim.c +++ b/openair1/SIMULATION/LTE_PHY/pdcchsim.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SIMULATION/LTE_PHY/prachsim.c b/openair1/SIMULATION/LTE_PHY/prachsim.c index 77f3b8accf..eeca52a274 100644 --- a/openair1/SIMULATION/LTE_PHY/prachsim.c +++ b/openair1/SIMULATION/LTE_PHY/prachsim.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SIMULATION/LTE_PHY/pucchsignalgegerator.h b/openair1/SIMULATION/LTE_PHY/pucchsignalgegerator.h index 45368dad82..0fd3dd752d 100644 --- a/openair1/SIMULATION/LTE_PHY/pucchsignalgegerator.h +++ b/openair1/SIMULATION/LTE_PHY/pucchsignalgegerator.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SIMULATION/LTE_PHY/pucchsignalgenerator.c b/openair1/SIMULATION/LTE_PHY/pucchsignalgenerator.c index 78dd47e00b..ce04cb9539 100644 --- a/openair1/SIMULATION/LTE_PHY/pucchsignalgenerator.c +++ b/openair1/SIMULATION/LTE_PHY/pucchsignalgenerator.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SIMULATION/LTE_PHY/pucchsim.c b/openair1/SIMULATION/LTE_PHY/pucchsim.c index 1f7dfb3789..919bec144d 100644 --- a/openair1/SIMULATION/LTE_PHY/pucchsim.c +++ b/openair1/SIMULATION/LTE_PHY/pucchsim.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SIMULATION/LTE_PHY/scansim.c b/openair1/SIMULATION/LTE_PHY/scansim.c index 24167984b2..c2ceb1c58d 100644 --- a/openair1/SIMULATION/LTE_PHY/scansim.c +++ b/openair1/SIMULATION/LTE_PHY/scansim.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SIMULATION/LTE_PHY/signalanalyzer.c b/openair1/SIMULATION/LTE_PHY/signalanalyzer.c index 26dd530a2a..2167f52abb 100644 --- a/openair1/SIMULATION/LTE_PHY/signalanalyzer.c +++ b/openair1/SIMULATION/LTE_PHY/signalanalyzer.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SIMULATION/LTE_PHY/signalanalyzer.h b/openair1/SIMULATION/LTE_PHY/signalanalyzer.h index 0ecad3324f..d3d82c8aaa 100644 --- a/openair1/SIMULATION/LTE_PHY/signalanalyzer.h +++ b/openair1/SIMULATION/LTE_PHY/signalanalyzer.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SIMULATION/LTE_PHY/syncsim.c b/openair1/SIMULATION/LTE_PHY/syncsim.c index 6cd90f9311..a5f046da93 100644 --- a/openair1/SIMULATION/LTE_PHY/syncsim.c +++ b/openair1/SIMULATION/LTE_PHY/syncsim.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SIMULATION/LTE_PHY/test.c b/openair1/SIMULATION/LTE_PHY/test.c index 6a794a6c20..abaf917f7a 100644 --- a/openair1/SIMULATION/LTE_PHY/test.c +++ b/openair1/SIMULATION/LTE_PHY/test.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SIMULATION/LTE_PHY/ulsignalgenerator.c b/openair1/SIMULATION/LTE_PHY/ulsignalgenerator.c index faa6c2c08d..e2a99dd7a4 100644 --- a/openair1/SIMULATION/LTE_PHY/ulsignalgenerator.c +++ b/openair1/SIMULATION/LTE_PHY/ulsignalgenerator.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SIMULATION/LTE_PHY/ulsignalgenerator.h b/openair1/SIMULATION/LTE_PHY/ulsignalgenerator.h index 5de212dfe0..d8d143817c 100644 --- a/openair1/SIMULATION/LTE_PHY/ulsignalgenerator.h +++ b/openair1/SIMULATION/LTE_PHY/ulsignalgenerator.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SIMULATION/LTE_PHY/ulsim.c b/openair1/SIMULATION/LTE_PHY/ulsim.c index deda4b4fa7..dd697899b8 100644 --- a/openair1/SIMULATION/LTE_PHY/ulsim.c +++ b/openair1/SIMULATION/LTE_PHY/ulsim.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SIMULATION/LTE_PHY/ulsim2.c b/openair1/SIMULATION/LTE_PHY/ulsim2.c index 883c009248..b6b1852c07 100644 --- a/openair1/SIMULATION/LTE_PHY/ulsim2.c +++ b/openair1/SIMULATION/LTE_PHY/ulsim2.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SIMULATION/RF/adc.c b/openair1/SIMULATION/RF/adc.c index b588b0a1ed..6dc1c7f8e6 100755 --- a/openair1/SIMULATION/RF/adc.c +++ b/openair1/SIMULATION/RF/adc.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SIMULATION/RF/dac.c b/openair1/SIMULATION/RF/dac.c index 41e7eb4fe5..22e286a496 100755 --- a/openair1/SIMULATION/RF/dac.c +++ b/openair1/SIMULATION/RF/dac.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SIMULATION/RF/defs.h b/openair1/SIMULATION/RF/defs.h index c58f7cd8d0..984dfa6ca8 100644 --- a/openair1/SIMULATION/RF/defs.h +++ b/openair1/SIMULATION/RF/defs.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SIMULATION/RF/rf.c b/openair1/SIMULATION/RF/rf.c index 115c730834..1f240595aa 100644 --- a/openair1/SIMULATION/RF/rf.c +++ b/openair1/SIMULATION/RF/rf.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SIMULATION/TOOLS/abstraction.c b/openair1/SIMULATION/TOOLS/abstraction.c index b451e4784b..d63d0b0fe9 100644 --- a/openair1/SIMULATION/TOOLS/abstraction.c +++ b/openair1/SIMULATION/TOOLS/abstraction.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SIMULATION/TOOLS/ch_desc_proto.c b/openair1/SIMULATION/TOOLS/ch_desc_proto.c index 4d9b2bf923..80a491888c 100755 --- a/openair1/SIMULATION/TOOLS/ch_desc_proto.c +++ b/openair1/SIMULATION/TOOLS/ch_desc_proto.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SIMULATION/TOOLS/defs.h b/openair1/SIMULATION/TOOLS/defs.h index d553faddc8..187ffcb241 100644 --- a/openair1/SIMULATION/TOOLS/defs.h +++ b/openair1/SIMULATION/TOOLS/defs.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SIMULATION/TOOLS/gauss.c b/openair1/SIMULATION/TOOLS/gauss.c index a99e5d7173..9c3a431bef 100644 --- a/openair1/SIMULATION/TOOLS/gauss.c +++ b/openair1/SIMULATION/TOOLS/gauss.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SIMULATION/TOOLS/llr_quantization.c b/openair1/SIMULATION/TOOLS/llr_quantization.c index bb76774e1e..e8b4696ba6 100644 --- a/openair1/SIMULATION/TOOLS/llr_quantization.c +++ b/openair1/SIMULATION/TOOLS/llr_quantization.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SIMULATION/TOOLS/multipath_channel.c b/openair1/SIMULATION/TOOLS/multipath_channel.c index 7a21db2a57..9a72ca6423 100644 --- a/openair1/SIMULATION/TOOLS/multipath_channel.c +++ b/openair1/SIMULATION/TOOLS/multipath_channel.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SIMULATION/TOOLS/multipath_tv_channel.c b/openair1/SIMULATION/TOOLS/multipath_tv_channel.c index 8b0b7b85ba..b1bd091ca7 100644 --- a/openair1/SIMULATION/TOOLS/multipath_tv_channel.c +++ b/openair1/SIMULATION/TOOLS/multipath_tv_channel.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SIMULATION/TOOLS/random_channel.c b/openair1/SIMULATION/TOOLS/random_channel.c index f79368c81e..9233d94132 100644 --- a/openair1/SIMULATION/TOOLS/random_channel.c +++ b/openair1/SIMULATION/TOOLS/random_channel.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SIMULATION/TOOLS/rangen_double.c b/openair1/SIMULATION/TOOLS/rangen_double.c index c060f5171d..24de0468c3 100644 --- a/openair1/SIMULATION/TOOLS/rangen_double.c +++ b/openair1/SIMULATION/TOOLS/rangen_double.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SIMULATION/TOOLS/scm_corrmat.h b/openair1/SIMULATION/TOOLS/scm_corrmat.h index 91c2bf4bb1..61fd6a6e11 100644 --- a/openair1/SIMULATION/TOOLS/scm_corrmat.h +++ b/openair1/SIMULATION/TOOLS/scm_corrmat.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair1/SIMULATION/TOOLS/taus.c b/openair1/SIMULATION/TOOLS/taus.c index f810f9e2c3..9a2a6f44b3 100644 --- a/openair1/SIMULATION/TOOLS/taus.c +++ b/openair1/SIMULATION/TOOLS/taus.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/COMMON/as_message.h b/openair2/COMMON/as_message.h index ae761b206a..30810a325e 100644 --- a/openair2/COMMON/as_message.h +++ b/openair2/COMMON/as_message.h @@ -1,31 +1,32 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ -*******************************************************************************/ /***************************************************************************** diff --git a/openair2/COMMON/commonDef.h b/openair2/COMMON/commonDef.h index 47fef519b5..e33e64ec06 100644 --- a/openair2/COMMON/commonDef.h +++ b/openair2/COMMON/commonDef.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ /* Source commonDef.h diff --git a/openair2/COMMON/gtpv1_u_messages_def.h b/openair2/COMMON/gtpv1_u_messages_def.h index 3ec9be54e3..0e93a917ab 100755 --- a/openair2/COMMON/gtpv1_u_messages_def.h +++ b/openair2/COMMON/gtpv1_u_messages_def.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/COMMON/gtpv1_u_messages_types.h b/openair2/COMMON/gtpv1_u_messages_types.h index 9c385ae3f6..2a6dd1bf2c 100755 --- a/openair2/COMMON/gtpv1_u_messages_types.h +++ b/openair2/COMMON/gtpv1_u_messages_types.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/COMMON/intertask_interface_conf.h b/openair2/COMMON/intertask_interface_conf.h index 3d20c317bd..9d6a7f9d99 100644 --- a/openair2/COMMON/intertask_interface_conf.h +++ b/openair2/COMMON/intertask_interface_conf.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/COMMON/mac_messages_def.h b/openair2/COMMON/mac_messages_def.h index 2854517a7c..64aca9911c 100644 --- a/openair2/COMMON/mac_messages_def.h +++ b/openair2/COMMON/mac_messages_def.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/COMMON/mac_messages_types.h b/openair2/COMMON/mac_messages_types.h index e0eb258104..ecc8c67533 100644 --- a/openair2/COMMON/mac_messages_types.h +++ b/openair2/COMMON/mac_messages_types.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/COMMON/mac_primitives.h b/openair2/COMMON/mac_primitives.h index df5c488b70..a8fc149f47 100644 --- a/openair2/COMMON/mac_primitives.h +++ b/openair2/COMMON/mac_primitives.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/COMMON/mac_rlc_primitives.h b/openair2/COMMON/mac_rlc_primitives.h index 602062977d..62913bd842 100644 --- a/openair2/COMMON/mac_rlc_primitives.h +++ b/openair2/COMMON/mac_rlc_primitives.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/COMMON/mac_rrc_primitives.h b/openair2/COMMON/mac_rrc_primitives.h index 72c77b3434..b7f1450909 100644 --- a/openair2/COMMON/mac_rrc_primitives.h +++ b/openair2/COMMON/mac_rrc_primitives.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/COMMON/messages_def.h b/openair2/COMMON/messages_def.h index 86297be314..246aa855ec 100644 --- a/openair2/COMMON/messages_def.h +++ b/openair2/COMMON/messages_def.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/COMMON/messages_types.h b/openair2/COMMON/messages_types.h index 669c2e935a..b1ff6c3b18 100644 --- a/openair2/COMMON/messages_types.h +++ b/openair2/COMMON/messages_types.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/COMMON/nas_messages_def.h b/openair2/COMMON/nas_messages_def.h index f18453991e..0e70564aa9 100644 --- a/openair2/COMMON/nas_messages_def.h +++ b/openair2/COMMON/nas_messages_def.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/COMMON/nas_messages_types.h b/openair2/COMMON/nas_messages_types.h index 4f6159c094..2251444a01 100644 --- a/openair2/COMMON/nas_messages_types.h +++ b/openair2/COMMON/nas_messages_types.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/COMMON/networkDef.h b/openair2/COMMON/networkDef.h index 2eb376a9c7..46716bee24 100644 --- a/openair2/COMMON/networkDef.h +++ b/openair2/COMMON/networkDef.h @@ -1,31 +1,31 @@ -/******************************************************************************* - 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@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ /***************************************************************************** diff --git a/openair2/COMMON/openair_defs.h b/openair2/COMMON/openair_defs.h index da0db25d2a..0a6b88ce33 100755 --- a/openair2/COMMON/openair_defs.h +++ b/openair2/COMMON/openair_defs.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/COMMON/openair_types.h b/openair2/COMMON/openair_types.h index 502af95de9..47f217038d 100755 --- a/openair2/COMMON/openair_types.h +++ b/openair2/COMMON/openair_types.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/COMMON/pdcp_messages_def.h b/openair2/COMMON/pdcp_messages_def.h index a6e032a0d7..28cda8bc1b 100644 --- a/openair2/COMMON/pdcp_messages_def.h +++ b/openair2/COMMON/pdcp_messages_def.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/COMMON/pdcp_messages_types.h b/openair2/COMMON/pdcp_messages_types.h index 4eb6063a5e..fc239f529f 100644 --- a/openair2/COMMON/pdcp_messages_types.h +++ b/openair2/COMMON/pdcp_messages_types.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/COMMON/phy_messages_def.h b/openair2/COMMON/phy_messages_def.h index 80464299ce..bc63c28ac3 100644 --- a/openair2/COMMON/phy_messages_def.h +++ b/openair2/COMMON/phy_messages_def.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/COMMON/phy_messages_types.h b/openair2/COMMON/phy_messages_types.h index 6dd647a17c..b8ef212f31 100644 --- a/openair2/COMMON/phy_messages_types.h +++ b/openair2/COMMON/phy_messages_types.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/COMMON/platform_constants.h b/openair2/COMMON/platform_constants.h index e7f0b7bcb7..ed052fc608 100755 --- a/openair2/COMMON/platform_constants.h +++ b/openair2/COMMON/platform_constants.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/COMMON/platform_types.h b/openair2/COMMON/platform_types.h index 7b1c02c2e7..a1af19fd0a 100755 --- a/openair2/COMMON/platform_types.h +++ b/openair2/COMMON/platform_types.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/COMMON/ral_messages_def.h b/openair2/COMMON/ral_messages_def.h index 96543e6ad8..59719663fe 100755 --- a/openair2/COMMON/ral_messages_def.h +++ b/openair2/COMMON/ral_messages_def.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/COMMON/ral_messages_types.h b/openair2/COMMON/ral_messages_types.h index 5b54a03d77..234304004d 100755 --- a/openair2/COMMON/ral_messages_types.h +++ b/openair2/COMMON/ral_messages_types.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/COMMON/rlc_messages_def.h b/openair2/COMMON/rlc_messages_def.h index aed4022856..990648eff6 100755 --- a/openair2/COMMON/rlc_messages_def.h +++ b/openair2/COMMON/rlc_messages_def.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/COMMON/rlc_messages_types.h b/openair2/COMMON/rlc_messages_types.h index 2918675fa1..1399dadade 100755 --- a/openair2/COMMON/rlc_messages_types.h +++ b/openair2/COMMON/rlc_messages_types.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/COMMON/rrc_messages_def.h b/openair2/COMMON/rrc_messages_def.h index 76073933fb..27d3a6bdd4 100644 --- a/openair2/COMMON/rrc_messages_def.h +++ b/openair2/COMMON/rrc_messages_def.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/COMMON/rrc_messages_types.h b/openair2/COMMON/rrc_messages_types.h index 2d6f3cdb86..816b936895 100644 --- a/openair2/COMMON/rrc_messages_types.h +++ b/openair2/COMMON/rrc_messages_types.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/COMMON/rrm_config_structs.h b/openair2/COMMON/rrm_config_structs.h index 9fa74dd14e..55443f497e 100755 --- a/openair2/COMMON/rrm_config_structs.h +++ b/openair2/COMMON/rrm_config_structs.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/COMMON/rrm_constants.h b/openair2/COMMON/rrm_constants.h index 25c584711c..e12608feb2 100755 --- a/openair2/COMMON/rrm_constants.h +++ b/openair2/COMMON/rrm_constants.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/COMMON/rtos_header.h b/openair2/COMMON/rtos_header.h index 92ed57e822..ea2783ee6f 100755 --- a/openair2/COMMON/rtos_header.h +++ b/openair2/COMMON/rtos_header.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/COMMON/s1ap_messages_def.h b/openair2/COMMON/s1ap_messages_def.h index ae81968018..ce51ac78ca 100644 --- a/openair2/COMMON/s1ap_messages_def.h +++ b/openair2/COMMON/s1ap_messages_def.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/COMMON/s1ap_messages_types.h b/openair2/COMMON/s1ap_messages_types.h index 7849e418d1..c39725b737 100644 --- a/openair2/COMMON/s1ap_messages_types.h +++ b/openair2/COMMON/s1ap_messages_types.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/COMMON/sctp_messages_def.h b/openair2/COMMON/sctp_messages_def.h index d3273ba03d..8053f47ec9 100644 --- a/openair2/COMMON/sctp_messages_def.h +++ b/openair2/COMMON/sctp_messages_def.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/COMMON/sctp_messages_types.h b/openair2/COMMON/sctp_messages_types.h index 0b365bd38b..490e39a8c7 100644 --- a/openair2/COMMON/sctp_messages_types.h +++ b/openair2/COMMON/sctp_messages_types.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/COMMON/tasks_def.h b/openair2/COMMON/tasks_def.h index 1da78c6131..5e0f8bd211 100644 --- a/openair2/COMMON/tasks_def.h +++ b/openair2/COMMON/tasks_def.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/COMMON/udp_messages_def.h b/openair2/COMMON/udp_messages_def.h index 43dc61f94f..a6341ec880 100755 --- a/openair2/COMMON/udp_messages_def.h +++ b/openair2/COMMON/udp_messages_def.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/COMMON/udp_messages_types.h b/openair2/COMMON/udp_messages_types.h index fe3ebbafd7..9491fab65f 100755 --- a/openair2/COMMON/udp_messages_types.h +++ b/openair2/COMMON/udp_messages_types.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/COMMON/x2ap_messages_def.h b/openair2/COMMON/x2ap_messages_def.h index 8518adcc8e..4e5bef69d5 100644 --- a/openair2/COMMON/x2ap_messages_def.h +++ b/openair2/COMMON/x2ap_messages_def.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/COMMON/x2ap_messages_types.h b/openair2/COMMON/x2ap_messages_types.h index 0e936c98cb..4e22149f3b 100644 --- a/openair2/COMMON/x2ap_messages_types.h +++ b/openair2/COMMON/x2ap_messages_types.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/ENB_APP/enb_app.c b/openair2/ENB_APP/enb_app.c index 4c55b05070..70fb5ad61f 100644 --- a/openair2/ENB_APP/enb_app.c +++ b/openair2/ENB_APP/enb_app.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/ENB_APP/enb_app.h b/openair2/ENB_APP/enb_app.h index 78580e27bf..30e3373eac 100644 --- a/openair2/ENB_APP/enb_app.h +++ b/openair2/ENB_APP/enb_app.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c index b5eeb63e09..07e0ffa640 100755 --- a/openair2/ENB_APP/enb_config.c +++ b/openair2/ENB_APP/enb_config.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/ENB_APP/enb_config.h b/openair2/ENB_APP/enb_config.h index 0fb82dcde3..113681dafe 100755 --- a/openair2/ENB_APP/enb_config.h +++ b/openair2/ENB_APP/enb_config.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/MAC/config.c b/openair2/LAYER2/MAC/config.c index b19e7f72e8..e3f6d8e78c 100644 --- a/openair2/LAYER2/MAC/config.c +++ b/openair2/LAYER2/MAC/config.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/MAC/defs.h b/openair2/LAYER2/MAC/defs.h index c5c4156c00..a0a43b6d79 100644 --- a/openair2/LAYER2/MAC/defs.h +++ b/openair2/LAYER2/MAC/defs.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/MAC/eNB_scheduler.c b/openair2/LAYER2/MAC/eNB_scheduler.c index 041cabb686..329c40be05 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler.c +++ b/openair2/LAYER2/MAC/eNB_scheduler.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/MAC/eNB_scheduler_RA.c b/openair2/LAYER2/MAC/eNB_scheduler_RA.c index bdcbae6b7f..361c0f461f 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_RA.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_RA.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/openair2/LAYER2/MAC/eNB_scheduler_bch.c b/openair2/LAYER2/MAC/eNB_scheduler_bch.c index 963942d7dc..dd0890783e 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_bch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_bch.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c index e8738f9be0..52e0f60d65 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/MAC/eNB_scheduler_mch.c b/openair2/LAYER2/MAC/eNB_scheduler_mch.c index ce3386b2cd..e894f3a662 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_mch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_mch.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c index d5415e0413..34169d902e 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c index 8b79090f3d..1018c6e7d8 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/MAC/extern.h b/openair2/LAYER2/MAC/extern.h index f29fefbea7..ca847acf4c 100644 --- a/openair2/LAYER2/MAC/extern.h +++ b/openair2/LAYER2/MAC/extern.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/MAC/l1_helpers.c b/openair2/LAYER2/MAC/l1_helpers.c index 89314b8200..3b4c78ea92 100644 --- a/openair2/LAYER2/MAC/l1_helpers.c +++ b/openair2/LAYER2/MAC/l1_helpers.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/MAC/lte_transport_init.c b/openair2/LAYER2/MAC/lte_transport_init.c index 47493f5086..fa446a4aee 100755 --- a/openair2/LAYER2/MAC/lte_transport_init.c +++ b/openair2/LAYER2/MAC/lte_transport_init.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/MAC/main.c b/openair2/LAYER2/MAC/main.c index 8a73c9298f..5db78a30c2 100644 --- a/openair2/LAYER2/MAC/main.c +++ b/openair2/LAYER2/MAC/main.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/MAC/openair2_proc.c b/openair2/LAYER2/MAC/openair2_proc.c index 5e0b8d5c02..bb4a994a8a 100644 --- a/openair2/LAYER2/MAC/openair2_proc.c +++ b/openair2/LAYER2/MAC/openair2_proc.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/MAC/pre_processor.c b/openair2/LAYER2/MAC/pre_processor.c index e4f113c77a..5a4caf82c4 100644 --- a/openair2/LAYER2/MAC/pre_processor.c +++ b/openair2/LAYER2/MAC/pre_processor.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/MAC/proto.h b/openair2/LAYER2/MAC/proto.h index 331d635371..d02e42ee16 100644 --- a/openair2/LAYER2/MAC/proto.h +++ b/openair2/LAYER2/MAC/proto.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/MAC/ra_procedures.c b/openair2/LAYER2/MAC/ra_procedures.c index 6f61f22848..43ec8b05ec 100644 --- a/openair2/LAYER2/MAC/ra_procedures.c +++ b/openair2/LAYER2/MAC/ra_procedures.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/MAC/rar_tools.c b/openair2/LAYER2/MAC/rar_tools.c index acf284bd37..2e97f83fac 100644 --- a/openair2/LAYER2/MAC/rar_tools.c +++ b/openair2/LAYER2/MAC/rar_tools.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/MAC/ue_procedures.c b/openair2/LAYER2/MAC/ue_procedures.c index 0a474d14b8..ee6340cb43 100644 --- a/openair2/LAYER2/MAC/ue_procedures.c +++ b/openair2/LAYER2/MAC/ue_procedures.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/MAC/vars.h b/openair2/LAYER2/MAC/vars.h index 60023bbae2..88da64de5a 100644 --- a/openair2/LAYER2/MAC/vars.h +++ b/openair2/LAYER2/MAC/vars.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c index df27aa2ee0..f25e921570 100755 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.h b/openair2/LAYER2/PDCP_v10.1.0/pdcp.h index ee1ef82c93..9e5b15f5a3 100755 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.h +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_control_primitive.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_control_primitive.c index facb9c8844..e858008803 100755 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_control_primitive.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_control_primitive.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_control_primitives_proto_extern.h b/openair2/LAYER2/PDCP_v10.1.0/pdcp_control_primitives_proto_extern.h index 84d3e9cea5..90c4805dde 100755 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_control_primitives_proto_extern.h +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_control_primitives_proto_extern.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c index 785a287d58..787d463b32 100755 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_netlink.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_netlink.c index 524dd2022b..365013c42d 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_netlink.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_netlink.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.c index 7ecf483332..fb530f686a 100755 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.h b/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.h index 185b50f866..1913fd69f1 100755 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.h +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_proto_extern.h b/openair2/LAYER2/PDCP_v10.1.0/pdcp_proto_extern.h index e7ed7dde9b..3b83140af2 100755 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_proto_extern.h +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_proto_extern.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_security.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_security.c index 131f56b968..15a1cf57d2 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_security.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_security.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.c index fcfcfb58ae..9615726bc0 100755 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.h b/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.h index a17d9ecc6c..1766613e1f 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.h +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_thread.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_thread.c index 4f0d11e235..8786a91690 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_thread.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_thread.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.c index 0790244fbb..ef2cf1afaf 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.h b/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.h index f5a7141a33..41f73a7045 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.h +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c index e8dcae6762..ec303172b0 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.h index 0e944d76bc..70cbb3b12e 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_constants.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_constants.h index 63cc6d8e9e..3bc97ee650 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_constants.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_constants.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_entity.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_entity.h index ea661b3881..15bba038ea 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_entity.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_entity.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.c index 5d981b417a..8bffde184e 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.h index 19cc5c2a8e..111de0416e 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c index ade7becaf1..eb2d0c5aca 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.h index e9633213a7..ed2f7f2936 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_proto_extern.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_proto_extern.h index f6edc6bb34..7f3cc6e31f 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_proto_extern.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_proto_extern.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.c index badbd0d71b..2581437f91 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.h index d4cb8a4373..c5fbc9edea 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.c index e85f627a4b..f41b96653c 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.h index 18a3423564..66e492649d 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.c index ec0da054c8..9c318a0346 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.h index e1d01d180c..aa6c4b878d 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.c index 4a96a25306..a580181f6e 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.h index 2f57c3859e..6c6bb0e6c6 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.c index d5c53c3b6b..e2dda28f95 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.h index 99de4b1f76..eba9dd6455 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segments_holes.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segments_holes.c index cb00704175..59f5180e2c 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segments_holes.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segments_holes.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segments_holes.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segments_holes.h index 5b83dfebfd..db171d3e3e 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segments_holes.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segments_holes.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.c index 84d86c1a91..9c46297ad6 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.h index 85bdd196b7..6a44401701 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_structs.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_structs.h index d887168fb8..738952d3c6 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_structs.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_structs.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.c index a174b7fa93..13f96e1f3f 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.h index 3e77bacca2..a78a391869 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.c index a30590bb83..746bde2659 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.h index 079a0f4565..2ef993e9ee 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_reordering.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_reordering.c index f15ae8132f..a05700abc1 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_reordering.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_reordering.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_reordering.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_reordering.h index 35f79e8637..11bcc92b09 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_reordering.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_reordering.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_status_prohibit.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_status_prohibit.c index cd04c185a3..716e592ce7 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_status_prohibit.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_status_prohibit.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_status_prohibit.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_status_prohibit.h index cf6ffc06bc..3881085b0e 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_status_prohibit.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_status_prohibit.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_windows.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_windows.c index 5255ef8b35..89a6657d62 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_windows.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_windows.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_windows.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_windows.h index d7716777cf..a9a306cad3 100755 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_windows.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_windows.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.c b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.c index c0bb945d18..9f57a6a0cd 100755 --- a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.c +++ b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.h b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.h index a55971ae9b..d772d1d4be 100755 --- a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.h +++ b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_entity.h b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_entity.h index 2e9e8820c2..fa716f81be 100755 --- a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_entity.h +++ b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_entity.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.c b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.c index 4a5a4dd259..6b1b487286 100755 --- a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.c +++ b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.h b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.h index b4f9d0bcbc..48322c98b8 100755 --- a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.h +++ b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_structs.h b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_structs.h index 32ed6980b1..e59d2972bc 100755 --- a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_structs.h +++ b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_structs.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.c b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.c index 834e45e7d7..8aab33f54c 100755 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.c +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.h index d9b5012766..2289ed639c 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_constants.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_constants.h index afafa734e2..d25a394e8b 100755 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_constants.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_constants.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.c b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.c index 8e735ca5f3..a91e384a55 100755 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.c +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.h index 98f4b0d4e2..b9a5166ed2 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.c b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.c index b78feb66e0..b2930e6296 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.c +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.h index b31d803c64..dce80d2d98 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_entity.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_entity.h index 8aed136494..07fb15bfef 100755 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_entity.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_entity.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_fsm.c b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_fsm.c index ab7b3a8497..27b35de67d 100755 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_fsm.c +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_fsm.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_fsm.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_fsm.h index 04e3a09499..645311f451 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_fsm.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_fsm.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_reassembly.c b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_reassembly.c index 5dfd7c47f3..24c0ee8291 100755 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_reassembly.c +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_reassembly.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_reassembly.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_reassembly.h index 7a2c13e5e4..adba9c133c 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_reassembly.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_reassembly.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_receiver.c b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_receiver.c index 0cbd74fbf4..085f37e4c1 100755 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_receiver.c +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_receiver.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_receiver.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_receiver.h index 560957a50f..b230a6cb40 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_receiver.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_receiver.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_segment.c b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_segment.c index e57ae55eec..a31f990916 100755 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_segment.c +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_segment.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_segment.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_segment.h index ec9d72851c..45c8b3d16d 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_segment.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_segment.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_structs.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_structs.h index 3d518861ce..535998bfd1 100755 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_structs.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_structs.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.c b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.c index aaa4c80e55..04afcff0ff 100755 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.c +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.h index 185ba9886d..ae64c28278 100755 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_very_simple_test.c b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_very_simple_test.c index 7fea51ff72..139490a680 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_very_simple_test.c +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_very_simple_test.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_very_simple_test.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_very_simple_test.h index 407d0d76b6..790dc1ee50 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_very_simple_test.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_very_simple_test.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/rlc.c b/openair2/LAYER2/RLC/rlc.c index 67c8803c93..e19c6b0b0a 100644 --- a/openair2/LAYER2/RLC/rlc.c +++ b/openair2/LAYER2/RLC/rlc.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/rlc.h b/openair2/LAYER2/RLC/rlc.h index 627d48c311..392ae88cf8 100755 --- a/openair2/LAYER2/RLC/rlc.h +++ b/openair2/LAYER2/RLC/rlc.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/rlc_def.h b/openair2/LAYER2/RLC/rlc_def.h index c0c56299a9..1205ad2891 100755 --- a/openair2/LAYER2/RLC/rlc_def.h +++ b/openair2/LAYER2/RLC/rlc_def.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/rlc_def_lte.h b/openair2/LAYER2/RLC/rlc_def_lte.h index ee7859e03c..01bf2ac486 100644 --- a/openair2/LAYER2/RLC/rlc_def_lte.h +++ b/openair2/LAYER2/RLC/rlc_def_lte.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/rlc_mac.c b/openair2/LAYER2/RLC/rlc_mac.c index 83ef0716ea..73f323f14b 100644 --- a/openair2/LAYER2/RLC/rlc_mac.c +++ b/openair2/LAYER2/RLC/rlc_mac.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/rlc_mpls.c b/openair2/LAYER2/RLC/rlc_mpls.c index a8d875984c..263b92b063 100644 --- a/openair2/LAYER2/RLC/rlc_mpls.c +++ b/openair2/LAYER2/RLC/rlc_mpls.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/rlc_primitives.h b/openair2/LAYER2/RLC/rlc_primitives.h index 40fa39aedd..d77d131345 100755 --- a/openair2/LAYER2/RLC/rlc_primitives.h +++ b/openair2/LAYER2/RLC/rlc_primitives.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/RLC/rlc_rrc.c b/openair2/LAYER2/RLC/rlc_rrc.c index a2be5cc3cd..05ad79d7d4 100644 --- a/openair2/LAYER2/RLC/rlc_rrc.c +++ b/openair2/LAYER2/RLC/rlc_rrc.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/layer2_top.c b/openair2/LAYER2/layer2_top.c index 9acfb1ed94..4cd1f50d03 100644 --- a/openair2/LAYER2/layer2_top.c +++ b/openair2/LAYER2/layer2_top.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/openair2_proc.c b/openair2/LAYER2/openair2_proc.c index 83441d7cb7..35684d239a 100644 --- a/openair2/LAYER2/openair2_proc.c +++ b/openair2/LAYER2/openair2_proc.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/register.c b/openair2/LAYER2/register.c index 02b299d2cc..ac93364452 100644 --- a/openair2/LAYER2/register.c +++ b/openair2/LAYER2/register.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/LAYER2/register.h b/openair2/LAYER2/register.h index 84113a37c5..09c464ae56 100644 --- a/openair2/LAYER2/register.h +++ b/openair2/LAYER2/register.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/Makefile b/openair2/Makefile index 19ce431a2e..799fde93c0 100755 --- a/openair2/Makefile +++ b/openair2/Makefile @@ -21,7 +21,7 @@ # Contact Information # OpenAirInterface Admin: openair_admin@eurecom.fr # OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@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 # diff --git a/openair2/NAS/nas_ue_task.h b/openair2/NAS/nas_ue_task.h index 99410fb335..6695ab0ac5 100644 --- a/openair2/NAS/nas_ue_task.h +++ b/openair2/NAS/nas_ue_task.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/NETWORK_DRIVER/LITE/RB_TOOL/rb_tool.c b/openair2/NETWORK_DRIVER/LITE/RB_TOOL/rb_tool.c index 4026f024ed..43b8ec3614 100755 --- a/openair2/NETWORK_DRIVER/LITE/RB_TOOL/rb_tool.c +++ b/openair2/NETWORK_DRIVER/LITE/RB_TOOL/rb_tool.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/NETWORK_DRIVER/LITE/classifier.c b/openair2/NETWORK_DRIVER/LITE/classifier.c index 5db3ded758..4025e28e19 100755 --- a/openair2/NETWORK_DRIVER/LITE/classifier.c +++ b/openair2/NETWORK_DRIVER/LITE/classifier.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/NETWORK_DRIVER/LITE/common.c b/openair2/NETWORK_DRIVER/LITE/common.c index c428d760db..7aca4b8d5f 100755 --- a/openair2/NETWORK_DRIVER/LITE/common.c +++ b/openair2/NETWORK_DRIVER/LITE/common.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/NETWORK_DRIVER/LITE/constant.h b/openair2/NETWORK_DRIVER/LITE/constant.h index 4bed95b08f..82cef8e8c1 100755 --- a/openair2/NETWORK_DRIVER/LITE/constant.h +++ b/openair2/NETWORK_DRIVER/LITE/constant.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/NETWORK_DRIVER/LITE/device.c b/openair2/NETWORK_DRIVER/LITE/device.c index 0ccba3e6ba..9b772d6eef 100755 --- a/openair2/NETWORK_DRIVER/LITE/device.c +++ b/openair2/NETWORK_DRIVER/LITE/device.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/NETWORK_DRIVER/LITE/ioctl.c b/openair2/NETWORK_DRIVER/LITE/ioctl.c index df2d74f53a..ad3a4eefac 100755 --- a/openair2/NETWORK_DRIVER/LITE/ioctl.c +++ b/openair2/NETWORK_DRIVER/LITE/ioctl.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/NETWORK_DRIVER/LITE/ioctl.h b/openair2/NETWORK_DRIVER/LITE/ioctl.h index 578792e5ab..3b5d55823a 100755 --- a/openair2/NETWORK_DRIVER/LITE/ioctl.h +++ b/openair2/NETWORK_DRIVER/LITE/ioctl.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/NETWORK_DRIVER/LITE/local.h b/openair2/NETWORK_DRIVER/LITE/local.h index 7d13063555..7268f69b5d 100755 --- a/openair2/NETWORK_DRIVER/LITE/local.h +++ b/openair2/NETWORK_DRIVER/LITE/local.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/NETWORK_DRIVER/LITE/netlink.c b/openair2/NETWORK_DRIVER/LITE/netlink.c index bf8030f667..2339540cae 100755 --- a/openair2/NETWORK_DRIVER/LITE/netlink.c +++ b/openair2/NETWORK_DRIVER/LITE/netlink.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/NETWORK_DRIVER/LITE/proto_extern.h b/openair2/NETWORK_DRIVER/LITE/proto_extern.h index 16d4e14401..36039ed984 100755 --- a/openair2/NETWORK_DRIVER/LITE/proto_extern.h +++ b/openair2/NETWORK_DRIVER/LITE/proto_extern.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/NETWORK_DRIVER/LITE/sap.h b/openair2/NETWORK_DRIVER/LITE/sap.h index 00aed03764..ffe778fe34 100755 --- a/openair2/NETWORK_DRIVER/LITE/sap.h +++ b/openair2/NETWORK_DRIVER/LITE/sap.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/NETWORK_DRIVER/LITE/tool.c b/openair2/NETWORK_DRIVER/LITE/tool.c index 37910bc6c2..492d674c06 100755 --- a/openair2/NETWORK_DRIVER/LITE/tool.c +++ b/openair2/NETWORK_DRIVER/LITE/tool.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/NETWORK_DRIVER/MESH/RB_TOOL/rb_tool.c b/openair2/NETWORK_DRIVER/MESH/RB_TOOL/rb_tool.c index 0c0107a37e..fb005b3589 100644 --- a/openair2/NETWORK_DRIVER/MESH/RB_TOOL/rb_tool.c +++ b/openair2/NETWORK_DRIVER/MESH/RB_TOOL/rb_tool.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/NETWORK_DRIVER/MESH/classifier.c b/openair2/NETWORK_DRIVER/MESH/classifier.c index 7c6ab220ef..2c55c0ca79 100755 --- a/openair2/NETWORK_DRIVER/MESH/classifier.c +++ b/openair2/NETWORK_DRIVER/MESH/classifier.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/NETWORK_DRIVER/MESH/common.c b/openair2/NETWORK_DRIVER/MESH/common.c index fa29b91955..37862046c9 100755 --- a/openair2/NETWORK_DRIVER/MESH/common.c +++ b/openair2/NETWORK_DRIVER/MESH/common.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/NETWORK_DRIVER/MESH/constant.h b/openair2/NETWORK_DRIVER/MESH/constant.h index 4f05f77734..a6f053b658 100755 --- a/openair2/NETWORK_DRIVER/MESH/constant.h +++ b/openair2/NETWORK_DRIVER/MESH/constant.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/NETWORK_DRIVER/MESH/device.c b/openair2/NETWORK_DRIVER/MESH/device.c index c7492064db..51b71d6d8e 100755 --- a/openair2/NETWORK_DRIVER/MESH/device.c +++ b/openair2/NETWORK_DRIVER/MESH/device.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/NETWORK_DRIVER/MESH/ioctl.c b/openair2/NETWORK_DRIVER/MESH/ioctl.c index 08e445ef6c..89f63ece77 100755 --- a/openair2/NETWORK_DRIVER/MESH/ioctl.c +++ b/openair2/NETWORK_DRIVER/MESH/ioctl.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/NETWORK_DRIVER/MESH/local.h b/openair2/NETWORK_DRIVER/MESH/local.h index 8539960470..1171eb3b5a 100755 --- a/openair2/NETWORK_DRIVER/MESH/local.h +++ b/openair2/NETWORK_DRIVER/MESH/local.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/NETWORK_DRIVER/MESH/mesh.c b/openair2/NETWORK_DRIVER/MESH/mesh.c index b53caf219e..9f49a4b4cd 100755 --- a/openair2/NETWORK_DRIVER/MESH/mesh.c +++ b/openair2/NETWORK_DRIVER/MESH/mesh.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/NETWORK_DRIVER/MESH/netlink.c b/openair2/NETWORK_DRIVER/MESH/netlink.c index ac6b9014cf..e8fd851c23 100644 --- a/openair2/NETWORK_DRIVER/MESH/netlink.c +++ b/openair2/NETWORK_DRIVER/MESH/netlink.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/NETWORK_DRIVER/MESH/proto_extern.h b/openair2/NETWORK_DRIVER/MESH/proto_extern.h index 7dd52c7682..ea46858445 100755 --- a/openair2/NETWORK_DRIVER/MESH/proto_extern.h +++ b/openair2/NETWORK_DRIVER/MESH/proto_extern.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/NETWORK_DRIVER/MESH/rrc_nas_primitives.h b/openair2/NETWORK_DRIVER/MESH/rrc_nas_primitives.h index 2900ac8be2..a1787b1df7 100755 --- a/openair2/NETWORK_DRIVER/MESH/rrc_nas_primitives.h +++ b/openair2/NETWORK_DRIVER/MESH/rrc_nas_primitives.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/NETWORK_DRIVER/MESH/sap.h b/openair2/NETWORK_DRIVER/MESH/sap.h index 7320f749df..4241744d86 100755 --- a/openair2/NETWORK_DRIVER/MESH/sap.h +++ b/openair2/NETWORK_DRIVER/MESH/sap.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/NETWORK_DRIVER/MESH/tool.c b/openair2/NETWORK_DRIVER/MESH/tool.c index 3b32535d24..54acd68ba7 100755 --- a/openair2/NETWORK_DRIVER/MESH/tool.c +++ b/openair2/NETWORK_DRIVER/MESH/tool.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/NETWORK_DRIVER/UE_IP/common.c b/openair2/NETWORK_DRIVER/UE_IP/common.c index 47d2786fa4..17ce737e6a 100755 --- a/openair2/NETWORK_DRIVER/UE_IP/common.c +++ b/openair2/NETWORK_DRIVER/UE_IP/common.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/NETWORK_DRIVER/UE_IP/constant.h b/openair2/NETWORK_DRIVER/UE_IP/constant.h index 2dfc810080..0345d2dfad 100755 --- a/openair2/NETWORK_DRIVER/UE_IP/constant.h +++ b/openair2/NETWORK_DRIVER/UE_IP/constant.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/NETWORK_DRIVER/UE_IP/device.c b/openair2/NETWORK_DRIVER/UE_IP/device.c index c02165174f..a0e32726d9 100755 --- a/openair2/NETWORK_DRIVER/UE_IP/device.c +++ b/openair2/NETWORK_DRIVER/UE_IP/device.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/NETWORK_DRIVER/UE_IP/local.h b/openair2/NETWORK_DRIVER/UE_IP/local.h index 5dd428c4cf..f00d26385d 100755 --- a/openair2/NETWORK_DRIVER/UE_IP/local.h +++ b/openair2/NETWORK_DRIVER/UE_IP/local.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/NETWORK_DRIVER/UE_IP/netlink.c b/openair2/NETWORK_DRIVER/UE_IP/netlink.c index a3efbb2140..17870218c9 100755 --- a/openair2/NETWORK_DRIVER/UE_IP/netlink.c +++ b/openair2/NETWORK_DRIVER/UE_IP/netlink.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/NETWORK_DRIVER/UE_IP/proto_extern.h b/openair2/NETWORK_DRIVER/UE_IP/proto_extern.h index 260af062f8..4eac01b680 100755 --- a/openair2/NETWORK_DRIVER/UE_IP/proto_extern.h +++ b/openair2/NETWORK_DRIVER/UE_IP/proto_extern.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/NETWORK_DRIVER/UE_IP/sap.h b/openair2/NETWORK_DRIVER/UE_IP/sap.h index 170ddf38c6..086390cdc4 100755 --- a/openair2/NETWORK_DRIVER/UE_IP/sap.h +++ b/openair2/NETWORK_DRIVER/UE_IP/sap.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/PHY_INTERFACE/defs.h b/openair2/PHY_INTERFACE/defs.h index a33e1586f3..20acba99e4 100755 --- a/openair2/PHY_INTERFACE/defs.h +++ b/openair2/PHY_INTERFACE/defs.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/PHY_INTERFACE/extern.h b/openair2/PHY_INTERFACE/extern.h index e90423be0e..b1700b7697 100644 --- a/openair2/PHY_INTERFACE/extern.h +++ b/openair2/PHY_INTERFACE/extern.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/PHY_INTERFACE/mac_phy_primitives.c b/openair2/PHY_INTERFACE/mac_phy_primitives.c index 0b7fecf66e..52b4a1b039 100644 --- a/openair2/PHY_INTERFACE/mac_phy_primitives.c +++ b/openair2/PHY_INTERFACE/mac_phy_primitives.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/PHY_INTERFACE/mac_phy_primitives.h b/openair2/PHY_INTERFACE/mac_phy_primitives.h index 774f393c58..a52ce6c8cb 100644 --- a/openair2/PHY_INTERFACE/mac_phy_primitives.h +++ b/openair2/PHY_INTERFACE/mac_phy_primitives.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/PHY_INTERFACE/vars.h b/openair2/PHY_INTERFACE/vars.h index 8e33fafc01..561ab426e7 100644 --- a/openair2/PHY_INTERFACE/vars.h +++ b/openair2/PHY_INTERFACE/vars.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.c b/openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.c index fe71e4bd4c..732d2aa54a 100644 --- a/openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.c +++ b/openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.h b/openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.h index 15807ddb83..f694a68c58 100644 --- a/openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.h +++ b/openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRC/LITE/L2_interface.c b/openair2/RRC/LITE/L2_interface.c index 16811fe70f..6a64095e92 100644 --- a/openair2/RRC/LITE/L2_interface.c +++ b/openair2/RRC/LITE/L2_interface.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRC/LITE/MESSAGES/asn1_msg.c b/openair2/RRC/LITE/MESSAGES/asn1_msg.c index 8823a87130..110dc6442d 100644 --- a/openair2/RRC/LITE/MESSAGES/asn1_msg.c +++ b/openair2/RRC/LITE/MESSAGES/asn1_msg.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRC/LITE/MESSAGES/asn1_msg.h b/openair2/RRC/LITE/MESSAGES/asn1_msg.h index d1516feccc..b5747cb94b 100644 --- a/openair2/RRC/LITE/MESSAGES/asn1_msg.h +++ b/openair2/RRC/LITE/MESSAGES/asn1_msg.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRC/LITE/defs.h b/openair2/RRC/LITE/defs.h index 75db59add6..bae3dc887a 100644 --- a/openair2/RRC/LITE/defs.h +++ b/openair2/RRC/LITE/defs.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRC/LITE/extern.h b/openair2/RRC/LITE/extern.h index 40e5e3e262..64863b796f 100644 --- a/openair2/RRC/LITE/extern.h +++ b/openair2/RRC/LITE/extern.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRC/LITE/proto.h b/openair2/RRC/LITE/proto.h index 9fbfadbd85..5d77698c8e 100644 --- a/openair2/RRC/LITE/proto.h +++ b/openair2/RRC/LITE/proto.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRC/LITE/rrc_2_rrm_msg.c b/openair2/RRC/LITE/rrc_2_rrm_msg.c index 64318c8063..0dcdce6b12 100644 --- a/openair2/RRC/LITE/rrc_2_rrm_msg.c +++ b/openair2/RRC/LITE/rrc_2_rrm_msg.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRC/LITE/rrc_UE.c b/openair2/RRC/LITE/rrc_UE.c index 9682f2f587..a919a055f2 100644 --- a/openair2/RRC/LITE/rrc_UE.c +++ b/openair2/RRC/LITE/rrc_UE.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRC/LITE/rrc_UE_ral.c b/openair2/RRC/LITE/rrc_UE_ral.c index 401d7257f9..ed1e6ca205 100755 --- a/openair2/RRC/LITE/rrc_UE_ral.c +++ b/openair2/RRC/LITE/rrc_UE_ral.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRC/LITE/rrc_UE_ral.h b/openair2/RRC/LITE/rrc_UE_ral.h index 6ad8e24023..a06ae637cd 100755 --- a/openair2/RRC/LITE/rrc_UE_ral.h +++ b/openair2/RRC/LITE/rrc_UE_ral.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRC/LITE/rrc_common.c b/openair2/RRC/LITE/rrc_common.c index 1d0e855a82..e2d8a6c69b 100644 --- a/openair2/RRC/LITE/rrc_common.c +++ b/openair2/RRC/LITE/rrc_common.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRC/LITE/rrc_config.c b/openair2/RRC/LITE/rrc_config.c index e33c2a71b9..cd91e6c2f3 100644 --- a/openair2/RRC/LITE/rrc_config.c +++ b/openair2/RRC/LITE/rrc_config.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRC/LITE/rrc_eNB.c b/openair2/RRC/LITE/rrc_eNB.c index 47c6055c62..f19c3bced4 100644 --- a/openair2/RRC/LITE/rrc_eNB.c +++ b/openair2/RRC/LITE/rrc_eNB.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRC/LITE/rrc_eNB_GTPV1U.c b/openair2/RRC/LITE/rrc_eNB_GTPV1U.c index ef70760235..b85933ad47 100755 --- a/openair2/RRC/LITE/rrc_eNB_GTPV1U.c +++ b/openair2/RRC/LITE/rrc_eNB_GTPV1U.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRC/LITE/rrc_eNB_GTPV1U.h b/openair2/RRC/LITE/rrc_eNB_GTPV1U.h index 70f9876164..388f71c136 100755 --- a/openair2/RRC/LITE/rrc_eNB_GTPV1U.h +++ b/openair2/RRC/LITE/rrc_eNB_GTPV1U.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRC/LITE/rrc_eNB_S1AP.c b/openair2/RRC/LITE/rrc_eNB_S1AP.c index 60b514ba2c..5c41658862 100644 --- a/openair2/RRC/LITE/rrc_eNB_S1AP.c +++ b/openair2/RRC/LITE/rrc_eNB_S1AP.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRC/LITE/rrc_eNB_S1AP.h b/openair2/RRC/LITE/rrc_eNB_S1AP.h index 0f6e01d5b6..ea797e8c20 100644 --- a/openair2/RRC/LITE/rrc_eNB_S1AP.h +++ b/openair2/RRC/LITE/rrc_eNB_S1AP.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRC/LITE/rrc_eNB_UE_context.c b/openair2/RRC/LITE/rrc_eNB_UE_context.c index 2bd2f1d69c..0662471763 100644 --- a/openair2/RRC/LITE/rrc_eNB_UE_context.c +++ b/openair2/RRC/LITE/rrc_eNB_UE_context.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRC/LITE/rrc_eNB_UE_context.h b/openair2/RRC/LITE/rrc_eNB_UE_context.h index 6a575cd700..084baa9cc4 100644 --- a/openair2/RRC/LITE/rrc_eNB_UE_context.h +++ b/openair2/RRC/LITE/rrc_eNB_UE_context.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRC/LITE/rrc_eNB_ral.c b/openair2/RRC/LITE/rrc_eNB_ral.c index ab9ff08705..d1a0f02e46 100755 --- a/openair2/RRC/LITE/rrc_eNB_ral.c +++ b/openair2/RRC/LITE/rrc_eNB_ral.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRC/LITE/rrc_eNB_ral.h b/openair2/RRC/LITE/rrc_eNB_ral.h index 31c1d031ca..da69b47023 100755 --- a/openair2/RRC/LITE/rrc_eNB_ral.h +++ b/openair2/RRC/LITE/rrc_eNB_ral.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRC/LITE/rrc_rrm_interface.c b/openair2/RRC/LITE/rrc_rrm_interface.c index 9e539bf4df..29f97ed296 100644 --- a/openair2/RRC/LITE/rrc_rrm_interface.c +++ b/openair2/RRC/LITE/rrc_rrm_interface.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRC/LITE/rrc_rrm_interface.h b/openair2/RRC/LITE/rrc_rrm_interface.h index eccadf03bf..5d83f8679b 100644 --- a/openair2/RRC/LITE/rrc_rrm_interface.h +++ b/openair2/RRC/LITE/rrc_rrm_interface.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRC/LITE/rrc_types.h b/openair2/RRC/LITE/rrc_types.h index 854f43e747..cd9b7815f6 100644 --- a/openair2/RRC/LITE/rrc_types.h +++ b/openair2/RRC/LITE/rrc_types.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRC/LITE/rrm_2_rrc_msg.c b/openair2/RRC/LITE/rrm_2_rrc_msg.c index 6cc08421dd..cc44465201 100644 --- a/openair2/RRC/LITE/rrm_2_rrc_msg.c +++ b/openair2/RRC/LITE/rrm_2_rrc_msg.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRC/LITE/utils.c b/openair2/RRC/LITE/utils.c index cf1252c30a..1bf6530384 100644 --- a/openair2/RRC/LITE/utils.c +++ b/openair2/RRC/LITE/utils.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRC/LITE/vars.h b/openair2/RRC/LITE/vars.h index 92525194e8..122dea1df2 100644 --- a/openair2/RRC/LITE/vars.h +++ b/openair2/RRC/LITE/vars.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRC/NAS/nas_config.c b/openair2/RRC/NAS/nas_config.c index d6c12a09e6..400be1a604 100644 --- a/openair2/RRC/NAS/nas_config.c +++ b/openair2/RRC/NAS/nas_config.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRC/NAS/nas_config.h b/openair2/RRC/NAS/nas_config.h index 654cb978c5..93ee5a196d 100755 --- a/openair2/RRC/NAS/nas_config.h +++ b/openair2/RRC/NAS/nas_config.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRC/NAS/rb_config.c b/openair2/RRC/NAS/rb_config.c index 2779a70420..9a7f8a88da 100644 --- a/openair2/RRC/NAS/rb_config.c +++ b/openair2/RRC/NAS/rb_config.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRC/NAS/rb_config.h b/openair2/RRC/NAS/rb_config.h index 9a9bd011f0..e8d807f882 100644 --- a/openair2/RRC/NAS/rb_config.h +++ b/openair2/RRC/NAS/rb_config.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRM_4_RRC_LITE/src/platform.h b/openair2/RRM_4_RRC_LITE/src/platform.h index 2d3ed51435..42bab6dc8b 100755 --- a/openair2/RRM_4_RRC_LITE/src/platform.h +++ b/openair2/RRM_4_RRC_LITE/src/platform.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRM_4_RRC_LITE/src/platform_constants.h b/openair2/RRM_4_RRC_LITE/src/platform_constants.h index 40d936f44a..ecf072ac4c 100755 --- a/openair2/RRM_4_RRC_LITE/src/platform_constants.h +++ b/openair2/RRM_4_RRC_LITE/src/platform_constants.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRM_4_RRC_LITE/src/platform_defines.h b/openair2/RRM_4_RRC_LITE/src/platform_defines.h index 9f185a04a8..ff3e7c0428 100755 --- a/openair2/RRM_4_RRC_LITE/src/platform_defines.h +++ b/openair2/RRM_4_RRC_LITE/src/platform_defines.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/Asn1Utils.cpp b/openair2/RRM_4_RRC_LITE/src/radio_resources/Asn1Utils.cpp index 4408039e1c..04b97887e4 100755 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/Asn1Utils.cpp +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/Asn1Utils.cpp @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/Asn1Utils.h b/openair2/RRM_4_RRC_LITE/src/radio_resources/Asn1Utils.h index 867b22c040..ee1eb8f38a 100755 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/Asn1Utils.h +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/Asn1Utils.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/Command.cpp b/openair2/RRM_4_RRC_LITE/src/radio_resources/Command.cpp index cc5bcb68d8..7bd92ad9b6 100755 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/Command.cpp +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/Command.cpp @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/Command.h b/openair2/RRM_4_RRC_LITE/src/radio_resources/Command.h index c5ddc45756..107cc97717 100755 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/Command.h +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/Command.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/DataRadioBearer.cpp b/openair2/RRM_4_RRC_LITE/src/radio_resources/DataRadioBearer.cpp index ae3c752efa..73824db9a9 100755 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/DataRadioBearer.cpp +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/DataRadioBearer.cpp @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/DataRadioBearer.h b/openair2/RRM_4_RRC_LITE/src/radio_resources/DataRadioBearer.h index e561a9ea7e..eb897ce894 100755 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/DataRadioBearer.h +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/DataRadioBearer.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/ENodeB.cpp b/openair2/RRM_4_RRC_LITE/src/radio_resources/ENodeB.cpp index b3e486fe85..8a4498861b 100755 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/ENodeB.cpp +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/ENodeB.cpp @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/ENodeB.h b/openair2/RRM_4_RRC_LITE/src/radio_resources/ENodeB.h index 3e8bf11ad3..c1c761032d 100755 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/ENodeB.h +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/ENodeB.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/Exceptions.h b/openair2/RRM_4_RRC_LITE/src/radio_resources/Exceptions.h index b18730bf38..a236d5e09e 100755 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/Exceptions.h +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/Exceptions.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/LogicalChannel.cpp b/openair2/RRM_4_RRC_LITE/src/radio_resources/LogicalChannel.cpp index 3b810a833b..607bfd042a 100755 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/LogicalChannel.cpp +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/LogicalChannel.cpp @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/LogicalChannel.h b/openair2/RRM_4_RRC_LITE/src/radio_resources/LogicalChannel.h index 2420f39f43..c9d572cbf1 100755 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/LogicalChannel.h +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/LogicalChannel.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/Mobile.cpp b/openair2/RRM_4_RRC_LITE/src/radio_resources/Mobile.cpp index 2e92d95240..7400700800 100755 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/Mobile.cpp +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/Mobile.cpp @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/Mobile.h b/openair2/RRM_4_RRC_LITE/src/radio_resources/Mobile.h index 41dbf9bebe..6d2be81694 100755 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/Mobile.h +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/Mobile.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/RadioBearer.cpp b/openair2/RRM_4_RRC_LITE/src/radio_resources/RadioBearer.cpp index 179fba1c7f..76a32516e4 100755 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/RadioBearer.cpp +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/RadioBearer.cpp @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/RadioBearer.h b/openair2/RRM_4_RRC_LITE/src/radio_resources/RadioBearer.h index fc944f57a2..16cf600c04 100755 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/RadioBearer.h +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/RadioBearer.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/RadioResources.cpp b/openair2/RRM_4_RRC_LITE/src/radio_resources/RadioResources.cpp index 7cd631cc02..efcffdcf7d 100755 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/RadioResources.cpp +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/RadioResources.cpp @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/RadioResources.h b/openair2/RRM_4_RRC_LITE/src/radio_resources/RadioResources.h index 7eeb564d29..263c486c2e 100755 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/RadioResources.h +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/RadioResources.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/SignallingRadioBearer.cpp b/openair2/RRM_4_RRC_LITE/src/radio_resources/SignallingRadioBearer.cpp index f3a197b135..99fa875d67 100755 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/SignallingRadioBearer.cpp +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/SignallingRadioBearer.cpp @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/SignallingRadioBearer.h b/openair2/RRM_4_RRC_LITE/src/radio_resources/SignallingRadioBearer.h index b5603e74cb..e441f9b0d7 100755 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/SignallingRadioBearer.h +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/SignallingRadioBearer.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/Transaction.cpp b/openair2/RRM_4_RRC_LITE/src/radio_resources/Transaction.cpp index 810fdc1636..c9ccc39745 100755 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/Transaction.cpp +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/Transaction.cpp @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/Transaction.h b/openair2/RRM_4_RRC_LITE/src/radio_resources/Transaction.h index 7f9eade115..2497a4ea3b 100755 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/Transaction.h +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/Transaction.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/Transactions.cpp b/openair2/RRM_4_RRC_LITE/src/radio_resources/Transactions.cpp index ed084245ec..04176f98ee 100755 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/Transactions.cpp +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/Transactions.cpp @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/Transactions.h b/openair2/RRM_4_RRC_LITE/src/radio_resources/Transactions.h index 2060f6a4a2..1b15b2e59f 100755 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/Transactions.h +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/Transactions.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/RRM_4_RRC_LITE/src/rrm.cpp b/openair2/RRM_4_RRC_LITE/src/rrm.cpp index 9c6304da22..02e3cae229 100755 --- a/openair2/RRM_4_RRC_LITE/src/rrm.cpp +++ b/openair2/RRM_4_RRC_LITE/src/rrm.cpp @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/AT_COMMANDS/parser.c b/openair2/UTIL/AT_COMMANDS/parser.c index c8cdba1209..0a5a530a31 100755 --- a/openair2/UTIL/AT_COMMANDS/parser.c +++ b/openair2/UTIL/AT_COMMANDS/parser.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/AT_COMMANDS/parser.h b/openair2/UTIL/AT_COMMANDS/parser.h index 443b602221..d232c076aa 100755 --- a/openair2/UTIL/AT_COMMANDS/parser.h +++ b/openair2/UTIL/AT_COMMANDS/parser.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/BIGPHYS/bigphys.c b/openair2/UTIL/BIGPHYS/bigphys.c index bf99d96a70..a325217621 100755 --- a/openair2/UTIL/BIGPHYS/bigphys.c +++ b/openair2/UTIL/BIGPHYS/bigphys.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/BIGPHYS/defs.h b/openair2/UTIL/BIGPHYS/defs.h index 5719cf0511..a371fb0002 100644 --- a/openair2/UTIL/BIGPHYS/defs.h +++ b/openair2/UTIL/BIGPHYS/defs.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/CLI/cli.c b/openair2/UTIL/CLI/cli.c index 710f9c4d8a..9f5f226047 100644 --- a/openair2/UTIL/CLI/cli.c +++ b/openair2/UTIL/CLI/cli.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/CLI/cli.h b/openair2/UTIL/CLI/cli.h index 4e9ba75cfe..fc1109b1c6 100644 --- a/openair2/UTIL/CLI/cli.h +++ b/openair2/UTIL/CLI/cli.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/CLI/cli_cmd.c b/openair2/UTIL/CLI/cli_cmd.c index a7acbbe5e5..8f7db6862c 100644 --- a/openair2/UTIL/CLI/cli_cmd.c +++ b/openair2/UTIL/CLI/cli_cmd.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/CLI/cli_if.h b/openair2/UTIL/CLI/cli_if.h index f7a3e0c381..1ec29d18a5 100644 --- a/openair2/UTIL/CLI/cli_if.h +++ b/openair2/UTIL/CLI/cli_if.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/CLI/cli_server.c b/openair2/UTIL/CLI/cli_server.c index df285c52bd..b93679c384 100644 --- a/openair2/UTIL/CLI/cli_server.c +++ b/openair2/UTIL/CLI/cli_server.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/FIFO/pad_list.c b/openair2/UTIL/FIFO/pad_list.c index dc0176670d..db7e33f1d6 100755 --- a/openair2/UTIL/FIFO/pad_list.c +++ b/openair2/UTIL/FIFO/pad_list.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/FIFO/pad_list.h b/openair2/UTIL/FIFO/pad_list.h index bcaf803cb8..5d018c3e24 100755 --- a/openair2/UTIL/FIFO/pad_list.h +++ b/openair2/UTIL/FIFO/pad_list.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/FIFO/types.h b/openair2/UTIL/FIFO/types.h index 0881074964..f75460d18b 100644 --- a/openair2/UTIL/FIFO/types.h +++ b/openair2/UTIL/FIFO/types.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/LISTS/list.c b/openair2/UTIL/LISTS/list.c index 343b1769d2..37450f6b30 100755 --- a/openair2/UTIL/LISTS/list.c +++ b/openair2/UTIL/LISTS/list.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/LOG/log.c b/openair2/UTIL/LOG/log.c index 283a906b58..abbdbc01ab 100755 --- a/openair2/UTIL/LOG/log.c +++ b/openair2/UTIL/LOG/log.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/LOG/log.h b/openair2/UTIL/LOG/log.h index c5d84689bf..c6abbfa001 100755 --- a/openair2/UTIL/LOG/log.h +++ b/openair2/UTIL/LOG/log.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/LOG/log_extern.h b/openair2/UTIL/LOG/log_extern.h index 8751254916..fbae536524 100644 --- a/openair2/UTIL/LOG/log_extern.h +++ b/openair2/UTIL/LOG/log_extern.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/LOG/log_if.h b/openair2/UTIL/LOG/log_if.h index b286d027aa..1e89344028 100644 --- a/openair2/UTIL/LOG/log_if.h +++ b/openair2/UTIL/LOG/log_if.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.c b/openair2/UTIL/LOG/vcd_signal_dumper.c index a1223e6ca5..8dfbfd6ef5 100644 --- a/openair2/UTIL/LOG/vcd_signal_dumper.c +++ b/openair2/UTIL/LOG/vcd_signal_dumper.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.h b/openair2/UTIL/LOG/vcd_signal_dumper.h index 7ec2e2445e..68257484f0 100644 --- a/openair2/UTIL/LOG/vcd_signal_dumper.h +++ b/openair2/UTIL/LOG/vcd_signal_dumper.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/MATH/crc_byte.c b/openair2/UTIL/MATH/crc_byte.c index 18054bf4d8..d305b10aeb 100644 --- a/openair2/UTIL/MATH/crc_byte.c +++ b/openair2/UTIL/MATH/crc_byte.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/MATH/oml.c b/openair2/UTIL/MATH/oml.c index 09e5b1a9c2..20c2876207 100644 --- a/openair2/UTIL/MATH/oml.c +++ b/openair2/UTIL/MATH/oml.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/MATH/oml.h b/openair2/UTIL/MATH/oml.h index 24e951fa68..9b0b863549 100644 --- a/openair2/UTIL/MATH/oml.h +++ b/openair2/UTIL/MATH/oml.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/MATH/random.c b/openair2/UTIL/MATH/random.c index 0d60a02512..04c20abaa8 100644 --- a/openair2/UTIL/MATH/random.c +++ b/openair2/UTIL/MATH/random.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/MATH/random_proto_extern.h b/openair2/UTIL/MATH/random_proto_extern.h index 3844a394ef..2fd70eb86c 100644 --- a/openair2/UTIL/MATH/random_proto_extern.h +++ b/openair2/UTIL/MATH/random_proto_extern.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/MATH/taus.c b/openair2/UTIL/MATH/taus.c index cba74ef1b4..277c2c16f6 100755 --- a/openair2/UTIL/MATH/taus.c +++ b/openair2/UTIL/MATH/taus.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/MEM/mem_block.c b/openair2/UTIL/MEM/mem_block.c index 6b4b3dab18..f0191a536a 100644 --- a/openair2/UTIL/MEM/mem_block.c +++ b/openair2/UTIL/MEM/mem_block.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/MEM/mem_block.h b/openair2/UTIL/MEM/mem_block.h index b38e9a2417..edcb147cee 100755 --- a/openair2/UTIL/MEM/mem_block.h +++ b/openair2/UTIL/MEM/mem_block.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/MEM/mem_mngt.c b/openair2/UTIL/MEM/mem_mngt.c index 43f55d1a05..1c4ad60552 100755 --- a/openair2/UTIL/MEM/mem_mngt.c +++ b/openair2/UTIL/MEM/mem_mngt.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/MEM/mem_mngt_proto_extern.h b/openair2/UTIL/MEM/mem_mngt_proto_extern.h index 9195aa558e..dd20bc2f25 100755 --- a/openair2/UTIL/MEM/mem_mngt_proto_extern.h +++ b/openair2/UTIL/MEM/mem_mngt_proto_extern.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/MEM/mem_pool.h b/openair2/UTIL/MEM/mem_pool.h index 7b68c88baa..5d950008de 100755 --- a/openair2/UTIL/MEM/mem_pool.h +++ b/openair2/UTIL/MEM/mem_pool.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OCG/OCG.c b/openair2/UTIL/OCG/OCG.c index 1170a6db7f..54f011260b 100644 --- a/openair2/UTIL/OCG/OCG.c +++ b/openair2/UTIL/OCG/OCG.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OCG/OCG.h b/openair2/UTIL/OCG/OCG.h index a32bfb14ee..cf96de7963 100644 --- a/openair2/UTIL/OCG/OCG.h +++ b/openair2/UTIL/OCG/OCG.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OCG/OCG_call_emu.h b/openair2/UTIL/OCG/OCG_call_emu.h index 836a10456c..25e455764e 100644 --- a/openair2/UTIL/OCG/OCG_call_emu.h +++ b/openair2/UTIL/OCG/OCG_call_emu.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OCG/OCG_config_mobi.c b/openair2/UTIL/OCG/OCG_config_mobi.c index b84210c073..f931fe0929 100644 --- a/openair2/UTIL/OCG/OCG_config_mobi.c +++ b/openair2/UTIL/OCG/OCG_config_mobi.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OCG/OCG_config_mobi.h b/openair2/UTIL/OCG/OCG_config_mobi.h index d1125651a0..a52c784fc6 100644 --- a/openair2/UTIL/OCG/OCG_config_mobi.h +++ b/openair2/UTIL/OCG/OCG_config_mobi.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OCG/OCG_create_dir.c b/openair2/UTIL/OCG/OCG_create_dir.c index 357fce7b20..27258ff122 100644 --- a/openair2/UTIL/OCG/OCG_create_dir.c +++ b/openair2/UTIL/OCG/OCG_create_dir.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OCG/OCG_create_dir.h b/openair2/UTIL/OCG/OCG_create_dir.h index b51306f624..f9f8db1690 100644 --- a/openair2/UTIL/OCG/OCG_create_dir.h +++ b/openair2/UTIL/OCG/OCG_create_dir.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OCG/OCG_detect_file.c b/openair2/UTIL/OCG/OCG_detect_file.c index 1ce230fb97..fb18f90bbc 100644 --- a/openair2/UTIL/OCG/OCG_detect_file.c +++ b/openair2/UTIL/OCG/OCG_detect_file.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OCG/OCG_detect_file.h b/openair2/UTIL/OCG/OCG_detect_file.h index 237bfa41d2..de877a4fcf 100644 --- a/openair2/UTIL/OCG/OCG_detect_file.h +++ b/openair2/UTIL/OCG/OCG_detect_file.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OCG/OCG_extern.h b/openair2/UTIL/OCG/OCG_extern.h index 1dc0b82ab7..e03932e406 100644 --- a/openair2/UTIL/OCG/OCG_extern.h +++ b/openair2/UTIL/OCG/OCG_extern.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OCG/OCG_generate_report.c b/openair2/UTIL/OCG/OCG_generate_report.c index 36db0d2ccb..5cf448a15d 100644 --- a/openair2/UTIL/OCG/OCG_generate_report.c +++ b/openair2/UTIL/OCG/OCG_generate_report.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OCG/OCG_generate_report.h b/openair2/UTIL/OCG/OCG_generate_report.h index e8a777f8a4..2a2f26f827 100644 --- a/openair2/UTIL/OCG/OCG_generate_report.h +++ b/openair2/UTIL/OCG/OCG_generate_report.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OCG/OCG_get_opt.c b/openair2/UTIL/OCG/OCG_get_opt.c index d4d0c877d9..1e9d8a784b 100644 --- a/openair2/UTIL/OCG/OCG_get_opt.c +++ b/openair2/UTIL/OCG/OCG_get_opt.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OCG/OCG_get_opt.h b/openair2/UTIL/OCG/OCG_get_opt.h index a084619a07..d44e96f5c3 100644 --- a/openair2/UTIL/OCG/OCG_get_opt.h +++ b/openair2/UTIL/OCG/OCG_get_opt.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OCG/OCG_if.h b/openair2/UTIL/OCG/OCG_if.h index 7b56003424..5f600539dd 100644 --- a/openair2/UTIL/OCG/OCG_if.h +++ b/openair2/UTIL/OCG/OCG_if.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OCG/OCG_parse_XML.c b/openair2/UTIL/OCG/OCG_parse_XML.c index 7d6cfad8ae..5397cdbd98 100644 --- a/openair2/UTIL/OCG/OCG_parse_XML.c +++ b/openair2/UTIL/OCG/OCG_parse_XML.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OCG/OCG_parse_XML.h b/openair2/UTIL/OCG/OCG_parse_XML.h index 6295a7afe6..25de67e196 100644 --- a/openair2/UTIL/OCG/OCG_parse_XML.h +++ b/openair2/UTIL/OCG/OCG_parse_XML.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OCG/OCG_parse_filename.c b/openair2/UTIL/OCG/OCG_parse_filename.c index bb860728a7..2f2a196fa0 100644 --- a/openair2/UTIL/OCG/OCG_parse_filename.c +++ b/openair2/UTIL/OCG/OCG_parse_filename.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OCG/OCG_parse_filename.h b/openair2/UTIL/OCG/OCG_parse_filename.h index ebdb617efe..4c1bd6989d 100644 --- a/openair2/UTIL/OCG/OCG_parse_filename.h +++ b/openair2/UTIL/OCG/OCG_parse_filename.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OCG/OCG_save_XML.c b/openair2/UTIL/OCG/OCG_save_XML.c index 5ad4081572..ec94ab9f8e 100644 --- a/openair2/UTIL/OCG/OCG_save_XML.c +++ b/openair2/UTIL/OCG/OCG_save_XML.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OCG/OCG_save_XML.h b/openair2/UTIL/OCG/OCG_save_XML.h index 0fff43fa34..d8cc24c9e8 100644 --- a/openair2/UTIL/OCG/OCG_save_XML.h +++ b/openair2/UTIL/OCG/OCG_save_XML.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OCG/OCG_vars.h b/openair2/UTIL/OCG/OCG_vars.h index 34c97dd58d..f1aab9b580 100644 --- a/openair2/UTIL/OCG/OCG_vars.h +++ b/openair2/UTIL/OCG/OCG_vars.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OMG/TraCIConstants.h b/openair2/UTIL/OMG/TraCIConstants.h index 90c78e0012..1defa16aad 100644 --- a/openair2/UTIL/OMG/TraCIConstants.h +++ b/openair2/UTIL/OMG/TraCIConstants.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OMG/client_traci_OMG.c b/openair2/UTIL/OMG/client_traci_OMG.c index a4b027116a..b3b43f49b2 100644 --- a/openair2/UTIL/OMG/client_traci_OMG.c +++ b/openair2/UTIL/OMG/client_traci_OMG.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OMG/client_traci_OMG.h b/openair2/UTIL/OMG/client_traci_OMG.h index a30f64372e..4d8b9e86d1 100644 --- a/openair2/UTIL/OMG/client_traci_OMG.h +++ b/openair2/UTIL/OMG/client_traci_OMG.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OMG/common.c b/openair2/UTIL/OMG/common.c index 1e2ea5a1f3..dd12cb302a 100644 --- a/openair2/UTIL/OMG/common.c +++ b/openair2/UTIL/OMG/common.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OMG/defs.h b/openair2/UTIL/OMG/defs.h index 1e70f1ea47..99de25b176 100644 --- a/openair2/UTIL/OMG/defs.h +++ b/openair2/UTIL/OMG/defs.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OMG/grid.c b/openair2/UTIL/OMG/grid.c index 69c9f2eb24..1c3fc0cc5c 100644 --- a/openair2/UTIL/OMG/grid.c +++ b/openair2/UTIL/OMG/grid.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OMG/grid.h b/openair2/UTIL/OMG/grid.h index dd148e3e2a..138eb0b552 100644 --- a/openair2/UTIL/OMG/grid.h +++ b/openair2/UTIL/OMG/grid.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OMG/id_manager.c b/openair2/UTIL/OMG/id_manager.c index ba6b8391e9..d37e56210d 100644 --- a/openair2/UTIL/OMG/id_manager.c +++ b/openair2/UTIL/OMG/id_manager.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OMG/id_manager.h b/openair2/UTIL/OMG/id_manager.h index ac2be91e43..d255d84dea 100644 --- a/openair2/UTIL/OMG/id_manager.h +++ b/openair2/UTIL/OMG/id_manager.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OMG/job.c b/openair2/UTIL/OMG/job.c index 51efd44e91..e43ed1a3eb 100644 --- a/openair2/UTIL/OMG/job.c +++ b/openair2/UTIL/OMG/job.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OMG/mobility_parser.c b/openair2/UTIL/OMG/mobility_parser.c index f22fea9972..d011dbe34f 100644 --- a/openair2/UTIL/OMG/mobility_parser.c +++ b/openair2/UTIL/OMG/mobility_parser.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OMG/mobility_parser.h b/openair2/UTIL/OMG/mobility_parser.h index 9b2ded837e..834f01d64a 100644 --- a/openair2/UTIL/OMG/mobility_parser.h +++ b/openair2/UTIL/OMG/mobility_parser.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OMG/omg.c b/openair2/UTIL/OMG/omg.c index 86e865ab9d..11bdc62071 100644 --- a/openair2/UTIL/OMG/omg.c +++ b/openair2/UTIL/OMG/omg.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OMG/omg.h b/openair2/UTIL/OMG/omg.h index 0b6627be60..1df5205df7 100644 --- a/openair2/UTIL/OMG/omg.h +++ b/openair2/UTIL/OMG/omg.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OMG/omg_constants.h b/openair2/UTIL/OMG/omg_constants.h index 8be36532ba..ba09ac6dd8 100644 --- a/openair2/UTIL/OMG/omg_constants.h +++ b/openair2/UTIL/OMG/omg_constants.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OMG/omg_hashtable.c b/openair2/UTIL/OMG/omg_hashtable.c index 2528c0e80e..761750a634 100644 --- a/openair2/UTIL/OMG/omg_hashtable.c +++ b/openair2/UTIL/OMG/omg_hashtable.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OMG/omg_hashtable.h b/openair2/UTIL/OMG/omg_hashtable.h index 8c4003e53b..c5437e381c 100644 --- a/openair2/UTIL/OMG/omg_hashtable.h +++ b/openair2/UTIL/OMG/omg_hashtable.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OMG/omg_vars.h b/openair2/UTIL/OMG/omg_vars.h index 3baf3758fb..f2715cdf1b 100644 --- a/openair2/UTIL/OMG/omg_vars.h +++ b/openair2/UTIL/OMG/omg_vars.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OMG/rwalk.c b/openair2/UTIL/OMG/rwalk.c index 40c7940c12..1a406d20e8 100644 --- a/openair2/UTIL/OMG/rwalk.c +++ b/openair2/UTIL/OMG/rwalk.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OMG/rwalk.h b/openair2/UTIL/OMG/rwalk.h index 9d512c67ad..6d38a8f799 100644 --- a/openair2/UTIL/OMG/rwalk.h +++ b/openair2/UTIL/OMG/rwalk.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OMG/rwp.c b/openair2/UTIL/OMG/rwp.c index f00d1f0bf2..6766cd9555 100644 --- a/openair2/UTIL/OMG/rwp.c +++ b/openair2/UTIL/OMG/rwp.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OMG/rwp.h b/openair2/UTIL/OMG/rwp.h index d35130fb00..ae895b95e3 100644 --- a/openair2/UTIL/OMG/rwp.h +++ b/openair2/UTIL/OMG/rwp.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OMG/socket_traci_OMG.c b/openair2/UTIL/OMG/socket_traci_OMG.c index fed154aa08..1a62ec04da 100644 --- a/openair2/UTIL/OMG/socket_traci_OMG.c +++ b/openair2/UTIL/OMG/socket_traci_OMG.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OMG/socket_traci_OMG.h b/openair2/UTIL/OMG/socket_traci_OMG.h index 1a7f4f5528..a873591148 100644 --- a/openair2/UTIL/OMG/socket_traci_OMG.h +++ b/openair2/UTIL/OMG/socket_traci_OMG.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OMG/static.c b/openair2/UTIL/OMG/static.c index f882ae7fe6..8305c6e9b7 100644 --- a/openair2/UTIL/OMG/static.c +++ b/openair2/UTIL/OMG/static.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OMG/static.h b/openair2/UTIL/OMG/static.h index 18b22123d7..1b5cb0f72f 100644 --- a/openair2/UTIL/OMG/static.h +++ b/openair2/UTIL/OMG/static.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OMG/steadystaterwp.c b/openair2/UTIL/OMG/steadystaterwp.c index 9bf11d240f..c466f3cd23 100644 --- a/openair2/UTIL/OMG/steadystaterwp.c +++ b/openair2/UTIL/OMG/steadystaterwp.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OMG/steadystaterwp.h b/openair2/UTIL/OMG/steadystaterwp.h index e7f3b184ee..1e274d9e1f 100644 --- a/openair2/UTIL/OMG/steadystaterwp.h +++ b/openair2/UTIL/OMG/steadystaterwp.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OMG/storage_traci_OMG.c b/openair2/UTIL/OMG/storage_traci_OMG.c index 7b703387f5..f8ccfdc059 100644 --- a/openair2/UTIL/OMG/storage_traci_OMG.c +++ b/openair2/UTIL/OMG/storage_traci_OMG.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OMG/storage_traci_OMG.h b/openair2/UTIL/OMG/storage_traci_OMG.h index cf2ecbe999..e1f97615c6 100644 --- a/openair2/UTIL/OMG/storage_traci_OMG.h +++ b/openair2/UTIL/OMG/storage_traci_OMG.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OMG/sumo.c b/openair2/UTIL/OMG/sumo.c index 65e193d8dc..f709a73e2a 100644 --- a/openair2/UTIL/OMG/sumo.c +++ b/openair2/UTIL/OMG/sumo.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OMG/sumo.h b/openair2/UTIL/OMG/sumo.h index f4950afc5c..71b36bf310 100644 --- a/openair2/UTIL/OMG/sumo.h +++ b/openair2/UTIL/OMG/sumo.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OMG/trace.c b/openair2/UTIL/OMG/trace.c index 04c84ed22a..89a9377f93 100644 --- a/openair2/UTIL/OMG/trace.c +++ b/openair2/UTIL/OMG/trace.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OMG/trace.h b/openair2/UTIL/OMG/trace.h index b3fe9af630..b3825e2fa8 100644 --- a/openair2/UTIL/OMG/trace.h +++ b/openair2/UTIL/OMG/trace.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OMG/trace_hashtable.c b/openair2/UTIL/OMG/trace_hashtable.c index 633ba700a1..2ecb392219 100644 --- a/openair2/UTIL/OMG/trace_hashtable.c +++ b/openair2/UTIL/OMG/trace_hashtable.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OMG/trace_hashtable.h b/openair2/UTIL/OMG/trace_hashtable.h index 0f0490318c..cd7feb73fc 100644 --- a/openair2/UTIL/OMG/trace_hashtable.h +++ b/openair2/UTIL/OMG/trace_hashtable.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OPT/mac_pcap.h b/openair2/UTIL/OPT/mac_pcap.h index e6e1dfb800..f44c12ec40 100644 --- a/openair2/UTIL/OPT/mac_pcap.h +++ b/openair2/UTIL/OPT/mac_pcap.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OPT/opt.h b/openair2/UTIL/OPT/opt.h index 62ec940cc3..bb3a099e12 100644 --- a/openair2/UTIL/OPT/opt.h +++ b/openair2/UTIL/OPT/opt.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OPT/probe.c b/openair2/UTIL/OPT/probe.c index 5fd34bbcf4..effd0bee85 100644 --- a/openair2/UTIL/OPT/probe.c +++ b/openair2/UTIL/OPT/probe.c @@ -52,7 +52,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OPT/socket_sender.c b/openair2/UTIL/OPT/socket_sender.c index b904e008c5..c984895351 100644 --- a/openair2/UTIL/OPT/socket_sender.c +++ b/openair2/UTIL/OPT/socket_sender.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OPT/vars.h b/openair2/UTIL/OPT/vars.h index 2730a971bd..4e03467537 100644 --- a/openair2/UTIL/OPT/vars.h +++ b/openair2/UTIL/OPT/vars.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OSA/osa_defs.h b/openair2/UTIL/OSA/osa_defs.h index 99f8023142..c11f93d2bb 100644 --- a/openair2/UTIL/OSA/osa_defs.h +++ b/openair2/UTIL/OSA/osa_defs.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OSA/osa_internal.h b/openair2/UTIL/OSA/osa_internal.h index 9376fc8a39..a42f925322 100644 --- a/openair2/UTIL/OSA/osa_internal.h +++ b/openair2/UTIL/OSA/osa_internal.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OSA/osa_key_deriver.c b/openair2/UTIL/OSA/osa_key_deriver.c index 25ed08889e..d8b5fba58b 100644 --- a/openair2/UTIL/OSA/osa_key_deriver.c +++ b/openair2/UTIL/OSA/osa_key_deriver.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OSA/osa_stream_eea.c b/openair2/UTIL/OSA/osa_stream_eea.c index 60fd731902..0a044e2e01 100644 --- a/openair2/UTIL/OSA/osa_stream_eea.c +++ b/openair2/UTIL/OSA/osa_stream_eea.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OSA/osa_stream_eia.c b/openair2/UTIL/OSA/osa_stream_eia.c index 9dc03f3f44..22ad10d25d 100644 --- a/openair2/UTIL/OSA/osa_stream_eia.c +++ b/openair2/UTIL/OSA/osa_stream_eia.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OTG/otg.c b/openair2/UTIL/OTG/otg.c index 5c7708c5c6..e167eb7b45 100644 --- a/openair2/UTIL/OTG/otg.c +++ b/openair2/UTIL/OTG/otg.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OTG/otg.h b/openair2/UTIL/OTG/otg.h index 8fef4c0c87..4c3f5bf8d9 100644 --- a/openair2/UTIL/OTG/otg.h +++ b/openair2/UTIL/OTG/otg.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OTG/otg_config.h b/openair2/UTIL/OTG/otg_config.h index 18bb4f5969..7e0e014375 100644 --- a/openair2/UTIL/OTG/otg_config.h +++ b/openair2/UTIL/OTG/otg_config.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OTG/otg_defs.h b/openair2/UTIL/OTG/otg_defs.h index 4f4cc4f601..c6cee01ec2 100644 --- a/openair2/UTIL/OTG/otg_defs.h +++ b/openair2/UTIL/OTG/otg_defs.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OTG/otg_externs.h b/openair2/UTIL/OTG/otg_externs.h index bcaa5d307d..7ceccfce35 100644 --- a/openair2/UTIL/OTG/otg_externs.h +++ b/openair2/UTIL/OTG/otg_externs.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OTG/otg_form.c b/openair2/UTIL/OTG/otg_form.c index 69b2549541..db77c6a801 100644 --- a/openair2/UTIL/OTG/otg_form.c +++ b/openair2/UTIL/OTG/otg_form.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OTG/otg_form.h b/openair2/UTIL/OTG/otg_form.h index b149206502..153ec75b32 100644 --- a/openair2/UTIL/OTG/otg_form.h +++ b/openair2/UTIL/OTG/otg_form.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OTG/otg_kpi.c b/openair2/UTIL/OTG/otg_kpi.c index f69c6940ff..3aa55df05f 100644 --- a/openair2/UTIL/OTG/otg_kpi.c +++ b/openair2/UTIL/OTG/otg_kpi.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OTG/otg_kpi.h b/openair2/UTIL/OTG/otg_kpi.h index d2c2fcec8a..c4ea232d87 100644 --- a/openair2/UTIL/OTG/otg_kpi.h +++ b/openair2/UTIL/OTG/otg_kpi.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OTG/otg_models.c b/openair2/UTIL/OTG/otg_models.c index b1327e8a08..e671160444 100644 --- a/openair2/UTIL/OTG/otg_models.c +++ b/openair2/UTIL/OTG/otg_models.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OTG/otg_models.h b/openair2/UTIL/OTG/otg_models.h index a0a776f8a7..51944fc15e 100644 --- a/openair2/UTIL/OTG/otg_models.h +++ b/openair2/UTIL/OTG/otg_models.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OTG/otg_rx.c b/openair2/UTIL/OTG/otg_rx.c index b5f0fd416b..8331dd8477 100644 --- a/openair2/UTIL/OTG/otg_rx.c +++ b/openair2/UTIL/OTG/otg_rx.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OTG/otg_rx.h b/openair2/UTIL/OTG/otg_rx.h index 6b3536a9c0..21c6fd85cb 100644 --- a/openair2/UTIL/OTG/otg_rx.h +++ b/openair2/UTIL/OTG/otg_rx.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OTG/otg_rx_socket.c b/openair2/UTIL/OTG/otg_rx_socket.c index 29590e33fc..e9d2e8a863 100644 --- a/openair2/UTIL/OTG/otg_rx_socket.c +++ b/openair2/UTIL/OTG/otg_rx_socket.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OTG/otg_rx_socket.h b/openair2/UTIL/OTG/otg_rx_socket.h index d9e33c9eea..0128269270 100644 --- a/openair2/UTIL/OTG/otg_rx_socket.h +++ b/openair2/UTIL/OTG/otg_rx_socket.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OTG/otg_tx.c b/openair2/UTIL/OTG/otg_tx.c index d6f6507644..e70bccbc73 100644 --- a/openair2/UTIL/OTG/otg_tx.c +++ b/openair2/UTIL/OTG/otg_tx.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OTG/otg_tx.h b/openair2/UTIL/OTG/otg_tx.h index b5cd7741a4..26013dfe47 100644 --- a/openair2/UTIL/OTG/otg_tx.h +++ b/openair2/UTIL/OTG/otg_tx.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OTG/otg_tx_socket.c b/openair2/UTIL/OTG/otg_tx_socket.c index 7eac7d0195..60b9df020c 100644 --- a/openair2/UTIL/OTG/otg_tx_socket.c +++ b/openair2/UTIL/OTG/otg_tx_socket.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OTG/otg_tx_socket.h b/openair2/UTIL/OTG/otg_tx_socket.h index 61668015df..2c5372773f 100644 --- a/openair2/UTIL/OTG/otg_tx_socket.h +++ b/openair2/UTIL/OTG/otg_tx_socket.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OTG/otg_vars.h b/openair2/UTIL/OTG/otg_vars.h index 9ce0afb82d..cc4c56ce9e 100644 --- a/openair2/UTIL/OTG/otg_vars.h +++ b/openair2/UTIL/OTG/otg_vars.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/OTG/traffic_config.h b/openair2/UTIL/OTG/traffic_config.h index 59b609cca7..3e982b1742 100644 --- a/openair2/UTIL/OTG/traffic_config.h +++ b/openair2/UTIL/OTG/traffic_config.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/TIMER/umts_timer.c b/openair2/UTIL/TIMER/umts_timer.c index 4e59e1e82f..9562aee67d 100755 --- a/openair2/UTIL/TIMER/umts_timer.c +++ b/openair2/UTIL/TIMER/umts_timer.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/TIMER/umts_timer.h b/openair2/UTIL/TIMER/umts_timer.h index e5668f6788..a857244ddf 100755 --- a/openair2/UTIL/TIMER/umts_timer.h +++ b/openair2/UTIL/TIMER/umts_timer.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/TIMER/umts_timer_proto_extern.h b/openair2/UTIL/TIMER/umts_timer_proto_extern.h index cb0223b111..ca50d3193f 100755 --- a/openair2/UTIL/TIMER/umts_timer_proto_extern.h +++ b/openair2/UTIL/TIMER/umts_timer_proto_extern.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/TIMER/umts_timer_struct.h b/openair2/UTIL/TIMER/umts_timer_struct.h index d6e15fabac..46b7216cd9 100755 --- a/openair2/UTIL/TIMER/umts_timer_struct.h +++ b/openair2/UTIL/TIMER/umts_timer_struct.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/TRACE/fifo_printf.c b/openair2/UTIL/TRACE/fifo_printf.c index e3b85337d3..2c5f5202f9 100755 --- a/openair2/UTIL/TRACE/fifo_printf.c +++ b/openair2/UTIL/TRACE/fifo_printf.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/TRACE/fifo_printf.h b/openair2/UTIL/TRACE/fifo_printf.h index ee0778fbda..84571e355c 100755 --- a/openair2/UTIL/TRACE/fifo_printf.h +++ b/openair2/UTIL/TRACE/fifo_printf.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/TRACE/fifo_printf_proto_extern.h b/openair2/UTIL/TRACE/fifo_printf_proto_extern.h index f9e6e278f9..66456af305 100755 --- a/openair2/UTIL/TRACE/fifo_printf_proto_extern.h +++ b/openair2/UTIL/TRACE/fifo_printf_proto_extern.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/UTIL/TRACE/print.h b/openair2/UTIL/TRACE/print.h index aff035a242..2c465e0fa5 100755 --- a/openair2/UTIL/TRACE/print.h +++ b/openair2/UTIL/TRACE/print.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/X2AP/x2ap.c b/openair2/X2AP/x2ap.c index 4ce72caf55..69b70964a4 100644 --- a/openair2/X2AP/x2ap.c +++ b/openair2/X2AP/x2ap.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/X2AP/x2ap.h b/openair2/X2AP/x2ap.h index 16c07eb672..561f0953c3 100644 --- a/openair2/X2AP/x2ap.h +++ b/openair2/X2AP/x2ap.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/X2AP/x2ap_common.c b/openair2/X2AP/x2ap_common.c index 9d9d7bc656..5565835997 100755 --- a/openair2/X2AP/x2ap_common.c +++ b/openair2/X2AP/x2ap_common.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/openair2/X2AP/x2ap_common.h b/openair2/X2AP/x2ap_common.h index fe7b710d96..04ad77f8e3 100755 --- a/openair2/X2AP/x2ap_common.h +++ b/openair2/X2AP/x2ap_common.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c b/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c index 6ebf709ec9..d515a206ae 100644 --- a/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c +++ b/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.h b/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.h index 39518173db..15e1d39da7 100644 --- a/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.h +++ b/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/ARCH/COMMON/common_lib.c b/targets/ARCH/COMMON/common_lib.c index 63f086ff1d..8b91a74b49 100644 --- a/targets/ARCH/COMMON/common_lib.c +++ b/targets/ARCH/COMMON/common_lib.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/ARCH/COMMON/common_lib.h b/targets/ARCH/COMMON/common_lib.h index a6851b0dbe..8cc7926d45 100644 --- a/targets/ARCH/COMMON/common_lib.h +++ b/targets/ARCH/COMMON/common_lib.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c index 6dd457d9b5..ce90d2cff9 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h index 628fcb377c..eabec94ebc 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/ARCH/EXMIMO/DEFS/openair_device.h b/targets/ARCH/EXMIMO/DEFS/openair_device.h index 3ca2f093f7..2be7b7f088 100755 --- a/targets/ARCH/EXMIMO/DEFS/openair_device.h +++ b/targets/ARCH/EXMIMO/DEFS/openair_device.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/ARCH/EXMIMO/DEFS/pcie_interface.h b/targets/ARCH/EXMIMO/DEFS/pcie_interface.h index 9c47d9b392..925787cabf 100644 --- a/targets/ARCH/EXMIMO/DEFS/pcie_interface.h +++ b/targets/ARCH/EXMIMO/DEFS/pcie_interface.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/ARCH/EXMIMO/DRIVER/eurecom/defs.h b/targets/ARCH/EXMIMO/DRIVER/eurecom/defs.h index 7467bd0357..ffba2d61c4 100755 --- a/targets/ARCH/EXMIMO/DRIVER/eurecom/defs.h +++ b/targets/ARCH/EXMIMO/DRIVER/eurecom/defs.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/ARCH/EXMIMO/DRIVER/eurecom/exmimo_fw.c b/targets/ARCH/EXMIMO/DRIVER/eurecom/exmimo_fw.c index e02173d9d2..eb23d1afb8 100644 --- a/targets/ARCH/EXMIMO/DRIVER/eurecom/exmimo_fw.c +++ b/targets/ARCH/EXMIMO/DRIVER/eurecom/exmimo_fw.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/ARCH/EXMIMO/DRIVER/eurecom/extern.h b/targets/ARCH/EXMIMO/DRIVER/eurecom/extern.h index b0bbd5c89b..90d1eaa64c 100755 --- a/targets/ARCH/EXMIMO/DRIVER/eurecom/extern.h +++ b/targets/ARCH/EXMIMO/DRIVER/eurecom/extern.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/ARCH/EXMIMO/DRIVER/eurecom/fileops.c b/targets/ARCH/EXMIMO/DRIVER/eurecom/fileops.c index 99edddab89..4427f4c8af 100755 --- a/targets/ARCH/EXMIMO/DRIVER/eurecom/fileops.c +++ b/targets/ARCH/EXMIMO/DRIVER/eurecom/fileops.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/ARCH/EXMIMO/DRIVER/eurecom/irq.c b/targets/ARCH/EXMIMO/DRIVER/eurecom/irq.c index 1e48a1f8c1..c8b9217ce3 100644 --- a/targets/ARCH/EXMIMO/DRIVER/eurecom/irq.c +++ b/targets/ARCH/EXMIMO/DRIVER/eurecom/irq.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/ARCH/EXMIMO/DRIVER/eurecom/module_main.c b/targets/ARCH/EXMIMO/DRIVER/eurecom/module_main.c index 988238bea9..4ef187b073 100755 --- a/targets/ARCH/EXMIMO/DRIVER/eurecom/module_main.c +++ b/targets/ARCH/EXMIMO/DRIVER/eurecom/module_main.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/ARCH/EXMIMO/DRIVER/eurecom/vars.h b/targets/ARCH/EXMIMO/DRIVER/eurecom/vars.h index e3a3a7abfc..7220946e6b 100755 --- a/targets/ARCH/EXMIMO/DRIVER/eurecom/vars.h +++ b/targets/ARCH/EXMIMO/DRIVER/eurecom/vars.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/ARCH/EXMIMO/DRIVER/exmimo3/defs.h b/targets/ARCH/EXMIMO/DRIVER/exmimo3/defs.h index 7467bd0357..ffba2d61c4 100755 --- a/targets/ARCH/EXMIMO/DRIVER/exmimo3/defs.h +++ b/targets/ARCH/EXMIMO/DRIVER/exmimo3/defs.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/ARCH/EXMIMO/DRIVER/exmimo3/exmimo_fw.c b/targets/ARCH/EXMIMO/DRIVER/exmimo3/exmimo_fw.c index d0d1a4fa08..1cc6abf9f7 100644 --- a/targets/ARCH/EXMIMO/DRIVER/exmimo3/exmimo_fw.c +++ b/targets/ARCH/EXMIMO/DRIVER/exmimo3/exmimo_fw.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/ARCH/EXMIMO/DRIVER/exmimo3/extern.h b/targets/ARCH/EXMIMO/DRIVER/exmimo3/extern.h index b0bbd5c89b..90d1eaa64c 100755 --- a/targets/ARCH/EXMIMO/DRIVER/exmimo3/extern.h +++ b/targets/ARCH/EXMIMO/DRIVER/exmimo3/extern.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/ARCH/EXMIMO/DRIVER/exmimo3/fileops.c b/targets/ARCH/EXMIMO/DRIVER/exmimo3/fileops.c index 99edddab89..4427f4c8af 100755 --- a/targets/ARCH/EXMIMO/DRIVER/exmimo3/fileops.c +++ b/targets/ARCH/EXMIMO/DRIVER/exmimo3/fileops.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/ARCH/EXMIMO/DRIVER/exmimo3/irq.c b/targets/ARCH/EXMIMO/DRIVER/exmimo3/irq.c index 1e48a1f8c1..c8b9217ce3 100644 --- a/targets/ARCH/EXMIMO/DRIVER/exmimo3/irq.c +++ b/targets/ARCH/EXMIMO/DRIVER/exmimo3/irq.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/ARCH/EXMIMO/DRIVER/exmimo3/module_main.c b/targets/ARCH/EXMIMO/DRIVER/exmimo3/module_main.c index 679f83d426..b25ff1cfa8 100755 --- a/targets/ARCH/EXMIMO/DRIVER/exmimo3/module_main.c +++ b/targets/ARCH/EXMIMO/DRIVER/exmimo3/module_main.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/ARCH/EXMIMO/DRIVER/exmimo3/vars.h b/targets/ARCH/EXMIMO/DRIVER/exmimo3/vars.h index e3a3a7abfc..7220946e6b 100755 --- a/targets/ARCH/EXMIMO/DRIVER/exmimo3/vars.h +++ b/targets/ARCH/EXMIMO/DRIVER/exmimo3/vars.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_dev.c b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_dev.c index 2e1a8f2587..2a25dd39fe 100644 --- a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_dev.c +++ b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_dev.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_drv.c b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_drv.c index 060db51b2b..b22b224e04 100644 --- a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_drv.c +++ b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_drv.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_drv.h b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_drv.h index ab81f78f8a..f19f0cfc42 100644 --- a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_drv.h +++ b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_drv.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_fifos.c b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_fifos.c index 4eb0ed7058..15f4deacd2 100644 --- a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_fifos.c +++ b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_fifos.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_ioctl.c b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_ioctl.c index 30ecf2a56a..8ade1d69a0 100644 --- a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_ioctl.c +++ b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_ioctl.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_mmap.c b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_mmap.c index a4af653862..c2860f0b18 100644 --- a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_mmap.c +++ b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_mmap.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_rw.c b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_rw.c index a07194f770..478f8bb363 100644 --- a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_rw.c +++ b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_rw.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/ARCH/EXMIMO/USERSPACE/LIB/example.c b/targets/ARCH/EXMIMO/USERSPACE/LIB/example.c index 87d006dbbf..5fbe19eacd 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/LIB/example.c +++ b/targets/ARCH/EXMIMO/USERSPACE/LIB/example.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/ARCH/EXMIMO/USERSPACE/LIB/gain_control.c b/targets/ARCH/EXMIMO/USERSPACE/LIB/gain_control.c index 9413295d46..84b2d8e8e2 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/LIB/gain_control.c +++ b/targets/ARCH/EXMIMO/USERSPACE/LIB/gain_control.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/ARCH/EXMIMO/USERSPACE/LIB/gain_control.h b/targets/ARCH/EXMIMO/USERSPACE/LIB/gain_control.h index bad05ca1c5..dd48683ad0 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/LIB/gain_control.h +++ b/targets/ARCH/EXMIMO/USERSPACE/LIB/gain_control.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c b/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c index 71c1009039..df9900d3bc 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c +++ b/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.h b/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.h index f40b7ae88c..ae2ff8a36b 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.h +++ b/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/elf.h b/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/elf.h index 793f585ae4..238c4ee606 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/elf.h +++ b/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/elf.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/elftypes.h b/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/elftypes.h index a83f89c794..dfd16118c6 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/elftypes.h +++ b/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/elftypes.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/updatefw.c b/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/updatefw.c index 17cca70a8a..692742c7cf 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/updatefw.c +++ b/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/updatefw.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/updatefw.h b/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/updatefw.h index c44570d8a1..ea2abec216 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/updatefw.h +++ b/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/updatefw.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/gpib_send.cc b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/gpib_send.cc index c451647f49..a007618e43 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/gpib_send.cc +++ b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/gpib_send.cc @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_config_exmimo.cc b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_config_exmimo.cc index 4618128401..4d0eef921b 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_config_exmimo.cc +++ b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_config_exmimo.cc @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_get_frame.cc b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_get_frame.cc index bdf50e1459..708910b4f7 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_get_frame.cc +++ b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_get_frame.cc @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_get_num_detected_cards.cc b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_get_num_detected_cards.cc index ec10e5d893..a26b6a0a67 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_get_num_detected_cards.cc +++ b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_get_num_detected_cards.cc @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_send_frame.cc b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_send_frame.cc index 4066cef7c9..75cdef67b2 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_send_frame.cc +++ b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_send_frame.cc @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_stop.cc b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_stop.cc index 5a0eb8c716..03b4b5324d 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_stop.cc +++ b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_stop.cc @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_stop_without_reset.cc b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_stop_without_reset.cc index 98dcb6f2f3..058a8bba3e 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_stop_without_reset.cc +++ b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_stop_without_reset.cc @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp index 192ed503e2..e57f55720b 100644 --- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp +++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/COMMON/create_tasks.c b/targets/COMMON/create_tasks.c index 537dbd91f6..148843dbbc 100644 --- a/targets/COMMON/create_tasks.c +++ b/targets/COMMON/create_tasks.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/COMMON/create_tasks.h b/targets/COMMON/create_tasks.h index 5d27c64abe..4e6f5817d8 100644 --- a/targets/COMMON/create_tasks.h +++ b/targets/COMMON/create_tasks.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf index bd9014670e..21303ebc71 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf @@ -130,7 +130,7 @@ eNBs = }; ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.12.17"; + mme_ip_address = ( { ipv4 = "192.168.12.62"; ipv6 = "192:168:30::17"; active = "yes"; preference = "ipv4"; @@ -139,11 +139,11 @@ eNBs = NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.213/24"; + ENB_INTERFACE_NAME_FOR_S1_MME = "eth1"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.82/24"; - ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.213/24"; + ENB_INTERFACE_NAME_FOR_S1U = "eth1"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.82/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 }; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/interfaces.bash b/targets/PROJECTS/GENERIC-LTE-EPC/interfaces.bash index 83e2eb9aea..b6151fc677 100755 --- a/targets/PROJECTS/GENERIC-LTE-EPC/interfaces.bash +++ b/targets/PROJECTS/GENERIC-LTE-EPC/interfaces.bash @@ -21,7 +21,7 @@ # Contact Information # OpenAirInterface Admin: openair_admin@eurecom.fr # OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@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 # diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/networks.bash b/targets/PROJECTS/GENERIC-LTE-EPC/networks.bash index 4b4173e6cb..81c4b7b1a6 100755 --- a/targets/PROJECTS/GENERIC-LTE-EPC/networks.bash +++ b/targets/PROJECTS/GENERIC-LTE-EPC/networks.bash @@ -21,7 +21,7 @@ # Contact Information # OpenAirInterface Admin: openair_admin@eurecom.fr # OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@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 # diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/start_enb_and_ue_virt.bash b/targets/PROJECTS/GENERIC-LTE-EPC/start_enb_and_ue_virt.bash index e0e97d8145..880382699c 100755 --- a/targets/PROJECTS/GENERIC-LTE-EPC/start_enb_and_ue_virt.bash +++ b/targets/PROJECTS/GENERIC-LTE-EPC/start_enb_and_ue_virt.bash @@ -22,7 +22,7 @@ # Contact Information # OpenAirInterface Admin: openair_admin@eurecom.fr # OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@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 # diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/start_ue.bash b/targets/PROJECTS/GENERIC-LTE-EPC/start_ue.bash index b76a267976..8ae7b10b67 100755 --- a/targets/PROJECTS/GENERIC-LTE-EPC/start_ue.bash +++ b/targets/PROJECTS/GENERIC-LTE-EPC/start_ue.bash @@ -22,7 +22,7 @@ # Contact Information # OpenAirInterface Admin: openair_admin@eurecom.fr # OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@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 # diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/utils.bash b/targets/PROJECTS/GENERIC-LTE-EPC/utils.bash index 7664678290..aa9bb333d4 100755 --- a/targets/PROJECTS/GENERIC-LTE-EPC/utils.bash +++ b/targets/PROJECTS/GENERIC-LTE-EPC/utils.bash @@ -21,7 +21,7 @@ # Contact Information # OpenAirInterface Admin: openair_admin@eurecom.fr # OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@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 # diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/virtual_box.bash b/targets/PROJECTS/GENERIC-LTE-EPC/virtual_box.bash index 57b935c0db..1fad3fe879 100755 --- a/targets/PROJECTS/GENERIC-LTE-EPC/virtual_box.bash +++ b/targets/PROJECTS/GENERIC-LTE-EPC/virtual_box.bash @@ -22,7 +22,7 @@ # Contact Information # OpenAirInterface Admin: openair_admin@eurecom.fr # OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@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 # diff --git a/targets/RT/USER/TOOLS/thread_ipc.c b/targets/RT/USER/TOOLS/thread_ipc.c index d6b86d2efb..36a61298ef 100644 --- a/targets/RT/USER/TOOLS/thread_ipc.c +++ b/targets/RT/USER/TOOLS/thread_ipc.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/RT/USER/TOOLS/thread_ipc.h b/targets/RT/USER/TOOLS/thread_ipc.h index 2a8fcc5185..99439b2b8d 100644 --- a/targets/RT/USER/TOOLS/thread_ipc.h +++ b/targets/RT/USER/TOOLS/thread_ipc.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/RT/USER/UE_transport_IQ.c b/targets/RT/USER/UE_transport_IQ.c index e986046d81..a52e3654ae 100644 --- a/targets/RT/USER/UE_transport_IQ.c +++ b/targets/RT/USER/UE_transport_IQ.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/RT/USER/condtest.c b/targets/RT/USER/condtest.c index 7244c47992..6ff2fe4516 100644 --- a/targets/RT/USER/condtest.c +++ b/targets/RT/USER/condtest.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/RT/USER/eNB_transport_IQ.c b/targets/RT/USER/eNB_transport_IQ.c index eaad2ebb24..07533ff59c 100644 --- a/targets/RT/USER/eNB_transport_IQ.c +++ b/targets/RT/USER/eNB_transport_IQ.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/RT/USER/emos-raw.c b/targets/RT/USER/emos-raw.c index 9e6861f1e6..b436e84502 100644 --- a/targets/RT/USER/emos-raw.c +++ b/targets/RT/USER/emos-raw.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 2faa4e796d..b96a7ae529 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c index 7c82b7976c..31701d877f 100644 --- a/targets/RT/USER/lte-ue.c +++ b/targets/RT/USER/lte-ue.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/RT/USER/msg_many.h b/targets/RT/USER/msg_many.h index f9d7e6a8d5..82e5eb1371 100644 --- a/targets/RT/USER/msg_many.h +++ b/targets/RT/USER/msg_many.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/RT/USER/rrh.c b/targets/RT/USER/rrh.c index ff4776754b..6da21190e5 100644 --- a/targets/RT/USER/rrh.c +++ b/targets/RT/USER/rrh.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/RT/USER/rrh_gw.c b/targets/RT/USER/rrh_gw.c index 2ff213b147..39b726ae07 100644 --- a/targets/RT/USER/rrh_gw.c +++ b/targets/RT/USER/rrh_gw.c @@ -22,7 +22,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/RT/USER/rrh_gw.h b/targets/RT/USER/rrh_gw.h index 37852c3b11..69546dbe07 100644 --- a/targets/RT/USER/rrh_gw.h +++ b/targets/RT/USER/rrh_gw.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/RT/USER/rrh_gw_externs.h b/targets/RT/USER/rrh_gw_externs.h index 47cb50605b..8d2d1d7e5e 100644 --- a/targets/RT/USER/rrh_gw_externs.h +++ b/targets/RT/USER/rrh_gw_externs.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/RT/USER/rt_wrapper.c b/targets/RT/USER/rt_wrapper.c index 62329d0f1b..0242dab3d8 100644 --- a/targets/RT/USER/rt_wrapper.c +++ b/targets/RT/USER/rt_wrapper.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/RT/USER/rt_wrapper.h b/targets/RT/USER/rt_wrapper.h index abe6e79a91..88a3d96efa 100644 --- a/targets/RT/USER/rt_wrapper.h +++ b/targets/RT/USER/rt_wrapper.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. diff --git a/targets/RT/USER/sched_dlsch.c b/targets/RT/USER/sched_dlsch.c index c13be0b7d4..d582e79310 100644 --- a/targets/RT/USER/sched_dlsch.c +++ b/targets/RT/USER/sched_dlsch.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/RT/USER/sched_rx_pdsch.c b/targets/RT/USER/sched_rx_pdsch.c index a32c4f2e59..be1ffbd752 100644 --- a/targets/RT/USER/sched_rx_pdsch.c +++ b/targets/RT/USER/sched_rx_pdsch.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/RT/USER/sched_ulsch.c b/targets/RT/USER/sched_ulsch.c index 2a698928ff..3ab0c312f5 100644 --- a/targets/RT/USER/sched_ulsch.c +++ b/targets/RT/USER/sched_ulsch.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/RT/USER/sleeptest.c b/targets/RT/USER/sleeptest.c index 694f9ddb4f..369f335307 100644 --- a/targets/RT/USER/sleeptest.c +++ b/targets/RT/USER/sleeptest.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/RT/USER/synctest.c b/targets/RT/USER/synctest.c index a4390640be..e365ad6728 100644 --- a/targets/RT/USER/synctest.c +++ b/targets/RT/USER/synctest.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/SCRIPTS/install_asn1c_0.9.24.modified.bash b/targets/SCRIPTS/install_asn1c_0.9.24.modified.bash index 3821d656c9..dc6f1aef25 100755 --- a/targets/SCRIPTS/install_asn1c_0.9.24.modified.bash +++ b/targets/SCRIPTS/install_asn1c_0.9.24.modified.bash @@ -22,7 +22,7 @@ # Contact Information # OpenAirInterface Admin: openair_admin@eurecom.fr # OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@eurecom.fr +# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr # # Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. # diff --git a/targets/SIMU/PROC/Process.c b/targets/SIMU/PROC/Process.c index a2c6260848..28d4970cc0 100644 --- a/targets/SIMU/PROC/Process.c +++ b/targets/SIMU/PROC/Process.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/SIMU/PROC/Process.h b/targets/SIMU/PROC/Process.h index 1f8eb4358b..4bf6c7a739 100644 --- a/targets/SIMU/PROC/Process.h +++ b/targets/SIMU/PROC/Process.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/SIMU/PROC/Tsync.h b/targets/SIMU/PROC/Tsync.h index e87b4cc6fc..6488759440 100644 --- a/targets/SIMU/PROC/Tsync.h +++ b/targets/SIMU/PROC/Tsync.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/SIMU/PROC/channel_sim_proc.c b/targets/SIMU/PROC/channel_sim_proc.c index 2af7513781..334d3f5549 100644 --- a/targets/SIMU/PROC/channel_sim_proc.c +++ b/targets/SIMU/PROC/channel_sim_proc.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/SIMU/PROC/channel_sim_proc.h b/targets/SIMU/PROC/channel_sim_proc.h index 3d1ac4e8b0..49e732de98 100644 --- a/targets/SIMU/PROC/channel_sim_proc.h +++ b/targets/SIMU/PROC/channel_sim_proc.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/SIMU/PROC/interface.h b/targets/SIMU/PROC/interface.h index e24e97066a..0688226ca6 100644 --- a/targets/SIMU/PROC/interface.h +++ b/targets/SIMU/PROC/interface.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/SIMU/USER/channel_sim.c b/targets/SIMU/USER/channel_sim.c index 69f41841a2..aeddfaddbe 100644 --- a/targets/SIMU/USER/channel_sim.c +++ b/targets/SIMU/USER/channel_sim.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/SIMU/USER/cor_SF_sim.c b/targets/SIMU/USER/cor_SF_sim.c index 339a00ff69..73a6f023cc 100644 --- a/targets/SIMU/USER/cor_SF_sim.c +++ b/targets/SIMU/USER/cor_SF_sim.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/SIMU/USER/cor_SF_sim.h b/targets/SIMU/USER/cor_SF_sim.h index 2afd3e664f..193eef90f1 100644 --- a/targets/SIMU/USER/cor_SF_sim.h +++ b/targets/SIMU/USER/cor_SF_sim.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/SIMU/USER/event_handler.c b/targets/SIMU/USER/event_handler.c index 956f345550..4072c6bfe7 100644 --- a/targets/SIMU/USER/event_handler.c +++ b/targets/SIMU/USER/event_handler.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/SIMU/USER/event_handler.h b/targets/SIMU/USER/event_handler.h index 46136de751..748d4efc2c 100644 --- a/targets/SIMU/USER/event_handler.h +++ b/targets/SIMU/USER/event_handler.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/SIMU/USER/init_lte.c b/targets/SIMU/USER/init_lte.c index 33c70ed4c8..d798b0968a 100644 --- a/targets/SIMU/USER/init_lte.c +++ b/targets/SIMU/USER/init_lte.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/SIMU/USER/init_lte.h b/targets/SIMU/USER/init_lte.h index 83e58bc734..b00f1f8a3c 100644 --- a/targets/SIMU/USER/init_lte.h +++ b/targets/SIMU/USER/init_lte.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/SIMU/USER/oaisim.c b/targets/SIMU/USER/oaisim.c index cd87d30495..c1d4d64ef6 100644 --- a/targets/SIMU/USER/oaisim.c +++ b/targets/SIMU/USER/oaisim.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/SIMU/USER/oaisim.h b/targets/SIMU/USER/oaisim.h index 15eaebda26..216acaa653 100644 --- a/targets/SIMU/USER/oaisim.h +++ b/targets/SIMU/USER/oaisim.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/SIMU/USER/oaisim_config.c b/targets/SIMU/USER/oaisim_config.c index 92d14797fa..51a5a03eac 100644 --- a/targets/SIMU/USER/oaisim_config.c +++ b/targets/SIMU/USER/oaisim_config.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/SIMU/USER/oaisim_config.h b/targets/SIMU/USER/oaisim_config.h index 7d580bd237..a50a8d2426 100644 --- a/targets/SIMU/USER/oaisim_config.h +++ b/targets/SIMU/USER/oaisim_config.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/SIMU/USER/oaisim_functions.c b/targets/SIMU/USER/oaisim_functions.c index 54d7aca589..ebdb3c00d3 100644 --- a/targets/SIMU/USER/oaisim_functions.c +++ b/targets/SIMU/USER/oaisim_functions.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/SIMU/USER/oaisim_functions.h b/targets/SIMU/USER/oaisim_functions.h index 693272b688..346e95eaf8 100644 --- a/targets/SIMU/USER/oaisim_functions.h +++ b/targets/SIMU/USER/oaisim_functions.h @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/SIMU/USER/oaisim_pad.c b/targets/SIMU/USER/oaisim_pad.c index 1ab933b688..b54709b925 100644 --- a/targets/SIMU/USER/oaisim_pad.c +++ b/targets/SIMU/USER/oaisim_pad.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/SIMU/USER/sinr_sim.c b/targets/SIMU/USER/sinr_sim.c index ba57ec3344..8bdc4a5057 100644 --- a/targets/SIMU/USER/sinr_sim.c +++ b/targets/SIMU/USER/sinr_sim.c @@ -21,7 +21,7 @@ Contact Information OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/TEST/OAI/case01.py b/targets/TEST/OAI/case01.py index 4a9594fdca..f2211bf6ac 100644 --- a/targets/TEST/OAI/case01.py +++ b/targets/TEST/OAI/case01.py @@ -22,7 +22,7 @@ # Contact Information # OpenAirInterface Admin: openair_admin@eurecom.fr # OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/TEST/OAI/case02.py b/targets/TEST/OAI/case02.py index d3d9577c4e..e3a4849901 100644 --- a/targets/TEST/OAI/case02.py +++ b/targets/TEST/OAI/case02.py @@ -22,7 +22,7 @@ # Contact Information # OpenAirInterface Admin: openair_admin@eurecom.fr # OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/TEST/OAI/case03.py b/targets/TEST/OAI/case03.py index e75b96a03f..ece67bcba0 100644 --- a/targets/TEST/OAI/case03.py +++ b/targets/TEST/OAI/case03.py @@ -22,7 +22,7 @@ # Contact Information # OpenAirInterface Admin: openair_admin@eurecom.fr # OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/TEST/OAI/case04.py b/targets/TEST/OAI/case04.py index 8b17265970..857190313d 100644 --- a/targets/TEST/OAI/case04.py +++ b/targets/TEST/OAI/case04.py @@ -22,7 +22,7 @@ # Contact Information # OpenAirInterface Admin: openair_admin@eurecom.fr # OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/TEST/OAI/case05.py b/targets/TEST/OAI/case05.py index 0d3fe0229f..c73ae969eb 100644 --- a/targets/TEST/OAI/case05.py +++ b/targets/TEST/OAI/case05.py @@ -22,7 +22,7 @@ # Contact Information # OpenAirInterface Admin: openair_admin@eurecom.fr # OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/TEST/OAI/test01.py b/targets/TEST/OAI/test01.py index f1c048fdcf..c382dd5c71 100644 --- a/targets/TEST/OAI/test01.py +++ b/targets/TEST/OAI/test01.py @@ -23,7 +23,7 @@ # Contact Information # OpenAirInterface Admin: openair_admin@eurecom.fr # OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@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 diff --git a/targets/build_helper.bash b/targets/build_helper.bash index c51a99bac8..2d30029eb4 100755 --- a/targets/build_helper.bash +++ b/targets/build_helper.bash @@ -21,7 +21,7 @@ # Contact Information # OpenAirInterface Admin: openair_admin@eurecom.fr # OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@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 # diff --git a/targets/build_oai.bash b/targets/build_oai.bash index c6c7edd56a..58e1659d56 100755 --- a/targets/build_oai.bash +++ b/targets/build_oai.bash @@ -21,7 +21,7 @@ # Contact Information # OpenAirInterface Admin: openair_admin@eurecom.fr # OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@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 # diff --git a/targets/perf_oai.bash b/targets/perf_oai.bash index 57139cdb01..c01ca35a8a 100755 --- a/targets/perf_oai.bash +++ b/targets/perf_oai.bash @@ -21,7 +21,7 @@ # Contact Information # OpenAirInterface Admin: openair_admin@eurecom.fr # OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@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 # -- GitLab