diff --git a/lib/include/srslte/interfaces/ue_interfaces.h b/lib/include/srslte/interfaces/ue_interfaces.h index 0891ce06c..fb000ef98 100644 --- a/lib/include/srslte/interfaces/ue_interfaces.h +++ b/lib/include/srslte/interfaces/ue_interfaces.h @@ -98,7 +98,8 @@ class gw_interface_nas { public: virtual int setup_if_addr(uint32_t lcid, uint8_t pdn_type, uint32_t ip_addr, uint8_t* ipv6_if_id, char* err_str) = 0; - virtual int apply_traffic_flow_template(uint8_t eps_bearer_id, + virtual int apply_traffic_flow_template(const uint8_t& eps_bearer_id, + const uint8_t& lcid, const LIBLTE_MME_TRAFFIC_FLOW_TEMPLATE_STRUCT* tft) = 0; }; diff --git a/srsue/hdr/stack/upper/gw.h b/srsue/hdr/stack/upper/gw.h index 39b16252a..b7ecee10a 100644 --- a/srsue/hdr/stack/upper/gw.h +++ b/srsue/hdr/stack/upper/gw.h @@ -60,7 +60,9 @@ public: // NAS interface int setup_if_addr(uint32_t lcid, uint8_t pdn_type, uint32_t ip_addr, uint8_t* ipv6_if_addr, char* err_str); - int apply_traffic_flow_template(uint8_t eps_bearer_id, const LIBLTE_MME_TRAFFIC_FLOW_TEMPLATE_STRUCT* tft); + int apply_traffic_flow_template(const uint8_t& eps_bearer_id, + const uint8_t& lcid, + const LIBLTE_MME_TRAFFIC_FLOW_TEMPLATE_STRUCT* tft); // RRC interface void add_mch_port(uint32_t lcid, uint32_t port); diff --git a/srsue/hdr/stack/upper/tft_packet_filter.h b/srsue/hdr/stack/upper/tft_packet_filter.h index 67b6cb338..92ba516fc 100644 --- a/srsue/hdr/stack/upper/tft_packet_filter.h +++ b/srsue/hdr/stack/upper/tft_packet_filter.h @@ -66,10 +66,14 @@ const uint8_t TCP_PROTOCOL = 0x06; class tft_packet_filter_t { public: - tft_packet_filter_t(uint8_t eps_bearer_id, const LIBLTE_MME_PACKET_FILTER_STRUCT& tft, srslte::log* log); + tft_packet_filter_t(uint8_t eps_bearer_id_, + uint8_t lcid_, + const LIBLTE_MME_PACKET_FILTER_STRUCT& tft_, + srslte::log* log_); bool match(const srslte::unique_byte_buffer_t& pdu); uint8_t eps_bearer_id; + uint8_t lcid; uint8_t id; uint8_t eval_precedence; uint16_t active_filters; diff --git a/srsue/src/stack/upper/gw.cc b/srsue/src/stack/upper/gw.cc index 814663f99..4bdc06833 100644 --- a/srsue/src/stack/upper/gw.cc +++ b/srsue/src/stack/upper/gw.cc @@ -219,15 +219,16 @@ int gw::setup_if_addr(uint32_t lcid, uint8_t pdn_type, uint32_t ip_addr, uint8_t return SRSLTE_SUCCESS; } -int gw::apply_traffic_flow_template(uint8_t erab_id, const LIBLTE_MME_TRAFFIC_FLOW_TEMPLATE_STRUCT* tft) +int gw::apply_traffic_flow_template(const uint8_t& erab_id, + const uint8_t& lcid, + const LIBLTE_MME_TRAFFIC_FLOW_TEMPLATE_STRUCT* tft) { - int err; switch (tft->tft_op_code) { case LIBLTE_MME_TFT_OPERATION_CODE_CREATE_NEW_TFT: gw_log->console("Adding new TFT\n"); for (int i = 0; i < tft->packet_filter_list_size; i++) { gw_log->console("New packet filter for TFT\n"); - tft_packet_filter_t filter(erab_id, tft->packet_filter_list[i], gw_log); + tft_packet_filter_t filter(erab_id, lcid, tft->packet_filter_list[i], gw_log); auto it = tft_filter_map.insert(std::make_pair(filter.eval_precedence, filter)); if (it.second == false) { gw_log->error("Error inserting TFT Packet Filter\n"); @@ -241,6 +242,7 @@ int gw::apply_traffic_flow_template(uint8_t erab_id, const LIBLTE_MME_TRAFFIC_FL } return SRSLTE_SUCCESS; } + /******************************************************************************* RRC interface *******************************************************************************/ @@ -357,7 +359,7 @@ uint8_t gw::check_tft_filter_match(const srslte::unique_byte_buffer_t& pdu) { for (std::pair& filter_pair : tft_filter_map) { bool match = filter_pair.second.match(pdu); if (match) { - lcid = filter_pair.second.eps_bearer_id - 2; + lcid = filter_pair.second.lcid; gw_log->console("Found filter match -- EPS bearer Id %d, LCID %d\n", filter_pair.second.eps_bearer_id, lcid); break; } diff --git a/srsue/src/stack/upper/nas.cc b/srsue/src/stack/upper/nas.cc index e2c7caa60..d44fa5c56 100644 --- a/srsue/src/stack/upper/nas.cc +++ b/srsue/src/stack/upper/nas.cc @@ -1164,7 +1164,7 @@ void nas::parse_activate_dedicated_eps_bearer_context_request(uint32_t lcid, uni } // apply packet filters to GW - gw->apply_traffic_flow_template(request.eps_bearer_id, tft); + gw->apply_traffic_flow_template(request.eps_bearer_id, rrc->get_lcid_for_eps_bearer(request.eps_bearer_id), tft); send_activate_dedicated_eps_bearer_context_accept(request.proc_transaction_id, request.eps_bearer_id); } diff --git a/srsue/src/stack/upper/tft_packet_filter.cc b/srsue/src/stack/upper/tft_packet_filter.cc index d7e3ebd6f..1fdb50df8 100644 --- a/srsue/src/stack/upper/tft_packet_filter.cc +++ b/srsue/src/stack/upper/tft_packet_filter.cc @@ -26,14 +26,16 @@ namespace srsue { -tft_packet_filter_t::tft_packet_filter_t(uint8_t eps_bearer_id, +tft_packet_filter_t::tft_packet_filter_t(uint8_t eps_bearer_id_, + uint8_t lcid_, const LIBLTE_MME_PACKET_FILTER_STRUCT& tft, - srslte::log* log) : - eps_bearer_id(eps_bearer_id), + srslte::log* log_) : + eps_bearer_id(eps_bearer_id_), + lcid(lcid_), id(tft.id), eval_precedence(tft.eval_precedence), active_filters(0), - log(log) + log(log_) { int idx = 0; while (idx < tft.filter_size) { diff --git a/srsue/test/upper/nas_test.cc b/srsue/test/upper/nas_test.cc index 1d1d4d1d9..4ce45b8db 100644 --- a/srsue/test/upper/nas_test.cc +++ b/srsue/test/upper/nas_test.cc @@ -143,7 +143,9 @@ class gw_dummy : public gw_interface_nas, public gw_interface_pdcp { return SRSLTE_SUCCESS; } - int apply_traffic_flow_template(uint8_t eps_bearer_id, const LIBLTE_MME_TRAFFIC_FLOW_TEMPLATE_STRUCT* tft) + int apply_traffic_flow_template(const uint8_t& eps_bearer_id, + const uint8_t& lcid, + const LIBLTE_MME_TRAFFIC_FLOW_TEMPLATE_STRUCT* tft) { return SRSLTE_SUCCESS; } diff --git a/srsue/test/upper/tft_test.cc b/srsue/test/upper/tft_test.cc index 30f9c174d..616e97154 100644 --- a/srsue/test/upper/tft_test.cc +++ b/srsue/test/upper/tft_test.cc @@ -64,6 +64,7 @@ uint8_t ip_tst_message2[] = { uint32_t ip_message_len2 = sizeof(ip_tst_message2); #define EPS_BEARER_ID 6 +#define LCID 1 int tft_filter_test_single_local_port() { @@ -103,8 +104,8 @@ int tft_filter_test_single_local_port() packet_filter.eval_precedence = 0; packet_filter.filter_size = 3; memcpy(packet_filter.filter, filter_message, 3); - - srsue::tft_packet_filter_t filter(EPS_BEARER_ID, packet_filter, &log1); + + srsue::tft_packet_filter_t filter(EPS_BEARER_ID, LCID, packet_filter, &log1); // Check filter TESTASSERT(filter.match(ip_msg1)); @@ -151,8 +152,8 @@ int tft_filter_test_single_remote_port() packet_filter.eval_precedence = 0; packet_filter.filter_size = 3; memcpy(packet_filter.filter, filter_message, 3); - - srsue::tft_packet_filter_t filter(EPS_BEARER_ID, packet_filter, &log1); + + srsue::tft_packet_filter_t filter(EPS_BEARER_ID, LCID, packet_filter, &log1); // Check filter TESTASSERT(filter.match(ip_msg1)); @@ -200,8 +201,8 @@ int tft_filter_test_ipv4_local_addr() packet_filter.eval_precedence = 0; packet_filter.filter_size = filter_size; memcpy(packet_filter.filter, filter_message, filter_size); - - srsue::tft_packet_filter_t filter(EPS_BEARER_ID, packet_filter, &log1); + + srsue::tft_packet_filter_t filter(EPS_BEARER_ID, LCID, packet_filter, &log1); // Check filter TESTASSERT(filter.match(ip_msg1)); @@ -249,8 +250,8 @@ int tft_filter_test_ipv4_remote_addr() packet_filter.eval_precedence = 0; packet_filter.filter_size = filter_size; memcpy(packet_filter.filter, filter_message, filter_size); - - srsue::tft_packet_filter_t filter(EPS_BEARER_ID, packet_filter, &log1); + + srsue::tft_packet_filter_t filter(EPS_BEARER_ID, LCID, packet_filter, &log1); // Check filter TESTASSERT(filter.match(ip_msg1)); @@ -297,8 +298,8 @@ int tft_filter_test_ipv4_tos() packet_filter.eval_precedence = 0; packet_filter.filter_size = filter_size; memcpy(packet_filter.filter, filter_message, filter_size); - - srsue::tft_packet_filter_t filter(EPS_BEARER_ID, packet_filter, &log1); + + srsue::tft_packet_filter_t filter(EPS_BEARER_ID, LCID, packet_filter, &log1); // Check filter TESTASSERT(filter.match(ip_msg1));