Files
tsnet-proxy/vendor/github.com/gaissmai/bart/base_index.go
2025-04-09 01:00:12 +01:00

596 lines
14 KiB
Go

// Copyright (c) 2024 Karl Gaissmaier
// SPDX-License-Identifier: MIT
// Please read the ART paper ./doc/artlookup.pdf
// to understand the baseIndex algorithm.
package bart
// netmask for bits
//
// 0b0000_0000, // bits == 0
// 0b1000_0000, // bits == 1
// 0b1100_0000, // bits == 2
// 0b1110_0000, // bits == 3
// 0b1111_0000, // bits == 4
// 0b1111_1000, // bits == 5
// 0b1111_1100, // bits == 6
// 0b1111_1110, // bits == 7
// 0b1111_1111, // bits == 8
func netMask(bits int) uint8 {
return 0b1111_1111 << (8 - bits)
}
// baseIndex of the first host route 0/8: pfxToIdx(0,8)
const firstHostIdx = 256
// pfxToIdx, maps a prefix table as a 'complete binary tree'.
func pfxToIdx(octet byte, prefixLen int) uint {
return uint(octet>>(strideLen-prefixLen)) + (1 << prefixLen)
}
// hostIndex, just pfxToIdx(octet, 8) but faster.
func hostIndex(octet uint) uint {
return octet + firstHostIdx
}
// cmpIndexRank, sort indexes in prefix sort order.
func cmpIndexRank(aIdx, bIdx uint) int {
// convert idx to prefix
aOctet, aBits := idxToPfx(aIdx)
bOctet, bBits := idxToPfx(bIdx)
// cmp the prefixes, first by address and then by bits
if aOctet == bOctet {
if aBits <= bBits {
return -1
}
return 1
}
if aOctet < bOctet {
return -1
}
return 1
}
// idxToPfx returns the octet and prefix len of baseIdx.
// It's the inverse to pfxToIdx.
func idxToPfx(idx uint) (octet byte, pfxLen int) {
return baseIdxLookupTbl[idx].octet, int(baseIdxLookupTbl[idx].pfxLen)
}
// baseIdxLookupTbl, maps back from idx => octet/bits
//
// Use the pre computed lookup table, the func baseIndexToPrefix is too slow
// in comparison to an array access.
//
// func baseIndexToPrefix(idx uint) (octet byte, pfxLen int) {
// nlz := bits.LeadingZeros(idx)
// pfxLen = strconv.IntSize - nlz - 1
// octet = byte((idx & (0xFF >> (8 - pfxLen))) << (8 - pfxLen))
// return octet, pfxLen
// }
var baseIdxLookupTbl = [512]struct {
octet byte
pfxLen int8
}{
{0, -1}, // idx == 0, invalid
{0, 0}, // idx == 1
{0, 1}, // idx == 2
{128, 1}, // idx == 3, e.g. 128.0.0.0/1, 8000::/1
{0, 2}, // idx == 4
{64, 2}, // idx == 5
{128, 2}, // idx == 6
{192, 2}, // idx == 7
{0, 3}, // idx == 8
{32, 3}, // idx == 9
{64, 3}, // idx == 10
{96, 3}, // idx == 11
{128, 3}, // idx == 12
{160, 3}, // idx == 13
{192, 3}, // idx == 14
{224, 3}, // idx == 15
{0, 4}, // idx == 16
{16, 4}, // idx == 17
{32, 4}, // idx == 18
{48, 4}, // idx == 19
{64, 4}, // idx == 20
{80, 4}, // idx == 21
{96, 4}, // idx == 22
{112, 4}, // idx == 23
{128, 4}, // idx == 24
{144, 4}, // idx == 25
{160, 4}, // idx == 26
{176, 4}, // idx == 27
{192, 4}, // idx == 28
{208, 4}, // idx == 29
{224, 4}, // idx == 30
{240, 4}, // idx == 31
{0, 5}, // idx == 32
{8, 5}, // idx == 33
{16, 5}, // idx == 34
{24, 5}, // idx == 35
{32, 5}, // idx == 36
{40, 5}, // idx == 37
{48, 5}, // idx == 38
{56, 5}, // idx == 39
{64, 5}, // idx == 40
{72, 5}, // idx == 41
{80, 5}, // idx == 42
{88, 5}, // idx == 43
{96, 5}, // idx == 44
{104, 5}, // idx == 45
{112, 5}, // idx == 46
{120, 5}, // idx == 47
{128, 5}, // idx == 48
{136, 5}, // idx == 49
{144, 5}, // idx == 50
{152, 5}, // idx == 51
{160, 5}, // idx == 52
{168, 5}, // idx == 53
{176, 5}, // idx == 54
{184, 5}, // idx == 55
{192, 5}, // idx == 56
{200, 5}, // idx == 57
{208, 5}, // idx == 58
{216, 5}, // idx == 59
{224, 5}, // idx == 60
{232, 5}, // idx == 61
{240, 5}, // idx == 62
{248, 5}, // idx == 63
{0, 6}, // idx == 64
{4, 6}, // idx == 65
{8, 6}, // idx == 66
{12, 6}, // idx == 67
{16, 6}, // idx == 68
{20, 6}, // idx == 69
{24, 6}, // idx == 70
{28, 6}, // idx == 71
{32, 6}, // idx == 72
{36, 6}, // idx == 73
{40, 6}, // idx == 74
{44, 6}, // idx == 75
{48, 6}, // idx == 76
{52, 6}, // idx == 77
{56, 6}, // idx == 78
{60, 6}, // idx == 79
{64, 6}, // idx == 80
{68, 6}, // idx == 81
{72, 6}, // idx == 82
{76, 6}, // idx == 83
{80, 6}, // idx == 84
{84, 6}, // idx == 85
{88, 6}, // idx == 86
{92, 6}, // idx == 87
{96, 6}, // idx == 88
{100, 6}, // idx == 89
{104, 6}, // idx == 90
{108, 6}, // idx == 91
{112, 6}, // idx == 92
{116, 6}, // idx == 93
{120, 6}, // idx == 94
{124, 6}, // idx == 95
{128, 6}, // idx == 96
{132, 6}, // idx == 97
{136, 6}, // idx == 98
{140, 6}, // idx == 99
{144, 6}, // idx == 100
{148, 6}, // idx == 101
{152, 6}, // idx == 102
{156, 6}, // idx == 103
{160, 6}, // idx == 104
{164, 6}, // idx == 105
{168, 6}, // idx == 106
{172, 6}, // idx == 107
{176, 6}, // idx == 108
{180, 6}, // idx == 109
{184, 6}, // idx == 110
{188, 6}, // idx == 111
{192, 6}, // idx == 112
{196, 6}, // idx == 113
{200, 6}, // idx == 114
{204, 6}, // idx == 115
{208, 6}, // idx == 116
{212, 6}, // idx == 117
{216, 6}, // idx == 118
{220, 6}, // idx == 119
{224, 6}, // idx == 120
{228, 6}, // idx == 121
{232, 6}, // idx == 122
{236, 6}, // idx == 123
{240, 6}, // idx == 124
{244, 6}, // idx == 125
{248, 6}, // idx == 126
{252, 6}, // idx == 127
{0, 7}, // idx == 128
{2, 7}, // idx == 129
{4, 7}, // idx == 130
{6, 7}, // idx == 131
{8, 7}, // idx == 132
{10, 7}, // idx == 133
{12, 7}, // idx == 134
{14, 7}, // idx == 135
{16, 7}, // idx == 136
{18, 7}, // idx == 137
{20, 7}, // idx == 138
{22, 7}, // idx == 139
{24, 7}, // idx == 140
{26, 7}, // idx == 141
{28, 7}, // idx == 142
{30, 7}, // idx == 143
{32, 7}, // idx == 144
{34, 7}, // idx == 145
{36, 7}, // idx == 146
{38, 7}, // idx == 147
{40, 7}, // idx == 148
{42, 7}, // idx == 149
{44, 7}, // idx == 150
{46, 7}, // idx == 151
{48, 7}, // idx == 152
{50, 7}, // idx == 153
{52, 7}, // idx == 154
{54, 7}, // idx == 155
{56, 7}, // idx == 156
{58, 7}, // idx == 157
{60, 7}, // idx == 158
{62, 7}, // idx == 159
{64, 7}, // idx == 160
{66, 7}, // idx == 161
{68, 7}, // idx == 162
{70, 7}, // idx == 163
{72, 7}, // idx == 164
{74, 7}, // idx == 165
{76, 7}, // idx == 166
{78, 7}, // idx == 167
{80, 7}, // idx == 168
{82, 7}, // idx == 169
{84, 7}, // idx == 170
{86, 7}, // idx == 171
{88, 7}, // idx == 172
{90, 7}, // idx == 173
{92, 7}, // idx == 174
{94, 7}, // idx == 175
{96, 7}, // idx == 176
{98, 7}, // idx == 177
{100, 7}, // idx == 178
{102, 7}, // idx == 179
{104, 7}, // idx == 180
{106, 7}, // idx == 181
{108, 7}, // idx == 182
{110, 7}, // idx == 183
{112, 7}, // idx == 184
{114, 7}, // idx == 185
{116, 7}, // idx == 186
{118, 7}, // idx == 187
{120, 7}, // idx == 188
{122, 7}, // idx == 189
{124, 7}, // idx == 190
{126, 7}, // idx == 191
{128, 7}, // idx == 192
{130, 7}, // idx == 193
{132, 7}, // idx == 194
{134, 7}, // idx == 195
{136, 7}, // idx == 196
{138, 7}, // idx == 197
{140, 7}, // idx == 198
{142, 7}, // idx == 199
{144, 7}, // idx == 200
{146, 7}, // idx == 201
{148, 7}, // idx == 202
{150, 7}, // idx == 203
{152, 7}, // idx == 204
{154, 7}, // idx == 205
{156, 7}, // idx == 206
{158, 7}, // idx == 207
{160, 7}, // idx == 208
{162, 7}, // idx == 209
{164, 7}, // idx == 210
{166, 7}, // idx == 211
{168, 7}, // idx == 212
{170, 7}, // idx == 213
{172, 7}, // idx == 214
{174, 7}, // idx == 215
{176, 7}, // idx == 216
{178, 7}, // idx == 217
{180, 7}, // idx == 218
{182, 7}, // idx == 219
{184, 7}, // idx == 220
{186, 7}, // idx == 221
{188, 7}, // idx == 222
{190, 7}, // idx == 223
{192, 7}, // idx == 224
{194, 7}, // idx == 225
{196, 7}, // idx == 226
{198, 7}, // idx == 227
{200, 7}, // idx == 228
{202, 7}, // idx == 229
{204, 7}, // idx == 230
{206, 7}, // idx == 231
{208, 7}, // idx == 232
{210, 7}, // idx == 233
{212, 7}, // idx == 234
{214, 7}, // idx == 235
{216, 7}, // idx == 236
{218, 7}, // idx == 237
{220, 7}, // idx == 238
{222, 7}, // idx == 239
{224, 7}, // idx == 240
{226, 7}, // idx == 241
{228, 7}, // idx == 242
{230, 7}, // idx == 243
{232, 7}, // idx == 244
{234, 7}, // idx == 245
{236, 7}, // idx == 246
{238, 7}, // idx == 247
{240, 7}, // idx == 248
{242, 7}, // idx == 249
{244, 7}, // idx == 250
{246, 7}, // idx == 251
{248, 7}, // idx == 252
{250, 7}, // idx == 253
{252, 7}, // idx == 254
{254, 7}, // idx == 255
//
// host routes, pfxLen == 8
//
{0, 8}, // idx == 256, e.g. 0.0.0.0/8, ::/8
{1, 8}, // idx == 257
{2, 8}, // idx == 258
{3, 8}, // idx == 259
{4, 8}, // idx == 260
{5, 8}, // idx == 261
{6, 8}, // idx == 262
{7, 8}, // idx == 263
{8, 8}, // idx == 264
{9, 8}, // idx == 265
{10, 8}, // idx == 266, 10.0.0.0/8, 0a00::/8
{11, 8}, // idx == 267
{12, 8}, // idx == 268
{13, 8}, // idx == 269
{14, 8}, // idx == 270
{15, 8}, // idx == 271
{16, 8}, // idx == 272
{17, 8}, // idx == 273
{18, 8}, // idx == 274
{19, 8}, // idx == 275
{20, 8}, // idx == 276
{21, 8}, // idx == 277
{22, 8}, // idx == 278
{23, 8}, // idx == 279
{24, 8}, // idx == 280
{25, 8}, // idx == 281
{26, 8}, // idx == 282
{27, 8}, // idx == 283
{28, 8}, // idx == 284
{29, 8}, // idx == 285
{30, 8}, // idx == 286
{31, 8}, // idx == 287
{32, 8}, // idx == 288
{33, 8}, // idx == 289
{34, 8}, // idx == 290
{35, 8}, // idx == 291
{36, 8}, // idx == 292
{37, 8}, // idx == 293
{38, 8}, // idx == 294
{39, 8}, // idx == 295
{40, 8}, // idx == 296
{41, 8}, // idx == 297
{42, 8}, // idx == 298
{43, 8}, // idx == 299
{44, 8}, // idx == 300
{45, 8}, // idx == 301
{46, 8}, // idx == 302
{47, 8}, // idx == 303
{48, 8}, // idx == 304
{49, 8}, // idx == 305
{50, 8}, // idx == 306
{51, 8}, // idx == 307
{52, 8}, // idx == 308
{53, 8}, // idx == 309
{54, 8}, // idx == 310
{55, 8}, // idx == 311
{56, 8}, // idx == 312
{57, 8}, // idx == 313
{58, 8}, // idx == 314
{59, 8}, // idx == 315
{60, 8}, // idx == 316
{61, 8}, // idx == 317
{62, 8}, // idx == 318
{63, 8}, // idx == 319
{64, 8}, // idx == 320
{65, 8}, // idx == 321
{66, 8}, // idx == 322
{67, 8}, // idx == 323
{68, 8}, // idx == 324
{69, 8}, // idx == 325
{70, 8}, // idx == 326
{71, 8}, // idx == 327
{72, 8}, // idx == 328
{73, 8}, // idx == 329
{74, 8}, // idx == 330
{75, 8}, // idx == 331
{76, 8}, // idx == 332
{77, 8}, // idx == 333
{78, 8}, // idx == 334
{79, 8}, // idx == 335
{80, 8}, // idx == 336
{81, 8}, // idx == 337
{82, 8}, // idx == 338
{83, 8}, // idx == 339
{84, 8}, // idx == 340
{85, 8}, // idx == 341
{86, 8}, // idx == 342
{87, 8}, // idx == 343
{88, 8}, // idx == 344
{89, 8}, // idx == 345
{90, 8}, // idx == 346
{91, 8}, // idx == 347
{92, 8}, // idx == 348
{93, 8}, // idx == 349
{94, 8}, // idx == 350
{95, 8}, // idx == 351
{96, 8}, // idx == 352
{97, 8}, // idx == 353
{98, 8}, // idx == 354
{99, 8}, // idx == 355
{100, 8}, // idx == 356
{101, 8}, // idx == 357
{102, 8}, // idx == 358
{103, 8}, // idx == 359
{104, 8}, // idx == 360
{105, 8}, // idx == 361
{106, 8}, // idx == 362
{107, 8}, // idx == 363
{108, 8}, // idx == 364
{109, 8}, // idx == 365
{110, 8}, // idx == 366
{111, 8}, // idx == 367
{112, 8}, // idx == 368
{113, 8}, // idx == 369
{114, 8}, // idx == 370
{115, 8}, // idx == 371
{116, 8}, // idx == 372
{117, 8}, // idx == 373
{118, 8}, // idx == 374
{119, 8}, // idx == 375
{120, 8}, // idx == 376
{121, 8}, // idx == 377
{122, 8}, // idx == 378
{123, 8}, // idx == 379
{124, 8}, // idx == 380
{125, 8}, // idx == 381
{126, 8}, // idx == 382
{127, 8}, // idx == 383
{128, 8}, // idx == 384
{129, 8}, // idx == 385
{130, 8}, // idx == 386
{131, 8}, // idx == 387
{132, 8}, // idx == 388
{133, 8}, // idx == 389
{134, 8}, // idx == 390
{135, 8}, // idx == 391
{136, 8}, // idx == 392
{137, 8}, // idx == 393
{138, 8}, // idx == 394
{139, 8}, // idx == 395
{140, 8}, // idx == 396
{141, 8}, // idx == 397
{142, 8}, // idx == 398
{143, 8}, // idx == 399
{144, 8}, // idx == 400
{145, 8}, // idx == 401
{146, 8}, // idx == 402
{147, 8}, // idx == 403
{148, 8}, // idx == 404
{149, 8}, // idx == 405
{150, 8}, // idx == 406
{151, 8}, // idx == 407
{152, 8}, // idx == 408
{153, 8}, // idx == 409
{154, 8}, // idx == 410
{155, 8}, // idx == 411
{156, 8}, // idx == 412
{157, 8}, // idx == 413
{158, 8}, // idx == 414
{159, 8}, // idx == 415
{160, 8}, // idx == 416
{161, 8}, // idx == 417
{162, 8}, // idx == 418
{163, 8}, // idx == 419
{164, 8}, // idx == 420
{165, 8}, // idx == 421
{166, 8}, // idx == 422
{167, 8}, // idx == 423
{168, 8}, // idx == 424
{169, 8}, // idx == 425
{170, 8}, // idx == 426
{171, 8}, // idx == 427
{172, 8}, // idx == 428
{173, 8}, // idx == 429
{174, 8}, // idx == 430
{175, 8}, // idx == 431
{176, 8}, // idx == 432
{177, 8}, // idx == 433
{178, 8}, // idx == 434
{179, 8}, // idx == 435
{180, 8}, // idx == 436
{181, 8}, // idx == 437
{182, 8}, // idx == 438
{183, 8}, // idx == 439
{184, 8}, // idx == 440
{185, 8}, // idx == 441
{186, 8}, // idx == 442
{187, 8}, // idx == 443
{188, 8}, // idx == 444
{189, 8}, // idx == 445
{190, 8}, // idx == 446
{191, 8}, // idx == 447
{192, 8}, // idx == 448
{193, 8}, // idx == 449
{194, 8}, // idx == 450
{195, 8}, // idx == 451
{196, 8}, // idx == 452
{197, 8}, // idx == 453
{198, 8}, // idx == 454
{199, 8}, // idx == 455
{200, 8}, // idx == 456
{201, 8}, // idx == 457
{202, 8}, // idx == 458
{203, 8}, // idx == 459
{204, 8}, // idx == 460
{205, 8}, // idx == 461
{206, 8}, // idx == 462
{207, 8}, // idx == 463
{208, 8}, // idx == 464
{209, 8}, // idx == 465
{210, 8}, // idx == 466
{211, 8}, // idx == 467
{212, 8}, // idx == 468
{213, 8}, // idx == 469
{214, 8}, // idx == 470
{215, 8}, // idx == 471
{216, 8}, // idx == 472
{217, 8}, // idx == 473
{218, 8}, // idx == 474
{219, 8}, // idx == 475
{220, 8}, // idx == 476
{221, 8}, // idx == 477
{222, 8}, // idx == 478
{223, 8}, // idx == 479
{224, 8}, // idx == 480
{225, 8}, // idx == 481
{226, 8}, // idx == 482
{227, 8}, // idx == 483
{228, 8}, // idx == 484
{229, 8}, // idx == 485
{230, 8}, // idx == 486
{231, 8}, // idx == 487
{232, 8}, // idx == 488
{233, 8}, // idx == 489
{234, 8}, // idx == 490
{235, 8}, // idx == 491
{236, 8}, // idx == 492
{237, 8}, // idx == 493
{238, 8}, // idx == 494
{239, 8}, // idx == 495
{240, 8}, // idx == 496
{241, 8}, // idx == 497
{242, 8}, // idx == 498
{243, 8}, // idx == 499
{244, 8}, // idx == 500
{245, 8}, // idx == 501
{246, 8}, // idx == 502
{247, 8}, // idx == 503
{248, 8}, // idx == 504
{249, 8}, // idx == 505
{250, 8}, // idx == 506
{251, 8}, // idx == 507
{252, 8}, // idx == 508
{253, 8}, // idx == 509
{254, 8}, // idx == 510
{255, 8}, // idx == 511
}