bgpkit-commons 0.12.0

A library for common BGP-related data and functions.
Documentation
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
//! PeeringDB table structs — faithful mirrors of the PeeringDB API responses.
//!
//! Each struct captures all fields returned by its corresponding API endpoint.
//! Fields use `Option<T>` where the API may return `null`.

use serde::{Deserialize, Serialize};

use super::HasId;

/// Social media entry (appears in several endpoints).
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SocialMediaEntry {
    pub service: String,
    pub identifier: String,
}

// ===========================================================================
// /net — Network (AS) information
// ===========================================================================

/// PeeringDB network (`/net`) — full record with all API fields.
///
/// One record per registered autonomous system in PeeringDB.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Network {
    #[serde(default)]
    pub id: u32,
    pub asn: Option<u32>,
    pub name: Option<String>,
    pub name_long: Option<String>,
    pub aka: Option<String>,
    pub org_id: Option<u32>,
    pub irr_as_set: Option<String>,
    pub website: Option<String>,

    // Network characteristics
    pub info_traffic: Option<String>,
    pub info_scope: Option<String>,
    pub info_type: Option<String>,
    pub info_types: Option<Vec<String>>,
    pub info_ratio: Option<String>,
    pub info_prefixes4: Option<u32>,
    pub info_prefixes6: Option<u32>,
    pub info_ipv6: Option<bool>,
    pub info_unicast: Option<bool>,
    pub info_multicast: Option<bool>,
    pub info_never_via_route_servers: Option<bool>,

    // Peering policy
    pub policy_general: Option<String>,
    pub policy_url: Option<String>,
    pub policy_contracts: Option<String>,
    pub policy_locations: Option<String>,
    pub policy_ratio: Option<bool>,

    // IXP / facility links
    pub route_server: Option<String>,
    pub looking_glass: Option<String>,
    pub ix_count: Option<u32>,
    pub fac_count: Option<u32>,

    // Administrative
    pub status: Option<String>,
    pub allow_ixp_update: Option<bool>,
    pub social_media: Option<Vec<SocialMediaEntry>>,
    pub notes: Option<String>,
    pub rir_status: Option<String>,
    pub rir_status_updated: Option<String>,
    pub status_dashboard: Option<String>,
    pub poc_updated: Option<String>,
    pub netixlan_updated: Option<String>,
    pub netfac_updated: Option<String>,
    pub created: Option<String>,
    pub updated: Option<String>,
}

impl HasId for Network {
    fn id(&self) -> u32 {
        self.id
    }
}

// ===========================================================================
// /ix — Internet exchange point
// ===========================================================================

/// PeeringDB internet exchange (`/ix`) — full record.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InternetExchange {
    pub id: u32,
    pub name: String,
    pub name_long: Option<String>,
    pub aka: Option<String>,
    pub org_id: Option<u32>,

    // Location
    pub city: Option<String>,
    pub country: Option<String>,
    pub region_continent: Option<String>,

    // Protocols
    pub proto_unicast: Option<bool>,
    pub proto_ipv6: Option<bool>,
    pub proto_multicast: Option<bool>,

    // Statistics
    pub net_count: Option<u32>,
    pub fac_count: Option<u32>,
    pub ixf_net_count: Option<u32>,

    // Service level
    pub media: Option<String>,
    pub service_level: Option<String>,
    pub terms: Option<String>,

    // Contact
    pub website: Option<String>,
    pub url_stats: Option<String>,
    pub tech_email: Option<String>,
    pub tech_phone: Option<String>,
    pub policy_email: Option<String>,
    pub policy_phone: Option<String>,
    pub sales_email: Option<String>,
    pub sales_phone: Option<String>,

    // IX-F import
    pub ixf_import_request: Option<String>,
    pub ixf_import_request_status: Option<String>,
    pub ixf_last_import: Option<String>,

    // Administrative
    pub status: Option<String>,
    pub status_dashboard: Option<String>,
    pub notes: Option<String>,
    pub social_media: Option<Vec<SocialMediaEntry>>,
    pub created: Option<String>,
    pub updated: Option<String>,
}

