Ivan Kluchnikov | 8ee6051 | 2012-03-05 19:24:57 +0400 | [diff] [blame] | 1 | /* gprs_rlcmac.cpp |
| 2 | * |
| 3 | * Copyright (C) 2012 Ivan Klyuchnikov |
Andreas Eversberg | 5dac2f0 | 2012-06-27 15:52:04 +0200 | [diff] [blame] | 4 | * Copyright (C) 2012 Andreas Eversberg <jolly@eversberg.eu> |
Holger Hans Peter Freyther | d6bd91e | 2013-08-24 21:16:55 +0200 | [diff] [blame] | 5 | * Copyright (C) 2013 by Holger Hans Peter Freyther |
Ivan Kluchnikov | 8ee6051 | 2012-03-05 19:24:57 +0400 | [diff] [blame] | 6 | * |
| 7 | * This program is free software; you can redistribute it and/or |
| 8 | * modify it under the terms of the GNU General Public License |
| 9 | * as published by the Free Software Foundation; either version 2 |
| 10 | * of the License, or (at your option) any later version. |
| 11 | * |
| 12 | * This program is distributed in the hope that it will be useful, |
| 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 15 | * GNU General Public License for more details. |
| 16 | * |
| 17 | * You should have received a copy of the GNU General Public License |
| 18 | * along with this program; if not, write to the Free Software |
| 19 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
| 20 | */ |
| 21 | |
Ivan Kluchnikov | 8ee6051 | 2012-03-05 19:24:57 +0400 | [diff] [blame] | 22 | #include <pcu_l1_if.h> |
Ivan Kluchnikov | 8ee6051 | 2012-03-05 19:24:57 +0400 | [diff] [blame] | 23 | #include <gprs_rlcmac.h> |
Holger Hans Peter Freyther | 67ed34e | 2013-10-17 17:01:54 +0200 | [diff] [blame] | 24 | #include <bts.h> |
Holger Hans Peter Freyther | 63f29d6 | 2013-10-19 19:04:03 +0200 | [diff] [blame] | 25 | #include <encoding.h> |
Holger Hans Peter Freyther | 099535a | 2013-10-16 17:42:31 +0200 | [diff] [blame] | 26 | #include <tbf.h> |
Max | 1187a77 | 2018-01-26 13:31:42 +0100 | [diff] [blame] | 27 | #include <gprs_debug.h> |
Andreas Eversberg | 53f4725 | 2012-07-15 07:10:10 +0200 | [diff] [blame] | 28 | |
Andreas Eversberg | 6681bb8 | 2012-07-25 08:48:44 +0200 | [diff] [blame] | 29 | extern void *tall_pcu_ctx; |
Ivan Kluchnikov | 8ee6051 | 2012-03-05 19:24:57 +0400 | [diff] [blame] | 30 | |
Andreas Eversberg | 8c3680d | 2012-10-08 12:30:56 +0200 | [diff] [blame] | 31 | int gprs_rlcmac_paging_request(uint8_t *ptmsi, uint16_t ptmsi_len, |
| 32 | const char *imsi) |
| 33 | { |
| 34 | LOGP(DRLCMAC, LOGL_NOTICE, "TX: [PCU -> BTS] Paging Request (CCCH)\n"); |
Pau Espin Pedrol | 05bca35 | 2019-10-16 14:36:26 +0200 | [diff] [blame] | 35 | bitvec *paging_request = bitvec_alloc(22, tall_pcu_ctx); |
Max | 7426c5f | 2019-02-18 20:42:42 +0100 | [diff] [blame] | 36 | bitvec_unhex(paging_request, DUMMY_VEC); |
Holger Hans Peter Freyther | 63f29d6 | 2013-10-19 19:04:03 +0200 | [diff] [blame] | 37 | int plen = Encoding::write_paging_request(paging_request, ptmsi, ptmsi_len); |
Andreas Eversberg | 8c3680d | 2012-10-08 12:30:56 +0200 | [diff] [blame] | 38 | pcu_l1if_tx_pch(paging_request, plen, (char *)imsi); |
| 39 | bitvec_free(paging_request); |
| 40 | |
| 41 | return 0; |
| 42 | } |
Andreas Eversberg | a004e6a | 2013-05-13 16:45:21 +0200 | [diff] [blame] | 43 | |
Oliver Smith | cfb6321 | 2019-09-05 17:13:33 +0200 | [diff] [blame] | 44 | /* Encode Application Information Request to Packet Application Information (3GPP TS 44.060 11.2.47) */ |
| 45 | struct msgb *gprs_rlcmac_app_info_msg(const struct gsm_pcu_if_app_info_req *req) { |
| 46 | struct msgb *msg; |
| 47 | uint16_t msgb_len = req->len + 1; |
| 48 | struct bitvec bv = {0, msgb_len, NULL}; |
| 49 | const enum bit_value page_mode[] = {ZERO, ZERO}; /* Normal Paging (3GPP TS 44.060 12.20) */ |
Andreas Eversberg | a004e6a | 2013-05-13 16:45:21 +0200 | [diff] [blame] | 50 | |
Oliver Smith | cfb6321 | 2019-09-05 17:13:33 +0200 | [diff] [blame] | 51 | if (!req->len) { |
| 52 | LOGP(DRLCMAC, LOGL_ERROR, "Application Information Request with zero length received!\n"); |
| 53 | return NULL; |
| 54 | } |
| 55 | |
| 56 | msg = msgb_alloc(msgb_len, "app_info_msg"); |
| 57 | if (!msg) |
| 58 | return NULL; |
| 59 | |
| 60 | bv.data = msgb_put(msg, msgb_len); |
| 61 | bitvec_set_bits(&bv, page_mode, 2); |
| 62 | bitvec_set_uint(&bv, req->application_type, 4); |
| 63 | bitvec_set_bytes(&bv, req->data, req->len); |
| 64 | return msg; |
| 65 | } |