|
1
|
|
|
# encoding: utf-8 |
|
2
|
|
|
""" |
|
3
|
|
|
sr/srv6vpnsid.py |
|
4
|
|
|
|
|
5
|
|
|
Created by Hiroki Shirokura 2020-01-09 |
|
6
|
|
|
Copyright (c) 2020 Hiroki Shirokura . All rights reserved. |
|
7
|
|
|
""" |
|
8
|
|
|
from struct import pack |
|
9
|
|
|
|
|
10
|
|
|
from exabgp.util import concat_bytes |
|
11
|
|
|
from exabgp.protocol.ip import IP |
|
12
|
|
|
|
|
13
|
|
|
from exabgp.bgp.message.notification import Notify |
|
14
|
|
|
from exabgp.bgp.message.update.attribute.sr.prefixsid import PrefixSid |
|
15
|
|
|
|
|
16
|
|
|
# 0 1 2 3 |
|
17
|
|
|
# 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 |
|
18
|
|
|
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
19
|
|
|
# | Type | Length | RESERVED | |
|
20
|
|
|
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
21
|
|
|
# | SID-Type | SID-Flags | | |
|
22
|
|
|
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |
|
23
|
|
|
# | | |
|
24
|
|
|
# | IPv6 SID (16 octets) | |
|
25
|
|
|
# | | |
|
26
|
|
|
# | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
27
|
|
|
# | | |
|
28
|
|
|
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
29
|
|
|
# 3.2. SRv6 VPN SID |
|
30
|
|
|
|
|
31
|
|
|
|
|
32
|
|
View Code Duplication |
@PrefixSid.register() |
|
|
|
|
|
|
33
|
|
|
class Srv6VpnSid(object): |
|
34
|
|
|
TLV = 4 |
|
35
|
|
|
LENGTH = 19 |
|
36
|
|
|
|
|
37
|
|
|
def __init__ (self,vpnsid,packed=None): |
|
38
|
|
|
self.vpnsid = vpnsid |
|
39
|
|
|
self.packed = self.pack() |
|
40
|
|
|
|
|
41
|
|
|
def __repr__ (self): |
|
42
|
|
|
return "srv6-vpn-sid %s" % (self.vpnsid) |
|
43
|
|
|
|
|
44
|
|
|
def pack (self): |
|
45
|
|
|
return concat_bytes( |
|
46
|
|
|
pack('!B', self.TLV), |
|
47
|
|
|
pack('!H', self.LENGTH), |
|
48
|
|
|
pack('!B', 0), |
|
49
|
|
|
pack('!B', 0), |
|
50
|
|
|
pack('!B', 0), |
|
51
|
|
|
IP.pton(self.vpnsid) |
|
52
|
|
|
) |
|
53
|
|
|
|
|
54
|
|
|
@classmethod |
|
55
|
|
|
def unpack (cls,data,length): |
|
56
|
|
|
vpnsid = -1 |
|
57
|
|
|
if cls.LENGTH != length: |
|
58
|
|
|
raise Notify(3,5, "Invalid TLV size. Should be {0} but {1} received".format(cls.LENGTH, length)) |
|
59
|
|
|
data = data[3:19] |
|
60
|
|
|
vpnsid = IP.unpack(data) |
|
61
|
|
|
return cls(vpnsid=str(vpnsid),packed=data) |
|
62
|
|
|
|
|
63
|
|
|
def json (self, compact=None): |
|
64
|
|
|
return '"srv6-vpn-sid": "%s"' % (self.vpnsid) |
|
65
|
|
|
|