forked from acouzens/open5gs
[NAS] fix the security issue (ZDI-CAN-14043)
This commit is contained in:
parent
4537142929
commit
00c96a3f0f
File diff suppressed because it is too large
Load Diff
|
@ -28,7 +28,7 @@
|
|||
/*******************************************************************************
|
||||
* This file had been created by nas-message.py script v0.2.0
|
||||
* Please do not modify this file but regenerate it via script.
|
||||
* Created on: 2021-06-15 11:11:47.251176 by acetcom
|
||||
* Created on: 2021-06-21 14:15:53.800337 by acetcom
|
||||
* from 24501-g41.docx
|
||||
******************************************************************************/
|
||||
|
||||
|
|
1112
lib/nas/5gs/ies.c
1112
lib/nas/5gs/ies.c
File diff suppressed because it is too large
Load Diff
|
@ -28,7 +28,7 @@
|
|||
/*******************************************************************************
|
||||
* This file had been created by nas-message.py script v0.2.0
|
||||
* Please do not modify this file but regenerate it via script.
|
||||
* Created on: 2021-06-15 11:11:47.230677 by acetcom
|
||||
* Created on: 2021-06-21 14:15:53.779048 by acetcom
|
||||
* from 24501-g41.docx
|
||||
******************************************************************************/
|
||||
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
/*******************************************************************************
|
||||
* This file had been created by nas-message.py script v0.2.0
|
||||
* Please do not modify this file but regenerate it via script.
|
||||
* Created on: 2021-06-15 11:11:47.238937 by acetcom
|
||||
* Created on: 2021-06-21 14:15:53.787309 by acetcom
|
||||
* from 24501-g41.docx
|
||||
******************************************************************************/
|
||||
|
||||
|
|
|
@ -373,7 +373,7 @@ f.write("""#include "ogs-nas-5gs.h"
|
|||
|
||||
int ogs_nas_5gs_encode_optional_type(ogs_pkbuf_t *pkbuf, uint8_t type)
|
||||
{
|
||||
uint16_t size = sizeof(uint8_t);
|
||||
int size = sizeof(uint8_t);
|
||||
|
||||
ogs_assert(ogs_pkbuf_pull(pkbuf, size));
|
||||
memcpy(pkbuf->data - size, &type, size);
|
||||
|
@ -389,8 +389,11 @@ for (k, v) in sorted_type_list:
|
|||
if (type_list[k]["format"] == "TV" or type_list[k]["format"] == "T") and type_list[k]["length"] == "1":
|
||||
f.write("int ogs_nas_5gs_decode_%s(ogs_nas_%s_t *%s, ogs_pkbuf_t *pkbuf)\n" % (v_lower(k), v_lower(k), get_value(k)))
|
||||
f.write("{\n")
|
||||
f.write(" uint16_t size = sizeof(ogs_nas_%s_t);\n\n" % v_lower(k))
|
||||
f.write(" ogs_assert(ogs_pkbuf_pull(pkbuf, size));\n")
|
||||
f.write(" int size = sizeof(ogs_nas_%s_t);\n\n" % v_lower(k))
|
||||
f.write(" if (ogs_pkbuf_pull(pkbuf, size) == NULL) {\n")
|
||||
f.write(" ogs_error(\"ogs_pkbuf_pull() failed [size:%d]\", (int)size);\n")
|
||||
f.write(" return -1;\n")
|
||||
f.write(" }\n\n")
|
||||
f.write(" memcpy(%s, pkbuf->data - size, size);\n\n" % get_value(k))
|
||||
f.write(" ogs_trace(\" %s - \");\n" % v_upper(k))
|
||||
f.write(" ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size);\n\n");
|
||||
|
@ -398,7 +401,7 @@ for (k, v) in sorted_type_list:
|
|||
f.write("}\n\n")
|
||||
f.write("int ogs_nas_5gs_encode_%s(ogs_pkbuf_t *pkbuf, ogs_nas_%s_t *%s)\n" % (v_lower(k), v_lower(k), get_value(k)))
|
||||
f.write("{\n")
|
||||
f.write(" uint16_t size = sizeof(ogs_nas_%s_t);\n\n" % v_lower(k))
|
||||
f.write(" int size = sizeof(ogs_nas_%s_t);\n\n" % v_lower(k))
|
||||
f.write(" ogs_assert(ogs_pkbuf_pull(pkbuf, size));\n")
|
||||
f.write(" memcpy(pkbuf->data - size, %s, size);\n\n" % get_value(k))
|
||||
f.write(" ogs_trace(\" %s - \");\n" % v_upper(k))
|
||||
|
@ -409,10 +412,13 @@ for (k, v) in sorted_type_list:
|
|||
f.write("int ogs_nas_5gs_decode_%s(ogs_nas_%s_t *%s, ogs_pkbuf_t *pkbuf)\n" % (v_lower(k), v_lower(k), get_value(k)))
|
||||
f.write("{\n")
|
||||
if type_list[k]["length"] == "4":
|
||||
f.write(" uint16_t size = 3;\n\n")
|
||||
f.write(" int size = 3;\n\n")
|
||||
else:
|
||||
f.write(" uint16_t size = sizeof(ogs_nas_%s_t);\n\n" % v_lower(k))
|
||||
f.write(" if (ogs_pkbuf_pull(pkbuf, size) == NULL) return -1;\n")
|
||||
f.write(" int size = sizeof(ogs_nas_%s_t);\n\n" % v_lower(k))
|
||||
f.write(" if (ogs_pkbuf_pull(pkbuf, size) == NULL) {\n")
|
||||
f.write(" ogs_error(\"ogs_pkbuf_pull() failed [size:%d]\", (int)size);\n")
|
||||
f.write(" return -1;\n")
|
||||
f.write(" }\n\n")
|
||||
f.write(" memcpy(%s, pkbuf->data - size, size);\n\n" % get_value(k))
|
||||
if "decode" in type_list[k]:
|
||||
f.write("%s" % type_list[k]["decode"])
|
||||
|
@ -423,9 +429,9 @@ for (k, v) in sorted_type_list:
|
|||
f.write("int ogs_nas_5gs_encode_%s(ogs_pkbuf_t *pkbuf, ogs_nas_%s_t *%s)\n" % (v_lower(k), v_lower(k), get_value(k)))
|
||||
f.write("{\n")
|
||||
if type_list[k]["length"] == "4":
|
||||
f.write(" uint16_t size = 3;\n")
|
||||
f.write(" int size = 3;\n")
|
||||
else:
|
||||
f.write(" uint16_t size = sizeof(ogs_nas_%s_t);\n" % v_lower(k))
|
||||
f.write(" int size = sizeof(ogs_nas_%s_t);\n" % v_lower(k))
|
||||
f.write(" ogs_nas_%s_t target;\n\n" % v_lower(k))
|
||||
f.write(" memcpy(&target, %s, size);\n" % get_value(k))
|
||||
if "encode" in type_list[k]:
|
||||
|
@ -439,11 +445,14 @@ for (k, v) in sorted_type_list:
|
|||
elif type_list[k]["format"] == "LV-E" or type_list[k]["format"] == "TLV-E":
|
||||
f.write("int ogs_nas_5gs_decode_%s(ogs_nas_%s_t *%s, ogs_pkbuf_t *pkbuf)\n" % (v_lower(k), v_lower(k), get_value(k)))
|
||||
f.write("{\n")
|
||||
f.write(" uint16_t size = 0;\n")
|
||||
f.write(" int size = 0;\n")
|
||||
f.write(" ogs_nas_%s_t *source = (ogs_nas_%s_t *)pkbuf->data;\n\n" % (v_lower(k), v_lower(k)))
|
||||
f.write(" %s->length = be16toh(source->length);\n" % get_value(k))
|
||||
f.write(" size = %s->length + sizeof(%s->length);\n\n" % (get_value(k), get_value(k)))
|
||||
f.write(" if (ogs_pkbuf_pull(pkbuf, size) == NULL) return -1;\n")
|
||||
f.write(" if (ogs_pkbuf_pull(pkbuf, size) == NULL) {\n")
|
||||
f.write(" ogs_error(\"ogs_pkbuf_pull() failed [size:%d]\", (int)size);\n")
|
||||
f.write(" return -1;\n")
|
||||
f.write(" }\n\n")
|
||||
f.write(" %s->buffer = pkbuf->data - size + sizeof(%s->length);\n\n" % (get_value(k), get_value(k)))
|
||||
f.write(" ogs_trace(\" %s - \");\n" % v_upper(k))
|
||||
f.write(" ogs_log_hexdump(OGS_LOG_TRACE, (void*)%s->buffer, %s->length);\n\n" % (get_value(k), get_value(k)));
|
||||
|
@ -451,8 +460,8 @@ for (k, v) in sorted_type_list:
|
|||
f.write("}\n\n")
|
||||
f.write("int ogs_nas_5gs_encode_%s(ogs_pkbuf_t *pkbuf, ogs_nas_%s_t *%s)\n" % (v_lower(k), v_lower(k), get_value(k)))
|
||||
f.write("{\n")
|
||||
f.write(" uint16_t size = 0;\n")
|
||||
f.write(" uint16_t target;\n\n")
|
||||
f.write(" int size = 0;\n")
|
||||
f.write(" int target;\n\n")
|
||||
f.write(" ogs_assert(%s);\n" % get_value(k))
|
||||
f.write(" ogs_assert(%s->buffer);\n\n" % get_value(k))
|
||||
f.write(" size = sizeof(%s->length);\n" % get_value(k))
|
||||
|
@ -469,11 +478,14 @@ for (k, v) in sorted_type_list:
|
|||
else:
|
||||
f.write("int ogs_nas_5gs_decode_%s(ogs_nas_%s_t *%s, ogs_pkbuf_t *pkbuf)\n" % (v_lower(k), v_lower(k), get_value(k)))
|
||||
f.write("{\n")
|
||||
f.write(" uint16_t size = 0;\n")
|
||||
f.write(" int size = 0;\n")
|
||||
f.write(" ogs_nas_%s_t *source = (ogs_nas_%s_t *)pkbuf->data;\n\n" % (v_lower(k), v_lower(k)))
|
||||
f.write(" %s->length = source->length;\n" % get_value(k))
|
||||
f.write(" size = %s->length + sizeof(%s->length);\n\n" % (get_value(k), get_value(k)))
|
||||
f.write(" if (ogs_pkbuf_pull(pkbuf, size) == NULL) return -1;\n")
|
||||
f.write(" if (ogs_pkbuf_pull(pkbuf, size) == NULL) {\n")
|
||||
f.write(" ogs_error(\"ogs_pkbuf_pull() failed [size:%d]\", (int)size);\n")
|
||||
f.write(" return -1;\n")
|
||||
f.write(" }\n\n")
|
||||
f.write(" if (sizeof(*%s) < size) return -1;\n" % get_value(k))
|
||||
f.write(" memcpy(%s, pkbuf->data - size, size);\n\n" % get_value(k))
|
||||
if "decode" in type_list[k]:
|
||||
|
@ -484,7 +496,7 @@ for (k, v) in sorted_type_list:
|
|||
f.write("}\n\n")
|
||||
f.write("int ogs_nas_5gs_encode_%s(ogs_pkbuf_t *pkbuf, ogs_nas_%s_t *%s)\n" % (v_lower(k), v_lower(k), get_value(k)))
|
||||
f.write("{\n")
|
||||
f.write(" uint16_t size = %s->length + sizeof(%s->length);\n" % (get_value(k), get_value(k)))
|
||||
f.write(" int size = %s->length + sizeof(%s->length);\n" % (get_value(k), get_value(k)))
|
||||
f.write(" ogs_nas_%s_t target;\n\n" % v_lower(k))
|
||||
f.write(" memcpy(&target, %s, sizeof(ogs_nas_%s_t));\n" % (get_value(k), v_lower(k)))
|
||||
if "encode" in type_list[k]:
|
||||
|
@ -663,7 +675,10 @@ for (k, v) in sorted_msg_list:
|
|||
|
||||
for ie in [ies for ies in msg_list[k]["ies"] if ies["presence"] == "M"]:
|
||||
f.write(" size = ogs_nas_5gs_decode_%s(&%s->%s, pkbuf);\n" % (v_lower(ie["type"]), get_value(k), get_value(ie["value"])))
|
||||
f.write(" if (size < 0) return size;\n")
|
||||
f.write(" if (size < 0) {\n")
|
||||
f.write(" ogs_error(\"ogs_nas_5gs_decode_%s() failed\");\n" % v_lower(ie["type"]))
|
||||
f.write(" return size;\n")
|
||||
f.write(" }\n\n")
|
||||
f.write(" decoded += size;\n\n")
|
||||
|
||||
optional_fields = False;
|
||||
|
@ -674,7 +689,10 @@ for (k, v) in sorted_msg_list:
|
|||
uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
|
||||
|
||||
size = sizeof(uint8_t);
|
||||
ogs_assert(ogs_pkbuf_pull(pkbuf, size));
|
||||
if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
|
||||
ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
|
||||
return OGS_ERROR;
|
||||
}
|
||||
decoded += size;
|
||||
|
||||
switch(type) {
|
||||
|
@ -686,7 +704,10 @@ for (k, v) in sorted_msg_list:
|
|||
f.write(" decoded--;\n")
|
||||
f.write(" ogs_assert(ogs_pkbuf_push(pkbuf, 1));\n")
|
||||
f.write(" size = ogs_nas_5gs_decode_%s(&%s->%s, pkbuf);\n" % (v_lower(ie["type"]), get_value(k), get_value(ie["value"])))
|
||||
f.write(" if (size < 0) return size;\n")
|
||||
f.write(" if (size < 0) {\n")
|
||||
f.write(" ogs_error(\"ogs_nas_5gs_decode_%s() failed\");\n" % v_lower(ie["type"]))
|
||||
f.write(" return size;\n")
|
||||
f.write(" }\n\n")
|
||||
f.write(" %s->presencemask |= OGS_NAS_5GS_%s_%s_PRESENT;\n" % (get_value(k), v_upper(k), v_upper(ie["value"])))
|
||||
f.write(" decoded += size;\n")
|
||||
f.write(" break;\n")
|
||||
|
@ -707,7 +728,7 @@ for (k, v) in sorted_msg_list:
|
|||
f.write("""int ogs_nas_5gmm_decode(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf)
|
||||
{
|
||||
int size = 0;
|
||||
uint16_t decoded = 0;
|
||||
int decoded = 0;
|
||||
|
||||
ogs_assert(pkbuf);
|
||||
ogs_assert(pkbuf->data);
|
||||
|
@ -716,7 +737,10 @@ f.write("""int ogs_nas_5gmm_decode(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *
|
|||
memset(message, 0, sizeof(ogs_nas_5gs_message_t));
|
||||
|
||||
size = sizeof(ogs_nas_5gmm_header_t);
|
||||
if (ogs_pkbuf_pull(pkbuf, size) == NULL) return OGS_ERROR;
|
||||
if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
|
||||
ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
|
||||
return OGS_ERROR;
|
||||
}
|
||||
memcpy(&message->gmm.h, pkbuf->data - size, size);
|
||||
decoded += size;
|
||||
|
||||
|
@ -729,7 +753,10 @@ for (k, v) in sorted_msg_list:
|
|||
f.write(" case OGS_NAS_5GS_%s:\n" % v_upper(k))
|
||||
if len(msg_list[k]["ies"]) != 0:
|
||||
f.write(" size = ogs_nas_5gs_decode_%s(message, pkbuf);\n" % v_lower(k))
|
||||
f.write(" if (size < 0) return OGS_ERROR;\n")
|
||||
f.write(" if (size < 0) {\n")
|
||||
f.write(" ogs_error(\"ogs_nas_5gs_decode_%s() failed\");\n" % v_lower(k))
|
||||
f.write(" return size;\n")
|
||||
f.write(" }\n\n")
|
||||
f.write(" decoded += size;\n")
|
||||
f.write(" break;\n")
|
||||
|
||||
|
@ -748,7 +775,7 @@ f.write(""" default:
|
|||
f.write("""int ogs_nas_5gsm_decode(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf)
|
||||
{
|
||||
int size = 0;
|
||||
uint16_t decoded = 0;
|
||||
int decoded = 0;
|
||||
|
||||
ogs_assert(pkbuf);
|
||||
ogs_assert(pkbuf->data);
|
||||
|
@ -757,7 +784,10 @@ f.write("""int ogs_nas_5gsm_decode(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *
|
|||
memset(message, 0, sizeof(ogs_nas_5gs_message_t));
|
||||
|
||||
size = sizeof(ogs_nas_5gsm_header_t);
|
||||
if (ogs_pkbuf_pull(pkbuf, size) == NULL) return OGS_ERROR;
|
||||
if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
|
||||
ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
|
||||
return OGS_ERROR;
|
||||
}
|
||||
memcpy(&message->gsm.h, pkbuf->data - size, size);
|
||||
decoded += size;
|
||||
|
||||
|
@ -770,7 +800,10 @@ for (k, v) in sorted_msg_list:
|
|||
f.write(" case OGS_NAS_5GS_%s:\n" % v_upper(k))
|
||||
if len(msg_list[k]["ies"]) != 0:
|
||||
f.write(" size = ogs_nas_5gs_decode_%s(message, pkbuf);\n" % v_lower(k))
|
||||
f.write(" if (size < 0) return OGS_ERROR;\n")
|
||||
f.write(" if (size < 0) {\n")
|
||||
f.write(" ogs_error(\"ogs_nas_5gs_decode_%s() failed\");\n" % v_lower(k))
|
||||
f.write(" return size;\n")
|
||||
f.write(" }\n\n")
|
||||
f.write(" decoded += size;\n")
|
||||
f.write(" break;\n")
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -28,7 +28,7 @@
|
|||
/*******************************************************************************
|
||||
* This file had been created by nas-message.py script v0.1.0
|
||||
* Please do not modify this file but regenerate it via script.
|
||||
* Created on: 2021-06-15 11:19:58.637113 by acetcom
|
||||
* Created on: 2021-06-21 14:44:53.390608 by acetcom
|
||||
* from 24301-g40.docx
|
||||
******************************************************************************/
|
||||
|
||||
|
|
1086
lib/nas/eps/ies.c
1086
lib/nas/eps/ies.c
File diff suppressed because it is too large
Load Diff
|
@ -28,7 +28,7 @@
|
|||
/*******************************************************************************
|
||||
* This file had been created by nas-message.py script v0.1.0
|
||||
* Please do not modify this file but regenerate it via script.
|
||||
* Created on: 2021-06-15 11:19:58.616283 by acetcom
|
||||
* Created on: 2021-06-21 14:44:53.369156 by acetcom
|
||||
* from 24301-g40.docx
|
||||
******************************************************************************/
|
||||
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
/*******************************************************************************
|
||||
* This file had been created by nas-message.py script v0.1.0
|
||||
* Please do not modify this file but regenerate it via script.
|
||||
* Created on: 2021-06-15 11:19:58.623021 by acetcom
|
||||
* Created on: 2021-06-21 14:44:53.375891 by acetcom
|
||||
* from 24301-g40.docx
|
||||
******************************************************************************/
|
||||
|
||||
|
|
|
@ -387,7 +387,7 @@ f.write("""#include "ogs-nas-eps.h"
|
|||
|
||||
int ogs_nas_eps_encode_optional_type(ogs_pkbuf_t *pkbuf, uint8_t type)
|
||||
{
|
||||
uint16_t size = sizeof(uint8_t);
|
||||
int size = sizeof(uint8_t);
|
||||
|
||||
ogs_assert(ogs_pkbuf_pull(pkbuf, size));
|
||||
memcpy(pkbuf->data - size, &type, size);
|
||||
|
@ -403,8 +403,11 @@ for (k, v) in sorted_type_list:
|
|||
if (type_list[k]["format"] == "TV" or type_list[k]["format"] == "T") and type_list[k]["length"] == "1":
|
||||
f.write("int ogs_nas_eps_decode_%s(ogs_nas_%s_t *%s, ogs_pkbuf_t *pkbuf)\n" % (v_lower(k), v_lower(k), v_lower(k)))
|
||||
f.write("{\n")
|
||||
f.write(" uint16_t size = sizeof(ogs_nas_%s_t);\n\n" % v_lower(k))
|
||||
f.write(" ogs_assert(ogs_pkbuf_pull(pkbuf, size));\n")
|
||||
f.write(" int size = sizeof(ogs_nas_%s_t);\n\n" % v_lower(k))
|
||||
f.write(" if (ogs_pkbuf_pull(pkbuf, size) == NULL) {\n")
|
||||
f.write(" ogs_error(\"ogs_pkbuf_pull() failed [size:%d]\", (int)size);\n")
|
||||
f.write(" return -1;\n")
|
||||
f.write(" }\n\n")
|
||||
f.write(" memcpy(%s, pkbuf->data - size, size);\n\n" % v_lower(k))
|
||||
f.write(" ogs_trace(\" %s - \");\n" % v_upper(k))
|
||||
f.write(" ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size);\n\n");
|
||||
|
@ -412,7 +415,7 @@ for (k, v) in sorted_type_list:
|
|||
f.write("}\n\n")
|
||||
f.write("int ogs_nas_eps_encode_%s(ogs_pkbuf_t *pkbuf, ogs_nas_%s_t *%s)\n" % (v_lower(k), v_lower(k), v_lower(k)))
|
||||
f.write("{\n")
|
||||
f.write(" uint16_t size = sizeof(ogs_nas_%s_t);\n\n" % v_lower(k))
|
||||
f.write(" int size = sizeof(ogs_nas_%s_t);\n\n" % v_lower(k))
|
||||
f.write(" ogs_assert(ogs_pkbuf_pull(pkbuf, size));\n")
|
||||
f.write(" memcpy(pkbuf->data - size, %s, size);\n\n" % v_lower(k))
|
||||
f.write(" ogs_trace(\" %s - \");\n" % v_upper(k))
|
||||
|
@ -423,10 +426,13 @@ for (k, v) in sorted_type_list:
|
|||
f.write("int ogs_nas_eps_decode_%s(ogs_nas_%s_t *%s, ogs_pkbuf_t *pkbuf)\n" % (v_lower(k), v_lower(k), v_lower(k)))
|
||||
f.write("{\n")
|
||||
if type_list[k]["length"] == "4":
|
||||
f.write(" uint16_t size = 3;\n\n")
|
||||
f.write(" int size = 3;\n\n")
|
||||
else:
|
||||
f.write(" uint16_t size = sizeof(ogs_nas_%s_t);\n\n" % v_lower(k))
|
||||
f.write(" if (ogs_pkbuf_pull(pkbuf, size) == NULL) return -1;\n")
|
||||
f.write(" int size = sizeof(ogs_nas_%s_t);\n\n" % v_lower(k))
|
||||
f.write(" if (ogs_pkbuf_pull(pkbuf, size) == NULL) {\n")
|
||||
f.write(" ogs_error(\"ogs_pkbuf_pull() failed [size:%d]\", (int)size);\n")
|
||||
f.write(" return -1;\n")
|
||||
f.write(" }\n\n")
|
||||
f.write(" memcpy(%s, pkbuf->data - size, size);\n\n" % v_lower(k))
|
||||
if "decode" in type_list[k]:
|
||||
f.write("%s" % type_list[k]["decode"])
|
||||
|
@ -437,9 +443,9 @@ for (k, v) in sorted_type_list:
|
|||
f.write("int ogs_nas_eps_encode_%s(ogs_pkbuf_t *pkbuf, ogs_nas_%s_t *%s)\n" % (v_lower(k), v_lower(k), v_lower(k)))
|
||||
f.write("{\n")
|
||||
if type_list[k]["length"] == "4":
|
||||
f.write(" uint16_t size = 3;\n")
|
||||
f.write(" int size = 3;\n")
|
||||
else:
|
||||
f.write(" uint16_t size = sizeof(ogs_nas_%s_t);\n" % v_lower(k))
|
||||
f.write(" int size = sizeof(ogs_nas_%s_t);\n" % v_lower(k))
|
||||
f.write(" ogs_nas_%s_t target;\n\n" % v_lower(k))
|
||||
f.write(" memcpy(&target, %s, size);\n" % v_lower(k))
|
||||
if "encode" in type_list[k]:
|
||||
|
@ -453,11 +459,14 @@ for (k, v) in sorted_type_list:
|
|||
elif type_list[k]["format"] == "LV-E" or type_list[k]["format"] == "TLV-E":
|
||||
f.write("int ogs_nas_eps_decode_%s(ogs_nas_%s_t *%s, ogs_pkbuf_t *pkbuf)\n" % (v_lower(k), v_lower(k), v_lower(k)))
|
||||
f.write("{\n")
|
||||
f.write(" uint16_t size = 0;\n")
|
||||
f.write(" int size = 0;\n")
|
||||
f.write(" ogs_nas_%s_t *source = (ogs_nas_%s_t *)pkbuf->data;\n\n" % (v_lower(k), v_lower(k)))
|
||||
f.write(" %s->length = be16toh(source->length);\n" % v_lower(k))
|
||||
f.write(" size = %s->length + sizeof(%s->length);\n\n" % (v_lower(k), v_lower(k)))
|
||||
f.write(" if (ogs_pkbuf_pull(pkbuf, size) == NULL) return -1;\n")
|
||||
f.write(" if (ogs_pkbuf_pull(pkbuf, size) == NULL) {\n")
|
||||
f.write(" ogs_error(\"ogs_pkbuf_pull() failed [size:%d]\", (int)size);\n")
|
||||
f.write(" return -1;\n")
|
||||
f.write(" }\n\n")
|
||||
f.write(" %s->buffer = pkbuf->data - size + sizeof(%s->length);\n\n" % (v_lower(k), v_lower(k)))
|
||||
f.write(" ogs_trace(\" %s - \");\n" % v_upper(k))
|
||||
f.write(" ogs_log_hexdump(OGS_LOG_TRACE, (void*)%s->buffer, %s->length);\n\n" % (v_lower(k), v_lower(k)));
|
||||
|
@ -465,8 +474,8 @@ for (k, v) in sorted_type_list:
|
|||
f.write("}\n\n")
|
||||
f.write("int ogs_nas_eps_encode_%s(ogs_pkbuf_t *pkbuf, ogs_nas_%s_t *%s)\n" % (v_lower(k), v_lower(k), v_lower(k)))
|
||||
f.write("{\n")
|
||||
f.write(" uint16_t size = 0;\n")
|
||||
f.write(" uint16_t target;\n\n")
|
||||
f.write(" int size = 0;\n")
|
||||
f.write(" int target;\n\n")
|
||||
f.write(" ogs_assert(%s);\n" % v_lower(k))
|
||||
f.write(" ogs_assert(%s->buffer);\n\n" % v_lower(k))
|
||||
f.write(" size = sizeof(%s->length);\n" % v_lower(k))
|
||||
|
@ -483,11 +492,14 @@ for (k, v) in sorted_type_list:
|
|||
else:
|
||||
f.write("int ogs_nas_eps_decode_%s(ogs_nas_%s_t *%s, ogs_pkbuf_t *pkbuf)\n" % (v_lower(k), v_lower(k), v_lower(k)))
|
||||
f.write("{\n")
|
||||
f.write(" uint16_t size = 0;\n")
|
||||
f.write(" int size = 0;\n")
|
||||
f.write(" ogs_nas_%s_t *source = (ogs_nas_%s_t *)pkbuf->data;\n\n" % (v_lower(k), v_lower(k)))
|
||||
f.write(" %s->length = source->length;\n" % v_lower(k))
|
||||
f.write(" size = %s->length + sizeof(%s->length);\n\n" % (v_lower(k), v_lower(k)))
|
||||
f.write(" if (ogs_pkbuf_pull(pkbuf, size) == NULL) return -1;\n")
|
||||
f.write(" if (ogs_pkbuf_pull(pkbuf, size) == NULL) {\n")
|
||||
f.write(" ogs_error(\"ogs_pkbuf_pull() failed [size:%d]\", (int)size);\n")
|
||||
f.write(" return -1;\n")
|
||||
f.write(" }\n\n")
|
||||
f.write(" if (sizeof(*%s) < size) return -1;\n" % v_lower(k))
|
||||
f.write(" memcpy(%s, pkbuf->data - size, size);\n\n" % v_lower(k))
|
||||
if "decode" in type_list[k]:
|
||||
|
@ -498,7 +510,7 @@ for (k, v) in sorted_type_list:
|
|||
f.write("}\n\n")
|
||||
f.write("int ogs_nas_eps_encode_%s(ogs_pkbuf_t *pkbuf, ogs_nas_%s_t *%s)\n" % (v_lower(k), v_lower(k), v_lower(k)))
|
||||
f.write("{\n")
|
||||
f.write(" uint16_t size = %s->length + sizeof(%s->length);\n" % (v_lower(k), v_lower(k)))
|
||||
f.write(" int size = %s->length + sizeof(%s->length);\n" % (v_lower(k), v_lower(k)))
|
||||
f.write(" ogs_nas_%s_t target;\n\n" % v_lower(k))
|
||||
f.write(" memcpy(&target, %s, sizeof(ogs_nas_%s_t));\n" % (v_lower(k), v_lower(k)))
|
||||
if "encode" in type_list[k]:
|
||||
|
@ -677,7 +689,10 @@ for (k, v) in sorted_msg_list:
|
|||
|
||||
for ie in [ies for ies in msg_list[k]["ies"] if ies["presence"] == "M"]:
|
||||
f.write(" size = ogs_nas_eps_decode_%s(&%s->%s, pkbuf);\n" % (v_lower(ie["type"]), v_lower(k), v_lower(ie["value"])))
|
||||
f.write(" if (size < 0) return size;\n")
|
||||
f.write(" if (size < 0) {\n")
|
||||
f.write(" ogs_error(\"ogs_nas_eps_decode_%s() failed\");\n" % v_lower(ie["type"]))
|
||||
f.write(" return size;\n")
|
||||
f.write(" }\n\n")
|
||||
f.write(" decoded += size;\n\n")
|
||||
|
||||
optional_fields = False;
|
||||
|
@ -688,7 +703,10 @@ for (k, v) in sorted_msg_list:
|
|||
uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
|
||||
|
||||
size = sizeof(uint8_t);
|
||||
ogs_assert(ogs_pkbuf_pull(pkbuf, size));
|
||||
if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
|
||||
ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
|
||||
return OGS_ERROR;
|
||||
}
|
||||
decoded += size;
|
||||
|
||||
switch (type) {
|
||||
|
@ -700,7 +718,10 @@ for (k, v) in sorted_msg_list:
|
|||
f.write(" decoded--;\n")
|
||||
f.write(" ogs_assert(ogs_pkbuf_push(pkbuf, 1));\n")
|
||||
f.write(" size = ogs_nas_eps_decode_%s(&%s->%s, pkbuf);\n" % (v_lower(ie["type"]), v_lower(k), v_lower(ie["value"])))
|
||||
f.write(" if (size < 0) return size;\n")
|
||||
f.write(" if (size < 0) {\n")
|
||||
f.write(" ogs_error(\"ogs_nas_eps_decode_%s() failed\");\n" % v_lower(ie["type"]))
|
||||
f.write(" return size;\n")
|
||||
f.write(" }\n\n")
|
||||
f.write(" %s->presencemask |= OGS_NAS_EPS_%s_%s_PRESENT;\n" % (v_lower(k), v_upper(k), v_upper(ie["value"])))
|
||||
f.write(" decoded += size;\n")
|
||||
f.write(" break;\n")
|
||||
|
@ -721,7 +742,7 @@ for (k, v) in sorted_msg_list:
|
|||
f.write("""int ogs_nas_emm_decode(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
|
||||
{
|
||||
int size = 0;
|
||||
uint16_t decoded = 0;
|
||||
int decoded = 0;
|
||||
|
||||
ogs_assert(pkbuf);
|
||||
ogs_assert(pkbuf->data);
|
||||
|
@ -730,7 +751,10 @@ f.write("""int ogs_nas_emm_decode(ogs_nas_eps_message_t *message, ogs_pkbuf_t *p
|
|||
memset(message, 0, sizeof(ogs_nas_eps_message_t));
|
||||
|
||||
size = sizeof(ogs_nas_emm_header_t);
|
||||
if (ogs_pkbuf_pull(pkbuf, size) == NULL) return OGS_ERROR;
|
||||
if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
|
||||
ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
|
||||
return OGS_ERROR;
|
||||
}
|
||||
memcpy(&message->emm.h, pkbuf->data - size, size);
|
||||
decoded += size;
|
||||
|
||||
|
@ -754,7 +778,10 @@ for (k, v) in sorted_msg_list:
|
|||
f.write(" case OGS_NAS_EPS_%s:\n" % v_upper(k))
|
||||
if len(msg_list[k]["ies"]) != 0:
|
||||
f.write(" size = ogs_nas_eps_decode_%s(message, pkbuf);\n" % v_lower(k))
|
||||
f.write(" if (size < 0) return OGS_ERROR;\n")
|
||||
f.write(" if (size < 0) {\n")
|
||||
f.write(" ogs_error(\"ogs_nas_5gs_decode_%s() failed\");\n" % v_lower(k))
|
||||
f.write(" return size;\n")
|
||||
f.write(" }\n\n")
|
||||
f.write(" decoded += size;\n")
|
||||
f.write(" break;\n")
|
||||
|
||||
|
@ -774,7 +801,7 @@ out:
|
|||
f.write("""int ogs_nas_esm_decode(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
|
||||
{
|
||||
int size = 0;
|
||||
uint16_t decoded = 0;
|
||||
int decoded = 0;
|
||||
|
||||
ogs_assert(pkbuf);
|
||||
ogs_assert(pkbuf->data);
|
||||
|
@ -783,7 +810,10 @@ f.write("""int ogs_nas_esm_decode(ogs_nas_eps_message_t *message, ogs_pkbuf_t *p
|
|||
memset(message, 0, sizeof(ogs_nas_eps_message_t));
|
||||
|
||||
size = sizeof(ogs_nas_esm_header_t);
|
||||
if (ogs_pkbuf_pull(pkbuf, size) == NULL) return OGS_ERROR;
|
||||
if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
|
||||
ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
|
||||
return OGS_ERROR;
|
||||
}
|
||||
memcpy(&message->esm.h, pkbuf->data - size, size);
|
||||
decoded += size;
|
||||
|
||||
|
@ -796,7 +826,10 @@ for (k, v) in sorted_msg_list:
|
|||
f.write(" case OGS_NAS_EPS_%s:\n" % v_upper(k))
|
||||
if len(msg_list[k]["ies"]) != 0:
|
||||
f.write(" size = ogs_nas_eps_decode_%s(message, pkbuf);\n" % v_lower(k))
|
||||
f.write(" if (size < 0) return OGS_ERROR;\n")
|
||||
f.write(" if (size < 0) {\n")
|
||||
f.write(" ogs_error(\"ogs_nas_5gs_decode_%s() failed\");\n" % v_lower(k))
|
||||
f.write(" return size;\n")
|
||||
f.write(" }\n\n")
|
||||
f.write(" decoded += size;\n")
|
||||
f.write(" break;\n")
|
||||
|
||||
|
|
Loading…
Reference in New Issue