L1CTL is sending PH-DATA.ind, not PH-DATA.req up to LAPDm
[osmocom-bb.git] / src / host / layer23 / src / common / l1ctl.c
index a2fd865..867f5c5 100644 (file)
@@ -47,6 +47,8 @@
 #include <osmocom/bb/common/lapdm.h>
 #include <osmocom/bb/common/logging.h>
 
+extern struct gsmtap_inst *gsmtap_inst;
+
 static struct msgb *osmo_l1_alloc(uint8_t msg_type)
 {
        struct l1ctl_hdr *l1h;
@@ -109,6 +111,8 @@ static int rx_l1_fbsb_conf(struct osmocom_ms *ms, struct msgb *msg)
 
 static int rx_l1_rach_conf(struct osmocom_ms *ms, struct msgb *msg)
 {
+       struct lapdm_entity *le = &ms->lapdm_channel.lapdm_dcch;
+       struct osmo_phsap_prim pp;
        struct l1ctl_info_dl *dl;
 
        if (msgb_l2len(msg) < sizeof(*dl)) {
@@ -120,15 +124,18 @@ static int rx_l1_rach_conf(struct osmocom_ms *ms, struct msgb *msg)
 
        dl = (struct l1ctl_info_dl *) msg->l1h;
 
-       l2_ph_chan_conf(msg, ms, dl);
+       osmo_prim_init(&pp.oph, SAP_GSM_PH, PRIM_PH_RACH,
+                       PRIM_OP_CONFIRM, msg);
+       pp.u.rach_ind.fn = ntohl(dl->frame_nr);
 
-       return 0;
+       return lapdm_phsap_up(&pp.oph, le);
 }
 
 /* Receive L1CTL_DATA_IND (Data Indication from L1) */
 static int rx_ph_data_ind(struct osmocom_ms *ms, struct msgb *msg)
 {
-       struct l1ctl_info_dl *dl, dl_cpy;
+       struct osmo_phsap_prim pp;
+       struct l1ctl_info_dl *dl;
        struct l1ctl_data_ind *ccch;
        struct lapdm_entity *le;
        struct rx_meas_stat *meas = &ms->meas;
@@ -152,7 +159,7 @@ static int rx_ph_data_ind(struct osmocom_ms *ms, struct msgb *msg)
        DEBUGP(DL1C, "%s (%.4u/%.2u/%.2u) %d dBm: %s\n",
                rsl_chan_nr_str(dl->chan_nr), tm.t1, tm.t2, tm.t3,
                (int)dl->rx_level-110,
-               hexdump(ccch->data, sizeof(ccch->data)));
+               osmo_hexdump(ccch->data, sizeof(ccch->data)));
 
        meas->last_fn = ntohl(dl->frame_nr);
        meas->frames++;
@@ -214,47 +221,47 @@ printf("Dropping frame with %u bit errors\n", dl->num_biterr);
 
        /* send CCCH data via GSMTAP */
        gsmtap_chan_type = chantype_rsl2gsmtap(chan_type, dl->link_id);
-       gsmtap_sendmsg(ntohs(dl->band_arfcn), chan_ts, gsmtap_chan_type, chan_ss,
-                       tm.fn, dl->rx_level-110, dl->snr, ccch->data,
-                       sizeof(ccch->data));
+       gsmtap_send(gsmtap_inst, ntohs(dl->band_arfcn), chan_ts,
+                   gsmtap_chan_type, chan_ss, tm.fn, dl->rx_level-110,
+                   dl->snr, ccch->data, sizeof(ccch->data));
 
        /* determine LAPDm entity based on SACCH or not */
        if (dl->link_id & 0x40)
-               le = &ms->l2_entity.lapdm_acch;
+               le = &ms->lapdm_channel.lapdm_acch;
        else
-               le = &ms->l2_entity.lapdm_dcch;
-       /* make local stack copy of l1ctl_info_dl, as LAPDm will
-        * overwrite skb hdr */
-       memcpy(&dl_cpy, dl, sizeof(dl_cpy));
+               le = &ms->lapdm_channel.lapdm_dcch;
 
        /* pull the L1 header from the msgb */
        msgb_pull(msg, msg->l2h - (msg->l1h-sizeof(struct l1ctl_hdr)));
        msg->l1h = NULL;
 
-       /* send it up into LAPDm */
-       l2_ph_data_ind(msg, le, &dl_cpy);
+       osmo_prim_init(&pp.oph, SAP_GSM_PH, PRIM_PH_DATA,
+                       PRIM_OP_INDICATION, msg);
+       pp.u.data.chan_nr = dl->chan_nr;
+       pp.u.data.link_id = dl->link_id;
 
-       return 0;
+       /* send it up into LAPDm */
+       return lapdm_phsap_up(&pp.oph, le);
 }
 
 /* Receive L1CTL_DATA_CONF (Data Confirm from L1) */
 static int rx_ph_data_conf(struct osmocom_ms *ms, struct msgb *msg)
 {
-       struct l1ctl_info_dl *dl;
+       struct osmo_phsap_prim pp;
+       struct l1ctl_info_dl *dl = (struct l1ctl_info_dl *) msg->l1h;
        struct lapdm_entity *le;
 
-       dl = (struct l1ctl_info_dl *) msg->l1h;
+       osmo_prim_init(&pp.oph, SAP_GSM_PH, PRIM_PH_RTS,
+                       PRIM_OP_INDICATION, msg);
 
        /* determine LAPDm entity based on SACCH or not */
        if (dl->link_id & 0x40)
-               le = &ms->l2_entity.lapdm_acch;
+               le = &ms->lapdm_channel.lapdm_acch;
        else
-               le = &ms->l2_entity.lapdm_dcch;
+               le = &ms->lapdm_channel.lapdm_dcch;
 
        /* send it up into LAPDm */
-       l2_ph_data_conf(msg, le);
-
-       return 0;
+       return lapdm_phsap_up(&pp.oph, le);
 }
 
 /* Transmit L1CTL_DATA_REQ */
@@ -266,7 +273,7 @@ int l1ctl_tx_data_req(struct osmocom_ms *ms, struct msgb *msg,
        uint8_t chan_type, chan_ts, chan_ss;
        uint8_t gsmtap_chan_type;
 
-       DEBUGP(DL1C, "(%s)\n", hexdump(msg->l2h, msgb_l2len(msg)));
+       DEBUGP(DL1C, "(%s)\n", osmo_hexdump(msg->l2h, msgb_l2len(msg)));
 
        if (msgb_l2len(msg) > 23) {
                LOGP(DL1C, LOGL_ERROR, "L1 cannot handle message length "
@@ -280,8 +287,8 @@ int l1ctl_tx_data_req(struct osmocom_ms *ms, struct msgb *msg,
        /* send copy via GSMTAP */
        rsl_dec_chan_nr(chan_nr, &chan_type, &chan_ss, &chan_ts);
        gsmtap_chan_type = chantype_rsl2gsmtap(chan_type, link_id);
-       gsmtap_sendmsg(0|0x4000, chan_ts, gsmtap_chan_type, chan_ss,
-                       0, 127, 255, msg->l2h, msgb_l2len(msg));
+       gsmtap_send(gsmtap_inst, 0|0x4000, chan_ts, gsmtap_chan_type,
+                   chan_ss, 0, 127, 255, msg->l2h, msgb_l2len(msg));
 
        /* prepend uplink info header */
        l1i_ul = (struct l1ctl_info_ul *) msgb_push(msg, sizeof(*l1i_ul));
@@ -604,7 +611,7 @@ static int rx_l1_sim_conf(struct osmocom_ms *ms, struct msgb *msg)
        uint16_t len = msg->len - sizeof(struct l1ctl_hdr);
        uint8_t *data = msg->data + sizeof(struct l1ctl_hdr);
        
-       LOGP(DL1C, LOGL_INFO, "SIM %s\n", hexdump(data, len));
+       LOGP(DL1C, LOGL_INFO, "SIM %s\n", osmo_hexdump(data, len));
        
        /* pull the L1 header from the msgb */
        msgb_pull(msg, sizeof(struct l1ctl_hdr));