impl HasId for InternetExchange {
    fn id(&self) -> u32 {
        self.id
    }
}

// ===========================================================================
// /ixlan — IXP peering LAN
// ===========================================================================

/// PeeringDB IXP peering LAN (`/ixlan`) — full record.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct IxLan {
    pub id: u32,
    pub ix_id: u32,
    pub name: Option<String>,
    pub descr: Option<String>,
    pub mtu: Option<u32>,
    pub rs_asn: Option<u32>,
    pub dot1q_support: Option<bool>,
    pub arp_sponge: Option<String>,
    pub ixf_ixp_import_enabled: Option<bool>,
    pub ixf_ixp_member_list_url_visible: Option<String>,
    pub status: Option<String>,
    pub created: Option<String>,
    pub updated: Option<String>,
}

impl HasId for IxLan {
    fn id(&self) -> u32 {
        self.id
    }
}

// ===========================================================================
// /ixpfx — IXP peering LAN prefix
// ===========================================================================

/// PeeringDB IXP prefix (`/ixpfx`) — peering LAN prefix.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct IxPrefix {
    pub id: u32,
    pub prefix: String,
    pub protocol: String,
    pub ixlan_id: u32,
    pub in_dfz: bool,
    pub status: Option<String>,
    pub created: Option<String>,
    pub updated: Option<String>,
}

impl HasId for IxPrefix {
    fn id(&self) -> u32 {
        self.id
    }
}

// ===========================================================================
// /netixlan — Network–IXP membership
// ===========================================================================

/// PeeringDB network–IXP membership (`/netixlan`) — represents an AS's
/// presence at a specific IXP peering LAN.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NetworkIxLan {
    pub id: u32,
    pub asn: u32,
    pub net_id: u32,
    pub ix_id: u32,
    pub ixlan_id: u32,
    pub name: Option<String>,
    pub speed: u64,
    pub is_rs_peer: bool,
    pub operational: bool,
    pub bfd_support: Option<bool>,
    pub ipaddr4: Option<String>,
    pub ipaddr6: Option<String>,
    pub notes: Option<String>,
    pub ix_side_id: Option<u32>,
    pub net_side_id: Option<u32>,
    pub status: Option<String>,
    pub created: Option<String>,
    pub updated: Option<String>,
}

impl HasId for NetworkIxLan {
    fn id(&self) -> u32 {
        self.id
    }
}

// ===========================================================================
// /fac — Facility (data center)
// ===========================================================================

/// PeeringDB facility (`/fac`) — full record.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Facility {
    pub id: u32,
    pub name: String,
    pub name_long: Option<String>,
    pub aka: Option<String>,
    pub org_id: Option<u32>,
    pub org_name: Option<String>,
    pub campus_id: Option<u32>,

    // Location
    pub address1: Option<String>,
    pub address2: Option<String>,
    pub city: Option<String>,
    pub state: Option<String>,
    pub country: Option<String>,
    pub zipcode: Option<String>,
    pub region_continent: Option<String>,
    pub latitude: Option<f64>,
    pub longitude: Option<f64>,
    pub clli: Option<String>,
    pub npanxx: Option<String>,
    pub floor: Option<String>,
    pub suite: Option<String>,
    pub property: Option<String>,
    pub rencode: Option<String>,
    pub diverse_serving_substations: Option<bool>,

    // Statistics
    pub net_count: Option<u32>,
    pub ix_count: Option<u32>,
    pub carrier_count: Option<u32>,

    // Utilities
    pub available_voltage_services: Option<Vec<String>>,

    // Contact
    pub website: Option<String>,
    pub tech_email: Option<String>,
    pub tech_phone: Option<String>,
    pub sales_email: Option<String>,
    pub sales_phone: Option<String>,

    // Administrative
    pub status: Option<String>,
    pub status_dashboard: Option<String>,
    pub notes: Option<String>,
    pub social_media: Option<Vec<SocialMediaEntry>>,
    pub created: Option<String>,
    pub updated: Option<String>,
}

impl HasId for Facility {
    fn id(&self) -> u32 {
        self.id
    }
}

