summaryrefslogtreecommitdiffstats
path: root/openbsc/doc/gsm-hopping.txt
blob: c964963c0b7519691ec357f309269bddf603fc68 (plain)
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
according to GSM 05.02:

general parameters from CCCH:
* CA cell allocation of ARFCN's (System Information / BCCH)
* FN: TDMA frame number (t1,t2,t3') in SCH

specific parameters from channel assignment:
* MA: mobile allocation, defines set of ARFCN's, up to 64
* MAIO: index
* HSN: hopping sequence generator number (0..64)


hopping sequence generation (6.2.3):

uint8_t rntable[114] = {
	 48,  98,  63,   1,  36,  95,  78, 102,  94,  73,
	  0,  64,  25,  81,  76,  59, 124,  23, 104, 100,
	101,  47, 118,  85,  18,  56,  96,  86,  54,   2,
	 80,  34, 127,  13,   6,  89,  57, 103,  12,  74,
	 55, 111,  75,  38, 109,  71, 112,  29,  11,  88,
	 87,  19,   3,  68, 110,  26,  33,  31,   8,  45,
	 82,  58,  40, 107,  32,   5, 106,  92,  62,  67,
	 77, 108, 122,  37,  60,  66, 121,  42,  51, 126,
	117, 114,   4,  90,  43,  52,  53, 113, 120,  72,
	 16,  49,   7,  79, 119,  61,  22,  84,   9,  97,
	125,  99,  17, 123
};

/* mai=0 represents lowest ARFCN in the MA */


uint8_t hopping_mai(uint8_t hsn, uint32_t fn, uint8_t maio,
		     uint8_t t1, uint8_t t2, uint8_t t3_)
{
	uint8_t mai;

	if (hsn == 0) /* cyclic hopping */
		mai = (fn + maio) % n;
	else {
		uint32_t m, m_, t_, s;

		m = t2 + rntable[(hsn xor (t1 % 64)) + t3];
		m_ = m % (2^NBIN);
		t_ = t3 % (2^NBIN);
		if (m_ < n then)
			s = m_;
		else
			s = (m_ + t_) % n;
		mai = (s + maio) % n;
	}

	return mai;
}