summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPatrick McHardy <kaber@trash.net>2010-08-13 07:47:35 +0200
committerPatrick McHardy <kaber@trash.net>2010-08-13 07:47:35 +0200
commit2698aeada73c07c33aa6cb6d9e7ae68904e18307 (patch)
treea0a7dfd900968dedf0db5753f4f895bcf3daebce
parentc2195bb5d209abf67cd9aef73ff0ef37d3e74f9b (diff)
ie: add <<NETWORK-PARAMETER>> IE
Signed-off-by: Patrick McHardy <kaber@trash.net>
-rw-r--r--include/dect/ie.h21
-rw-r--r--src/s_msg.c51
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",