introduce new API for configuring the diag logging
diff --git a/src/config.c b/src/config.c
new file mode 100644
index 0000000..90887bb
--- /dev/null
+++ b/src/config.c
@@ -0,0 +1,58 @@
+#include <stdint.h>
+#include <osmocom/core/msgb.h>
+
+#include "diagcmd.h"
+#include "framing.h"
+
+enum log_config_op {
+	LOG_CONFIG_DISABLE_OP			= 0,
+	LOG_CONFIG_RETRIEVE_ID_RANGES_OP	= 1,
+	LOG_CONFIG_RETRIEVE_VALID_MASK_OP	= 2,
+	LOG_CONFIG_SET_MASK_OP			= 3,
+	LOG_CONFIG_GET_LOGMASK_OP		= 4,
+};
+
+struct diag_log_config_req_hdr {
+	uint8_t		msg_type;
+	uint8_t		pad[3];
+	uint32_t	operation;
+} __attribute((packed));
+
+struct diag_log_config_set_mask {
+	struct diag_log_config_req_hdr hdr;
+	uint32_t	equip_id;
+	uint32_t	last_item;
+	uint8_t		data[0];
+} __attribute((packed));
+
+struct msgb *gen_log_config_set_mask(uint32_t last_item)
+{
+	struct msgb *msg = msgb_alloc(MAX_PACKET, "Diag Tx");
+	struct diag_log_config_set_mask *dlcsm;
+	uint8_t *mask;
+
+	msg->l2h = msgb_put(msg, sizeof(*dlcsm));
+	dlcsm = (struct diag_log_config_set_mask *) msg->l2h;
+	dlcsm->hdr.msg_type = DIAG_LOG_CONFIG_F;
+	dlcsm->hdr.operation = LOG_CONFIG_SET_MASK_OP;
+	dlcsm->equip_id = 5;
+	dlcsm->last_item = last_item;
+	msg->l3h = msgb_put(msg, dlcsm->last_item/8);
+
+	return msg;
+}
+
+int log_config_set_mask_bit(struct msgb *msg, uint32_t bit_in)
+{
+	struct diag_log_config_set_mask *dlcsm = msg->l2h;
+	uint8_t *mask = msg->l3h;
+	unsigned int byte = bit_in / 8;
+	unsigned int bit = bit_in % 8;
+
+	if (byte > dlcsm->last_item/8)
+		return -1;
+
+	mask[byte] |= (1 << bit);
+
+	return 0;
+}