diff --git a/metadata_exporter.h b/metadata_exporter.h index b0e1c3e..3982cd8 100644 --- a/metadata_exporter.h +++ b/metadata_exporter.h @@ -93,7 +93,9 @@ enum radio_event { RADIO_EVENT_GSM_RR_CHANNEL_CONF, RADIO_EVENT_CELL_LOCATION_GERAN, RADIO_EVENT_GSM_RR_CELL_SEL_RESEL_PARAM, - RADIO_EVENT_GRR_CELL_RESEL + RADIO_EVENT_GRR_CELL_RESEL, + RADIO_EVENT_WCDMA_RRC_STATE, + RADIO_EVENT_WCDMA_CELL_ID }; #define EVENT_STR_LEN 255 @@ -301,6 +303,21 @@ struct md_radio_gsm_rr_channel_conf_event { uint8_t channel_mode_2; }; +struct md_radio_wcdma_rrc_state_event { + MD_RADIO_EVENT; + uint8_t rrc_state; +}; + +struct md_radio_wcdma_cell_id_event { + MD_RADIO_EVENT; + uint32_t ul_uarfcn; + uint32_t dl_uarfcn; + uint32_t cell_id; + uint16_t ura_id; + uint8_t cell_access_rest; + uint8_t call_accs; +}; + #define md_sysevent md_munin_event struct md_exporter { diff --git a/metadata_input_netlink.c b/metadata_input_netlink.c index 656f3b5..b640f53 100644 --- a/metadata_input_netlink.c +++ b/metadata_input_netlink.c @@ -453,6 +453,78 @@ static void md_input_netlink_radio_gsm_rr_channel_conf(struct md_input_netlink * free(event); } +static void md_input_netlink_radio_wcdma_rrc_state(struct md_input_netlink *min, + struct json_object *obj) +{ + struct md_radio_wcdma_rrc_state_event *event = calloc(sizeof(struct md_radio_wcdma_rrc_state_event), 1); + + if (!event) + return; + + json_object_object_foreach(obj, key, val) { + if (!strcmp(key, "md_seq")) + event->sequence = (uint16_t) json_object_get_int(val); + else if (!strcmp(key, "timestamp")) + event->tstamp = json_object_get_int64(val); + else if (!strcmp(key, "event_param")) + event->event_param = (uint8_t) json_object_get_int(val); + else if (!strcmp(key, "event_type")) + event->md_type = (uint8_t) json_object_get_int(val); + else if (!strcmp(key, "iccid")) + event->iccid = json_object_get_string(val); + else if (!strcmp(key, "imsi")) + event->imsi = json_object_get_string(val); + else if (!strcmp(key, "imei")) + event->imei = json_object_get_string(val); + else if (!strcmp(key, "rrc_state")) + event->rrc_state = (uint8_t) json_object_get_int(val); + } + + mde_publish_event_obj(min->parent, (struct md_event*) event); + free(event); +} + +static void md_input_netlink_radio_wcdma_cell_id(struct md_input_netlink *min, + struct json_object *obj) +{ + struct md_radio_wcdma_cell_id_event *event = calloc(sizeof(struct md_radio_wcdma_cell_id_event), 1); + + if (!event) + return; + + json_object_object_foreach(obj, key, val) { + if (!strcmp(key, "md_seq")) + event->sequence = (uint16_t) json_object_get_int(val); + else if (!strcmp(key, "timestamp")) + event->tstamp = json_object_get_int64(val); + else if (!strcmp(key, "event_param")) + event->event_param = (uint8_t) json_object_get_int(val); + else if (!strcmp(key, "event_type")) + event->md_type = (uint8_t) json_object_get_int(val); + else if (!strcmp(key, "iccid")) + event->iccid = json_object_get_string(val); + else if (!strcmp(key, "imsi")) + event->imsi = json_object_get_string(val); + else if (!strcmp(key, "imei")) + event->imei = json_object_get_string(val); + else if (!strcmp(key, "ul_uarfcn")) + event->ul_uarfcn = (uint32_t) json_object_get_int(val); + else if (!strcmp(key, "dl_uarfcn")) + event->dl_uarfcn = (uint32_t) json_object_get_int(val); + else if (!strcmp(key, "cell_id")) + event->cell_id = (uint32_t) json_object_get_int(val); + else if (!strcmp(key, "ura_id")) + event->ura_id = (uint16_t) json_object_get_int(val); + else if (!strcmp(key, "cell_access_rest")) + event->cell_access_rest = (uint8_t) json_object_get_int(val); + else if (!strcmp(key, "call_accs")) + event->dl_uarfcn = (uint8_t) json_object_get_int(val); + } + + mde_publish_event_obj(min->parent, (struct md_event*) event); + free(event); +} + static void md_input_netlink_handle_radio_event(struct md_input_netlink *min, struct json_object *obj) { @@ -464,6 +536,8 @@ static void md_input_netlink_handle_radio_event(struct md_input_netlink *min, return; } + memset(min->mre, 0, sizeof(struct md_radio_event)); + min->mre->md_type = META_TYPE_RADIO; event_param = (uint8_t) json_object_get_int(event_param_json); switch (event_param) { @@ -487,6 +561,15 @@ static void md_input_netlink_handle_radio_event(struct md_input_netlink *min, META_PRINT_SYSLOG(min->parent, LOG_ERR, "GRR_CELL_RESEL\n"); md_input_netlink_radio_grr_cell_resel(min, obj); break; + case RADIO_EVENT_WCDMA_RRC_STATE: + META_PRINT_SYSLOG(min->parent, LOG_ERR, "WCDMA_RRC_STATE\n"); + md_input_netlink_radio_wcdma_rrc_state(min, obj); + break; + case RADIO_EVENT_WCDMA_CELL_ID: + META_PRINT_SYSLOG(min->parent, LOG_ERR, "WCDMA_CELL_ID\n"); + md_input_netlink_radio_wcdma_cell_id(min, obj); + break; + default: break; } @@ -543,7 +626,7 @@ static void md_input_netlink_handle_gps_event(struct md_input_netlink *min, if (sentence_id <= 0) return; - + gps_event.minmea_id = sentence_id; //We can ignore NMEA checksum diff --git a/metadata_writer_nne.c b/metadata_writer_nne.c index ce789ae..f1962d8 100644 --- a/metadata_writer_nne.c +++ b/metadata_writer_nne.c @@ -845,6 +845,21 @@ struct nne_radio_descr NNE_RADIO_GRR_CELL_RESEL_DESCR[] = { { NULL, NNE_TYPE_NULL, 0 } }; +struct nne_radio_descr NNE_RADIO_WCDMA_RRC_STATE_DESCR[] = { + { "wcdma_rrc_state.rrc_state", NNE_TYPE_UINT8, offsetof(struct md_radio_wcdma_rrc_state_event, rrc_state) }, + { NULL, NNE_TYPE_NULL, 0 } +}; + +struct nne_radio_descr NNE_RADIO_WCDMA_CELL_ID_DESCR[] = { + { "wcdma_cell_id.ul_uarfcn", NNE_TYPE_UINT32, offsetof(struct md_radio_wcdma_cell_id_event, ul_uarfcn) }, + { "wcdma_cell_id.dl_uarfcn", NNE_TYPE_UINT32, offsetof(struct md_radio_wcdma_cell_id_event, dl_uarfcn) }, + { "wcdma_cell_id.cell_id", NNE_TYPE_UINT32, offsetof(struct md_radio_wcdma_cell_id_event, cell_id) }, + { "wcdma_cell_id.ura_id", NNE_TYPE_UINT16, offsetof(struct md_radio_wcdma_cell_id_event, ura_id) }, + { "wcdma_cell_id.ul_uarfcn", NNE_TYPE_UINT8, offsetof(struct md_radio_wcdma_cell_id_event, cell_access_rest) }, + { "wcdma_cell_id.ul_uarfcn", NNE_TYPE_UINT8, offsetof(struct md_radio_wcdma_cell_id_event, call_accs) }, + { NULL, NNE_TYPE_NULL, 0 } +}; + static void md_nne_send_radio_message(struct md_writer_nne *mwn, struct md_radio_event *mre, struct nne_radio_descr *descr) @@ -914,6 +929,14 @@ static void md_nne_handle_radio(struct md_writer_nne *mwn, META_PRINT_SYSLOG(mwn->parent, LOG_ERR, "NNE writer: RADIO_EVENT_GRR_CELL_RESEL\n"); md_nne_send_radio_message(mwn, mre, NNE_RADIO_GRR_CELL_RESEL_DESCR); break; + case RADIO_EVENT_WCDMA_RRC_STATE: + META_PRINT_SYSLOG(mwn->parent, LOG_ERR, "NNE writer: RADIO_EVENT_WCDMA_RRC_STATE\n"); + md_nne_send_radio_message(mwn, mre, NNE_RADIO_WCDMA_RRC_STATE_DESCR); + break; + case RADIO_EVENT_WCDMA_CELL_ID: + META_PRINT_SYSLOG(mwn->parent, LOG_ERR, "NNE writer: RADIO_EVENT_WCDMA_CELL_ID\n"); + md_nne_send_radio_message(mwn, mre, NNE_RADIO_WCDMA_CELL_ID_DESCR); + break; default: META_PRINT_SYSLOG(mwn->parent, LOG_ERR, "NNE writer: Unsupported radio event %u\n", mre->event_param); break; diff --git a/metadata_writer_zeromq.h b/metadata_writer_zeromq.h index 5669309..f26b92c 100644 --- a/metadata_writer_zeromq.h +++ b/metadata_writer_zeromq.h @@ -53,6 +53,8 @@ enum md_zmq_topics { MD_ZMQ_TOPIC_RADIO_GRR_CELL_RESEL, MD_ZMQ_TOPIC_RADIO_GSM_RR_CIPHER_MODE, MD_ZMQ_TOPIC_RADIO_GSM_RR_CHANNEL_CONF, + MD_ZMQ_TOPIC_RADIO_WCDMA_RRC_STATE, + MD_ZMQ_TOPIC_RADIO_WCDMA_CELL_ID, __MD_ZMQ_TOPICS_MAX }; #define MD_ZMQ_TOPICS_MAX (__MD_ZMQ_TOPICS_MAX - 1) diff --git a/metadata_writer_zeromq_nne.c b/metadata_writer_zeromq_nne.c index 87a10c9..9e4e405 100644 --- a/metadata_writer_zeromq_nne.c +++ b/metadata_writer_zeromq_nne.c @@ -19,7 +19,9 @@ const char *nne_topics[MD_ZMQ_TOPICS_MAX + 1] = { "RADIO.GSM_RR_CELL_SEL_RESEL_PARAM", "RADIO.GRR_CELL_RESEL", "RADIO.GSM_RR_CIPHER_MODE", - "RADIO.GSM_RR_CHANNEL_CONF" + "RADIO.GSM_RR_CHANNEL_CONF", + "RADIO.WCDMA_RRC_STATE", + "RADIO.WCDMA_CELL_ID" }; const char *nne_keys[MD_ZMQ_KEYS_MAX + 1] = {