aboutsummaryrefslogtreecommitdiffstats
path: root/src/gprs_rlcmac.cpp
diff options
context:
space:
mode:
authorAndreas Eversberg <jolly@eversberg.eu>2012-10-08 12:30:56 +0200
committerAndreas Eversberg <jolly@eversberg.eu>2012-12-18 10:03:34 +0100
commit8c3680dcc9819c337ab7629e86164b14017aab28 (patch)
treed3cfc47caef6ca6aab8a86c6ab2bc9a829093c93 /src/gprs_rlcmac.cpp
parent00950743d77673c73057f0e44581a881733ac993 (diff)
Added paging PS support by Ivan Kluchnikov
Original code: c7e7f6868b6f24346424dee904f4e76d3f216ff4 (The code was committed earlier, but got lost somehow.) I added IMSI, so the paging request is sent in correct paging group. Also I excluded rest octets from pseudo length. It is tested and it work.
Diffstat (limited to 'src/gprs_rlcmac.cpp')
-rw-r--r--src/gprs_rlcmac.cpp50
1 files changed, 50 insertions, 0 deletions
diff --git a/src/gprs_rlcmac.cpp b/src/gprs_rlcmac.cpp
index 1f981933..ff423d2c 100644
--- a/src/gprs_rlcmac.cpp
+++ b/src/gprs_rlcmac.cpp
@@ -1573,6 +1573,43 @@ void write_packet_downlink_assignment(RlcMacDownlink_t * block, uint8_t old_tfi,
block->u.Packet_Downlink_Assignment.Exist_AdditionsR99 = 0x0; // AdditionsR99 = off
}
+/* generate paging request */
+int write_paging_request(bitvec * dest, uint8_t *ptmsi, uint16_t ptmsi_len)
+{
+ unsigned wp = 0;
+ int plen;
+
+ bitvec_write_field(dest, wp,0x0,4); // Skip Indicator
+ bitvec_write_field(dest, wp,0x6,4); // Protocol Discriminator
+ bitvec_write_field(dest, wp,0x21,8); // Paging Request Message Type
+
+ bitvec_write_field(dest, wp,0x0,4); // Page Mode
+ bitvec_write_field(dest, wp,0x0,4); // Channel Needed
+
+ // Mobile Identity
+ bitvec_write_field(dest, wp,ptmsi_len+1,8); // Mobile Identity length
+ bitvec_write_field(dest, wp,0xf,4); // unused
+ bitvec_write_field(dest, wp,0x4,4); // PTMSI type
+ for (int i = 0; i < ptmsi_len; i++)
+ {
+ bitvec_write_field(dest, wp,ptmsi[i],8); // PTMSI
+ }
+ if ((wp % 8)) {
+ LOGP(DRLCMACUL, LOGL_ERROR, "Length of PAG.REQ without rest "
+ "octets is not multiple of 8 bits, PLEASE FIX!\n");
+ exit (0);
+ }
+ plen = wp / 8;
+ bitvec_write_field(dest, wp,0x0,1); // "L" NLN(PCH) = off
+ bitvec_write_field(dest, wp,0x0,1); // "L" Priority1 = off
+ bitvec_write_field(dest, wp,0x1,1); // "L" Priority2 = off
+ bitvec_write_field(dest, wp,0x0,1); // "L" Group Call information = off
+ bitvec_write_field(dest, wp,0x0,1); // "H" Packet Page Indication 1 = packet paging procedure
+ bitvec_write_field(dest, wp,0x1,1); // "H" Packet Page Indication 2 = packet paging procedure
+
+ return plen;
+}
+
/* generate uplink ack */
void write_packet_uplink_ack(RlcMacDownlink_t * block, struct gprs_rlcmac_tbf *tbf,
uint8_t final)
@@ -1700,3 +1737,16 @@ int gprs_rlcmac_tx_ul_ud(gprs_rlcmac_tbf *tbf)
return 0;
}
+
+int gprs_rlcmac_paging_request(uint8_t *ptmsi, uint16_t ptmsi_len,
+ const char *imsi)
+{
+ LOGP(DRLCMAC, LOGL_NOTICE, "TX: [PCU -> BTS] Paging Request (CCCH)\n");
+ bitvec *paging_request = bitvec_alloc(23);
+ bitvec_unhex(paging_request, "2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b");
+ int plen = write_paging_request(paging_request, ptmsi, ptmsi_len);
+ pcu_l1if_tx_pch(paging_request, plen, (char *)imsi);
+ bitvec_free(paging_request);
+
+ return 0;
+}