Follow OGSlib updates

This commit is contained in:
Sukchan Lee 2019-06-22 10:14:01 +09:00
parent 5ca6d79590
commit 058ebc747d
3 changed files with 201 additions and 241 deletions

View File

@ -31,113 +31,107 @@ tlv_desc_t tlv_desc_more8 = { TLV_MORE, "More", 0, 8, 0, 0, { NULL } };
static ogs_tlv_t* tlv_add_leaf(
ogs_tlv_t *parent_tlv, ogs_tlv_t *tlv, tlv_desc_t *desc, void *msg)
{
switch (desc->ctype)
switch (desc->ctype) {
case TLV_UINT8:
case TLV_INT8:
{
case TLV_UINT8:
case TLV_INT8:
{
tlv_uint8_t *v = (tlv_uint8_t *)msg;
if (parent_tlv)
tlv = ogs_tlv_embed(parent_tlv,
desc->type, 1, desc->instance, (uint8_t*)&v->u8);
else
tlv = ogs_tlv_add(tlv,
desc->type, 1, desc->instance, (uint8_t*)&v->u8);
ogs_assert(tlv);
break;
}
case TLV_UINT16:
{
tlv_uint16_t *v = (tlv_uint16_t *)msg;
tlv_uint8_t *v = (tlv_uint8_t *)msg;
if (parent_tlv)
tlv = ogs_tlv_embed(parent_tlv,
desc->type, 1, desc->instance, &v->u8);
else
tlv = ogs_tlv_add(tlv, desc->type, 1, desc->instance, &v->u8);
ogs_assert(tlv);
break;
}
case TLV_UINT16:
{
tlv_uint16_t *v = (tlv_uint16_t *)msg;
v->u16 = htons(v->u16);
v->u16 = htons(v->u16);
if (parent_tlv)
tlv = ogs_tlv_embed(parent_tlv,
desc->type, 2, desc->instance, (uint8_t*)&v->u16);
else
tlv = ogs_tlv_add(tlv,
desc->type, 2, desc->instance, (uint8_t*)&v->u16);
ogs_assert(tlv);
break;
}
case TLV_UINT24:
case TLV_INT24:
{
tlv_uint24_t *v = (tlv_uint24_t *)msg;
if (parent_tlv)
tlv = ogs_tlv_embed(parent_tlv,
desc->type, 2, desc->instance, &v->u16);
else
tlv = ogs_tlv_add(tlv, desc->type, 2, desc->instance, &v->u16);
ogs_assert(tlv);
break;
}
case TLV_UINT24:
case TLV_INT24:
{
tlv_uint24_t *v = (tlv_uint24_t *)msg;
v->u24 = v->u24 << 8;
v->u24 = htonl(v->u24);
v->u24 = v->u24 << 8;
v->u24 = htonl(v->u24);
if (parent_tlv)
tlv = ogs_tlv_embed(parent_tlv,
desc->type, 3, desc->instance, (uint8_t*)&v->u24);
else
tlv = ogs_tlv_add(tlv,
desc->type, 3, desc->instance, (uint8_t*)&v->u24);
ogs_assert(tlv);
break;
}
case TLV_UINT32:
case TLV_INT32:
{
tlv_uint32_t *v = (tlv_uint32_t *)msg;
if (parent_tlv)
tlv = ogs_tlv_embed(parent_tlv,
desc->type, 3, desc->instance, &v->u24);
else
tlv = ogs_tlv_add(tlv, desc->type, 3, desc->instance, &v->u24);
ogs_assert(tlv);
break;
}
case TLV_UINT32:
case TLV_INT32:
{
tlv_uint32_t *v = (tlv_uint32_t *)msg;
v->u32 = htonl(v->u32);
v->u32 = htonl(v->u32);
if (parent_tlv)
tlv = ogs_tlv_embed(parent_tlv,
desc->type, 4, desc->instance, (uint8_t*)&v->u32);
else
tlv = ogs_tlv_add(tlv,
desc->type, 4, desc->instance, (uint8_t*)&v->u32);
ogs_assert(tlv);
break;
}
case TLV_FIXED_STR:
{
tlv_octet_t *v = (tlv_octet_t *)msg;
if (parent_tlv)
tlv = ogs_tlv_embed(parent_tlv,
desc->type, 4, desc->instance, &v->u32);
else
tlv = ogs_tlv_add(tlv,
desc->type, 4, desc->instance, &v->u32);
ogs_assert(tlv);
break;
}
case TLV_FIXED_STR:
{
tlv_octet_t *v = (tlv_octet_t *)msg;
if (parent_tlv)
tlv = ogs_tlv_embed(parent_tlv,
desc->type, desc->length, desc->instance, v->data);
else
tlv = ogs_tlv_add(tlv,
desc->type, desc->length, desc->instance, v->data);
ogs_assert(tlv);
break;
}
case TLV_VAR_STR:
{
tlv_octet_t *v = (tlv_octet_t *)msg;
if (parent_tlv)
tlv = ogs_tlv_embed(parent_tlv,
desc->type, desc->length, desc->instance, v->data);
else
tlv = ogs_tlv_add(tlv,
desc->type, desc->length, desc->instance, v->data);
ogs_assert(tlv);
break;
}
case TLV_VAR_STR:
{
tlv_octet_t *v = (tlv_octet_t *)msg;
ogs_assert(v->len > 0);
ogs_assert(v->len > 0);
if (parent_tlv)
tlv = ogs_tlv_embed(parent_tlv,
desc->type, v->len, desc->instance, v->data);
else
tlv = ogs_tlv_add(tlv,
desc->type, v->len, desc->instance, v->data);
ogs_assert(tlv);
break;
}
case TLV_NULL:
{
if (parent_tlv)
tlv = ogs_tlv_embed(parent_tlv,
desc->type, 0, desc->instance, NULL);
else
tlv = ogs_tlv_add(tlv,
desc->type, 0, desc->instance, NULL);
ogs_assert(tlv);
break;
}
default:
{
ogs_assert_if_reached();
break;
}
if (parent_tlv)
tlv = ogs_tlv_embed(parent_tlv,
desc->type, v->len, desc->instance, v->data);
else
tlv = ogs_tlv_add(tlv,
desc->type, v->len, desc->instance, v->data);
ogs_assert(tlv);
break;
}
case TLV_NULL:
{
if (parent_tlv)
tlv = ogs_tlv_embed(parent_tlv,
desc->type, 0, desc->instance, NULL);
else
tlv = ogs_tlv_add(tlv,
desc->type, 0, desc->instance, NULL);
ogs_assert(tlv);
break;
}
default:
ogs_assert_if_reached();
break;
}
return tlv;
@ -164,21 +158,17 @@ static uint32_t tlv_add_compound(ogs_tlv_t **root, ogs_tlv_t *parent_tlv,
*root = NULL;
for (i = 0, desc = parent_desc->child_descs[i]; desc != NULL;
i++, desc = parent_desc->child_descs[i])
{
i++, desc = parent_desc->child_descs[i]) {
next_desc = parent_desc->child_descs[i+1];
if (next_desc != NULL && next_desc->ctype == TLV_MORE)
{
if (next_desc != NULL && next_desc->ctype == TLV_MORE) {
int offset2 = offset;
for (j = 0; j < next_desc->length; j++)
{
for (j = 0; j < next_desc->length; j++) {
presence_p = (tlv_presence_t *)(p + offset2);
if (*presence_p == 0)
break;
if (desc->ctype == TLV_COMPOUND)
{
if (desc->ctype == TLV_COMPOUND) {
ogs_trace("BUILD %sC#%d [%s] T:%d I:%d (vsz=%d) off:%p ",
indent, i, desc->name, desc->type, desc->instance,
desc->vsize, p + offset2);
@ -193,9 +183,7 @@ static uint32_t tlv_add_compound(ogs_tlv_t **root, ogs_tlv_t *parent_tlv,
p + offset2 + sizeof(tlv_presence_t), depth + 1);
ogs_assert(r > 0 && emb_tlv);
count += 1 + r;
}
else
{
} else {
ogs_trace("BUILD %sL#%d [%s] T:%d L:%d I:%d "
"(cls:%d vsz:%d) off:%p ",
indent, i, desc->name, desc->type, desc->length,
@ -214,15 +202,11 @@ static uint32_t tlv_add_compound(ogs_tlv_t **root, ogs_tlv_t *parent_tlv,
}
offset += desc->vsize * next_desc->length;
i++;
}
else
{
} else {
presence_p = (tlv_presence_t *)(p + offset);
if (*presence_p)
{
if (desc->ctype == TLV_COMPOUND)
{
if (*presence_p) {
if (desc->ctype == TLV_COMPOUND) {
ogs_trace("BUILD %sC#%d [%s] T:%d I:%d (vsz=%d) off:%p ",
indent, i, desc->name, desc->type, desc->instance,
desc->vsize, p + offset);
@ -237,9 +221,7 @@ static uint32_t tlv_add_compound(ogs_tlv_t **root, ogs_tlv_t *parent_tlv,
p + offset + sizeof(tlv_presence_t), depth + 1);
ogs_assert(r > 0 && emb_tlv);
count += 1 + r;
}
else
{
} else {
ogs_trace("BUILD %sL#%d [%s] T:%d L:%d I:%d "
"(cls:%d vsz:%d) off:%p ",
indent, i, desc->name, desc->type, desc->length,
@ -300,22 +282,17 @@ static tlv_desc_t* tlv_find_desc(uint8_t *desc_index,
ogs_assert(tlv);
for (i = 0, desc = parent_desc->child_descs[i]; desc != NULL;
i++, desc = parent_desc->child_descs[i])
{
if (desc->type == tlv->type && desc->instance == tlv->instance)
{
i++, desc = parent_desc->child_descs[i]) {
if (desc->type == tlv->type && desc->instance == tlv->instance) {
*desc_index = i;
*tlv_offset = offset;
break;
}
if (desc->ctype == TLV_MORE)
{
if (desc->ctype == TLV_MORE) {
ogs_assert(prev_desc && prev_desc->ctype != TLV_MORE);
offset += prev_desc->vsize * (desc->length - 1);
}
else
{
} else {
offset += desc->vsize;
}
@ -331,101 +308,99 @@ static int tlv_parse_leaf(void *msg, tlv_desc_t *desc, ogs_tlv_t *tlv)
ogs_assert(desc);
ogs_assert(tlv);
switch (desc->ctype)
switch (desc->ctype) {
case TLV_UINT8:
case TLV_INT8:
{
case TLV_UINT8:
case TLV_INT8:
{
tlv_uint8_t *v = (tlv_uint8_t *)msg;
tlv_uint8_t *v = (tlv_uint8_t *)msg;
if (tlv->length != 1)
{
ogs_error("Invalid TLV length %d. It should be 1", tlv->length);
return OGS_ERROR;
}
v->u8 = *(uint8_t*)(tlv->value);
break;
}
case TLV_UINT16:
case TLV_INT16:
if (tlv->length != 1)
{
tlv_uint16_t *v = (tlv_uint16_t *)msg;
if (tlv->length != 2)
{
ogs_error("Invalid TLV length %d. It should be 2", tlv->length);
return OGS_ERROR;
}
v->u16 = ((((uint8_t*)tlv->value)[0]<< 8)&0xff00) |
((((uint8_t*)tlv->value)[1] )&0x00ff);
break;
ogs_error("Invalid TLV length %d. It should be 1", tlv->length);
return OGS_ERROR;
}
case TLV_UINT24:
case TLV_INT24:
v->u8 = *(uint8_t*)(tlv->value);
break;
}
case TLV_UINT16:
case TLV_INT16:
{
tlv_uint16_t *v = (tlv_uint16_t *)msg;
if (tlv->length != 2)
{
tlv_uint24_t *v = (tlv_uint24_t *)msg;
if (tlv->length != 3)
{
ogs_error("Invalid TLV length %d. It should be 3", tlv->length);
return OGS_ERROR;
}
v->u24 = ((((uint8_t*)tlv->value)[0]<<16)&0x00ff0000) |
((((uint8_t*)tlv->value)[1]<< 8)&0x0000ff00) |
((((uint8_t*)tlv->value)[2] )&0x000000ff);
break;
ogs_error("Invalid TLV length %d. It should be 2", tlv->length);
return OGS_ERROR;
}
case TLV_UINT32:
case TLV_INT32:
v->u16 = ((((uint8_t*)tlv->value)[0]<< 8)&0xff00) |
((((uint8_t*)tlv->value)[1] )&0x00ff);
break;
}
case TLV_UINT24:
case TLV_INT24:
{
tlv_uint24_t *v = (tlv_uint24_t *)msg;
if (tlv->length != 3)
{
tlv_uint32_t *v = (tlv_uint32_t *)msg;
if (tlv->length != 4)
{
ogs_error("Invalid TLV length %d. It should be 4", tlv->length);
return OGS_ERROR;
}
v->u32 = ((((uint8_t*)tlv->value)[0]<<24)&0xff000000) |
((((uint8_t*)tlv->value)[1]<<16)&0x00ff0000) |
((((uint8_t*)tlv->value)[2]<< 8)&0x0000ff00) |
((((uint8_t*)tlv->value)[3] )&0x000000ff);
break;
ogs_error("Invalid TLV length %d. It should be 3", tlv->length);
return OGS_ERROR;
}
case TLV_FIXED_STR:
v->u24 = ((((uint8_t*)tlv->value)[0]<<16)&0x00ff0000) |
((((uint8_t*)tlv->value)[1]<< 8)&0x0000ff00) |
((((uint8_t*)tlv->value)[2] )&0x000000ff);
break;
}
case TLV_UINT32:
case TLV_INT32:
{
tlv_uint32_t *v = (tlv_uint32_t *)msg;
if (tlv->length != 4)
{
tlv_octet_t *v = (tlv_octet_t *)msg;
if (tlv->length != desc->length)
{
ogs_error("Invalid TLV length %d. It should be %d",
tlv->length, desc->length);
return OGS_ERROR;
}
v->data = tlv->value;
v->len = tlv->length;
break;
ogs_error("Invalid TLV length %d. It should be 4", tlv->length);
return OGS_ERROR;
}
case TLV_VAR_STR:
v->u32 = ((((uint8_t*)tlv->value)[0]<<24)&0xff000000) |
((((uint8_t*)tlv->value)[1]<<16)&0x00ff0000) |
((((uint8_t*)tlv->value)[2]<< 8)&0x0000ff00) |
((((uint8_t*)tlv->value)[3] )&0x000000ff);
break;
}
case TLV_FIXED_STR:
{
tlv_octet_t *v = (tlv_octet_t *)msg;
if (tlv->length != desc->length)
{
tlv_octet_t *v = (tlv_octet_t *)msg;
ogs_error("Invalid TLV length %d. It should be %d",
tlv->length, desc->length);
return OGS_ERROR;
}
v->data = tlv->value;
v->len = tlv->length;
break;
v->data = tlv->value;
v->len = tlv->length;
break;
}
case TLV_VAR_STR:
{
tlv_octet_t *v = (tlv_octet_t *)msg;
v->data = tlv->value;
v->len = tlv->length;
break;
}
case TLV_NULL:
{
if (tlv->length != 0) {
ogs_error("Invalid TLV length %d. It should be 0", tlv->length);
return OGS_ERROR;
}
case TLV_NULL:
{
if (tlv->length != 0)
{
ogs_error("Invalid TLV length %d. It should be 0", tlv->length);
return OGS_ERROR;
}
break;
}
default:
ogs_assert_if_reached();
break;
break;
}
default:
ogs_assert_if_reached();
break;
}
return OGS_OK;
@ -452,11 +427,9 @@ static int tlv_parse_compound(void *msg, tlv_desc_t *parent_desc,
indent[depth*2] = 0;
tlv = parent_tlv;
while(tlv)
{
while (tlv) {
desc = tlv_find_desc(&index, &offset, parent_desc, tlv);
if (desc == NULL)
{
if (desc == NULL) {
ogs_error("Unexpected TLV type:%d", tlv->type);
return OGS_ERROR;
}
@ -465,19 +438,15 @@ static int tlv_parse_compound(void *msg, tlv_desc_t *parent_desc,
/* Multiple of the same type TLV may be included */
next_desc = parent_desc->child_descs[index+1];
if (next_desc != NULL && next_desc->ctype == TLV_MORE)
{
for (j = 0; j < next_desc->length; j++)
{
if (next_desc != NULL && next_desc->ctype == TLV_MORE) {
for (j = 0; j < next_desc->length; j++) {
presence_p = (tlv_presence_t *)(p + offset + desc->vsize * j);
if (*presence_p == 0)
{
if (*presence_p == 0) {
offset += desc->vsize * j;
break;
}
}
if (j == next_desc->length)
{
if (j == next_desc->length) {
ogs_fatal("Multiple of the same type TLV need more room");
ogs_assert_if_reached();
tlv = tlv->next;
@ -485,11 +454,9 @@ static int tlv_parse_compound(void *msg, tlv_desc_t *parent_desc,
}
}
if (desc->ctype == TLV_COMPOUND)
{
if (desc->ctype == TLV_COMPOUND) {
emb_tlv = ogs_tlv_parse_embedded_block(tlv, mode);
if (emb_tlv == NULL)
{
if (emb_tlv == NULL) {
ogs_error("Error while parse TLV");
return OGS_ERROR;
}
@ -502,24 +469,20 @@ static int tlv_parse_compound(void *msg, tlv_desc_t *parent_desc,
rv = tlv_parse_compound(
p + offset, desc, emb_tlv, depth + 1, mode);
if (rv != OGS_OK)
{
if (rv != OGS_OK) {
ogs_error("Can't parse compound TLV");
return OGS_ERROR;
}
*presence_p = 1;
}
else
{
} else {
ogs_trace("PARSE %sL#%d [%s] T:%d L:%d I:%d "
"(cls:%d vsz:%d) off:%p ",
indent, i++, desc->name, desc->type, desc->length,
desc->instance, desc->ctype, desc->vsize, p + offset);
rv = tlv_parse_leaf(p + offset, desc, tlv);
if (rv != OGS_OK)
{
if (rv != OGS_OK) {
ogs_error("Can't parse leaf TLV");
return OGS_ERROR;
}
@ -546,8 +509,7 @@ int tlv_parse_msg(void *msg, tlv_desc_t *desc, ogs_pkbuf_t *pkbuf, int mode)
ogs_assert(desc->child_descs[0]);
root = ogs_tlv_parse_block(pkbuf->len, pkbuf->data, mode);
if (root == NULL)
{
if (root == NULL) {
ogs_error("Can't parse TLV message");
return OGS_ERROR;
}

@ -1 +1 @@
Subproject commit 2a609cc8e33e6288a1f56af595ef677884af1591
Subproject commit 4d14299149cc5e63b60f833cb0a34bbe60f859bc

View File

@ -40,21 +40,19 @@ ogs_pkbuf_t *sgsap_build_location_update_request(mme_ue_t *mme_ue)
ogs_assert(vlr);
root = ogs_tlv_add(NULL, SGSAP_IE_IMSI_TYPE, SGSAP_IE_IMSI_LEN, 0,
(uint8_t *)&mme_ue->nas_mobile_identity_imsi);
&mme_ue->nas_mobile_identity_imsi);
mme_name_len = mme_name_build(mme_name,
served_gummei->mme_code[0],
served_gummei->mme_gid[0],
&served_gummei->plmn_id[0]);
ogs_tlv_add(root, SGSAP_IE_MME_NAME_TYPE, mme_name_len, 0,
(uint8_t *)mme_name);
ogs_tlv_add(root, SGSAP_IE_MME_NAME_TYPE, mme_name_len, 0, mme_name);
eps_update_type = SGSAP_EPS_UPDATE_IMSI_ATTACH;
ogs_tlv_add(root, SGSAP_IE_EPS_UPDATE_TYPE, SGSAP_IE_EPS_UPDATE_LEN, 0,
(uint8_t *)&eps_update_type);
&eps_update_type);
memcpy(&lai, &vlr->lai, sizeof(nas_lai_t));
lai.lac = htons(lai.lac);
ogs_tlv_add(root, SGSAP_IE_LAI_TYPE, SGSAP_IE_LAI_LEN, 0,
(uint8_t *)&lai);
ogs_tlv_add(root, SGSAP_IE_LAI_TYPE, SGSAP_IE_LAI_LEN, 0, &lai);
pkbuf = ogs_pkbuf_alloc(NULL, MAX_SDU_LEN);
ogs_pkbuf_put_u8(pkbuf, SGSAP_LOCATION_UPDATE_REQUEST);