src: use new libosmogsm and include/osmocom/[gsm|core] path to headers
[osmocom-bb.git] / src / target / firmware / include / comm / msgb.h
index f7c9d14..10cff9b 100644 (file)
  *
  */
 
-#include <linuxlist.h>
+#include <osmocom/core/linuxlist.h>
+#include <console.h>
 
 struct msgb {
        struct llist_head list;
 
+       /* the layer 1 header, if any */
+       unsigned char *l1h;
        /* the A-bis layer 2 header: OML, RSL(RLL), NS */
        unsigned char *l2h;
        /* the layer 3 header. For OML: FOM; RSL: 04.08; GPRS: BSSGP */
@@ -45,9 +48,15 @@ extern void msgb_enqueue(struct llist_head *queue, struct msgb *msg);
 extern struct msgb *msgb_dequeue(struct llist_head *queue);
 extern void msgb_reset(struct msgb *m);
 
+#define msgb_l1(m)     ((void *)(m->l1h))
 #define msgb_l2(m)     ((void *)(m->l2h))
 #define msgb_l3(m)     ((void *)(m->l3h))
 
+static inline unsigned int msgb_l1len(const struct msgb *msgb)
+{
+       return msgb->tail - (uint8_t *)msgb_l1(msgb);
+}
+
 static inline unsigned int msgb_l2len(const struct msgb *msgb)
 {
        return msgb->tail - (uint8_t *)msgb_l2(msgb);
@@ -62,13 +71,65 @@ static inline unsigned int msgb_headlen(const struct msgb *msgb)
 {
        return msgb->len - msgb->data_len;
 }
+static inline int msgb_tailroom(const struct msgb *msgb)
+{
+       return (msgb->head + msgb->data_len) - msgb->tail;
+}
 static inline unsigned char *msgb_put(struct msgb *msgb, unsigned int len)
 {
        unsigned char *tmp = msgb->tail;
+
+       /* we intentionally call cons_puts() here to display an allocation
+        * failure on the _other_ serial port (i.e. the one that doesn't
+        * have the HDLC layer on it */
+       if (msgb_tailroom(msgb) < len)
+               cons_puts("msgb_tailroom insufficient!\n");
+
        msgb->tail += len;
        msgb->len += len;
        return tmp;
 }
+static inline void msgb_put_u8(struct msgb *msgb, uint8_t word)
+{
+       uint8_t *space = msgb_put(msgb, 1);
+       space[0] = word & 0xFF;
+}
+static inline void msgb_put_u16(struct msgb *msgb, uint16_t word)
+{
+       uint8_t *space = msgb_put(msgb, 2);
+       space[0] = word >> 8 & 0xFF;
+       space[1] = word & 0xFF;
+}
+static inline void msgb_put_u32(struct msgb *msgb, uint32_t word)
+{
+       uint8_t *space = msgb_put(msgb, 4);
+       space[0] = word >> 24 & 0xFF;
+       space[1] = word >> 16 & 0xFF;
+       space[2] = word >> 8 & 0xFF;
+       space[3] = word & 0xFF;
+}
+static inline unsigned char *msgb_get(struct msgb *msgb, unsigned int len)
+{
+       unsigned char *tmp = msgb->data;
+       msgb->data += len;
+       msgb->len -= len;
+       return tmp;
+}
+static inline uint8_t msgb_get_u8(struct msgb *msgb)
+{
+       uint8_t *space = msgb_get(msgb, 1);
+       return space[0];
+}
+static inline uint16_t msgb_get_u16(struct msgb *msgb)
+{
+       uint8_t *space = msgb_get(msgb, 2);
+       return space[0] << 8 | space[1];
+}
+static inline uint32_t msgb_get_u32(struct msgb *msgb)
+{
+       uint8_t *space = msgb_get(msgb, 4);
+       return space[0] << 24 | space[1] << 16 | space[2] << 8 | space[3];
+}
 static inline unsigned char *msgb_push(struct msgb *msgb, unsigned int len)
 {
        msgb->data -= len;
@@ -80,10 +141,6 @@ static inline unsigned char *msgb_pull(struct msgb *msgb, unsigned int len)
        msgb->len -= len;
        return msgb->data += len;
 }
-static inline int msgb_tailroom(const struct msgb *msgb)
-{
-       return (msgb->data + msgb->data_len) - msgb->tail;
-}
 
 /* increase the headroom of an empty msgb, reducing the tailroom */
 static inline void msgb_reserve(struct msgb *msg, int len)