gsm0808: Add a method to create a new DTAP message with a msgb
authorHolger Hans Peter Freyther <zecke@selfish.org>
Thu, 4 Nov 2010 11:26:06 +0000 (12:26 +0100)
committerHolger Hans Peter Freyther <zecke@selfish.org>
Thu, 4 Nov 2010 11:27:48 +0000 (12:27 +0100)
include/osmocore/gsm0808.h
src/gsm0808.c

index 39a439b..c6d11e1 100644 (file)
@@ -37,6 +37,7 @@ struct msgb *gsm0808_create_assignment_completed(uint8_t rr_cause,
                                                 uint8_t speech_mode);
 struct msgb *gsm0808_create_assignment_failure(uint8_t cause, uint8_t *rr_cause);
 
+struct msgb *gsm0808_create_dtap(struct msgb *msg, uint8_t link_id);
 void gsm0808_prepend_dtap_header(struct msgb *msg, uint8_t link_id);
 
 const struct tlv_definition *gsm0808_att_tlvdef();
index 3962baa..7c9fa09 100644 (file)
@@ -292,6 +292,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 },