diff options
author | Patrick McHardy <kaber@trash.net> | 2010-08-13 07:47:35 +0200 |
---|---|---|
committer | Patrick McHardy <kaber@trash.net> | 2010-08-13 07:47:35 +0200 |
commit | 2698aeada73c07c33aa6cb6d9e7ae68904e18307 (patch) | |
tree | a0a7dfd900968dedf0db5753f4f895bcf3daebce | |
parent | c2195bb5d209abf67cd9aef73ff0ef37d3e74f9b (diff) |
ie: add <<NETWORK-PARAMETER>> IE
Signed-off-by: Patrick McHardy <kaber@trash.net>
-rw-r--r-- | include/dect/ie.h | 21 | ||||
-rw-r--r-- | src/s_msg.c | 51 |
2 files changed, 71 insertions, 1 deletions
diff --git a/include/dect/ie.h b/include/dect/ie.h index e4949f7..1a62b18 100644 --- a/include/dect/ie.h +++ b/include/dect/ie.h @@ -1110,8 +1110,27 @@ struct dect_ie_location_area { * @{ */ +/** + * Network parameter discriminators + */ +enum dect_network_parameter_discriminators { + DECT_NETWORK_PARAMETER_APPLICATION_ASSIGNED = 0x08, /**< Application assigned */ + DECT_NETWORK_PARAMETER_DEVICE_NAME = 0x10, /**< Device name */ + DECT_NETWORK_PARAMETER_HO_REFERENCE_NOT_ACQUIRED = 0x68, /**< Handover reference not required */ + DECT_NETWORK_PARAMETER_HO_REFERENCE_PRIVATE_NETWORK = 0x69, /**< Handover reference, private network */ + DECT_NETWORK_PARAMETER_HO_REFERENCE_GSM_NETWORK = 0x6a, /**< Handover reference, GSM network */ + DECT_NETWORK_PARAMETER_HO_REFERENCE_PUBLIC_NETWORK = 0x6b, /**< Handover reference, public network */ + DECT_NETWORK_PARAMETER_PROPRIETARY = 0x7f, /**< Proprietary */ + DECT_NETWORK_PARAMETER_HO_REFERENCE_REQUEST_GSM_NETWORK = 0xea, /**< Handover reference request, GSM network */ + DECT_NETWORK_PARAMETER_HO_REFERENCE_UMTS_NETWORK = 0xeb, /**< Handover reference, UMTS network */ + DECT_NETWORK_PARAMETER_HO_REFERENCE_REQUEST_UMTS_NETWORK= 0xec, /**< Handover reference request, UMTS network */ +}; + struct dect_ie_network_parameter { - struct dect_ie_common common; + struct dect_ie_common common; + enum dect_network_parameter_discriminators discriminator; + uint8_t len; + uint8_t data[64]; }; /** diff --git a/src/s_msg.c b/src/s_msg.c index a874095..9d75196 100644 --- a/src/s_msg.c +++ b/src/s_msg.c @@ -1034,6 +1034,54 @@ static int dect_sfmt_parse_feature_indicate(const struct dect_handle *dh, return 0; } +static const struct dect_trans_tbl dect_network_parameter_discriminators[] = { + TRANS_TBL(DECT_NETWORK_PARAMETER_APPLICATION_ASSIGNED, "Application assigned"), + TRANS_TBL(DECT_NETWORK_PARAMETER_DEVICE_NAME, "Device name"), + TRANS_TBL(DECT_NETWORK_PARAMETER_HO_REFERENCE_NOT_ACQUIRED, "Handover reference not requied"), + TRANS_TBL(DECT_NETWORK_PARAMETER_HO_REFERENCE_PRIVATE_NETWORK, "Handover reference, private network"), + TRANS_TBL(DECT_NETWORK_PARAMETER_HO_REFERENCE_GSM_NETWORK, "Handover reference, GSM network"), + TRANS_TBL(DECT_NETWORK_PARAMETER_HO_REFERENCE_PUBLIC_NETWORK, "Handover reference, public network"), + TRANS_TBL(DECT_NETWORK_PARAMETER_PROPRIETARY, "Proprietary"), + TRANS_TBL(DECT_NETWORK_PARAMETER_HO_REFERENCE_REQUEST_GSM_NETWORK, "Handover reference request, GSM network"), + TRANS_TBL(DECT_NETWORK_PARAMETER_HO_REFERENCE_UMTS_NETWORK, "Handover reference, UMTS network"), + TRANS_TBL(DECT_NETWORK_PARAMETER_HO_REFERENCE_REQUEST_UMTS_NETWORK, "Handover reference request, UMTS network"), +}; + +static void dect_sfmt_dump_network_parameter(const struct dect_ie_common *_ie) +{ + const struct dect_ie_network_parameter *ie = dect_ie_container(ie, _ie); + char buf[64]; + + sfmt_debug("\tDiscriminator: %s\n", + dect_val2str(dect_network_parameter_discriminators, + buf, sizeof(buf))); +} + +static int dect_sfmt_parse_network_parameter(const struct dect_handle *dh, + struct dect_ie_common **ie, + const struct dect_sfmt_ie *src) +{ + struct dect_ie_network_parameter *dst = dect_ie_container(dst, *ie); + + dst->discriminator = src->data[2]; + dst->len = src->len - 3; + if (dst->len > array_size(dst->data)) + return -1; + memcpy(dst->data, src->data + 3, dst->len); + return 0; +} + +static int dect_sfmt_build_network_parameter(struct dect_sfmt_ie *dst, + const struct dect_ie_common *ie) +{ + const struct dect_ie_network_parameter *src = dect_ie_container(src, ie); + + dst->data[2] = src->discriminator; + memcpy(dst->data + 3, src->data, src->len); + dst->len = src->len + 3; + return 0; +} + static const struct dect_trans_tbl dect_reject_reasons[] = { TRANS_TBL(DECT_REJECT_TPUI_UNKNOWN, "TPUI unknown"), TRANS_TBL(DECT_REJECT_IPUI_UNKNOWN, "IPUI unknown"), @@ -2086,6 +2134,9 @@ static const struct dect_ie_handler { [S_VL_IE_NETWORK_PARAMETER] = { .name = "NETWORK-PARAMETER", .size = sizeof(struct dect_ie_network_parameter), + .build = dect_sfmt_build_network_parameter, + .parse = dect_sfmt_parse_network_parameter, + .dump = dect_sfmt_dump_network_parameter, }, [S_VL_IE_EXT_HO_INDICATOR] = { .name = "EXT-H/O-INDICATOR", |