forked from PentHertz/OpenBTS
-
Notifications
You must be signed in to change notification settings - Fork 0
/
pat.txt
788 lines (672 loc) · 33.5 KB
/
pat.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
Kyles Blackberry is Blackberry 9700
Speed tests:
From mobileSpeedTest.com:
Original:
Your speed: 5.166 Kbps
Your latency: 3.057 seconds
Transferred 100KB in 154.86 seconds.
With ganged TBFs, TBF wrap-around disabled, GPRS.Counters.N3105=3, GPRS.TBF.Retry=4,
GPRS.SinglePduMode=0. The thing is still getting alot of 3105 errors.
And in general it gets cause=1 too, although not during this test, but before.
Your speed: 6.984 Kbps
Your latency: 2.09 seconds
Transferred 100KB in 114.55 seconds.
Another try:
Your speed: 7.539 Kbps
Your latency: 2.583 seconds
Transferred 100KB in 106.11 seconds.
Then I tried allowing TBF wrap-around and it went down!
Your speed: 6.383 Kbps
Your latency: 2.34 seconds
Transferred 100KB in 125.34 seconds.
Got 11 retries during the test,
Note: GSM04.08 (L3 Procedures) and GSM04.18 (L3 messages) replaced by 44.18 + 24.08
4.08 has a state machine picture in 4.1.2, and GMM states a little after.
24.007 7.1.1 has lots of state machines including same state machine picture,
but I dont think they are useful.
3.64 6.2 has the DTM state machine picture.
23.060 6.1 has a description of GMM states (PMM_whatever) for 3G-SGSN.
24.007 11.2.4 - Lists IEI formats so you can tell how to skip an unrecognized IEI.
3.03 2.6 - how to encode TLLI.
Measurement Reports:
45.008 10.1.4: in Network Control Order 2 (the one I have been using) if the
MS detects a downlink signalling failure or random access failure
(as defined in 44.018/44.060) the MS will perform autonomous cell reselection.
This may have been what was happening when the MS would stop listening
to the BTS for 2 second straight.
RA Update - for GPRS.
LA Update - for CS calls.
Combined RA/LA update permitted at SGSN.
DRX mode and paging groups covered in GSM05.02.
MS tells DRX mode to SGSN in the GPRS Attach or RA Update messages.
Just what does the sgsn think it is going to do with it?
GPRS:
Jean Samuel - French guy funding Russians to develop GPRS.
The BCS Block Check Sequence shown in GSM03.64 6.6.4 figure 20
is just the 40 bit checksum added by transmit().
PDP Context Activiation: Getting IP address: 24.008 6.1.2
GSM 4.64 - LLC layer.
Note from man 7 tcp:
tcp_frto (integer; default: 0; since Linux 2.4.21/2.6)
Enables F-RTO, an enhanced recovery algorithm for TCP retransmission time-
outs (RTOs). It is particularly beneficial in wireless environments where
packet loss is typically due to random radio interference rather than inter-
mediate router congestion. See RFC 4138 for more details.
This file can have one of the following values:
0 Disabled.
1 The basic version F-RTO algorithm is enabled.
2 Enable SACK-enhanced F-RTO if flow uses SACK. The basic version can be
used also when SACK is in use though in that case scenario(s) exists
where F-RTO interacts badly with the packet counting of the SACK-enabled
TCP flow.
Before Linux 2.6.22, this parameter was a Boolean value, supporting just
values 0 and 1 above.
RadioResource.cpp: AccessGrantResponder()
serviceLoop()
TCHFACCHL1Encoder::dispatch() - does TCH data pushing.
mDemuxTable in TRXManager.cpp, calls writeLowSideRx in a L1Decoder descendent class.
mGPRSFEC
Maximum LLC PDU size is 1560 bytes. (GSM04.60 sec9.1.12) Bytes over are discarded in RLC.
In unacknowledged mode, LLC-PDUs delivered in the order received, with 0-bits for missing blocks.
The minimum payload size (using CS-1) is 20 bytes (see RLCPayloadSize)
Therefore, a single PDU may take 78 blocks.
There are 1-N downstream L1 physical channels.
Each is connected to an L1FEC.
An N-PDU is on the network side of SGMS
A PDU (aka NS-PDU) is on the downstream side of SGMS, after SNDCP
A Segment is a part of a PDU for transmission in an RLC Radio Block.
All MAC control functions come from the SGMS via BSSGP.
The RLC/MAC is entirely oblivious of PDU content, just passes it to SGMS.
The RLC reports downlink packet loss information to SGMS as
a Bucket Leak Rate, per BSS (aka BVC on the BSSGP interface), and per MS.
Notes:
Notes: The SAPMux class defines writeHighSide and writeLowSide
An encoder class defines only writeHighSide
A decoder class defines only writeLowSide.
MAC MODE:
Dont understand. For downlink allocation it is:
Dynamic allocation, Extended Dynamic allocation, (arent these inapplicable?)
Fixed allocation full duplex, Fixed allocation half duplex.
TBF Mode:
Packet Uplink Assignment, Packet Downlink Assignment, Immediate Assignment
TFI goes with TBF. TFI is unique only within a PDCH.
For Multislot, TFI is unique in all PDCH of multislot.
RLC Mode:
Acknowledged or Unacknowledged. (See GSM04.60 11.2.7 Packet Downlink Assignment)
Upstream:
BSSGSP
Definitions:
BVCI - BSSGP Virtual Connection ID, 0 = signaling, 1 = PTM (point-to-multipoint)
It corresponds to a cell, and can be used instead of routing area id
at operators discretion.
NSEI+BVCI
NSE - Network Service Entity. There is one or more NSE inside the BSS for signaling.
NSEI - Network Service Entity Id.
I think these correspond to BSS.
---
NS-VC - Virtual Connection
---
LSP - Link Selector Parameter, something used only inside the BSS or SGSN,
and not transmitted, to uniquely identify NS-VC.
We wont use it.
QoS Profile: specifies transmission mode (acknowledged, etc), bit rate, other stuff.
Messages:
DL-UNITDATA
Includes PDU type (DL-UNITDATA), TLLI, QoS Profile, PDU Lifetime, PDU.
optional: IMSI, oldTLLI, PFI (Packet Flow Identifier), etc.
Does NOT include LSP, BVCI, NSEI
UL-UNITDATA
Includes PDU type (UL-UNITDATA), TLLI, BVCI, Cell Identifier, PDU.
Does NOT include LSP, BVCI, NSEI.
GMM-PAGING-PS/GMM-PAGING-CS (for packet or voice)
Includes PDU type (PAGING-PS), QoS Profile, P-TMSI <or> IMSI.
Note: If TLLI is specified and already exists within a Radio Context in BSS
[because MS has communicated previously] it is used.
BVCI <or> Location Area <or> Routing Area <or> BSSArea Indication
Optional: P-TMSI, BVCI, Location area, Routing area.
GMM-RA-CAPABILITY, GMM-RA-CAPABILITY-UPDATE
Astonishingly, the BSS asks the SGSN for this info.
GMM-RADIO-STATUS
GMM-SUSPEND
GMM-RESUME
NM-FLUSH
NM-LLC-DISCARDED
NM-FLOW-CONTROL-BVC
NM-FLOW-CONTROL-MS
NM-STATUS
NM-BVC-BLOCK/NM-BVC-UNBLOCK
NM-BVC-RESET
NM-TRACE
PFM-...
Downstream:
RACH/AGCH for paging.
PDUs via RLC
SGSN Uplink:
//
// OpenBSC endpoint for NS layer packets: libgp/gprs_ns.c:read_nsip_msg
// (in OpenBSC, NSIP means NS over IP), which eventually calls:
// libgp/gprs_ns.c:gprs_ns_rcvmsg(), in which BSS is identified by three ways:
// 1. First it tries using the IP address of the BSS to identify the BSS.
// 2. If unrecognized, the NSEI specified in the NS_RESET command is used.
// 3. If no NS_RESET ever received, sets NSEI to 0xfffe and proceeds; this works
// if there is only one BSS, ever, as in our case.
// NS-UNITDATA packets (the only data type) are sent to gprs_ns_rx_unitdata(),
// which somehow calls sgsn_ns_cb() (a callback function)
// which calls libgp/bprs_bssgp.c:gprs_bssgp_rcvmsg(bci and nsei as params)
// which looks up the BTS using the NSEI, then uses:
// switch (BVCI) {
// case BVCI_SIGNALLING: gprs_bssgp_rx_sign()
// case PVCI_PTM: // throw an error
// default: gprs_bssgp_rx_ptp().
// gprs_bssgp_rx_ptp() is the main BSSGP function, does this:
// switch (pdu_type):
// case BSSGP_PDUT_UL_UNITDATA: bssgp_rx_ul_ud(),
// which calls bssgp_rx_ul_ud(), which calls gprs_llc_rcvmsg()
// case BSSGP_PDUT_FLOW_CONTROL_BVC: bssgp_rx_fc_bvc();
// default: // throw an error
//
// gprs/gprs_llc.c:gprs_llc_rcvmsg() is the main entry point.
// extracts TLLI, and forwards message based on SAPI to:
// case GPRS_SAPI_GMM: gsm0408_gprs_rcvmsg()
// case GPRS_SAPI_SNDCP3/5/9/11: sndcp_llunitdata_ind(),
// which assembles NS-PDUs as per SNDCP, then sends the complete N-PDU to:
// sgsn_rx_sndcp_ud_ind(), which looks up the MM context by RAI+TLLI,
// then looks up the PDP context by NSAPI+MM context,
// counts bytes sent, then calls gtp_data_req(gsn, pdp->lib,npdu,npdu_len)
SGSN Downlink:
Packets come in on a tunnel, may have different header sizes depending on version.
Gtp lib decapsulates them, gtp_decaps0(),gtp_decaps1(), gets the header,
which may indicate PDP creation, update, etc, or "GTP_PDU" type, which calls:
gtp/gtp.c: gtp_gtpu_ind() which calls (via callback table, to get out of gtp lib)
sgsn_libgtp.c: cb_data_ind(struct pdp_t*lib,void *packet,unsigned len)
The pdp has an MM context, which has the nsei+bvci+tlli.
If mm_state is GMM_REGISTERED_SUSPENDED, it calls gprs_bssgp_tx_paging(),
(and apparently drops the incoming NPDU on the floor)
else if mm_state is GMM_REGISTERED_NORMAL it just sends the packet to:
sndcp_unitdata_req()
Eventually it calls:
int gprs_bssgp_tx_dl_ud(struct msgb *msg, struct sgsn_mm_ctx *mmctx)
which calls: gprs_ns_sendmsg(bssgp_nsi, msg);
where bssgp_nsi is a global var.
int gprs_ns_sendmsg(struct gprs_ns_inst *nsi, struct msgb *msg)
does: { ... nsvc = nsvc_by_nsei(nsi, msgb_nsei(msg)); }
then calls gprs_ns_tx(nsvc,msg)
which calls nsip_sendmsg(nsvc,msg)
which if the encapsulation is udp calls gprs_ns_tx(nsvc,msg) (else *_frgre_*something()
which calls nsip_sendmsg(nsvc,msg) which uses:
struct gprs_ns_inst *nsi = nsvc->nsi;
struct sockaddr_in *daddr = &nsvc->ip.bts_addr;
rc = sendto(nsi->nsip.fd.fd, msg->data, msg->len, 0,
(struct sockaddr *)daddr, sizeof(*daddr));
In osmocom/openbsc/openbsc/src/gprs
I modified the sgsn Makefile to remove -lgtp, and took out all the gtp references
execpt pdp stuff, so we can move that file to sgsn and stop linking with libgtp.
Notes: the cb_conf callback creates the pdp context;
to replace, I must call create_pdp_conf(), which calls gsm48_tx_gsm_act_pdp_acc() to
send an acknowledgment to the MS.
The eua is struct pdp_t is the IP address. First byte is IETF, second
GPRS Messages in GSM04.08 also GSM44.18
the opensgsn accepts flow control messages but ignores them
Wikipediate/GPRS_Core_Network says:
GTP-U is used for user-data in spearated unnels for each PDP context.
GTP-C for control: setup of PDP contexts, etc.
GTP-C on UDP port 2123 and GTP-U port 2125
GTP version zero supports both on one generic header, can be used with UDP or TCP on port 3386.
But port 3386 is also dedicated to the charging service, specifically: "GSM/UMTS CDR logging protocol".
GSM 20.060 - Routing! Finally!
sndcp:
/* Request transmission of a SN-PDU over specified LLC Entity + SAPI */
sndcp_unitdata_req()
Note that sndcp header compression is optional, so I suspect opensgsn doesnt bother, not sure.
GTP and GGSN:
See 29.060 for GTP, and 27.060 for an example.
29.060 7.3.2 create pdp context response:
PPP is not normally used on the GGSN
PPP support was added to allow an MS to use PPP to go all the way to a network endpoint.
See cisco document: http://www.cisco.com/en/US/docs/ios/12_3/12_3y/12_3yq/ggsn_5_2/configuration/guide/ggsnppp.html
And I quote:
If the MS requests a dynamic PDP address with the PDP Type IPv4, IPv6 or
IPv4v6 and a dynamic PDP address is allowed, then the End User Address
information element shall be included and the PDP Address field in the End
User Address information element shall contain the dynamic PDP Address(es)
allocated by the GGSN. If the MS requests a static PDP address with
the PDP Type IPv4, IPv6 or IPv4v6, or a PDP address is specified with
PDP Type PPP, then the End User Address information element shall be
included and the PDP Address field shall not be included.
ephemeral ports:
cat /proc/sys/net/ipv4/ip_local_port_range
/* actually send the N-PDU to the SGSN core code, which then
* hands it off to the correct GTP tunnel + GGSN via gtp_data_req() */
return sgsn_rx_sndcp_ud_ind(&sne->ra_id, lle->llme->tlli, sne->nsapi, msg, npdu_len, npdu)
// Wrap BSSGP packets in yet another layer per 44.018
// OpenBSC endpoint: libgp/gprs_ns.c:read_nsip_msg (NSIP == NS over IP), which eventually calls:
struct NSLayer {
};
// Talk to BSSGSP (or whomever)
struct BSSGPLayer {
send and recv L2 messages.
Talk to the socket.
};
class MACB {
// Just one of these.
For each PCH:
TFI table - points to MACD for each TFI for both uplink and downlink.
// Which MS is using which Block locations currently.
// This could just be bit mask, which is set when TBF allocated
// and reset when TBF unallocated. If you really need to know
// who owns a slot, you could run through the TFI table.
Uplink_Block_Assignment[12];
Downlink_Block_Assignment[12];
IMSI to MACD table
PTMSI to MACD table
TLLI to MACD table
// Routine to assign blocks to MACDs.
};
GPRSChannel pickChannel() {
}
class MACD { // aka Radio Context.
// One per IMSI or TLLI, which means one per MS.
// We will keep these around until the MS detaches, or they get really old.
TLLI mtlli; // Not known when MS first attaches.
IMSI mimsi;
// State of MS: packet-idle, packet-transfer.
// Points to in-process TBFs; there could be multiple ones because a single
// block.
// 1 or more PCH assigned to MS.
// NO, the SGMS does this: Incoming message may be control or data, routed to UplinkTBF.
};
class GPRSChannel {
GPRSL12Uplink *uplink;
GPRSL12Downlink *downlink;
};
class GPRSL12Uplink { // aka PCH
// downstream attaches to a single Physical channel in L1FEC.
// Incoming messages are routed to MACD based on TFI.
List mReservations; // Radio blocks that have been reserved for some purpose,
// eg, single block grants requested by RACH
// Return an available RB on this uplink.
RBN reserveOneBlock() {
}
};
class GPRSL12Downlink { // aka PCH
// One of these for each PCH (physical channel), attached to L1FEC.
// Accepts Radio Blocks from anybody.
};
class AGCHResponder {
// This class queues GPRS responses that must be sent via AGCH.
// These are:
};
class GPRSRachManager - not needed, just use some functions.
{
// Receives Packet Channel Request on RACH. (from Control:AccessGrantResponder())
// Routes to MACD.
// Note that SGMS knows nothing about this yet - the MS will use its newly
// allocated channel to send a PDU that goes to SGMS.
};
// A TBF can be a single block packet access, or one or two phase multi-block access,
// although this class does not do the phases, it just handles a single TBF transaction,
// then disappars.
class DownlinkTBF {
// Contains the downlink RLCEngine.
PDU *data[0..n] // 1 or more PDUs to send.
GPRSL12Downlink mpch[4]; // Up to 4 physical channel
int PDUPriority
MACD *my_ms; // Used to get TLLI.
int TFI; // 0..7, assigned when transaction starts.
};
// For open-ended dynamic uplink, which uses USF, the MS will continue to monitor
// the PDCH for its USF value until it receives ... or until T3180 expires: 5 seconds.
// If MS finishes, it sends its final block then immediately enters packet-idle mode
// unless there is a downlink in progress.
class UplinkTBF {
// Contains the uplink RLCEngine.
// Assembles the PDUs and sends them to BSSGP.
};
=========================================================================
// IMMEDIATE ASSIGNMENT FORMAT: GSM04.08sec9.1.18
// Notes: We will not use:
// Immediate_Assignment_Extended for RR only and addresses 2 mobiles simultaneously.
// "RR Packet Uplink/Downlink Assignment" is part of the "Packet Assignment"
// command that is sent on DCCH of an MS with an ongoing RR channel.
struct {
uint l2_pseudo_length:8;
uint RR_protocol_discriminator:4; // Not sure, see 04.18sec10.2, GSM24.07
uint skip_indicator:4; // 0 == dont ignore this message.
uint message_type:8; // 0x3f == IMMEDIATE_ASSIGNMENT,
uint page_mode:4;
uint dedicated_mode_or_TBF:4; // sec10.5.2.25b
// bits are:
// unused:1;
// TMA:1; 0 == no meaning ??, 1 == first of two message TBF assignment.
// downlink:1; 0 == RR, 1 == TBF.
// TD:1; 0 == no meaning ??, 1 == there is something in the rest octets
// for a TBF, it is the Packet Uplink Assignment.
uint channel_description:24; // for RR, ignored for TBF.
// GSM04.08sec10.5.2.25a
<or> uint packet_channel_description:24; // for TBF
struct {
uint channel_type:5; // unused, must be 1;
uint TN:3; // Timeslot Number.
uint TSC:3; // Training Sequence Code; GSN.05.02
uint union_encode_bits:2; // set to 0x00 to indicate no frequency hopping.
uint spare:1; // set to 0
uint ARFCN:10;
};
uint request_reference:24; // Identifies the MS that sent the RACH.
// use: L3RequestReference foo(RA,GSM::Time&when);
struct {
uint RA:8; // The 8-bit RACH message sent by the MS.
// The T? fields encode the FN module 42432 in which RACH was received.
// Note: FN modulo 42432 == (51X((T3-T2) mod 26) + T3 + 51*26*T1prime
uint T1prime:5; // FN (div 1326) mod 32;
uint T3highpart:3 // FN mod 51, in 6 bits;
uint T3lowpart:3;
uint T2:5; // FN mod 26.
};
uint timing_advance:8;
mobile allocation:8; // encoded as Format LV? length 1-9 bytes.
// length indicator set to 0 unless there is frequency hopping.
starting_time:24; // optional, encoded as Format TV with IEI = 0x7c;
// Sec 9.1.18.2 says: starting_time ignored for TBF.
IA_rest_octets[] // For RR, may be Frequency Params
// For TBF, may be Packet Uplink Assignment, Packet Downlink Assignment,
// or Second Part Packet Assignment sec10.5.2.16
// Packet Uplink Assignment Message rest_octets:
struct IA_Rest_Octets { // 10.5.2.16
union1:2; // Must be HH for a TBF
uint type1; // 0 => Packet Uplink/downlink Assignment,
// 1 => Second Part Assignment.
uint type2: // 0 => packet_uplink_assignment, 1 => Packet_Downlink_Assignment,
Packet_Uplink_Assignment {
uint union_altype:1: // 0 => single_block_allocation, 1 => Fixed or Dynamic Allocation;
// (But note: polling indicates a Fixed Allocation for just one block.)
if (union_altype == 1) {
uint TFI_Assignment:5;
uint Polling:1; // 1 => MS shall send a Packet Control Acknowledgement in the
// uplink block specified by TBF Starting TIme.
uint union_fixed_indicator:1;
if (union_fixed_indicator == 0) {
// USF stuff, we dont need yet.
} else { // union_fixed_indicator == 1
Allocation_Bitmap_Length:5;
Allocation_Bitmap // variable sized.
union_p0_indicator:1; // 1 => P0 present;
if (union_p0_indicator == 1) {
P0:4; BTS_PWR_CTRL_MODE:1; PR_MODE:1;
}
}
Channel_Coding_Command:2;
TLLI_Block_Channel_Coding:1;
{ 0 | 1 ALPHA:4; }
GAMMA:5
{ 0 | 1 Timing_Advance_Index:4}
{ 0 | 1 TBF_Starting_time:16 }
} else { // union_altype == 0
// Single Block Allocation
{ 0 | 1 ALPHA:4; }
GAMMA:5
uint Note1_bits:2; // Must be 0x1;
TBF_Starting_time:16;
{L | H
P0:4; BTS_PWR_CTRL_MODE:1; PR_MODE:1;
}
}
};
};
};
=========================================================================
Mobile Originated Packet Transfer:
Described in GSM03.64sec6.6.4.7, and GSM44.018sec3.
Note: GSM44.018 talks about RR establishment, which is a voice call, in sec 3.2,3.3 and 3.4.
Voice mode is "idle mode" or "dedicated mode"
GPRS is in "packet idle mode" or "packet transfer mode".
Note that an MS in packet idle mode will receive pages on PACCH, but the Page may specify
establishment of a GSM RR connection, ie a voice call.
Section 3.5 (and only sec 3.5) talks about packet mode.
PACCH = Packet Associated Control Channel.
RACH -> Packet Channel Request (requests one block, may request one or two phase mode)
GSM04.18sec9.1.8 - Channel Request word encoding.
GSM04.18sec3.3.1.1.1 Channel request procedure. and GSM24.07?
This message contains only:
Establishment Cause (1 byte)
Random Reference (There is none in this case,
because Establishment Cause takes the whole byte.)
(Mobile may send M+1 of these)
Which phase will be requested documented in 44.018 3.5.2.1.2, but I dont think we care.
Establishment cause is one or two phase "packet access".
The request may specify:
- for user data, unacknowledged mode, MS requests single block, and attempts two-phase;
- for user data, acknowledged mode, MS requests either one-phase access
or a single block packet access.
- for page response, etc, MS requests a one phase access.
Note: Network may change one-phase request into single-block access, which forces
the MS to perform two-phase access [if it wants to send multiple packets].
fy, for GSM: After sending M+1, MS starts T3126, and if no answer, gives up.
MS enters packet transfer mode, and listens to all of BCCH and CCCH in its timeslot.
GPRS: After sending max number of Channel Request, MS starts T3146,
after which is sends a Random Access Failure and looks for another cell.
Response may be any of:
AGCH <- IMMEDIATE ASSIGNMENT, which either contains Packet Uplink Assignment,
or bit in "Dedicated mode or TBF" element saying it is 2 part,
in which case the real IMMEDIATE ASSIGNMENT is sent within 2 multiframes.
The MS will then respond to IMMEDIATE ASSIGNMENT, (and then can try to do its
uplink using the packet channel.)
AGCH <- REJECT, which lets the MS look for another cell.
PAGCH <- Packet Queuing Notification. (optional, used if heavy traffic,
but only applicable on PCCCH, not CCCH.)
Medium Access Modes:
Fixed, Dynamic (uses USF), Extended Dynamic, or Exclusive Allocation.
For two-phase access, need an additional set of transfers before starting:
PACCH -> Packet Resource Request (optional, used for Fixed or Exclusive Allocation)
PACCH <- Packet Uplink Assignment (optional, used for Fixed or Exclusive Allocation)
For Fixed Allocation, Packet Uplink Assignment specfies start frame, slot, and
bitmap of blocks assigned to MS.
For one-phase access:
I think one-phase access also works for a single unacknowledged uplink block?
For Dynamic Allocation, USF (Uplink State Flag) in download block tells MS
when they can use the upload blocks.
Unacknowledged Mode Uplink Data Transfer:
Fixed Allocation Uplink 4.60sec8.1.1.3:
Initiation by MS sending PACKET RESOURCE REQUEST, using Mobile Originated blah above,
or during downlink transfer, can also send PACKET DOWNLINK ACK/NAC with
essentially the same info.
Closed-ended TBF:
PACKET RESOURCE REQUEST includes non-zero RLC_OCTET_COUNT, which is number
of bytes + RLC block length but less LLC boundaries, which the network must add in.
Network sends PACKET UPLINK ASSIGNMENT with enough blocks to handle it.
Premature end is possible by FINAL_ALLOCATION indication in a fixed allocation
assignment message.
Open-ended TBF:
At the beginning of the uplink allocation the MS may request to continue the TBF
by transmitting another PACKET RESOURCE REQUEST or PACKET DOWNLINK ACK/NACK,
with the number RLC data otets ready to transmit in the RLC_OCTET_COUNT.
[in the Channel Request Description IE.]
Alternatively, can request open-ended TBF with first PACKET RESOURCE REQUEST
RLC_OCTET_COUNT == 0.
Network sends another PACKET UPLINK ASSIGNMENT with a new fixed allocation,
or PACKET ACCESS REJECT. PACKET UPLINK ASSIGNMENT may also set the FINAL_ALLOCATION bit
to stop the open-ended transfer after this final assignment.
PDTCH (assigned slot and block numbers) -> Data
...
PACCH <- Packet Uplink Ack/Nack (includes the successfully received block mask, but it is not used except to determine channel quality.)
No Packet Control Acknowledgment is sent..
Notes Uplink Data Transfer, either acknolwedged or unacknowledged:
Network can send a downlink assignment or timeslot reconfig (needed for multislot)
while uplink is running.
If MS in half duplex mode it has to wait for uplink to end before
starting a downlink.
Note: Half Duplex Mode is a Medium Access Mode described in GSM04.60sec8.1.0,
specified in MAC_MODE parameter in downlink assignment, or
weirdly in uplink assignment.
Holding the line open:
By this I mean, keeping the MS listening to PDCH so you dont have to send
another control block on CCCh.
Downlink: you cant hold the TBF open, because the RLC Data Block has a TFI bit
that indicates the end of the transfer. I looked a little at sending 0 sized blocks,
but became confused. However, after downlink, the MS stays on PDCH
until T3192 expires, for both Acknowledged (sec 9.3.2.6) and Unacknowledged mode, (sec 9.3.3.5.)
(Note: T3191 is something to do with how long the MS has to respond
to the final block sent downlink.)
Accodring to GSM04.60 table 13.1, you can continue to send down the final block
of the transaction over and over to keep T3192 reset.
This would work for acknowledged mode, because the network is just pretending
it did not receive the final block, but I am not sure how this would work in
unacknowledged mode, where each block is only sent once.
Uplink: See 04.60 sec 9.3.3.3. After the final uplink block, network sends
Packet Uplink Ack/Nack (even for unacknowledged mode) with "Final Ack" == 1
and an RRBP field, which indicates an uplink slot the MS uses to send
a new PACKET RESOURCE REQUEST if it wants to send more, or PACKET CONTROL ACKNOLWEDGEMENT
and unless there is a downlink TBF in progress, immediately enters packet-idle mode.
If the Packet Control Acknowledgement is a RACH, there is also a way to encode
CTRL_ACK to specify the MS wants a new uplink TBF. The Packet Control Acknowledgement
documentation for CTRL_ACK is full of special cases because you would only use
that if it is a RACH, otherwise the MS would send a Packet Resource Request.
Options:
o Sec 7.1 lists all the ways an uplink TBF can be established, and there is no way
for the MS to do this during the T3192 period, when there is no TBF in either
direction but the MS is still waiting out T3192 for a new downlink TBF.
If you want to keep the MS camped on PDCH, they expect you to use PCCCH.
o The network could delay sending the final uplinkAck/Nack up to 5 sec, but that might
prevent the MS from starting a new uplink until then.
o The network could send an AckNack requesting retransmission just to keep the MS
on the line, but that risks having an outright failure reported by the MS to upper
layers if it cannot get the block through on the resend, and at the very least,
reporting incorrect QoS parameters.
o Near the end of T3192 (after downlink ends) send an unsolicited single-block uplink.
This is undocumented, so it might not work.
o This idea does not work (because MS must respond to an RRBP, which it will not get):
The network could send a new downlink message before T3192 expires,
and then just never send any downlink (let the timer expire) and send
Packet Polling Requests to the MS. The 51-multiframe is a 1/4 sec.
o Maybe network could send a dummy control block with an RRBP field.
For Fixed uplink, the MS may request more uplink via:
bits in the "Packet Downlink Ack/Nack" block sent
upwards during an existing downlink, or in the first packet of an existing uplink.
Notes: The "GPRS Cell Options" information element (GSM04.60 table 12.4.2) is
sent in PSI1, PSI13, PSI14 (PACCH only), and SI13.
Note that both PSI1 and PSI13 can be sent on PAACH as well as PCCCH.
It specifies the values for T3168: range 0-0.5sec and T3192: range 0-1.5sec.
The RRBP field in acknowledged download mode specifies yet another
single block packet the MS can send upwards, for Ack/Nack or any other purpose
the MS desires.
The first block of a downlink must arrive within T3190, which is 5sec.
The MS will stay camped on the downlink until T3190 expires, which is 5sec.
Acknowledged Mode Uplink Data Transfer:
(Note: TBF survives until all blocks acknowledged.)
Fixed Allocation Transfer:
PDTCH (assigned slot and block numbers) -> Data
...
PACCH <- Packet Uplink Ack/Nack
(or unsolicited PACKET UPLINK ASSIGNMENT or TIMESLOT RECONFIG)
PACCH -> Packet Control Acknowledgment.
Dynamic Allocation Transfer:
PDTCH -> Data
...
PACCH <- Packet Uplink Ack/Nack
PDTCH -> Data (new data or possibly retries)
..
PDTCH -> Last Data Block.
PACCH <- Packet Uplink Assignment
PACCH -> Packet Control Acknowledgment.
Downlink Transfer:
PACKET DOWNLINK ASSIGNMENT or TIMESLOT RECONFIG contains TBF start time.
If a second downlink assignment or timeslot reconfig arrives while downlink
in progress, MS waits until TBF start time, then switches to new one.
If the downlink assignment does not include a TBF start time, the MS reacts
within reaction time specified in GSM05.10.
If the gap between blocks addressed to itself ever exceeds T3190, MS aborts
as per sec 8.7.1
Network sends PACKET TBF RELEASE to end downlink prematurely.
If no on-going uplink TBF, puts the MS in packet idle mode.
Note: It looks like you can keep the "line open" by letting
Network Originated Downlink: GSM4.08 sec3.5.3
CCCH <- IMMEDIATE ASSIGNMENT with a Packet Downlink Assignment,
IMMEDIATE ASSIGNMENT format in GSN04.18sec9.1.18
Note: The network must use this only when MS is in packet-idle mode.
The IMMEDIATE ASSIGNMENT contains:
packet channel description, initial timing advance, and packet downlink assignment,
which contains: TLLI, TFI, RLC mode, power control, polling bit,
timing advance valid flag,
and optionally: TAI (timing advance index) and/or TBF start time.
optional: MS -> PDCH If polling bit is 1, MS waits for TBF start time and
sends PACKET CONTROL ACKNOWLEDGMENT first.
Note: in this case TBF start time applies both to download time and upload time.
Then network starts sending the packets.
Note: 4.08 sec 3.5.3.2 says you can also send a single RLC/MAC control message the same way,
but you dont have to specify TFI.
Network Originated Page:
The GMM can use this to find out the Routing Area of the MS.
For GPRS see 44.018sec3.3.2.1.1 "Paging initiation using paging subchannel on CCCH"
PCH of CCCH <- Paging Request, using P-TMSI or IMSI.
CCCH Paging Request format in GSM04.18sec9.1.22 and following.
If IMSI, page request may be for RR (voice) or packet, depending on
"Packet Page Indication" field.
RACH -> Channel Request
Mobile then does a Mobile Originated Packet Transfer, and sends a packet paging response
(GSM03.64) to the network, which is an LLC frame and we dont need to know anything
more about it, because it is interpreted inside the SGSN.
Note: The SGSN sets the mobility management mode to "Ready", but the MS is usually
still in packet-idle-mode until the SGSN initiates a downlink packet transfer.
CCCH [AGCH?] <- Packet Uplink Assignment (or Immediate Assignment)
For two-phase access:
PACCH -> Packet Resource Request (optional, used for Fixed or Exclusive Allocation)
PACCH <- Packed Uplink Assignment (optional, used for Fixed or Exclusive Allocation)
PDTCH -> Packet Paging Response (LLC frame)
Now the MM (Mobility management) state of the MS is Ready.
When MS is in Ready state:
If Packet uplink in progress:
PACCH <- Packet Downlink Assignment Message, specifies PDCH to be used.
else:
CCCH <- Immediate Assignment Message, specifies PDCH to be used.
-> Packet Control Acknowledgement (if requested by network, used for timing advance)
PDCH <- Data, indicated by TFI
All the modes same as for uplink.
=========================================================================
GSM MODE (old, I aborted this):
RACH -> Packet Channel Request (requests one block, may request one or two phase mode)
(Mobile may send M+1 of these)
Includes establishment cause which may be "answer to paging", or
"procedures that can be completed with SDCCH"
GPRS Channel Request Purposes are in 44.018 3.5.2.1.2
GSM: After sending M+1, MS starts T3126, and if no answer, gives up.
GPRS: After sending max number of Channel Request, MS starts T3146,
after which is sends a Random Access Failure and looks for another cell.
Response may be any of:
PAGCH <- Packet Queuing Notification. (optional, used if heavy traffic,
only applicable on PCCCH, not CCCH)
AGCH <- Packet Uplink Assignment???
AGCH <- REJECT, which lets the MS look for another cell.
AGCH <- IMMEDIATE ASSIGNMENT, which either contains Packet Downlink Assignment,
or bit saying it is 2 part, in which case the real IMMEDIATE ASSIGNMENT
is sent within 2 multiframes.
The MS will then respond to IMMEDIATE ASSIGNMENT, and then can try to do its
uplink using the packet channel.
On CCCH, may send either IMMEDIATE ASSIGNMENT,must use Immediate Assignment.
Class A or B may receive <- Paging Request, which upon which the MS may abort the packet attempt.
Network Originated Transfer:
If MS is in Standby state:
PCH <- Paging Request
RACH -> Channel Request
Mobile then does a Mobile Originated Packet Transfer, and sends a Packet Paging Response
to the network, which is an LLC frame.
CCCH [AGCH?] <- Packet Uplink Assignment (or Immediate Assignment)
For two-phase access:
PACCH -> Packet Resource Request (optional, used for Fixed or Exclusive Allocation)
PACCH <- Packed Uplink Assignment (optional, used for Fixed or Exclusive Allocation)
PDTCH -> Packet Paging Response (LLC frame)
Now the MM (Mobility management) state of the MS is Ready.
When MS is in Ready state:
If Packet uplink in progress:
PACCH <- Packet Downlink Assignment Message, specifies PDCH to be used.
else:
CCCH <- Immediate Assignment Message, specifies PDCH to be used.
-> Packet Control Acknowledgement (if requested by network, used for timing advance)
PDCH <- Data, indicated by TFI
All the modes same as for uplink.
============================================================================
Radio stuff:
GSMConfig.cpp:
TCHFACCHLogicalChannel *GSMConfig::getTCH()
getChan<TCHFACCHLogicalChannel>(mTCHPool)
L1Encoder, L2Decoder are ok
L1FEC is referenced by parent.