mirror of
https://gitea.osmocom.org/cellular-infrastructure/osmo-pcu.git
synced 2025-11-03 05:33:31 +00:00
Compare commits
1 Commits
1.0.0
...
fixeria/re
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e22aa1dc70 |
@@ -1639,3 +1639,60 @@ void Encoding::write_packet_access_reject(
|
||||
bitvec_write_field(dest, &wp, 5, 8); // WAIT_INDICATION value
|
||||
bitvec_write_field(dest, &wp, 0, 1); // WAIT_INDICATION size in seconds
|
||||
}
|
||||
|
||||
void Encoding::write_packet_access_reject_tfi(struct bitvec *dest, uint8_t tfi, bool ul)
|
||||
{
|
||||
unsigned wp = 0;
|
||||
|
||||
bitvec_write_field(dest, &wp, 0x1, 2); // Payload Type
|
||||
bitvec_write_field(dest, &wp, 0x0, 2); // Uplink block with TDMA FN
|
||||
bitvec_write_field(dest, &wp, 0, 1); // No Polling Bit
|
||||
bitvec_write_field(dest, &wp, 0x0, 3); // Uplink state flag
|
||||
bitvec_write_field(dest, &wp,
|
||||
MT_PACKET_ACCESS_REJECT, 6); // MESSAGE TYPE
|
||||
bitvec_write_field(dest, &wp, 0, 2); // fixed 00
|
||||
bitvec_write_field(dest, &wp, 0x03, 2); // Global TFI
|
||||
bitvec_write_field(dest, &wp, !ul, 1); // Uplink / Downlink
|
||||
bitvec_write_field(dest, &wp, tfi, 5); // TFI
|
||||
bitvec_write_field(dest, &wp, 1, 1); // WAIT_INDICATION size in seconds
|
||||
/* TODO: make it configurable */
|
||||
bitvec_write_field(dest, &wp, 5, 8); // WAIT_INDICATION value
|
||||
bitvec_write_field(dest, &wp, 0, 1); // WAIT_INDICATION size in seconds
|
||||
}
|
||||
|
||||
#if 0
|
||||
void Encoding::write_packet_access_reject_tfi(struct bitvec *bv, uint8_t tfi, bool ul)
|
||||
{
|
||||
/* The PACKET ACCESS REJECT message (with RLC header) */
|
||||
Packet_Access_Reject_t RejectMsg = {
|
||||
.MESSAGE_TYPE = MT_PACKET_ACCESS_REJECT,
|
||||
.PAGE_MODE = 0x00, /* Normal Paging */
|
||||
|
||||
.Count_Reject = 1,
|
||||
};
|
||||
|
||||
/* Prepare the identity part (Global TFI) */
|
||||
RejectID_t RejectID = { .UnionType = 0x03 };
|
||||
if (ul) {
|
||||
RejectID.u.Global_TFI.UnionType = 0x00;
|
||||
RejectID.u.Global_TFI.u.UPLINK_TFI = tfi;
|
||||
} else {
|
||||
RejectID.u.Global_TFI.UnionType = 0x01;
|
||||
RejectID.u.Global_TFI.u.DOWNLINK_TFI = tfi;
|
||||
}
|
||||
|
||||
RejectMsg.Reject[0] = (Reject_t) {
|
||||
.ID = RejectID,
|
||||
.Exist_Wait = 0,
|
||||
};
|
||||
|
||||
/* Complete block with both MAC and RLC headers */
|
||||
RlcMacDownlink_t dl_block = {
|
||||
.u = { .Packet_Access_Reject = RejectMsg },
|
||||
.PAYLOAD_TYPE = PAYLOAD_TYPE_CTRL_NO_OPT_OCTET,
|
||||
.USF = 7, /* Why should we deal with MAC header here?!? */
|
||||
};
|
||||
|
||||
OSMO_ASSERT(encode_gsm_rlcmac_downlink(bv, &dl_block) == 0);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -73,6 +73,8 @@ public:
|
||||
static void write_packet_access_reject(
|
||||
bitvec * dest, uint32_t tlli);
|
||||
|
||||
static void write_packet_access_reject_tfi(struct bitvec *bv, uint8_t tfi, bool ul);
|
||||
|
||||
static void write_packet_uplink_ack(
|
||||
bitvec * dest, struct gprs_rlcmac_ul_tbf *tbf, bool is_final,
|
||||
uint8_t rrbp);
|
||||
|
||||
@@ -172,6 +172,12 @@ static struct msgb *sched_select_ctrl_msg(
|
||||
if (!tbf)
|
||||
continue;
|
||||
|
||||
/* HACK: send PACKET ACCESS REJECT if needed */
|
||||
if ((msg = tbf->sched_pkt_acc_req) != NULL) {
|
||||
tbf->sched_pkt_acc_req = NULL;
|
||||
return msg;
|
||||
}
|
||||
|
||||
/*
|
||||
* Assignments for the same direction have lower precedence,
|
||||
* because they may kill the TBF when the CONTROL ACK is
|
||||
|
||||
10
src/pdch.cpp
10
src/pdch.cpp
@@ -638,6 +638,12 @@ void gprs_rlcmac_pdch::rcv_resource_request(Packet_Resource_Request_t *request,
|
||||
return;
|
||||
}
|
||||
|
||||
struct msgb *msg = msgb_alloc(23, "access_reject");
|
||||
struct bitvec bv = {
|
||||
.data_len = GSM_MACBLOCK_LEN,
|
||||
.data = msgb_put(msg, GSM_MACBLOCK_LEN)
|
||||
};
|
||||
|
||||
if (request->ID.u.Global_TFI.UnionType) {
|
||||
struct gprs_rlcmac_dl_tbf *dl_tbf;
|
||||
int8_t tfi = request->ID.u.Global_TFI.u.DOWNLINK_TFI;
|
||||
@@ -648,6 +654,8 @@ void gprs_rlcmac_pdch::rcv_resource_request(Packet_Resource_Request_t *request,
|
||||
}
|
||||
LOGPTBFDL(dl_tbf, LOGL_ERROR,
|
||||
"RX: [PCU <- BTS] FIXME: Packet resource request\n");
|
||||
Encoding::write_packet_access_reject_tfi(&bv, tfi, false);
|
||||
dl_tbf->sched_pkt_acc_req = msg;
|
||||
|
||||
/* Reset N3101 counter: */
|
||||
dl_tbf->n_reset(N3101);
|
||||
@@ -661,6 +669,8 @@ void gprs_rlcmac_pdch::rcv_resource_request(Packet_Resource_Request_t *request,
|
||||
}
|
||||
LOGPTBFUL(ul_tbf, LOGL_ERROR,
|
||||
"RX: [PCU <- BTS] FIXME: Packet resource request\n");
|
||||
Encoding::write_packet_access_reject_tfi(&bv, tfi, true);
|
||||
ul_tbf->sched_pkt_acc_req = msg;
|
||||
|
||||
/* Reset N3101 counter: */
|
||||
ul_tbf->n_reset(N3101);
|
||||
|
||||
@@ -232,6 +232,9 @@ gprs_rlcmac_tbf::gprs_rlcmac_tbf(BTS *bts_, gprs_rlcmac_tbf_direction dir) :
|
||||
m_rlc.init();
|
||||
m_llc.init();
|
||||
|
||||
/* HACK HACK HACK */
|
||||
sched_pkt_acc_req = NULL;
|
||||
|
||||
m_name_buf[0] = '\0';
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user