diff options
author | Harald Welte <laforge@gnumonks.org> | 2010-03-02 21:59:20 +0100 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2010-03-02 21:59:20 +0100 |
commit | f08eabf2341de43993918246e89ce30c3651f378 (patch) | |
tree | 2d9b4d9acbee1ff20be66c9f3cbf520bb217946d | |
parent | fdd0a700930bdd04bc8827ef88dc5039ecc5b6ce (diff) |
add two new RSL utility functions
-rw-r--r-- | include/osmocore/rsl.h | 7 | ||||
-rw-r--r-- | src/rsl.c | 48 |
2 files changed, 55 insertions, 0 deletions
diff --git a/include/osmocore/rsl.h b/include/osmocore/rsl.h index 3a2b04d4..250c6ea5 100644 --- a/include/osmocore/rsl.h +++ b/include/osmocore/rsl.h @@ -21,4 +21,11 @@ const char *rsl_err_name(uint8_t err); /* Section 3.3.2.3 TS 05.02. I think this looks like a table */ int rsl_ccch_conf_to_bs_cc_chans(int ccch_conf); +/* Push a RSL RLL header with L3_INFO IE */ +int rsl_rll_push_l3(struct msgb *msg, uint8_t msg_type, + uint8_t chan_nr, uint8_t link_id); + +/* Allocate msgb and fill with simple RSL RLL header */ +struct msgb *rsl_rll_simple(uint8_t msg_type, uint8_t chan_nr, + uint8_t link_id); #endif /* _OSMOCORE_RSL_H */ @@ -237,3 +237,51 @@ int rsl_ccch_conf_to_bs_ccch_sdcch_comb(int ccch_conf) return -1; } } + +/* Push a RSL RLL header with L3_INFO IE */ +int rsl_rll_push_l3(struct msgb *msg, uint8_t msg_type, + uint8_t chan_nr, uint8_t link_id) +{ + uint8_t l3_len = msg->tail - (uint8_t *)msgb_l3(msg); + struct abis_rsl_rll_hdr *rh; + + /* construct a RSLms RLL message (DATA INDICATION, UNIT DATA + * INDICATION) and send it off via RSLms */ + + /* Push the L3 IE tag and lengh */ + msgb_tv16_push(msg, RSL_IE_L3_INFO, l3_len); + + /* Then push the RSL header */ + rh = (struct abis_rsl_rll_hdr *) msgb_push(msg, sizeof(*rh)); + rsl_init_rll_hdr(rh, msg_type); + rh->c.msg_discr |= ABIS_RSL_MDISC_TRANSP; + rh->chan_nr = chan_nr; + rh->link_id = link_id; + + /* set the l2 header pointer */ + msg->l2h = (uint8_t *)rh; + + return 0; +} + +struct msgb *rsl_rll_simple(uint8_t msg_type, uint8_t chan_nr, + uint8_t link_id) +{ + struct abis_rsl_rll_hdr *rh; + struct msgb *msg = msgb_alloc(sizeof(*rh), "rsl_rll_simple"); + + if (!msg) + return NULL; + + /* put the RSL header */ + rh = (struct abis_rsl_rll_hdr *) msgb_put(msg, sizeof(*rh)); + rsl_init_rll_hdr(rh, msg_type); + rh->c.msg_discr |= ABIS_RSL_MDISC_TRANSP; + rh->chan_nr = chan_nr; + rh->link_id = link_id; + + /* set the l2 header pointer */ + msg->l2h = (uint8_t *)rh; + + return msg; +} |