summaryrefslogtreecommitdiff
path: root/docs/configuration/protocols/openfabric.md
blob: 4c9b934d38c88e3d6be67e0c36792b063be73d9d (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
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
---
myst:
  html_meta:
    description: |
      OpenFabric is a routing protocol derived from IS-IS that provides
      link-state routing with optimized flooding, making it well-suited
      for spine-leaf topologies.
    keywords: openfabric, isis, link-state, spine-leaf, fabric, net, lsp
---

(openfabric)=

# OpenFabric

% stop_vyoslinter
OpenFabric, specified in [draft-white-openfabric-06.txt](https://datatracker.ietf.org/doc/html/draft-white-openfabric-06),
% start_vyoslinter
is a routing protocol derived from IS-IS. It provides link-state routing with
optimized flooding, making it well-suited for spine-leaf topologies.

OpenFabric is a dual-stack protocol. A single instance can simultaneously
route both IPv4 and IPv6 traffic.

## Configuration

### Mandatory settings

Each OpenFabric router must be configured with a unique
{abbr}`NET (Network Entity Title)`, the
{abbr}`CLNS (Connectionless Network Service)` equivalent of a Router ID. The
6-byte system identifier portion of the NET must be unique across the fabric.

```{cfgcmd} set protocols openfabric net \<network-entity-title\>

**Configure the Network Entity Title (NET) for the router.**

A typical NET looks like ``49.0001.1921.6800.1002.00``.

The NET consists of the following parts:

- **{abbr}`AFI (Authority and Format Identifier)`** (`49`): OpenFabric
  conventionally uses AFI value 49 for private addressing.
- **Area identifier** (`0001`): The area number within the fabric (in this
  case, Area 1).
- **System identifier** (`1921.6800.1002`): Uniquely identifies the router
  within the fabric. We recommend deriving this value from the router IP
  address or MAC address. To construct the system identifier from an IPv4
  address (for example, `192.168.1.2`):

  - Pad each octet with leading zeros: `192.168.1.2` → `192.168.001.002`.
  - Regroup the digits into three 4-digit blocks: `192.168.001.002` →
    `1921.6800.1002`.

- **NET selector** (`00`): Must always be `00` to indicate the local system.
```

Example:

```none
set protocols openfabric net 49.0001.1921.6800.1002.00
```

```{cfgcmd} set protocols openfabric domain \<name\> interface \<interface\> address-family \<ipv4|ipv6\>

**Configure the named OpenFabric domain on a specific interface for the
given address family (IPv4 or IPv6).**

For dual-stack operation, run the command twice: once with `ipv4` and once
with `ipv6`.
```

Example:

```none
set protocols openfabric domain fabric1 interface eth1 address-family ipv4
set protocols openfabric domain fabric1 interface eth1 address-family ipv6
```

### OpenFabric global configuration

```{cfgcmd} set protocols openfabric domain \<name\> domain-password \<plaintext-password|md5\> \<password\>

**Configure the authentication password for the specified OpenFabric
domain.**

The password can be specified as either plain text or
an {abbr}`MD5 (Message-Digest Algorithm 5)` hash.
```

Example:

```none
set protocols openfabric domain fabric1 domain-password md5 'shared-secret'
```

```{cfgcmd} set protocols openfabric domain \<name\> purge-originator

**Enable {abbr}`POI (Purge Originator Identification)` for the specified
OpenFabric domain.**

POI is defined in RFC 6232.
```

Example:

```none
set protocols openfabric domain fabric1 purge-originator
```

```{cfgcmd} set protocols openfabric domain \<name\> set-overload-bit

**Configure the overload bit for the specified OpenFabric domain.**

This instructs other routers in the domain not to use this router for
transit traffic.
```

Example:

```none
set protocols openfabric domain fabric1 set-overload-bit
```

```{cfgcmd} set protocols openfabric domain \<name\> log-adjacency-changes

**Enable logging of adjacency state changes in the specified OpenFabric
domain.**
```

Example:

```none
set protocols openfabric domain fabric1 log-adjacency-changes
```

```{cfgcmd} set protocols openfabric domain \<name\> fabric-tier \<0-14\>

**Configure a static tier number for the specified OpenFabric domain.**

The router advertises the tier value to indicate its location in the
OpenFabric domain.
```

Example:

```none
set protocols openfabric domain fabric1 fabric-tier 1
```

### Interface configuration

```{cfgcmd} set protocols openfabric domain \<name\> interface \<interface\> hello-interval \<1-600\>

**Configure the interval, in seconds, at which the router transmits Hello
packets on this interface.**

Hello packets are exchanged with neighbors to establish and maintain
adjacencies.
```

Example:

```none
set protocols openfabric domain fabric1 interface eth0 hello-interval 5
```

```{cfgcmd} set protocols openfabric domain \<name\> interface \<interface\> hello-multiplier \<2-100\>

**Configure the multiplier used to compute the Hello hold time on the
specified interface.**
```

Example:

```none
set protocols openfabric domain fabric1 interface eth0 hello-multiplier 3
```

```{cfgcmd} set protocols openfabric domain \<name\> interface \<interface\> metric \<0-16777215\>

**Configure the routing metric for the specified interface.**

This metric is used in path selection to determine the most efficient
route. Lower metrics indicate preferred paths.
```

Example:

```none
set protocols openfabric domain fabric1 interface eth0 metric 100
```

```{cfgcmd} set protocols openfabric domain \<name\> interface \<interface\> passive

**Enable passive mode for the specified interface.**

In passive mode, the router does not send Hello packets on the interface
and does not form adjacencies.
```

Example:

```none
set protocols openfabric domain fabric1 interface eth0 passive
```

```{cfgcmd} set protocols openfabric domain \<name\> interface \<interface\> password \<plaintext-password|md5\> \<password\>

**Configure the authentication password for the specified interface.**

The password can be specified as either plain text or
an {abbr}`MD5 (Message-Digest Algorithm 5)` hash.
```

Example:

```none
set protocols openfabric domain fabric1 interface eth0 password plaintext-password link-secret
```

```{cfgcmd} set protocols openfabric domain \<name\> interface \<interface\> csnp-interval \<1-600\>

**Configure the interval, in seconds, at which
{abbr}`CSNPs (Complete Sequence Number PDUs)` are sent on the specified
interface.**
```

Example:

```none
set protocols openfabric domain fabric1 interface eth0 csnp-interval 10
```

```{cfgcmd} set protocols openfabric domain \<name\> interface \<interface\> psnp-interval \<0-120\>

**Configure the interval, in seconds, at which
{abbr}`PSNPs (Partial Sequence Number PDUs)` are sent on the specified
interface.**
```

Example:

```none
set protocols openfabric domain fabric1 interface eth0 psnp-interval 2
```

### Timers

```{cfgcmd} set protocols openfabric domain \<name\> lsp-gen-interval \<1-120\>

**Configure the minimum interval, in seconds, between successive
generations of the same {abbr}`LSP (Link State PDU)` in the OpenFabric
domain.**
```

Example:

```none
set protocols openfabric domain fabric1 lsp-gen-interval 5
```

```{cfgcmd} set protocols openfabric domain \<name\> lsp-refresh-interval \<1-65235\>

**Configure the LSP refresh interval, in seconds, for the OpenFabric
domain.**
```

```{note}
The value must be lower than `max-lsp-lifetime`. Otherwise, LSPs will
time out before they can be refreshed.
```

Example:

```none
set protocols openfabric domain fabric1 lsp-refresh-interval 900
```

```{cfgcmd} set protocols openfabric domain \<name\> max-lsp-lifetime \<360-65535\>

**Configure the maximum lifetime, in seconds, for LSPs in the OpenFabric
domain.**

By default, LSPs remain in the link-state database for 1200 seconds and
are deleted if they are not refreshed.
```

Example:

```none
set protocols openfabric domain fabric1 max-lsp-lifetime 1200
```

```{cfgcmd} set protocols openfabric domain \<name\> spf-interval \<1-120\>

**Configure the minimum interval, in seconds, between consecutive
{abbr}`SPF (Shortest Path First)` calculations in the OpenFabric domain.**
```

Example:

```none
set protocols openfabric domain fabric1 spf-interval 5
```

## Example

The following example demonstrates a basic OpenFabric configuration between
two routers.

**Node 1:**

```none
set interfaces loopback lo address '198.51.100.1/32'
set interfaces ethernet eth1 address '192.0.2.1/24'

set protocols openfabric domain VyOS interface eth1 address-family ipv4
set protocols openfabric domain VyOS interface lo address-family ipv4
set protocols openfabric domain VyOS interface lo passive
set protocols openfabric net '49.0001.1980.5110.0001.00'
```

**Node 2:**

```none
set interfaces loopback lo address '198.51.100.2/32'
set interfaces ethernet eth1 address '192.0.2.2/24'

set protocols openfabric domain VyOS interface eth1 address-family ipv4
set protocols openfabric domain VyOS interface lo address-family ipv4
set protocols openfabric domain VyOS interface lo passive
set protocols openfabric net '49.0001.1980.5110.0002.00'
```

After committing the configuration, verify the neighbor adjacencies on both
nodes: 

```none
vyos@node-1:~$ show openfabric neighbor
show openfabric neighbor
Area VyOS:
  System Id           Interface   L  State        Holdtime SNPA
  node-2              eth1        2  Up            27      2020.2020.2020


vyos@node-2:~$ show openfabric neighbor
show openfabric neighbor
Area VyOS:
  System Id           Interface   L  State        Holdtime SNPA
  node-1              eth1        2  Up            30      2020.2020.2020
```

Verify that the OpenFabric routes have successfully populated:

```none
vyos@node-1:~$ show ip route openfabric
show ip route openfabric
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, F - PBR,
       f - OpenFabric,
       > - selected route, * - FIB route, q - queued, r - rejected, b - backup
       t - trapped, o - offload failure

f   192.0.2.0/24 [115/20] via 192.0.2.2, eth1 onlink, weight 1, 00:00:10
f>* 198.51.100.2/32 [115/20] via 192.0.2.2, eth1 onlink, weight 1, 00:00:10

vyos@node-2:~$ show ip route openfabric
show ip route openfabric
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, F - PBR,
       f - OpenFabric,
       > - selected route, * - FIB route, q - queued, r - rejected, b - backup
       t - trapped, o - offload failure

f   192.0.2.0/24 [115/20] via 192.0.2.1, eth1 onlink, weight 1, 00:00:48
f>* 198.51.100.1/32 [115/20] via 192.0.2.1, eth1 onlink, weight 1, 00:00:48
```