Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG UE
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Michael Black
OpenXG UE
Commits
5790c8ab
Commit
5790c8ab
authored
Jan 17, 2014
by
Lionel Gauthier
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
git-svn-id:
http://svn.eurecom.fr/openair4G/trunk@4902
818b1a75-f10b-46b9-bf7c-635c3b92a50f
parent
81d1ca7a
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
1468 additions
and
12 deletions
+1468
-12
openair3/RAL-LTE/LTE_RAL_UE/MIH-USER/lte_test_user/Jamfile
openair3/RAL-LTE/LTE_RAL_UE/MIH-USER/lte_test_user/Jamfile
+11
-10
openair3/RAL-LTE/LTE_RAL_UE/MIH-USER/lte_test_user/README.txt
...air3/RAL-LTE/LTE_RAL_UE/MIH-USER/lte_test_user/README.txt
+11
-0
openair3/RAL-LTE/LTE_RAL_UE/MIH-USER/lte_test_user/lte_user.conf
...3/RAL-LTE/LTE_RAL_UE/MIH-USER/lte_test_user/lte_user.conf
+4
-2
openair3/RAL-LTE/LTE_RAL_UE/MIH-USER/lte_test_user/ue_lte_user.conf
...AL-LTE/LTE_RAL_UE/MIH-USER/lte_test_user/ue_lte_user.conf
+42
-0
openair3/RAL-LTE/LTE_RAL_UE/MIH-USER/lte_test_user/ue_lte_user.cpp
...RAL-LTE/LTE_RAL_UE/MIH-USER/lte_test_user/ue_lte_user.cpp
+1400
-0
No files found.
openair3/RAL-LTE/LTE_RAL_UE/MIH-USER/lte_test_user/Jamfile
View file @
5790c8ab
...
...
@@ -16,18 +16,19 @@
# This software is distributed without any warranty.
#===============================================================================
project lte_user
install install
: ue_lte_user
ue_lte_user.conf
: <location>../../dist
;
exe lte_user
: mih_usr.cpp
../../lib/odtone//odtone_base
../../lib/odtone/mih//odtone_mih
../../lib/odtone/sap//odtone_sap
project ue_lte_user
;
install install
:
lte_user
lte_user.conf
: <location>../../dist
exe ue_lte_user
:
ue_lte_user.cpp
../../lib/odtone//odtone
/boost//program_options
;
openair3/RAL-LTE/LTE_RAL_UE/MIH-USER/lte_test_user/README.txt
0 → 100755
View file @
5790c8ab
FILES TO BE USED:
Jamfile
ue_lte_user.conf
ue_lte_user.cpp
README.txt
FILES OBSOLETES:
lte_user.conf
mih_usr.cpp
openair3/RAL-LTE/LTE_RAL_UE/MIH-USER/lte_test_user/lte_user.conf
View file @
5790c8ab
...
...
@@ -20,7 +20,7 @@
## User id
##
[
user
]
id
=
user
id
=
user
_ue
##
## Commands supported by the MIH-User
...
...
@@ -31,10 +31,12 @@ commands = mih_link_get_parameters, mih_link_configure_thresholds, mih_link_acti
## Port used for communication with MIHF
##
[
conf
]
port
=
123
4
port
=
123
5
##
## MIHF configuration. For the default demonstration leave as is.
##
[
mihf
]
local_port
=
1025
openair3/RAL-LTE/LTE_RAL_UE/MIH-USER/lte_test_user/ue_lte_user.conf
0 → 100755
View file @
5790c8ab
#===============================================================================
# Brief : MIH-User configuration file
# Authors : Carlos Guimaraes <cguimaraes@av.it.pt>
# Bruno Santos <bsantos@av.it.pt>
#-------------------------------------------------------------------------------
# ODTONE - Open Dot Twenty One
#
# Copyright (C) 2009-2012 Universidade Aveiro
# Copyright (C) 2009-2012 Instituto de Telecomunicações - Pólo Aveiro
#
# This software is distributed under a license. The full license
# agreement can be found in the file LICENSE in this distribution.
# This software may not be copied, modified, sold or distributed
# other than expressed in the named license agreement.
#
# This software is distributed without any warranty.
#===============================================================================
##
## User id
##
[
user
]
id
=
user_ue
##
## Commands supported by the MIH-User
##
commands
=
mih_link_get_parameters
,
mih_link_configure_thresholds
,
mih_link_actions
,
mih_net_ho_candidate_query
,
mih_net_ho_commit
,
mih_n2n_ho_query_resources
,
mih_n2n_ho_commit
,
mih_n2n_ho_complete
,
mih_mn_ho_candidate_query
,
mih_mn_ho_commit
,
mih_mn_ho_complete
##
## Port used for communication with MIHF
##
[
conf
]
port
=
1235
##
## MIHF configuration. For the default demonstration leave as is.
##
[
mihf
]
local_port
=
1025
openair3/RAL-LTE/LTE_RAL_UE/MIH-USER/lte_test_user/ue_lte_user.cpp
0 → 100755
View file @
5790c8ab
//==============================================================================
// Brief : MIH-User
// Authors : Bruno Santos <bsantos@av.it.pt>
//------------------------------------------------------------------------------
// ODTONE - Open Dot Twenty One
//
// Copyright (C) 2009-2012 Universidade Aveiro
// Copyright (C) 2009-2012 Instituto de Telecomunicações - Pólo Aveiro
//
// This software is distributed under a license. The full license
// agreement can be found in the file LICENSE in this distribution.
// This software may not be copied, modified, sold or distributed
// other than expressed in the named license agreement.
//
// This software is distributed without any warranty.
//==============================================================================
#include <odtone/base.hpp>
#include <odtone/debug.hpp>
#include <odtone/logger.hpp>
#include <odtone/mih/request.hpp>
#include <odtone/mih/response.hpp>
#include <odtone/mih/indication.hpp>
#include <odtone/mih/confirm.hpp>
#include <odtone/mih/tlv_types.hpp>
#include <odtone/sap/user.hpp>
#include <boost/utility.hpp>
#include <boost/bind.hpp>
#include <boost/tokenizer.hpp>
#include <boost/foreach.hpp>
#include <boost/format.hpp>
#include <iostream>
#include <map>
#include <time.h>
///////////////////////////////////////////////////////////////////////////////
// Definition of the scenario to execute
#define NB_OF_RESOURCES 4 // Should not exceed mih_user::_max_link_action_requests
//#define SCENARIO_1 // Sequentially activate and deactivate each resource
//#define SCENARIO_2 // Activate all resources, then deactivate all resources
#define NUM_PARM_REPORT 10
///////////////////////////////////////////////////////////////////////////////
// The scenario coded in this MIH-USER demo is the following
// +--------+ +-----+ +---------+
// |MIH_USER| |MIH-F| |LINK_SAP |
// +---+----+ +--+--+ +----+----+
// | | |
// ... (start of MIH-F here) ... ...
// | |---------- Link_Capability_Discover.request --------X|
// ... (start of LINK_SAP here) ... ...
// | |<--------- Link_Register.indication -----------------|
// | |---------- Link_Capability_Discover.request -------->|
// | |<--------- Link_Capability_Discover.confirm ---------|
// | | |
// ... (start of MIH USER here) ... ...
// |---------- MIH_User_Register.indication ------------>| (supported_commands) |
// | | |
// |---------- MIH_Capability_Discover.request --------->| |
// |<--------- MIH_Capability_Discover.confirm ----------| |
// | | |
// |---------- MIH_Event_Subscribe.request ------------->|---------- Link_Event_Subscribe.request ------------>|
// |<--------- MIH_Event_Subscribe.confirm --------------|<--------- Link_Event_Subscribe.confirm -------------|
// | | |
// |---------- MIH_Link_Actions.request ---------------->|---------- Link_Actions.request -------------------->|
// | (POWER UP + SCAN) | (POWER UP + SCAN) |
// ... ... ...
// | | |
// |<--------- Link_Detected.indication -----------------|<--------- Link_Detected.indication -----------------|
// | | |
// |<--------- Link_Up.indication -----------------------|<--------- Link_Up.indication -----------------------|
// | | RRC Connection Reestablishment notification) |
// | | |
// |---------- MIH_Link_Configure_Thresholds.request --->|---------- Link_Configure_Thresholds.request ------->|
// | | |
// |<--------- Link_Up.indication -----------------------|<--------- Link_Up.indication -----------------------|
// | | (RRC Connection reconfiguration notification) |
// |<--------- MIH_Link_Configure_Thresholds.confirm ----|<--------- Link_Configure_Thresholds.confirm --------|
// | | |
// |<--------- MIH_Link_Parameters_Report.indication ----|<--------- MIH_Link_Parameters_Report.indication ----|
// ... ... ...
// |<--------- MIH_Link_Actions.confirm -----------------|<--------- Link_Actions.confirm ---------------------|
// | (Success) | |
// |<--------- MIH_Link_Parameters_Report.indication ----|<--------- MIH_Link_Parameters_Report.indication ----|
// ... ... ...
// |<--------- MIH_Link_Parameters_Report.indication ----|<--------- MIH_Link_Parameters_Report.indication ----|
// ... ... ...
// |<--------- MIH_Link_Parameters_Report.indication ----|<--------- MIH_Link_Parameters_Report.indication ----|
// ... ... ...
// etc etc etc
///////////////////////////////////////////////////////////////////////////////
static
const
char
*
const
kConf_MIH_Commands
=
"user.commands"
;
///////////////////////////////////////////////////////////////////////////////
namespace
po
=
boost
::
program_options
;
using
odtone
::
uint
;
using
odtone
::
ushort
;
using
odtone
::
sint8
;
odtone
::
logger
log_
(
"[mih_usr]"
,
std
::
cout
);
///////////////////////////////////////////////////////////////////////////////
//-----------------------------------------------------------------------------
void
__trim
(
odtone
::
mih
::
octet_string
&
str
,
const
char
chr
)
//-----------------------------------------------------------------------------
{
str
.
erase
(
std
::
remove
(
str
.
begin
(),
str
.
end
(),
chr
),
str
.
end
());
}
//-----------------------------------------------------------------------------
template
<
class
T
>
std
::
string
StringOf
(
T
object
)
{
//-----------------------------------------------------------------------------
std
::
ostringstream
os
;
os
<<
object
;
return
(
os
.
str
());
}
//-----------------------------------------------------------------------------
std
::
string
getTimeStamp4Log
()
//-----------------------------------------------------------------------------
{
std
::
stringstream
ss
(
std
::
stringstream
::
in
|
std
::
stringstream
::
out
);
struct
timespec
time_spec
;
unsigned
int
time_now_micros
;
unsigned
int
time_now_s
;
clock_gettime
(
CLOCK_REALTIME
,
&
time_spec
);
time_now_s
=
(
unsigned
int
)
time_spec
.
tv_sec
%
3600
;
time_now_micros
=
(
unsigned
int
)
time_spec
.
tv_nsec
/
1000
;
ss
<<
time_now_s
<<
':'
<<
time_now_micros
;
return
ss
.
str
();
}
//-----------------------------------------------------------------------------
std
::
string
status2string
(
odtone
::
mih
::
status
statusP
){
//-----------------------------------------------------------------------------
switch
(
statusP
.
get
())
{
case
odtone
:
:
mih
::
status_success
:
return
"SUCCESS"
;
break
;
case
odtone
:
:
mih
::
status_failure
:
return
"UNSPECIFIED_FAILURE"
;
break
;
case
odtone
:
:
mih
::
status_rejected
:
return
"REJECTED"
;
break
;
case
odtone
:
:
mih
::
status_authorization_failure
:
return
"AUTHORIZATION_FAILURE"
;
break
;
case
odtone
:
:
mih
::
status_network_error
:
return
"NETWORK_ERROR"
;
break
;
default:
return
"UNKNOWN"
;
}
}
//-----------------------------------------------------------------------------
std
::
string
link_down_reason2string
(
odtone
::
mih
::
link_dn_reason
reasonP
){
//-----------------------------------------------------------------------------
switch
(
reasonP
.
get
())
{
case
odtone
:
:
mih
::
link_dn_reason_explicit_disconnect
:
return
"DN_REASON_EXPLICIT_DISCONNECT"
;
break
;
case
odtone
:
:
mih
::
link_dn_reason_packet_timeout
:
return
"DN_REASON_PACKET_TIMEOUT"
;
break
;
case
odtone
:
:
mih
::
link_dn_reason_no_resource
:
return
"DN_REASON_NO_RESOURCE"
;
break
;
case
odtone
:
:
mih
::
link_dn_reason_no_broadcast
:
return
"DN_REASON_NO_BROADCAST"
;
break
;
case
odtone
:
:
mih
::
link_dn_reason_authentication_failure
:
return
"DN_REASON_AUTHENTICATION_FAILURE"
;
break
;
case
odtone
:
:
mih
::
link_dn_reason_billing_failure
:
return
"DN_REASON_BILLING_FAILURE"
;
break
;
default:
return
"DN_REASON_UNKNOWN"
;
}
}
//-----------------------------------------------------------------------------
std
::
string
link_going_down_reason2string
(
odtone
::
mih
::
link_gd_reason
reasonP
){
//-----------------------------------------------------------------------------
switch
(
reasonP
.
get
())
{
case
odtone
:
:
mih
::
link_gd_reason_explicit_disconnect
:
return
"GD_REASON_EXPLICIT_DISCONNECT"
;
break
;
case
odtone
:
:
mih
::
link_gd_reason_link_parameter_degrading
:
return
"GD_REASON_PARAMETER_DEGRADING"
;
break
;
case
odtone
:
:
mih
::
link_gd_reason_low_power
:
return
"GD_REASON_LOW_POWER"
;
break
;
case
odtone
:
:
mih
::
link_gd_reason_no_resource
:
return
"GD_REASON_NO_RESOURCE"
;
break
;
default:
return
"GD_REASON_UNKNOWN"
;
}
}
//-----------------------------------------------------------------------------
std
::
string
evt2string
(
odtone
::
mih
::
mih_evt_list
evtP
){
//-----------------------------------------------------------------------------
std
::
string
s
=
std
::
string
(
" "
);
if
(
evtP
.
get
(
odtone
::
mih
::
mih_evt_link_detected
))
s
+=
"DETECTED "
;
if
(
evtP
.
get
(
odtone
::
mih
::
mih_evt_link_up
))
s
+=
"UP "
;
if
(
evtP
.
get
(
odtone
::
mih
::
mih_evt_link_down
))
s
+=
"DOWN "
;
if
(
evtP
.
get
(
odtone
::
mih
::
mih_evt_link_parameters_report
))
s
+=
"PARAMETERS_REPORT "
;
if
(
evtP
.
get
(
odtone
::
mih
::
mih_evt_link_going_down
))
s
+=
"GOING_DOWN "
;
if
(
evtP
.
get
(
odtone
::
mih
::
mih_evt_link_handover_imminent
))
s
+=
"HANDOVER_IMMINENT "
;
if
(
evtP
.
get
(
odtone
::
mih
::
mih_evt_link_handover_complete
))
s
+=
"HANDOVER_COMPLETE "
;
if
(
evtP
.
get
(
odtone
::
mih
::
mih_evt_link_pdu_transmit_status
))
s
+=
"PDU_TRANSMIT_STATUS "
;
return
s
;
}
//-----------------------------------------------------------------------------
std
::
string
cmd2string
(
odtone
::
mih
::
mih_cmd_list
cmdP
){
//-----------------------------------------------------------------------------
std
::
string
s
=
std
::
string
(
" "
);
if
(
cmdP
.
get
(
odtone
::
mih
::
mih_cmd_link_get_parameters
))
s
+=
"Link_Get_Parameters "
;
if
(
cmdP
.
get
(
odtone
::
mih
::
mih_cmd_link_configure_thresholds
))
s
+=
"Link_Configure_Thresholds "
;
if
(
cmdP
.
get
(
odtone
::
mih
::
mih_cmd_link_actions
))
s
+=
"Link_Actions "
;
if
(
cmdP
.
get
(
odtone
::
mih
::
mih_cmd_net_ho_candidate_query
))
s
+=
"Net_HO_Candidate_Query "
;
if
(
cmdP
.
get
(
odtone
::
mih
::
mih_cmd_net_ho_commit
))
s
+=
"Net_HO_Commit "
;
if
(
cmdP
.
get
(
odtone
::
mih
::
mih_cmd_n2n_ho_query_resources
))
s
+=
"N2N_HO_Query_Resources "
;
if
(
cmdP
.
get
(
odtone
::
mih
::
mih_cmd_n2n_ho_commit
))
s
+=
"N2N_HO_Commit "
;
if
(
cmdP
.
get
(
odtone
::
mih
::
mih_cmd_n2n_ho_complete
))
s
+=
"N2N_HO_Complete "
;
if
(
cmdP
.
get
(
odtone
::
mih
::
mih_cmd_mn_ho_candidate_query
))
s
+=
"MN_HO_Candidate_Query "
;
if
(
cmdP
.
get
(
odtone
::
mih
::
mih_cmd_mn_ho_commit
))
s
+=
"MN_HO_Commit "
;
if
(
cmdP
.
get
(
odtone
::
mih
::
mih_cmd_mn_ho_complete
))
s
+=
"MN_HO_Complete "
;
return
s
;
}
//-----------------------------------------------------------------------------
std
::
string
link_type2string
(
const
odtone
::
mih
::
link_type
&
lt
)
//-----------------------------------------------------------------------------
{
switch
(
lt
.
get
())
{
case
odtone
:
:
mih
::
link_type_gsm
:
return
"GSM"
;
break
;
case
odtone
:
:
mih
::
link_type_gprs
:
return
"GPRS"
;
break
;
case
odtone
:
:
mih
::
link_type_edge
:
return
"EDGE"
;
break
;
case
odtone
:
:
mih
::
link_type_ethernet
:
return
"Ethernet"
;
break
;
case
odtone
:
:
mih
::
link_type_wireless_other
:
return
"Other"
;
break
;
case
odtone
:
:
mih
::
link_type_802_11
:
return
"IEEE 802.11"
;
break
;
case
odtone
:
:
mih
::
link_type_cdma2000
:
return
"CDMA-2000"
;
break
;
case
odtone
:
:
mih
::
link_type_umts
:
return
"UMTS"
;
break
;
case
odtone
:
:
mih
::
link_type_cdma2000_hrpd
:
return
"CDMA-2000-HRPD"
;
break
;
case
odtone
:
:
mih
::
link_type_lte
:
return
"LTE"
;
break
;
case
odtone
:
:
mih
::
link_type_802_16
:
return
"IEEE 802.16"
;
break
;
case
odtone
:
:
mih
::
link_type_802_20
:
return
"IEEE 802.20"
;
break
;
case
odtone
:
:
mih
::
link_type_802_22
:
return
"IEEE 802.22"
;
break
;
default:
break
;
}
return
"Unknown link type"
;
}
//-----------------------------------------------------------------------------
std
::
string
link_addr2string
(
const
odtone
::
mih
::
link_addr
*
addr
)
//-----------------------------------------------------------------------------
{
if
(
const
odtone
::
mih
::
mac_addr
*
la
=
boost
::
get
<
odtone
::
mih
::
mac_addr
>
(
addr
))
{
return
la
->
address
();
}
else
if
(
const
odtone
::
mih
::
l2_3gpp_3g_cell_id
*
la
=
boost
::
get
<
odtone
::
mih
::
l2_3gpp_3g_cell_id
>
(
addr
))
{
char
plmn
[
16
];
sprintf
(
plmn
,
"%hhx:%hhx:%hhx"
,
la
->
plmn_id
[
0
],
la
->
plmn_id
[
1
],
la
->
plmn_id
[
2
]);
return
str
(
boost
::
format
(
"%s %d"
)
%
plmn
%
la
->
_cell_id
);
}
else
if
(
const
odtone
::
mih
::
l2_3gpp_2g_cell_id
*
la
=
boost
::
get
<
odtone
::
mih
::
l2_3gpp_2g_cell_id
>
(
addr
))
{
char
plmn
[
16
];
sprintf
(
plmn
,
"%hhx:%hhx:%hhx"
,
la
->
plmn_id
[
0
],
la
->
plmn_id
[
1
],
la
->
plmn_id
[
2
]);
return
str
(
boost
::
format
(
"%s %d %d"
)
%
plmn
%
la
->
_lac
%
la
->
_ci
);
}
else
if
(
const
odtone
::
mih
::
l2_3gpp_addr
*
la
=
boost
::
get
<
odtone
::
mih
::
l2_3gpp_addr
>
(
addr
))
{
return
la
->
value
;
}
else
if
(
const
odtone
::
mih
::
l2_3gpp2_addr
*
la
=
boost
::
get
<
odtone
::
mih
::
l2_3gpp2_addr
>
(
addr
))
{
return
la
->
value
;
}
else
if
(
const
odtone
::
mih
::
other_l2_addr
*
la
=
boost
::
get
<
odtone
::
mih
::
other_l2_addr
>
(
addr
))
{
return
la
->
value
;
}
return
"null"
;
}
//-----------------------------------------------------------------------------
std
::
string
l2_3gpp_3g_cell_id2string
(
odtone
::
mih
::
l2_3gpp_3g_cell_id
&
addr
)
//-----------------------------------------------------------------------------
{
char
buffer
[
256
];
int
index
=
0
;
index
+=
std
::
sprintf
(
&
buffer
[
index
],
"plmn: -%hhx--%hhx--%hhx-
\n
"
,
addr
.
plmn_id
[
0
],
addr
.
plmn_id
[
1
],
addr
.
plmn_id
[
2
]);
index
+=
std
::
sprintf
(
&
buffer
[
index
],
"cell_id: %hhx
\n
"
,
addr
.
_cell_id
);
return
buffer
;
}
//-----------------------------------------------------------------------------
std
::
string
link_id2string
(
odtone
::
mih
::
link_id
linkP
)
//-----------------------------------------------------------------------------
{
std
::
string
s
;
s
=
link_type2string
(
linkP
.
type
.
get
())
+
" "
+
link_addr2string
(
&
linkP
.
addr
);
return
s
;
}
//-----------------------------------------------------------------------------
std
::
string
ip_addr2string
(
odtone
::
mih
::
ip_addr
ip_addrP
)
{
//-----------------------------------------------------------------------------
std
::
string
s
;
switch
(
ip_addrP
.
type
())
{
case
odtone
:
:
mih
::
ip_addr
::
ipv4
:
s
=
"ipv4 "
;
break
;
case
odtone
:
:
mih
::
ip_addr
::
ipv6
:
s
=
"ipv6 "
;
break
;
default:
s
=
"Unkown type "
;
}
s
+=
ip_addrP
.
address
();
return
s
;
}
//-----------------------------------------------------------------------------
std
::
string
ip_tuple2string
(
odtone
::
mih
::
ip_tuple
ip_tupleP
)
{
//-----------------------------------------------------------------------------
char
buffer
[
128
];
std
::
snprintf
(
buffer
,
128
,
"%s/%d"
,
ip_addr2string
(
ip_tupleP
.
ip
).
c_str
(),
ip_tupleP
.
port_val
);
return
buffer
;
}
//-----------------------------------------------------------------------------
std
::
string
ip_proto2string
(
odtone
::
mih
::
proto
ip_protoP
)
{
//-----------------------------------------------------------------------------
switch
(
ip_protoP
.
get
())
{
case
odtone
:
:
mih
::
proto_tcp
:
return
"TCP"
;
case
odtone
:
:
mih
::
proto_udp
:
return
"UDP"
;
default:
break
;
}
return
"Unknown IP protocol"
;
}
// TEMP : next 2 functions are commented to restore flow_id as a uint32
// full structure will be updated later
/*//-----------------------------------------------------------------------------
std::string flow_id2string(odtone::mih::flow_id flowP) {
//-----------------------------------------------------------------------------
std::string s;
odtone::mih::ip_tuple ip;
ip = flowP.src;
s = "SRC = " + ip_tuple2string(flowP.src);
s += ", DST = " + ip_tuple2string(flowP.dst);
s += ", PROTO = " + ip_proto2string(flowP.transport);
return s;
}
//-----------------------------------------------------------------------------
std::string flow_id2string(odtone::mih::link_ac_param link_ac_paramP) {
//-----------------------------------------------------------------------------
if (odtone::mih::resource_desc *res = boost::get<odtone::mih::resource_desc>(&link_ac_paramP.param)) {
return flow_id2string(res->fid);
}
else if (odtone::mih::flow_attribute *flow = boost::get<odtone::mih::flow_attribute>(&link_ac_paramP.param)) {
return flow_id2string(flow->id);
}
return "null";
}*/
//-----------------------------------------------------------------------------
std
::
string
link_ac_result2string
(
odtone
::
mih
::
link_ac_result
resultP
)
//-----------------------------------------------------------------------------
{
switch
(
resultP
.
get
())
{
case
odtone
:
:
mih
::
link_ac_success
:
return
"SUCCESS"
;
break
;
case
odtone
:
:
mih
::
link_ac_failure
:
return
"FAILURE"
;
break
;
case
odtone
:
:
mih
::
link_ac_refused
:
return
"REFUSED"
;
break
;
case
odtone
:
:
mih
::
link_ac_incapable
:
return
"INCAPABLE"
;
break
;
default:
break
;
}
return
"Unknown action result"
;
}
//-----------------------------------------------------------------------------
std
::
string
link_actions_req2string
(
odtone
::
mih
::
link_action_req
link_act_reqP
)
{
//-----------------------------------------------------------------------------
std
::
string
s
;
s
=
link_id2string
(
link_act_reqP
.
id
);
if
(
link_act_reqP
.
action
.
type
==
odtone
::
mih
::
link_ac_type_none
)
s
+=
", AC_TYPE_NONE"
;
if
(
link_act_reqP
.
action
.
type
==
odtone
::
mih
::
link_ac_type_disconnect
)
s
+=
", AC_TYPE_DISCONNECT"
;
if
(
link_act_reqP
.
action
.
type
==
odtone
::
mih
::
link_ac_type_low_power
)
s
+=
", AC_TYPE_LOW_POWER"
;
if
(
link_act_reqP
.
action
.
type
==
odtone
::
mih
::
link_ac_type_power_down
)
s
+=
", AC_TYPE_POWER_DOWN"
;
if
(
link_act_reqP
.
action
.
type
==
odtone
::
mih
::
link_ac_type_power_up
)
s
+=
", AC_TYPE_POWER_UP"
;
if
(
link_act_reqP
.
action
.
type
==
odtone
::
mih
::
link_ac_type_flow_attr
)
s
+=
", AC_TYPE_FLOW_ATTR"
;
if
(
link_act_reqP
.
action
.
type
==
odtone
::
mih
::
link_ac_type_link_activate_resources
)
s
+=
", AC_TYPE_ACTIVATE_RESOURCES"
;
if
(
link_act_reqP
.
action
.
type
==
odtone
::
mih
::
link_ac_type_link_deactivate_resources
)
s
+=
", AC_TYPE_DEACTIVATE_RESOURCES"
;
if
(
link_act_reqP
.
action
.
attr
.
get
(
odtone
::
mih
::
link_ac_attr_data_fwd_req
))
s
+=
", AC_ATTR_DATA_FWD_REQ"
;
if
(
link_act_reqP
.
action
.
attr
.
get
(
odtone
::
mih
::
link_ac_attr_scan
))
s
+=
", AC_ATTR_SCAN"
;
if
(
link_act_reqP
.
action
.
attr
.
get
(
odtone
::
mih
::
link_ac_attr_res_retain
))
s
+=
", AC_ATTR_RES_RETAIN"
;
s
+=
", "
+
StringOf
(
link_act_reqP
.
ex_time
)
+
" ms"
;
return
s
;
}
//-----------------------------------------------------------------------------
std
::
string
net_type_addr_list2string
(
boost
::
optional
<
odtone
::
mih
::
net_type_addr_list
>
ntalP
)
{
//-----------------------------------------------------------------------------
std
::
string
s
;
std
::
ostringstream
stream
;
odtone
::
mih
::
net_type_addr
net_type_addr
;
for
(
odtone
::
mih
::
net_type_addr_list
::
iterator
i
=
ntalP
->
begin
();
i
!=
ntalP
->
end
();
i
++
)
{
net_type_addr
=
boost
::
get
<
odtone
::
mih
::
net_type_addr
>
(
*
i
);
stream
<<
net_type_addr
;
if
(
i
!=
ntalP
->
begin
())
{
stream
<<
" / "
;
}
}
s
=
stream
.
str
();
return
s
;
}
/**
* Parse supported commands.
*
* @param cfg Configuration options.
* @return An optional list of supported commands.
*/
boost
::
optional
<
odtone
::
mih
::
mih_cmd_list
>
parse_supported_commands
(
const
odtone
::
mih
::
config
&
cfg
)
{
using
namespace
boost
;
odtone
::
mih
::
mih_cmd_list
commands
;
std
::
map
<
std
::
string
,
odtone
::
mih
::
mih_cmd_list_enum
>
enum_map
;
enum_map
[
"mih_link_get_parameters"
]
=
odtone
::
mih
::
mih_cmd_link_get_parameters
;
enum_map
[
"mih_link_configure_thresholds"
]
=
odtone
::
mih
::
mih_cmd_link_configure_thresholds
;
enum_map
[
"mih_link_actions"
]
=
odtone
::
mih
::
mih_cmd_link_actions
;
enum_map
[
"mih_net_ho_candidate_query"
]
=
odtone
::
mih
::
mih_cmd_net_ho_candidate_query
;
enum_map
[
"mih_net_ho_commit"
]
=
odtone
::
mih
::
mih_cmd_net_ho_commit
;
enum_map
[
"mih_n2n_ho_query_resources"
]
=
odtone
::
mih
::
mih_cmd_n2n_ho_query_resources
;
enum_map
[
"mih_n2n_ho_commit"
]
=
odtone
::
mih
::
mih_cmd_n2n_ho_commit
;
enum_map
[
"mih_n2n_ho_complete"
]
=
odtone
::
mih
::
mih_cmd_n2n_ho_complete
;
enum_map
[
"mih_mn_ho_candidate_query"
]
=
odtone
::
mih
::
mih_cmd_mn_ho_candidate_query
;
enum_map
[
"mih_mn_ho_commit"
]
=
odtone
::
mih
::
mih_cmd_mn_ho_commit
;
enum_map
[
"mih_mn_ho_complete"
]
=
odtone
::
mih
::
mih_cmd_mn_ho_complete
;
std
::
string
tmp
=
cfg
.
get
<
std
::
string
>
(
kConf_MIH_Commands
);
__trim
(
tmp
,
' '
);
char_separator
<
char
>
sep1
(
","
);
tokenizer
<
char_separator
<
char
>
>
list_tokens
(
tmp
,
sep1
);
BOOST_FOREACH
(
std
::
string
str
,
list_tokens
)
{
if
(
enum_map
.
find
(
str
)
!=
enum_map
.
end
())
{
commands
.
set
((
odtone
::
mih
::
mih_cmd_list_enum
)
enum_map
[
str
]);
}
}
return
commands
;
}
///////////////////////////////////////////////////////////////////////////////
/**
* This class provides an implementation of an IEEE 802.21 MIH-User.
*/
class
mih_user
:
boost
::
noncopyable
{
public:
/**
* Construct the MIH-User.
*
* @param cfg Configuration options.
* @param io The io_service object that the MIH-User will use to
* dispatch handlers for any asynchronous operations performed on the socket.
*/
mih_user
(
const
odtone
::
mih
::
config
&
cfg
,
boost
::
asio
::
io_service
&
io
);
/**
* Destruct the MIH-User.
*/
~
mih_user
();
protected:
/**
* User registration handler.
*
* @param cfg Configuration options.
* @param ec Error Code.
*/
void
user_reg_handler
(
const
odtone
::
mih
::
config
&
cfg
,
const
boost
::
system
::
error_code
&
ec
);
/**
* Default MIH event handler.
*
* @param msg Received event notification.
* @param ec Error code.
*/
void
event_handler
(
odtone
::
mih
::
message
&
msg
,
const
boost
::
system
::
error_code
&
ec
);
/**
* MIH receive message handler.
*
* @param msg Received message.
* @param ec Error code.
*/
void
receive_handler
(
odtone
::
mih
::
message
&
msg
,
const
boost
::
system
::
error_code
&
ec
);
void
send_MIH_User_Register_indication
(
const
odtone
::
mih
::
config
&
cfg
);
void
send_MIH_Capability_Discover_request
(
void
);
void
receive_MIH_Capability_Discover_confirm
(
odtone
::
mih
::
message
&
msg
);
void
send_MIH_Event_Subscribe_request
(
odtone
::
mih
::
link_tuple_id
&
li
,
odtone
::
mih
::
mih_evt_list
&
evt
);
void
receive_MIH_Event_Subscribe_confirm
(
odtone
::
mih
::
message
&
msg
);
void
send_MIH_Event_Unsubscribe_request
(
void
);
void
send_MIH_Event_Unsubscribe_request
(
odtone
::
mih
::
link_tuple_id
&
li
,
odtone
::
mih
::
mih_evt_list
&
evt
);
void
receive_MIH_Event_Unsubscribe_confirm
(
odtone
::
mih
::
message
&
msg
);
void
send_MIH_Link_Actions_request
(
const
odtone
::
mih
::
link_id
&
link
,
odtone
::
mih
::
link_ac_type
type
);
void
receive_MIH_Link_Actions_confirm
(
odtone
::
mih
::
message
&
msg
);
void
receive_MIH_Link_Parameters_Report
(
odtone
::
mih
::
message
&
msg
,
const
boost
::
system
::
error_code
&
ec
);
void
send_MIH_Link_Configure_Thresholds_request
(
odtone
::
mih
::
message
&
msg
,
const
boost
::
system
::
error_code
&
ec
);
void
receive_MIH_Link_Configure_Thresholds_confirm
(
odtone
::
mih
::
message
&
msg
,
const
boost
::
system
::
error_code
&
ec
);
private:
odtone
::
sap
::
user
_mihf
;
/**< User SAP helper. */
odtone
::
mih
::
id
_mihfid
;
/**< MIHF destination ID. */
odtone
::
mih
::
id
_mihuserid
;
/**< MIH_USER ID. */
odtone
::
mih
::
ip_addr
_mihf_ip
;
/**< MIHF IP address */
odtone
::
mih
::
port
_mihf_lport
;
/**< MIHF local port number */
odtone
::
mih
::
link_id_list
_link_id_list
;
/**< List of network link identifiers */
odtone
::
mih
::
mih_evt_list
_subs_evt_list
;
/**< List of subscribed link events */
odtone
::
mih
::
link_ac_type
_last_link_action_type
;
odtone
::
uint
_current_link_action_request
,
_nb_of_link_action_requests
;
odtone
::
uint
link_threshold_request
,
link_measures_request
,
link_measures_counter
;
odtone
::
mih
::
link_id
rcv_link_id
;
static
const
odtone
::
uint
_max_link_action_requests
=
4
;
odtone
::
uint
_num_thresholds_request
;
void
receive_MIH_Link_Detected_indication
(
odtone
::
mih
::
message
&
msg
);
void
send_MIH_Link_Action_Power_Up_plus_scan_request
(
const
odtone
::
mih
::
link_id
&
link
);
void
receive_MIH_Link_Up_indication
(
odtone
::
mih
::
message
&
msg
);
void
receive_MIH_Link_Down_indication
(
odtone
::
mih
::
message
&
msg
);
void
receive_MIH_Link_Going_Down_indication
(
odtone
::
mih
::
message
&
msg
);
};
//-----------------------------------------------------------------------------
mih_user
::
mih_user
(
const
odtone
::
mih
::
config
&
cfg
,
boost
::
asio
::
io_service
&
io
)
:
_mihf
(
cfg
,
io
,
boost
::
bind
(
&
mih_user
::
event_handler
,
this
,
_1
,
_2
)),
_last_link_action_type
(
odtone
::
mih
::
link_ac_type_none
),
_current_link_action_request
(
0
),
_nb_of_link_action_requests
(
NB_OF_RESOURCES
),
_num_thresholds_request
(
0
)
//-----------------------------------------------------------------------------
{
odtone
::
mih
::
octet_string
user_id
=
cfg
.
get
<
odtone
::
mih
::
octet_string
>
(
odtone
::
sap
::
kConf_MIH_SAP_id
);
_mihuserid
.
assign
(
user_id
.
c_str
());
odtone
::
mih
::
octet_string
dest_id
=
cfg
.
get
<
odtone
::
mih
::
octet_string
>
(
odtone
::
sap
::
kConf_MIH_SAP_dest
);
_mihfid
.
assign
(
dest_id
.
c_str
());
odtone
::
mih
::
octet_string
src
=
cfg
.
get
<
odtone
::
mih
::
octet_string
>
(
odtone
::
sap
::
kConf_MIHF_Ip
);
boost
::
asio
::
ip
::
address
ip
=
boost
::
asio
::
ip
::
address
::
from_string
(
src
);
if
(
ip
.
is_v4
())
{
odtone
::
mih
::
ip_addr
ip_addr
(
odtone
::
mih
::
ip_addr
::
ipv4
,
src
);
_mihf_ip
=
ip_addr
;
}
else
if
(
ip
.
is_v6
())
{
odtone
::
mih
::
ip_addr
ip_addr
(
odtone
::
mih
::
ip_addr
::
ipv6
,
src
);
_mihf_ip
=
ip_addr
;
}
_mihf_lport
=
cfg
.
get
<
odtone
::
mih
::
port
>
(
odtone
::
sap
::
kConf_MIHF_Local_Port
);
//_nb_of_link_action_requests = NB_OF_RESOURCES;
if
(
_nb_of_link_action_requests
>
_max_link_action_requests
)
{
_nb_of_link_action_requests
=
_max_link_action_requests
;
}
_link_id_list
.
clear
();
_subs_evt_list
.
clear
();
link_threshold_request
=
0
;
link_measures_request
=
0
;
link_measures_counter
=
0
;
log_
(
0
,
"[MSC_NEW]["
+
getTimeStamp4Log
()
+
"][MIH-USER="
+
_mihuserid
.
to_string
()
+
"]
\n
"
);
// Send MEDIEVAL specific MIH_User_Register.indication message to the MIH-F
mih_user
::
send_MIH_User_Register_indication
(
cfg
);
}
//-----------------------------------------------------------------------------
mih_user
::~
mih_user
()
//-----------------------------------------------------------------------------
{
}
//-----------------------------------------------------------------------------
void
mih_user
::
user_reg_handler
(
const
odtone
::
mih
::
config
&
cfg
,
const
boost
::
system
::
error_code
&
ec
)
//-----------------------------------------------------------------------------
{
log_
(
0
,
"MIH-User register result: "
,
ec
.
message
(),
"
\n
"
);
//
// Let's fire a capability discover request to get things moving
//
mih_user
::
send_MIH_Capability_Discover_request
();
}
//-----------------------------------------------------------------------------
void
mih_user
::
event_handler
(
odtone
::
mih
::
message
&
msg
,
const
boost
::
system
::
error_code
&
ec
)
//-----------------------------------------------------------------------------
{
if
(
ec
)
{
log_
(
0
,
__FUNCTION__
,
" error: "
,
ec
.
message
());
return
;
}
switch
(
msg
.
mid
())
{
case
odtone
:
:
mih
::
indication
::
link_detected
:
mih_user
::
receive_MIH_Link_Detected_indication
(
msg
);
break
;
case
odtone
:
:
mih
::
indication
::
link_up
:
mih_user
::
receive_MIH_Link_Up_indication
(
msg
);
if
(
_num_thresholds_request
==
0
)
{
mih_user
::
send_MIH_Link_Configure_Thresholds_request
(
msg
,
ec
);
_num_thresholds_request
+=
1
;;
}
break
;
case
odtone
:
:
mih
::
indication
::
link_down
:
mih_user
::
receive_MIH_Link_Down_indication
(
msg
);
break
;
case
odtone
:
:
mih
::
indication
::
link_going_down
:
mih_user
::
receive_MIH_Link_Going_Down_indication
(
msg
);
break
;
case
odtone
:
:
mih
::
indication
::
link_handover_imminent
:
log_
(
0
,
"MIH-User has received a local event
\"
link_handover_imminent
\"
"
);
break
;
case
odtone
:
:
mih
::
indication
::
link_handover_complete
:
log_
(
0
,
"MIH-User has received a local event
\"
link_handover_complete
\"
"
);
break
;
case
odtone
:
:
mih
::
indication
::
link_parameters_report
:
//log_(0, "MIH-User has received a local event \"link_parameters_report\"");
mih_user
::
receive_MIH_Link_Parameters_Report
(
msg
,
ec
);
/*if (link_threshold_request == 0){
mih_user::send_MIH_Link_Configure_Thresholds_request(msg, ec);
link_threshold_request =1;
} else if (link_threshold_request == 1){
link_measures_counter ++;
// Stop measures after 5 reports
if (link_measures_counter == NUM_PARM_REPORT){
mih_user::send_MIH_Link_Configure_Thresholds_request(msg, ec);
}
}*/
break
;
case
odtone
:
:
mih
::
indication
::
link_pdu_transmit_status
:
log_
(
0
,
"MIH-User has received a local event
\"
link_pdu_transmit_status
\"
"
);
break
;
case
odtone
:
:
mih
::
confirm
::
link_configure_thresholds
:
mih_user
::
receive_MIH_Link_Configure_Thresholds_confirm
(
msg
,
ec
);
break
;
default:
log_
(
0
,
"MIH-User has received UNKNOWN local event"
);
break
;
}
}
//-----------------------------------------------------------------------------
void
mih_user
::
receive_handler
(
odtone
::
mih
::
message
&
msg
,
const
boost
::
system
::
error_code
&
ec
)
//-----------------------------------------------------------------------------
{
if
(
ec
)
{
log_
(
0
,
__FUNCTION__
,
" error: "
,
ec
.
message
());
return
;
}
switch
(
msg
.
mid
())
{
case
odtone
:
:
mih
::
confirm
::
capability_discover
:
mih_user
::
receive_MIH_Capability_Discover_confirm
(
msg
);
break
;
case
odtone
:
:
mih
::
confirm
::
event_subscribe
:
mih_user
::
receive_MIH_Event_Subscribe_confirm
(
msg
);
break
;
case
odtone
:
:
mih
::
confirm
::
event_unsubscribe
:
mih_user
::
receive_MIH_Event_Unsubscribe_confirm
(
msg
);
break
;
case
odtone
:
:
mih
::
confirm
::
link_actions
:
mih_user
::
receive_MIH_Link_Actions_confirm
(
msg
);
break
;
default:
log_
(
0
,
"MIH-User has received UNKNOWN message ("
,
msg
.
mid
(),
")
\n
"
);
break
;
}
}
//-----------------------------------------------------------------------------
void
mih_user
::
receive_MIH_Link_Detected_indication
(
odtone
::
mih
::
message
&
msg
)
//-----------------------------------------------------------------------------
{
log_
(
0
,
"MIH_Link_Detected.indication - RECEIVED - Begin
\n
"
);
odtone
::
mih
::
link_det_info
ldi
;
odtone
::
mih
::
link_det_info_list
ldil
;
odtone
::
mih
::
link_det_info_list
::
iterator
it_ldil
;
odtone
::
mih
::
link_id
lid
;
msg
>>
odtone
::
mih
::
indication
()
&
odtone
::
mih
::
tlv_link_det_info_list
(
ldil
);
log_
(
0
,
"[MSC_MSG]["
+
getTimeStamp4Log
()
+
"]["
+
msg
.
source
().
to_string
()
+
"][--- MIH_Link_Detected.indication --->]["
+
msg
.
destination
().
to_string
()
+
"]
\n
"
);
for
(
it_ldil
=
ldil
.
begin
();
it_ldil
!=
ldil
.
end
();
it_ldil
++
)
{
ldi
=
*
it_ldil
;
log_
(
0
,
"
\t
MIH_Link_Detected.indication - network_id:........"
,
ldi
.
network_id
.
c_str
());
log_
(
0
,
"
\t
MIH_Link_Detected.indication - net_aux_id:........"
,
ldi
.
net_aux_id
.
c_str
());
log_
(
0
,
"
\t
MIH_Link_Detected.indication - sig_strength:......TO DO"
);
//, ldi.signal);
log_
(
0
,
"
\t
MIH_Link_Detected.indication - sinr:.............."
,
ldi
.
sinr
);
log_
(
0
,
"
\t
MIH_Link_Detected.indication - data_rate:........."
,
ldi
.
data_rate
);
log_
(
0
,
"
\t
MIH_Link_Detected.indication - data_rate:........."
,
ldi
.
data_rate
);
log_
(
0
,
"
\t
MIH_Link_Detected.indication - mih_capabilities:.."
,
ldi
.
data_rate
);
log_
(
0
,
"
\t
MIH_Link_Detected.indication - net_capabilities:..TO DO"
);
//, ldi.net_capabilities);
}
// Display message parameters
// TODO: for each link_det_info in the list {display LINK_DET_INFO}
// send Link_Action / Power Up
lid
.
type
=
odtone
::
mih
::
link_type_lte
;
lid
.
addr
=
ldi
.
id
.
addr
;
//send_MIH_Link_Action_Power_Up_plus_scan_request(lid);
log_
(
0
,
"MIH_Link_Detected.indication - End
\n
"
);
}
//-----------------------------------------------------------------------------
void
mih_user
::
send_MIH_Link_Action_Power_Up_plus_scan_request
(
const
odtone
::
mih
::
link_id
&
link
)
//-----------------------------------------------------------------------------
{
odtone
::
mih
::
message
m
;
odtone
::
mih
::
link_action_list
lal
;
odtone
::
mih
::
link_action_req
link_act_req
;
//struct null n;
link_act_req
.
id
=
link
;
link_act_req
.
action
.
type
=
odtone
::
mih
::
link_ac_type_power_up
;
link_act_req
.
action
.
attr
.
clear
();
link_act_req
.
action
.
attr
.
set
(
odtone
::
mih
::
link_ac_attr_scan
);
link_act_req
.
ex_time
=
5000
;
// in ms
lal
.
push_back
(
link_act_req
);
m
<<
odtone
::
mih
::
request
(
odtone
::
mih
::
request
::
link_actions
)
&
odtone
::
mih
::
tlv_link_action_list
(
lal
);
m
.
source
(
_mihuserid
);
m
.
destination
(
_mihfid
);
log_
(
0
,
"[MSC_MSG]["
+
getTimeStamp4Log
()
+
"]["
+
m
.
source
().
to_string
()
+
"][--- MIH_Link_Actions.request
\\
n"
+
link_actions_req2string
(
link_act_req
)
+
" --->]["
+
m
.
destination
().
to_string
()
+
"]
\n
"
);
_mihf
.
async_send
(
m
,
boost
::
bind
(
&
mih_user
::
receive_handler
,
this
,
_1
,
_2
));
log_
(
0
,
"MIH-User has sent Link_Actions.request to "
,
m
.
destination
().
to_string
());
log_
(
0
,
" - LINK_ID - Link identifier: "
,
link_id2string
(
link
).
c_str
());
log_
(
0
,
" - LINK_ACTIONS - Link Actions: "
+
link_actions_req2string
(
link_act_req
)
+
"
\n
"
);
log_
(
0
,
"MIH_Link_Action_Power_Up_request - SENT
\n
"
);
}
//-----------------------------------------------------------------------------
void
mih_user
::
receive_MIH_Link_Up_indication
(
odtone
::
mih
::
message
&
msg
)
//-----------------------------------------------------------------------------
{
log_
(
0
,
"MIH_Link_Up.indication - RECEIVED - Begin
\n
"
);
odtone
::
mih
::
link_tuple_id
link
;
// odtone::mih::tlv_old_access_router oldAR;
msg
>>
odtone
::
mih
::
indication
()
&
odtone
::
mih
::
tlv_link_identifier
(
link
);
// & odtone::mih::tlv_old_access_router(oar);
log_
(
0
,
"[MSC_MSG]["
+
getTimeStamp4Log
()
+
"]["
+
msg
.
source
().
to_string
()
+
"][--- MIH_Link_Up.indication --->]["
+
msg
.
destination
().
to_string
()
+
"]
\n
"
);
// Display message parameters
log_
(
0
,
" - LINK_ID - Link identifier: "
,
link_id2string
(
link
).
c_str
(),
"
\n
"
);
log_
(
0
,
"MIH_Link_Up.indication - End
\n
"
);
}
//-----------------------------------------------------------------------------
void
mih_user
::
receive_MIH_Link_Down_indication
(
odtone
::
mih
::
message
&
msg
)
//-----------------------------------------------------------------------------
{
odtone
::
mih
::
link_tuple_id
link
;
boost
::
optional
<
odtone
::
mih
::
link_addr
>
addr
;
odtone
::
mih
::
link_dn_reason
ldr
;
log_
(
0
,
"MIH_Link_Down.indication - RECEIVED - Begin
\n
"
);
msg
>>
odtone
::
mih
::
indication
()
&
odtone
::
mih
::
tlv_link_identifier
(
link
)
&
odtone
::
mih
::
tlv_old_access_router
(
addr
)
&
odtone
::
mih
::
tlv_link_dn_reason
(
ldr
);
// log_(0, "[MSC_MSG]["+getTimeStamp4Log()+"]["+ msg.source().to_string() +"][--- MIH_Link_Down.indication\\n"+link_down_reason2string(ldr).c_str()+" --->]["+msg.destination().to_string()+"]\n");
//Display message parameters
log_
(
0
,
" - LINK_ID - Link identifier: "
,
link_id2string
(
link
).
c_str
(),
"
\n
"
);
// log_(0, " - LINK_DN_REASON - Link down reason: ", link_down_reason2string(ldr).c_str(), "\n");
log_
(
0
,
"MIH_Link_Down.indication - End
\n
"
);
}
//-----------------------------------------------------------------------------
void
mih_user
::
receive_MIH_Link_Going_Down_indication
(
odtone
::
mih
::
message
&
msg
)
//-----------------------------------------------------------------------------
{
log_
(
0
,
"MIH_Link_Going_Down.indication - RECEIVED - Begin
\n
"
);
odtone
::
mih
::
link_tuple_id
link
;
odtone
::
mih
::
link_gd_reason
lgd
;
odtone
::
mih
::
link_ac_ex_time
ex_time
;
msg
>>
odtone
::
mih
::
indication
()
&
odtone
::
mih
::
tlv_link_identifier
(
link
)
&
odtone
::
mih
::
tlv_time_interval
(
ex_time
)
&
odtone
::
mih
::
tlv_link_gd_reason
(
lgd
);
log_
(
0
,
"[MSC_MSG]["
+
getTimeStamp4Log
()
+
"]["
+
msg
.
source
().
to_string
()
+
"][--- MIH_Link_Going_Down.indication
\\
n"
+
link_going_down_reason2string
(
lgd
).
c_str
()
+
" --->]["
+
msg
.
destination
().
to_string
()
+
"]
\n
"
);
// Display message parameters
log_
(
0
,
" - LINK_ID - Link identifier: "
,
link_id2string
(
link
).
c_str
());
log_
(
0
,
" - Time Interval:"
,
(
ex_time
/
256
));
log_
(
0
,
" - LINK_GD_REASON - Link going down reason: "
,
link_going_down_reason2string
(
lgd
).
c_str
(),
"
\n
"
);
log_
(
0
,
"MIH_Link_Going_Down.indication - End
\n
"
);
}
//-----------------------------------------------------------------------------
void
mih_user
::
receive_MIH_Link_Parameters_Report
(
odtone
::
mih
::
message
&
msg
,
const
boost
::
system
::
error_code
&
ec
)
//-----------------------------------------------------------------------------
{
odtone
::
mih
::
link_tuple_id
link
;
odtone
::
mih
::
link_param_rpt_list
lprl
;
msg
>>
odtone
::
mih
::
indication
()
&
odtone
::
mih
::
tlv_link_identifier
(
link
)
&
odtone
::
mih
::
tlv_link_param_rpt_list
(
lprl
);
log_
(
0
,
""
);
log_
(
0
,
"MIH_Link_Parameters_Report.indication - RECEIVED - Begin"
);
log_
(
0
,
"[MSC_MSG]["
+
getTimeStamp4Log
()
+
"]["
+
msg
.
source
().
to_string
()
+
"][--- MIH_Link_Parameters_Report.indication --->]["
+
msg
.
destination
().
to_string
()
+
"]
\n
"
);
log_
(
0
,
" - LINK_TUPLE_ID - Link identifier: "
,
link_id2string
(
link
).
c_str
());
log_
(
0
,
"MIH_Link_Parameters_Report.indication - End"
);
}
//-----------------------------------------------------------------------------
void
mih_user
::
send_MIH_User_Register_indication
(
const
odtone
::
mih
::
config
&
cfg
)
//-----------------------------------------------------------------------------
{
odtone
::
mih
::
message
m
;
boost
::
optional
<
odtone
::
mih
::
mih_cmd_list
>
supp_cmd
=
parse_supported_commands
(
cfg
);
m
<<
odtone
::
mih
::
indication
(
odtone
::
mih
::
indication
::
user_register
)
&
odtone
::
mih
::
tlv_command_list
(
supp_cmd
);
m
.
source
(
_mihuserid
);
m
.
destination
(
_mihfid
);
log_
(
0
,
"[MSC_MSG]["
+
getTimeStamp4Log
()
+
"]["
+
m
.
source
().
to_string
()
+
"][--- MIH_User_Register.indication --->]["
+
m
.
destination
().
to_string
()
+
"]
\n
"
);
_mihf
.
async_send
(
m
,
boost
::
bind
(
&
mih_user
::
user_reg_handler
,
this
,
boost
::
cref
(
cfg
),
_2
));
log_
(
0
,
"MIH_User_Register.indication - SENT (towards its local MIHF)
\n
"
);
}
//-----------------------------------------------------------------------------
void
mih_user
::
send_MIH_Capability_Discover_request
(
void
)
//-----------------------------------------------------------------------------
{
odtone
::
mih
::
message
m
;
m
<<
odtone
::
mih
::
request
(
odtone
::
mih
::
request
::
capability_discover
);
m
.
source
(
_mihuserid
);
m
.
destination
(
_mihfid
);
log_
(
0
,
"[MSC_MSG]["
+
getTimeStamp4Log
()
+
"]["
+
m
.
source
().
to_string
()
+
"][--- MIH_Capability_Discover.request --->]["
+
m
.
destination
().
to_string
()
+
"]
\n
"
);
_mihf
.
async_send
(
m
,
boost
::
bind
(
&
mih_user
::
receive_handler
,
this
,
_1
,
_2
));
log_
(
0
,
"MIH_Capability_Discover.request - SENT (towards its local MIHF)
\n
"
);
}
//-----------------------------------------------------------------------------
void
mih_user
::
receive_MIH_Capability_Discover_confirm
(
odtone
::
mih
::
message
&
msg
)
//-----------------------------------------------------------------------------
{
log_
(
0
,
"MIH_Capability_Discover.confirm - RECEIVED - Begin
\n
"
);
odtone
::
mih
::
status
st
;
boost
::
optional
<
odtone
::
mih
::
net_type_addr_list
>
ntal
;
boost
::
optional
<
odtone
::
mih
::
mih_evt_list
>
evt
;
boost
::
optional
<
odtone
::
mih
::
mih_cmd_list
>
cmd
;
msg
>>
odtone
::
mih
::
confirm
()
&
odtone
::
mih
::
tlv_status
(
st
)
&
odtone
::
mih
::
tlv_net_type_addr_list
(
ntal
)
&
odtone
::
mih
::
tlv_event_list
(
evt
)
&
odtone
::
mih
::
tlv_command_list
(
cmd
);
log_
(
0
,
"[MSC_MSG]["
+
getTimeStamp4Log
()
+
"]["
+
msg
.
source
().
to_string
()
+
"][--- MIH_Capability_Discover.confirm"
+
"
\\
nstatus="
+
status2string
(
st
).
c_str
()
+
"
\\
nEvent list="
+
evt2string
(
evt
.
get
()).
c_str
()
+
"
\\
nNet type addr list="
+
net_type_addr_list2string
(
ntal
).
c_str
()
+
" --->]["
+
msg
.
destination
().
to_string
()
+
"]
\n
"
);
// Display message parameters
log_
(
0
,
" - STATUS: "
,
status2string
(
st
).
c_str
(),
" ("
,
st
.
get
(),
")"
);
if
(
evt
)
{
log_
(
0
,
" - MIH_EVT_LIST - Event List: "
,
evt2string
(
evt
.
get
()).
c_str
());
}
if
(
cmd
)
{
log_
(
0
,
" - MIH_CMD_LIST - Command List: "
,
cmd2string
(
cmd
.
get
()).
c_str
());
}
if
(
ntal
)
{
log_
(
0
,
" - LIST(NET_TYPE_ADDR) - Network Types and Link Address: "
,
net_type_addr_list2string
(
ntal
).
c_str
());
//Store link address
for
(
odtone
::
mih
::
net_type_addr_list
::
iterator
i
=
ntal
->
begin
();
i
!=
ntal
->
end
();
i
++
)
{
rcv_link_id
.
addr
=
i
->
addr
;
rcv_link_id
.
type
=
boost
::
get
<
odtone
::
mih
::
link_type
>
(
i
->
nettype
.
link
);
}
}
log_
(
0
,
""
);
//
// event subscription
//
// For every interface the MIHF sent in the
// Capability_Discover.response send an Event_Subscribe.request
// for all availabe events
//
if
(
ntal
&&
evt
)
{
_subs_evt_list
=
evt
.
get
();
// save the list of subscribed link events
for
(
odtone
::
mih
::
net_type_addr_list
::
iterator
i
=
ntal
->
begin
();
i
!=
ntal
->
end
();
i
++
)
{
if
(
i
->
nettype
.
link
.
which
()
==
1
)
{
odtone
::
mih
::
link_tuple_id
li
;
li
.
addr
=
i
->
addr
;
li
.
type
=
boost
::
get
<
odtone
::
mih
::
link_type
>
(
i
->
nettype
.
link
);
_link_id_list
.
push_back
(
li
);
// save the link identifier of the network interface
mih_user
::
send_MIH_Event_Subscribe_request
(
li
,
evt
.
get
());
}
}
}
log_
(
0
,
"MIH_Capability_Discover.confirm - End
\n
"
);
}
//-----------------------------------------------------------------------------
void
mih_user
::
send_MIH_Event_Subscribe_request
(
odtone
::
mih
::
link_tuple_id
&
li
,
odtone
::
mih
::
mih_evt_list
&
evt
)
//-----------------------------------------------------------------------------
{
odtone
::
mih
::
message
m
;
m
<<
odtone
::
mih
::
request
(
odtone
::
mih
::
request
::
event_subscribe
)
&
odtone
::
mih
::
tlv_link_identifier
(
li
)
&
odtone
::
mih
::
tlv_event_list
(
evt
);
m
.
source
(
_mihuserid
);
m
.
destination
(
_mihfid
);
log_
(
0
,
"[MSC_MSG]["
+
getTimeStamp4Log
()
+
"]["
+
m
.
source
().
to_string
()
+
"][--- MIH_Event_Subscribe.request"
+
"
\\
nLink="
+
link_id2string
(
li
).
c_str
()
+
"
\\
nEvent list="
+
evt2string
(
evt
).
c_str
()
+
" --->]["
+
m
.
destination
().
to_string
()
+
"]
\n
"
);
_mihf
.
async_send
(
m
,
boost
::
bind
(
&
mih_user
::
receive_handler
,
this
,
_1
,
_2
));
log_
(
0
,
"MIH-User has sent Event_Subscribe.request to "
,
m
.
destination
().
to_string
());
log_
(
0
,
" - LINK_TUPLE_ID - Link identifier: "
,
link_id2string
(
li
).
c_str
());
log_
(
0
,
" - MIH_EVT_LIST - Event List: "
,
evt2string
(
evt
).
c_str
(),
"
\n
"
);
log_
(
0
,
"MIH_Event_Subscribe.request - SENT
\n
"
);
}
//-----------------------------------------------------------------------------
void
mih_user
::
receive_MIH_Event_Subscribe_confirm
(
odtone
::
mih
::
message
&
msg
)
//-----------------------------------------------------------------------------
{
log_
(
0
,
"MIH_Event_Subscribe.confirm("
,
msg
.
tid
(),
") - RECEIVED - Begin
\n
"
);
odtone
::
mih
::
status
st
;
odtone
::
mih
::
link_tuple_id
link
;
boost
::
optional
<
odtone
::
mih
::
mih_evt_list
>
evt
;
msg
>>
odtone
::
mih
::
confirm
()
&
odtone
::
mih
::
tlv_status
(
st
)
&
odtone
::
mih
::
tlv_link_identifier
(
link
)
&
odtone
::
mih
::
tlv_event_list
(
evt
);
if
(
evt
)
{
log_
(
0
,
"[MSC_MSG]["
+
getTimeStamp4Log
()
+
"]["
+
msg
.
source
().
to_string
()
+
"][--- MIH_Event_Subscribe.confirm"
+
"
\\
nstatus="
+
status2string
(
st
).
c_str
()
+
"
\\
nLink="
+
link_id2string
(
link
).
c_str
()
+
"
\\
nEvent list="
+
evt2string
(
evt
.
get
()).
c_str
()
+
" --->]["
+
msg
.
destination
().
to_string
()
+
"]
\n
"
);
}
else
{
log_
(
0
,
"[MSC_MSG]["
+
getTimeStamp4Log
()
+
"]["
+
msg
.
source
().
to_string
()
+
"][--- MIH_Event_Subscribe.confirm"
+
"
\\
nstatus="
+
status2string
(
st
).
c_str
()
+
"
\\
nLink="
+
link_id2string
(
link
).
c_str
()
+
" --->]["
+
msg
.
destination
().
to_string
()
+
"]
\n
"
);
}
// Display message parameters
log_
(
0
,
" - STATUS: "
,
status2string
(
st
).
c_str
(),
" ("
,
st
.
get
(),
")"
);
log_
(
0
,
" - LINK_TUPLE_ID - Link identifier: "
,
link_id2string
(
link
).
c_str
());
if
(
evt
)
{
log_
(
0
,
" - MIH_EVT_LIST - Event List: "
,
evt2string
(
evt
.
get
()).
c_str
());
}
log_
(
0
,
""
);
//mih_user::send_MIH_Link_Actions_request(link, odtone::mih::link_ac_type_link_activate_resources);
//log_(0, "TEMP : Resource scenario deactivated\n");
log_
(
0
,
"MIH_Event_Subscribe.confirm - End
\n
"
);
mih_user
::
send_MIH_Link_Action_Power_Up_plus_scan_request
(
link
);
}
//-----------------------------------------------------------------------------
void
mih_user
::
send_MIH_Event_Unsubscribe_request
(
void
)
//-----------------------------------------------------------------------------
{
odtone
::
mih
::
link_tuple_id
li
;
// For every interface the MIH user received in the
// Capability_Discover.confirm, send an Event_Unsubscribe.request
// for all subscribed events
for
(
odtone
::
mih
::
link_id_list
::
iterator
i
=
_link_id_list
.
begin
();
i
!=
_link_id_list
.
end
();
i
++
)
{
li
.
type
=
i
->
type
;
li
.
addr
=
i
->
addr
;
mih_user
::
send_MIH_Event_Unsubscribe_request
(
li
,
_subs_evt_list
);
}
}
//-----------------------------------------------------------------------------
void
mih_user
::
send_MIH_Event_Unsubscribe_request
(
odtone
::
mih
::
link_tuple_id
&
li
,
odtone
::
mih
::
mih_evt_list
&
evt
)
//-----------------------------------------------------------------------------
{
odtone
::
mih
::
message
m
;
m
<<
odtone
::
mih
::
request
(
odtone
::
mih
::
request
::
event_unsubscribe
)
&
odtone
::
mih
::
tlv_link_identifier
(
li
)
&
odtone
::
mih
::
tlv_event_list
(
evt
);
m
.
source
(
_mihuserid
);
m
.
destination
(
_mihfid
);
log_
(
0
,
"[MSC_MSG]["
+
getTimeStamp4Log
()
+
"]["
+
m
.
source
().
to_string
()
+
"][--- MIH_Event_Unsubscribe.request"
+
"
\\
nLink="
+
link_id2string
(
li
).
c_str
()
+
"
\\
nEvent list="
+
evt2string
(
evt
).
c_str
()
+
" --->]["
+
m
.
destination
().
to_string
()
+
"]
\n
"
);
_mihf
.
async_send
(
m
,
boost
::
bind
(
&
mih_user
::
receive_handler
,
this
,
_1
,
_2
));
log_
(
0
,
"MIH-User has sent Event_Unsubscribe.request to "
,
m
.
destination
().
to_string
());
log_
(
0
,
" - LINK_TUPLE_ID - Link identifier: "
,
link_id2string
(
li
).
c_str
());
log_
(
0
,
" - MIH_EVT_LIST - Event List: "
,
evt2string
(
evt
).
c_str
(),
"
\n
"
);
log_
(
0
,
"MIH_Event_Unsubscribe.request - SENT
\n
"
);
}
//-----------------------------------------------------------------------------
void
mih_user
::
receive_MIH_Event_Unsubscribe_confirm
(
odtone
::
mih
::
message
&
msg
)
//-----------------------------------------------------------------------------
{
log_
(
0
,
"MIH_Event_Unsubscribe.confirm("
,
msg
.
tid
(),
") - RECEIVED - Begin
\n
"
);
odtone
::
mih
::
status
st
;
odtone
::
mih
::
link_tuple_id
link
;
boost
::
optional
<
odtone
::
mih
::
mih_evt_list
>
evt
;
msg
>>
odtone
::
mih
::
confirm
()
&
odtone
::
mih
::
tlv_status
(
st
)
&
odtone
::
mih
::
tlv_link_identifier
(
link
)
&
odtone
::
mih
::
tlv_event_list
(
evt
);
if
(
evt
)
{
log_
(
0
,
"[MSC_MSG]["
+
getTimeStamp4Log
()
+
"]["
+
msg
.
source
().
to_string
()
+
"][--- MIH_Event_Unsubscribe.confirm"
+
"
\\
nstatus="
+
status2string
(
st
).
c_str
()
+
"
\\
nLink="
+
link_id2string
(
link
).
c_str
()
+
"
\\
nEvent list="
+
evt2string
(
evt
.
get
()).
c_str
()
+
" --->]["
+
msg
.
destination
().
to_string
()
+
"]
\n
"
);
}
else
{
log_
(
0
,
"[MSC_MSG]["
+
getTimeStamp4Log
()
+
"]["
+
msg
.
source
().
to_string
()
+
"][--- MIH_Event_Unsubscribe.confirm"
+
"
\\
nstatus="
+
status2string
(
st
).
c_str
()
+
"
\\
nLink="
+
link_id2string
(
link
).
c_str
()
+
" --->]["
+
msg
.
destination
().
to_string
()
+
"]
\n
"
);
}
// Display message parameters
log_
(
0
,
" - STATUS: "
,
status2string
(
st
).
c_str
(),
" ("
,
st
.
get
(),
")"
);
log_
(
0
,
" - LINK_TUPLE_ID - Link identifier: "
,
link_id2string
(
link
).
c_str
());
if
(
evt
)
{
log_
(
0
,
" - MIH_EVT_LIST - Event List: "
,
evt2string
(
evt
.
get
()).
c_str
());
}
log_
(
0
,
""
);
log_
(
0
,
"MIH_Event_Unsubscribe.confirm - End"
);
}
//-----------------------------------------------------------------------------
void
mih_user
::
send_MIH_Link_Actions_request
(
const
odtone
::
mih
::
link_id
&
link
,
odtone
::
mih
::
link_ac_type
type
)
//-----------------------------------------------------------------------------
{
odtone
::
mih
::
message
m
;
odtone
::
mih
::
link_action_list
lal
;
odtone
::
mih
::
link_action_req
link_act_req
;
link_act_req
.
id
=
link
;
link_act_req
.
action
.
type
=
type
;
_last_link_action_type
=
type
;
// Initialize resource parameters
odtone
::
mih
::
resource_desc
res
;
res
.
lid
=
link
;
// Link identifier
res
.
data_rate
=
128000
;
// bit rate
res
.
jumbo
=
false
;
// jumbo disable
res
.
multicast
=
false
;
// multicast disable
odtone
::
mih
::
qos
qos
;
// Class Of Service
qos
.
value
=
56
;
res
.
qos_val
=
qos
;
res
.
fid
=
555
+
_current_link_action_request
;
// // Flow identifier
// res.fid.src.ip = _mihf_ip;
// res.fid.src.port_val = _mihf_lport;
//
// if (mih_user::_current_link_action_request == 0) {
// res.fid.dst.ip = odtone::mih::ip_addr(odtone::mih::ip_addr::ipv6,
// "2001:0660:0382:0014:0335:0600:8014:9150"); // DUMMY
// }
// else if (mih_user::_current_link_action_request == 1) {
// res.fid.dst.ip = odtone::mih::ip_addr(odtone::mih::ip_addr::ipv6,
// "2001:0660:0382:0014:0335:0600:8014:9151"); // DUMMY
// }
// else if (mih_user::_current_link_action_request == 2) {
// res.fid.dst.ip = odtone::mih::ip_addr(odtone::mih::ip_addr::ipv6,
// "FF3E:0020:2001:0DB8:0000:0000:0000:0043"); // DUMMY
// res.multicast = true;
// }
// else if (mih_user::_current_link_action_request == 3) {
// res.fid.dst.ip = odtone::mih::ip_addr(odtone::mih::ip_addr::ipv6,
// "2001:0660:0382:0014:0335:0600:8014:9153"); // DUMMY
// }
// res.fid.dst.port_val = 1235; // DUMMY
// res.fid.transport = odtone::mih::proto_udp;
link_act_req
.
action
.
param
.
param
=
res
;
link_act_req
.
ex_time
=
0
;
lal
.
push_back
(
link_act_req
);
m
<<
odtone
::
mih
::
request
(
odtone
::
mih
::
request
::
link_actions
)
&
odtone
::
mih
::
tlv_link_action_list
(
lal
);
m
.
source
(
_mihuserid
);
m
.
destination
(
_mihfid
);
log_
(
0
,
"[MSC_MSG]["
+
getTimeStamp4Log
()
+
"]["
+
m
.
source
().
to_string
()
+
"][--- MIH_Link_Actions.request
\\
n"
+
link_actions_req2string
(
link_act_req
)
+
" --->]["
+
m
.
destination
().
to_string
()
+
"]
\n
"
);
_mihf
.
async_send
(
m
,
boost
::
bind
(
&
mih_user
::
receive_handler
,
this
,
_1
,
_2
));
log_
(
0
,
"MIH-User has sent Link_Actions.request to "
,
m
.
destination
().
to_string
());
log_
(
0
,
" - LINK_ID - Link identifier: "
,
link_id2string
(
link
).
c_str
());
log_
(
0
,
" - FLOW_ID - Flow identifier: "
,
res
.
fid
);
//TEMP log_(0, " - FLOW_ID - Flow identifier: ", flow_id2string(link_act_req.action.param).c_str());
log_
(
0
,
" - LINK_ACTIONS - Link Actions: "
+
link_actions_req2string
(
link_act_req
)
+
"
\n
"
);
log_
(
0
,
"MIH_Link_Actions.request - SENT
\n
"
);
}
//-----------------------------------------------------------------------------
void
mih_user
::
receive_MIH_Link_Actions_confirm
(
odtone
::
mih
::
message
&
msg
)
//-----------------------------------------------------------------------------
{
log_
(
0
,
"MIH_Link_Actions.confirm - RECEIVED - Begin
\n
"
);
odtone
::
mih
::
status
st
;
boost
::
optional
<
odtone
::
mih
::
link_action_rsp_list
>
larl
;
msg
>>
odtone
::
mih
::
confirm
()
&
odtone
::
mih
::
tlv_status
(
st
)
&
odtone
::
mih
::
tlv_link_action_rsp_list
(
larl
);
log_
(
0
,
"[MSC_MSG]["
+
getTimeStamp4Log
()
+
"]["
+
msg
.
source
().
to_string
()
+
"][--- MIH_Link_Actions.confirm"
+
"
\\
nstatus="
+
status2string
(
st
).
c_str
()
+
" --->]["
+
msg
.
destination
().
to_string
()
+
"]
\n
"
);
// Display message parameters
log_
(
0
,
" - STATUS: "
,
status2string
(
st
).
c_str
(),
" ("
,
st
.
get
(),
")"
);
if
(
larl
)
{
log_
(
0
,
" - LINK ACTION RSP LIST - Length:"
,
larl
.
get
().
size
());
for
(
odtone
::
mih
::
link_action_rsp_list
::
iterator
i
=
larl
->
begin
();
i
!=
larl
->
end
();
i
++
)
{
log_
(
0
,
"
\t
LINK_ID: "
,
link_id2string
(
i
->
id
).
c_str
(),
", LINK_AC_RESULT: "
,
link_ac_result2string
(
i
->
result
).
c_str
());
}
}
log_
(
0
,
""
);
// 1st scenario: Sequentially activate and deactivate each resource
#ifdef SCENARIO_1
if
(
larl
)
{
odtone
::
mih
::
link_action_rsp
*
rsp
=
&
larl
->
front
();
if
(
_current_link_action_request
<
_nb_of_link_action_requests
)
{
if
(
_last_link_action_type
==
odtone
::
mih
::
link_ac_type_link_activate_resources
)
{
if
(
rsp
->
result
.
get
()
==
odtone
::
mih
::
link_ac_success
)
{
mih_user
::
send_MIH_Link_Actions_request
(
rsp
->
id
,
odtone
::
mih
::
link_ac_type_link_deactivate_resources
);
_current_link_action_request
+=
1
;
}
}
else
if
(
_last_link_action_type
==
odtone
::
mih
::
link_ac_type_link_deactivate_resources
)
{
mih_user
::
send_MIH_Link_Actions_request
(
rsp
->
id
,
odtone
::
mih
::
link_ac_type_link_activate_resources
);
}
}
else
{
// Ends the scenario
mih_user
::
send_MIH_Event_Unsubscribe_request
();
}
}
#endif // SCENARIO_1
#ifdef SCENARIO_2
// 2nd scenario: Activate all resources, then deactivate all resources
if
(
larl
.
get
().
size
()
>
0
)
{
odtone
::
mih
::
link_action_rsp
*
rsp
=
&
larl
->
front
();
if
(
++
_current_link_action_request
<
_nb_of_link_action_requests
)
{
if
(
_last_link_action_type
==
odtone
::
mih
::
link_ac_type_link_activate_resources
)
{
mih_user
::
send_MIH_Link_Actions_request
(
rsp
->
id
,
odtone
::
mih
::
link_ac_type_link_activate_resources
);
}
else
if
(
_last_link_action_type
==
odtone
::
mih
::
link_ac_type_link_deactivate_resources
)
{
mih_user
::
send_MIH_Link_Actions_request
(
rsp
->
id
,
odtone
::
mih
::
link_ac_type_link_deactivate_resources
);
}
}
else
if
(
_last_link_action_type
==
odtone
::
mih
::
link_ac_type_link_activate_resources
)
{
_current_link_action_request
=
0
;
mih_user
::
send_MIH_Link_Actions_request
(
rsp
->
id
,
odtone
::
mih
::
link_ac_type_link_deactivate_resources
);
}
else
{
// Ends the scenario
mih_user
::
send_MIH_Event_Unsubscribe_request
();
}
}
#endif // SCENARIO_2
log_
(
0
,
"MIH_Link_Actions.confirm - End
\n
"
);
}
//-----------------------------------------------------------------------------
void
mih_user
::
send_MIH_Link_Configure_Thresholds_request
(
odtone
::
mih
::
message
&
msg
,
const
boost
::
system
::
error_code
&
ec
)
//-----------------------------------------------------------------------------
{
odtone
::
mih
::
message
m
;
odtone
::
mih
::
threshold
th
;
std
::
vector
<
odtone
::
mih
::
threshold
>
thl
;
odtone
::
mih
::
link_tuple_id
lti
;
odtone
::
mih
::
l2_3gpp_addr
local_l2_3gpp_addr
;
//List of the link threshold parameters
odtone
::
mih
::
link_cfg_param_list
lcpl
;
odtone
::
mih
::
link_cfg_param
lcp
;
odtone
::
mih
::
link_param_lte
lp
;
//odtone::mih::link_param_gen lp;
odtone
::
mih
::
link_param_type
typr
;
log_
(
0
,
""
);
log_
(
0
,
"send_MIH_Link_Configure_Thresholds_request - Begin"
);
//link_tuple_id
lti
.
type
=
rcv_link_id
.
type
;
lti
.
addr
=
rcv_link_id
.
addr
;
//local_l2_3gpp_addr = boost::get<odtone::mih::l2_3gpp_addr>(lti.addr);
//link_param_gen_data_rate = 0, /**< Data rate. */
//link_param_gen_signal_strength = 1, /**< Signal strength. */
//link_param_gen_sinr = 2, /**< SINR. */
//link_param_gen_throughput = 3, /**< Throughput. */
//link_param_gen_packet_error_rate = 4, /**< Packet error rate. */
//lp = odtone::mih::link_param_lte_bandwidth;
lp
=
odtone
::
mih
::
link_param_lte_rsrp
;
lcp
.
type
=
lp
;
link_measures_request
=
0
;
if
(
link_measures_request
==
0
){
// Set Timer Interval (in ms)
lcp
.
timer_interval
=
3000
;
//th_action_normal = 0, /**< Set normal threshold. */
//th_action_one_shot = 1, /**< Set one-shot threshold. */
//th_action_cancel = 2 /**< Cancel threshold. */
lcp
.
action
=
odtone
::
mih
::
th_action_normal
;
link_measures_request
=
1
;
}
else
if
(
link_measures_request
==
1
){
// Set Timer Interval (in ms)
lcp
.
timer_interval
=
0
;
lcp
.
action
=
odtone
::
mih
::
th_action_cancel
;
link_measures_request
=
0
;
}
//above_threshold = 0, /**< Above threshold. */
//below_threshold = 1, /**< Below threshold. */
th
.
threshold_val
=
-
105
;
th
.
threshold_x_dir
=
odtone
::
mih
::
threshold
::
above_threshold
;
thl
.
push_back
(
th
);
lcp
.
threshold_list
=
thl
;
lcpl
.
push_back
(
lcp
);
m
<<
odtone
::
mih
::
request
(
odtone
::
mih
::
request
::
link_configure_thresholds
)
&
odtone
::
mih
::
tlv_link_identifier
(
lti
)
&
odtone
::
mih
::
tlv_link_cfg_param_list
(
lcpl
);
m
.
destination
(
msg
.
source
());
log_
(
0
,
"[MSC_MSG]["
+
getTimeStamp4Log
()
+
"]["
+
_mihuserid
.
to_string
()
+
"][--- MIH_Link_Configure_Thresholds.request
\\
nlink="
+
// link_tupple_id2string(lti).c_str() +
link_id2string
(
lti
).
c_str
()
+
" --->]["
+
_mihfid
.
to_string
()
+
"]
\n
"
);
_mihf
.
async_send
(
m
,
boost
::
bind
(
&
mih_user
::
event_handler
,
this
,
_1
,
_2
));
log_
(
0
,
" - LINK_TUPLE_ID - Link identifier: "
,
link_id2string
(
lti
).
c_str
());
log_
(
0
,
"
\t
- LINK CFG PARAM LIST - Length: "
,
lcpl
.
size
());
//if(lp == odtone::mih::link_param_gen_data_rate) {log_(0, "\t Generic link parameter DATA RATE ");}
//if(lp == odtone::mih::link_param_gen_signal_strength) {log_(0, "\t Generic link parameter SIGNAL STRENGTH");}
//if(lp == odtone::mih::link_param_gen_sinr) {log_(0, "\t Generic link parameter SINR");}
//if(lp == odtone::mih::link_param_gen_throughput) {log_(0, "\t Generic link parameter THROUGHPUT");}
//if(lp == odtone::mih::link_param_lte_bandwidth) {log_(0, "\t LTE link parameter BANDWIDTH");}
if
(
lp
==
odtone
::
mih
::
link_param_lte_rsrp
)
{
log_
(
0
,
"
\t
LTE link parameter LTE RSRP"
);}
log_
(
0
,
"
\t
- TIMER INTERVAL - Value: "
,
lcp
.
timer_interval
);
if
(
lcp
.
action
==
odtone
::
mih
::
th_action_normal
)
{
log_
(
0
,
"
\t
Normal Threshold"
);}
if
(
lcp
.
action
==
odtone
::
mih
::
th_action_one_shot
)
{
log_
(
0
,
"
\t
One Shot Threshold"
);}
if
(
lcp
.
action
==
odtone
::
mih
::
th_action_cancel
)
{
log_
(
0
,
"
\t
Threshold to be canceled"
);}
log_
(
0
,
"
\t
Threshold value: "
,
th
.
threshold_val
);
if
(
th
.
threshold_x_dir
==
odtone
::
mih
::
threshold
::
below_threshold
)
{
log_
(
0
,
"
\t
Threshold direction BELOW"
);}
if
(
th
.
threshold_x_dir
==
odtone
::
mih
::
threshold
::
above_threshold
)
{
log_
(
0
,
"
\t
Threshold direction ABOVE"
);}
log_
(
0
,
"send_MIH_Link_Configure_Thresholds_request - End"
);
}
//-----------------------------------------------------------------------------
void
mih_user
::
receive_MIH_Link_Configure_Thresholds_confirm
(
odtone
::
mih
::
message
&
msg
,
const
boost
::
system
::
error_code
&
ec
)
//-----------------------------------------------------------------------------
{
log_
(
0
,
""
);
log_
(
0
,
"receive_MIH_Link_Configure_Thresholds_confirm - Begin"
);
// T odtone::uint iter;
// T odtone::mih::status st;
//boost::optional<odtone::mih::link_cfg_status_list> lcsl;
// Todtone::mih::link_cfg_status_list lcsl;
// Todtone::mih::link_cfg_status lcp;
//odtone::mih::link_param_gen lp;
// T odtone::mih::link_tuple_id lti;
//msg >> odtone::mih::confirm()
// & odtone::mih::tlv_status(st)
// & odtone::mih::tlv_link_identifier(lti)
// & odtone::mih::tlv_link_cfg_status_list(lcsl);
log_
(
0
,
"receive_MIH_Link_Configure_Thresholds_confirm - End"
);
log_
(
0
,
""
);
}
//-----------------------------------------------------------------------------
int
main
(
int
argc
,
char
**
argv
)
//-----------------------------------------------------------------------------
{
odtone
::
setup_crash_handler
();
try
{
boost
::
asio
::
io_service
ios
;
// declare MIH Usr available options
po
::
options_description
desc
(
odtone
::
mih
::
octet_string
(
"MIH Usr Configuration"
));
desc
.
add_options
()
(
"help"
,
"Display configuration options"
)
(
odtone
::
sap
::
kConf_File
,
po
::
value
<
std
::
string
>
()
->
default_value
(
"ue_lte_user.conf"
),
"Configuration file"
)
(
odtone
::
sap
::
kConf_Receive_Buffer_Len
,
po
::
value
<
uint
>
()
->
default_value
(
4096
),
"Receive buffer length"
)
(
odtone
::
sap
::
kConf_Port
,
po
::
value
<
ushort
>
()
->
default_value
(
1235
),
"Listening port"
)
(
odtone
::
sap
::
kConf_MIH_SAP_id
,
po
::
value
<
std
::
string
>
()
->
default_value
(
"user"
),
"MIH-User ID"
)
(
kConf_MIH_Commands
,
po
::
value
<
std
::
string
>
()
->
default_value
(
""
),
"MIH-User supported commands"
)
(
odtone
::
sap
::
kConf_MIHF_Ip
,
po
::
value
<
std
::
string
>
()
->
default_value
(
"127.0.0.1"
),
"Local MIHF IP address"
)
(
odtone
::
sap
::
kConf_MIHF_Local_Port
,
po
::
value
<
ushort
>
()
->
default_value
(
1025
),
"Local MIHF communication port"
)
(
odtone
::
sap
::
kConf_MIH_SAP_dest
,
po
::
value
<
std
::
string
>
()
->
default_value
(
"mihf2_ue"
),
"MIHF destination"
);
odtone
::
mih
::
config
cfg
(
desc
);
cfg
.
parse
(
argc
,
argv
,
odtone
::
sap
::
kConf_File
);
if
(
cfg
.
help
())
{
std
::
cerr
<<
desc
<<
std
::
endl
;
return
EXIT_SUCCESS
;
}
mih_user
usr
(
cfg
,
ios
);
ios
.
run
();
}
catch
(
std
::
exception
&
e
)
{
log_
(
0
,
"exception: "
,
e
.
what
());
}
}
// EOF ////////////////////////////////////////////////////////////////////////
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment