Commit 1e127878 authored by Tien-Thinh Nguyen's avatar Tien-Thinh Nguyen

Merge branch 'fix_sst_sd_cots_ue' into 'develop'

Fix sst sd cots ue

See merge request oai/cn5g/oai-cn5g-amf!174
parents 44cffecf e42c609b
...@@ -3255,8 +3255,8 @@ void amf_n1::ul_nas_transport_handle( ...@@ -3255,8 +3255,8 @@ void amf_n1::ul_nas_transport_handle(
// TODO: Only use the first one for now if there's multiple requested // TODO: Only use the first one for now if there's multiple requested
// NSSAI since we don't know which slice associated with this PDU session // NSSAI since we don't know which slice associated with this PDU session
if (nc->requestedNssai.size() > 0) { if (nc->allowed_nssai.size() > 0) {
snssai = nc->requestedNssai[0]; snssai = nc->allowed_nssai[0];
Logger::amf_n1().debug( Logger::amf_n1().debug(
"Use first Requested S-NSSAI %s", snssai.ToString().c_str()); "Use first Requested S-NSSAI %s", snssai.ToString().c_str());
} else { } else {
...@@ -4128,6 +4128,23 @@ void amf_n1::initialize_registration_accept( ...@@ -4128,6 +4128,23 @@ void amf_n1::initialize_registration_accept(
requested_nssai.push_back(ss.second); requested_nssai.push_back(ss.second);
} }
// Allowed NSSAI
for (auto s : common_nssais) {
SNSSAI_t snssai = {};
snssai.sst = s.sst;
snssai.sd = s.sd;
if (s.sd == SD_NO_VALUE) {
snssai.length = SST_LENGTH;
} else {
snssai.length = SST_LENGTH + SD_LENGTH;
}
Logger::amf_n1().debug("Allowed S-NSSAI (SST 0x%x, SD 0x%x)", s.sst, s.sd);
allowed_nssais.push_back(snssai);
// Store in the NAS context
nc->allowed_nssai.push_back(snssai); // TODO: refactor NAS_Context
}
// Rejected NSSAIs
for (auto rn : requested_nssai) { for (auto rn : requested_nssai) {
bool found = false; bool found = false;
...@@ -4142,9 +4159,9 @@ void amf_n1::initialize_registration_accept( ...@@ -4142,9 +4159,9 @@ void amf_n1::initialize_registration_accept(
} else { } else {
snssai.length = SST_LENGTH + SD_LENGTH; snssai.length = SST_LENGTH + SD_LENGTH;
} }
Logger::amf_n1().debug( // Logger::amf_n1().debug(
"Allowed S-NSSAI (SST 0x%x, SD 0x%x)", s.sst, s.sd); // "Allowed S-NSSAI (SST 0x%x, SD 0x%x)", s.sst, s.sd);
allowed_nssais.push_back(snssai); // allowed_nssais.push_back(snssai);
found = true; found = true;
break; break;
} else { } else {
......
...@@ -63,8 +63,14 @@ typedef enum { ...@@ -63,8 +63,14 @@ typedef enum {
sIZE += sizeof(uint16_t) sIZE += sizeof(uint16_t)
#define DECODE_U24(bUFFER, vALUE, sIZE) \ #define DECODE_U24(bUFFER, vALUE, sIZE) \
vALUE = ntohl(*(uint32_t*) (bUFFER)) >> 8; \ do { \
sIZE += sizeof(uint8_t) + sizeof(uint16_t) uint32_t value_tmp = 0; \
uint8_t size_tmp = sizeof(uint8_t) + sizeof(uint16_t); \
memcpy((unsigned char*) &value_tmp, bUFFER, size_tmp); \
vALUE = ntohl(value_tmp); \
vALUE = vALUE >> 8; \
sIZE += size_tmp; \
} while (0)
#define DECODE_U32(bUFFER, vALUE, sIZE) \ #define DECODE_U32(bUFFER, vALUE, sIZE) \
vALUE = ntohl(*(uint32_t*) (bUFFER)); \ vALUE = ntohl(*(uint32_t*) (bUFFER)); \
...@@ -89,8 +95,12 @@ typedef enum { ...@@ -89,8 +95,12 @@ typedef enum {
size += sizeof(uint16_t) size += sizeof(uint16_t)
#define ENCODE_U24(buffer, value, size) \ #define ENCODE_U24(buffer, value, size) \
*(uint32_t*) (buffer) = htonl(value); \ do { \
size += sizeof(uint8_t) + sizeof(uint16_t) uint32_t value_tmp = htonl(value << 8); \
uint8_t size_tmp = sizeof(uint8_t) + sizeof(uint16_t); \
memcpy(buffer, (unsigned char*) &value_tmp, size_tmp); \
size += size_tmp; \
} while (0)
#define ENCODE_U32(buffer, value, size) \ #define ENCODE_U32(buffer, value, size) \
*(uint32_t*) (buffer) = htonl(value); \ *(uint32_t*) (buffer) = htonl(value); \
......
...@@ -98,6 +98,7 @@ class nas_context { ...@@ -98,6 +98,7 @@ class nas_context {
// Set to true if marked as default // Set to true if marked as default
std::vector<std::pair<bool, nas::SNSSAI_t>> subscribed_snssai; std::vector<std::pair<bool, nas::SNSSAI_t>> subscribed_snssai;
std::vector<nas::SNSSAI_t> configured_nssai; std::vector<nas::SNSSAI_t> configured_nssai;
// TODO: rejected_nssai;
// std::vector<nas::SNSSAI_t> default_configured_nssai; // std::vector<nas::SNSSAI_t> default_configured_nssai;
// std::vector<nas::SNSSAI_t> s_nssai; //for Network Slice selection // std::vector<nas::SNSSAI_t> s_nssai; //for Network Slice selection
......
...@@ -126,6 +126,12 @@ int Rejected_SNSSAI::encode2buffer(uint8_t* buf, int len) { ...@@ -126,6 +126,12 @@ int Rejected_SNSSAI::encode2buffer(uint8_t* buf, int len) {
Logger::nas_mm().debug("SST %d", sst_); Logger::nas_mm().debug("SST %d", sst_);
if (sd_.has_value()) { if (sd_.has_value()) {
ENCODE_U24(buf + encoded_size, sd_.value(), encoded_size); ENCODE_U24(buf + encoded_size, sd_.value(), encoded_size);
/*ENCODE_U8(
buf + encoded_size, (sd_.value() & 0x00ff0000) >> 16, encoded_size);
ENCODE_U8(
buf + encoded_size, (sd_.value() & 0x0000ff00) >> 8, encoded_size);
ENCODE_U8(buf + encoded_size, (sd_.value() & 0x000000ff), encoded_size);
*/
Logger::nas_mm().debug("SD 0x%x", sd_.value()); Logger::nas_mm().debug("SD 0x%x", sd_.value());
} }
Logger::nas_mm().debug("Encoded Rejected_SNSSAI (len %d)", encoded_size); Logger::nas_mm().debug("Encoded Rejected_SNSSAI (len %d)", encoded_size);
...@@ -147,10 +153,10 @@ int Rejected_SNSSAI::decodefrombuffer(uint8_t* buf, int len) { ...@@ -147,10 +153,10 @@ int Rejected_SNSSAI::decodefrombuffer(uint8_t* buf, int len) {
cause_, sst_); cause_, sst_);
} else if (length_ == 4) { } else if (length_ == 4) {
uint32_t sd = 0; uint32_t sd = 0;
DECODE_U8(buf + decoded_size, sd, decoded_size); DECODE_U24(buf + decoded_size, sd, decoded_size);
sd_ = std::optional<uint32_t>(sd); sd_ = std::optional<uint32_t>(sd);
Logger::nas_mm().debug( Logger::nas_mm().debug(
"Decoded Rejected_SNSSAI length 0x%x,cause 0x%x, SST 0x%x, SD 0x%x", "Decoded Rejected_SNSSAI length 0x%x, cause 0x%x, SST 0x%x, SD 0x%x",
length_, cause_, sst_, sd); length_, cause_, sst_, sd);
} else { } else {
return -1; // invalid value return -1; // invalid value
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment