1
+ import os
1
2
import sys
2
3
import argparse
3
4
14
15
15
16
16
17
BATMAN_ROUTING_ALG = 'BATMAN_V'
18
+ CBMA_ROOT = os .path .normpath (os .path .dirname (__file__ ))
17
19
18
- def get_interface_locally_administed_mac (interface : str ) -> str :
20
+ def get_interface_locally_administered_mac (interface : str ) -> str :
19
21
mac = get_interface_mac_address (interface )
20
22
mac_bytes = bytearray .fromhex (mac .replace (':' , '' ))
21
23
mac_bytes [0 ] ^= 0x2 # Locally administered bit
@@ -35,6 +37,32 @@ def destroy_batman(batman: str) -> None:
35
37
destroy_batman_str = f"ip link del { batman } "
36
38
run_command_retcode (destroy_batman_str .split ())
37
39
40
+ def get_mtu_from_constants_rc (exclude : list [str ] = []) -> int :
41
+ mtu = 0
42
+ constants_rc = f"{ CBMA_ROOT } /scripts/mess/constants.rc"
43
+ with open (constants_rc , 'r' ) as f :
44
+ for line in f .readlines ():
45
+ if line .startswith ('#' ) or not '=' in line \
46
+ or not ('OVERHEAD' in line or 'HOPEFULLY' in line ):
47
+ continue
48
+ for e in exclude :
49
+ if e in line :
50
+ break
51
+ else :
52
+ try :
53
+ mtu += int (line .split ('=' )[- 1 ].strip ())
54
+ except ValueError :
55
+ logger .warning (f"Ignoring '{ line .strip ()} ' for MTU calculation" )
56
+ if not mtu :
57
+ logger .error (f"Unable to get MTU value from { constants_rc } " )
58
+ sys .exit (255 )
59
+
60
+ return mtu
61
+
62
+ def set_interface_mtu (interface : str , mtu : int ) -> bool :
63
+ cmd_str = f"ip link set { interface } mtu { mtu } "
64
+ return not run_command_retcode (cmd_str .split ())
65
+
38
66
39
67
if __name__ == '__main__' :
40
68
parser = argparse .ArgumentParser (description = 'CBMA standalone parameters' )
@@ -101,6 +129,17 @@ def destroy_batman(batman: str) -> None:
101
129
certificates = CBMACertificates (cert_dir , key , chain , ca )
102
130
103
131
is_upper = args .upper or any ('bat' in i and glob (f"/sys/class/net/*/upper_{ i } " ) for i in interfaces )
132
+
133
+ mtu_base = get_mtu_from_constants_rc (exclude = ['OVERHEAD' ])
134
+ mtu_overhead = get_mtu_from_constants_rc (exclude = ['HOPEFULLY' ])
135
+ if not is_upper :
136
+ mtu_overhead *= 2
137
+ mtu = mtu_base + mtu_overhead
138
+
139
+ for i in interfaces :
140
+ if not set_interface_mtu (i , mtu ):
141
+ sys .exit (255 )
142
+
104
143
enable_macsec_encryption = is_upper
105
144
try :
106
145
controller = CBMAController (args .port ,
@@ -113,7 +152,7 @@ def destroy_batman(batman: str) -> None:
113
152
sys .exit (255 )
114
153
115
154
if not (existing_batman := f"/sys/class/net/{ args .batman } " in glob ("/sys/class/net/*" )):
116
- mac = get_interface_locally_administed_mac (interfaces [0 ])
155
+ mac = get_interface_locally_administered_mac (interfaces [0 ])
117
156
create_batman (args .batman , mac )
118
157
try :
119
158
logger .info (f"Adding { interfaces } to the CBMAController" )
0 commit comments