Merge commit '7f6615a37df0dadbe86fdfc980e0a8a15013a80e'
[osmocom-bb.git] / src / shared / libosmocore / src / gsm0808.c
index 636c211..dc450cc 100644 (file)
@@ -108,6 +108,19 @@ struct msgb *gsm0808_create_clear_complete(void)
        return msg;
 }
 
+struct msgb *gsm0808_create_clear_command(uint8_t reason)
+{
+       struct msgb *msg = msgb_alloc_headroom(BSSMAP_MSG_SIZE, BSSMAP_MSG_HEADROOM,
+                                              "bssmap: clear command");
+       if (!msg)
+               return NULL;
+
+       msg->l3h = msgb_tv_put(msg, BSSAP_MSG_BSS_MANAGEMENT, 4);
+       msgb_v_put(msg, BSS_MAP_MSG_CLEAR_CMD);
+       msgb_tlv_put(msg, GSM0808_IE_CAUSE, 1, &reason);
+       return msg;
+}
+
 struct msgb *gsm0808_create_cipher_complete(struct msgb *layer3, uint8_t alg_id)
 {
        struct msgb *msg = msgb_alloc_headroom(BSSMAP_MSG_SIZE, BSSMAP_MSG_HEADROOM,
@@ -271,6 +284,26 @@ struct msgb *gsm0808_create_assignment_failure(uint8_t cause, uint8_t *rr_cause)
        return msg;
 }
 
+struct msgb *gsm0808_create_clear_rqst(uint8_t cause)
+{
+       struct msgb *msg;
+
+       msg = msgb_alloc_headroom(BSSMAP_MSG_SIZE, BSSMAP_MSG_HEADROOM,
+                                 "bssmap: clear rqst");
+       if (!msg)
+               return NULL;
+
+       msg->l3h = msgb_put(msg, 2 + 4);
+       msg->l3h[0] = BSSAP_MSG_BSS_MANAGEMENT;
+       msg->l3h[1] = 4;
+
+       msg->l3h[2] = BSS_MAP_MSG_CLEAR_RQST;
+       msg->l3h[3] = GSM0808_IE_CAUSE;
+       msg->l3h[4] = 1;
+       msg->l3h[5] = cause;
+       return msg;
+}
+
 void gsm0808_prepend_dtap_header(struct msgb *msg, uint8_t link_id)
 {
        uint8_t *hh = msgb_push(msg, 3);
@@ -279,6 +312,29 @@ void gsm0808_prepend_dtap_header(struct msgb *msg, uint8_t link_id)
        hh[2] = msg->len - 3;
 }
 
+struct msgb *gsm0808_create_dtap(struct msgb *msg_l3, uint8_t link_id)
+{
+       struct dtap_header *header;
+       uint8_t *data;
+       struct msgb *msg = msgb_alloc_headroom(BSSMAP_MSG_SIZE, BSSMAP_MSG_HEADROOM,
+                                              "dtap");
+       if (!msg)
+               return NULL;
+
+       /* DTAP header */
+       msg->l3h = msgb_put(msg, sizeof(*header));
+       header = (struct dtap_header *) &msg->l3h[0];
+       header->type = BSSAP_MSG_DTAP;
+       header->link_id = link_id;
+       header->length = msgb_l3len(msg_l3);
+
+       /* Payload */
+       data = msgb_put(msg, header->length);
+       memcpy(data, msg_l3->l3h, header->length);
+
+       return msg;
+}
+
 static const struct tlv_definition bss_att_tlvdef = {
        .def = {
                [GSM0808_IE_IMSI]                   = { TLV_TYPE_TLV },