// ===========================================================================
// /netfac — Network–facility co-location
// ===========================================================================

/// PeeringDB network–facility co-location (`/netfac`).
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NetworkFacility {
    pub id: u32,
    pub net_id: u32,
    pub fac_id: u32,
    pub local_asn: u32,
    pub name: Option<String>,
    pub city: Option<String>,
    pub country: Option<String>,
    pub status: Option<String>,
    pub created: Option<String>,
    pub updated: Option<String>,
}

impl HasId for NetworkFacility {
    fn id(&self) -> u32 {
        self.id
    }
}

// ===========================================================================
// /ixfac — IXP–facility association
// ===========================================================================

/// PeeringDB IXP–facility association (`/ixfac`).
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct IxFacility {
    pub id: u32,
    pub ix_id: u32,
    pub fac_id: u32,
    pub name: Option<String>,
    pub city: Option<String>,
    pub country: Option<String>,
    pub status: Option<String>,
    pub created: Option<String>,
    pub updated: Option<String>,
}

impl HasId for IxFacility {
    fn id(&self) -> u32 {
        self.id
    }
}

// ===========================================================================
// /org — Organization
// ===========================================================================

/// PeeringDB organization (`/org`) — full record.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Organization {
    pub id: u32,
    pub name: String,
    pub name_long: Option<String>,
    pub aka: Option<String>,

    // Location
    pub address1: Option<String>,
    pub address2: Option<String>,
    pub city: Option<String>,
    pub state: Option<String>,
    pub country: Option<String>,
    pub zipcode: Option<String>,
    pub latitude: Option<f64>,
    pub longitude: Option<f64>,
    pub floor: Option<String>,
    pub suite: Option<String>,

    // Contact
    pub website: Option<String>,

    // Administrative
    pub status: Option<String>,
    pub notes: Option<String>,
    pub social_media: Option<Vec<SocialMediaEntry>>,
    pub created: Option<String>,
    pub updated: Option<String>,
}

impl HasId for Organization {
    fn id(&self) -> u32 {
        self.id
    }
}

// ===========================================================================
// /campus — Facility campus
// ===========================================================================

/// PeeringDB campus (`/campus`) — a group of co-located facilities.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Campus {
    pub id: u32,
    pub name: String,
    pub name_long: Option<String>,
    pub aka: Option<String>,
    pub org_id: Option<u32>,
    pub org_name: Option<String>,

    // Location
    pub city: Option<String>,
    pub state: Option<String>,
    pub country: Option<String>,
    pub zipcode: Option<String>,

    // Contact
    pub website: Option<String>,

    // Administrative
    pub status: Option<String>,
    pub notes: Option<String>,
    pub social_media: Option<Vec<SocialMediaEntry>>,
    pub created: Option<String>,
    pub updated: Option<String>,
}

impl HasId for Campus {
    fn id(&self) -> u32 {
        self.id
    }
}

// ===========================================================================
// /carrier — Transport carrier
// ===========================================================================

/// PeeringDB carrier (`/carrier`) — a transport provider.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Carrier {
    pub id: u32,
    pub name: String,
    pub name_long: Option<String>,
    pub aka: Option<String>,
    pub org_id: Option<u32>,
    pub org_name: Option<String>,

    // Statistics
    pub fac_count: Option<u32>,

    // Contact
    pub website: Option<String>,

    // Administrative
    pub status: Option<String>,
    pub notes: Option<String>,
    pub social_media: Option<Vec<SocialMediaEntry>>,
    pub created: Option<String>,
    pub updated: Option<String>,
}

impl HasId for Carrier {
    fn id(&self) -> u32 {
        self.id
    }
}

// ===========================================================================
// /carrierfac — Carrier–facility association
// ===========================================================================

/// PeeringDB carrier–facility association (`/carrierfac`).
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CarrierFacility {
    pub id: u32,
    pub carrier_id: u32,
    pub fac_id: u32,
    pub name: Option<String>,
    pub status: Option<String>,
    pub created: Option<String>,
    pub updated: Option<String>,
}

impl HasId for CarrierFacility {
    fn id(&self) -> u32 {
        self.id
    }
}