@@ -39,10 +39,7 @@ def generate_neighbor_entries(filename, all_available_macs):
39
39
}
40
40
arp_output .append (obj )
41
41
42
- ip_addr = key .split (':' )[2 ]
43
- if ipaddress .ip_interface (str (ip_addr )).ip .version != 4 :
44
- #This is ipv6 address
45
- ip_addr = key .replace (key .split (':' )[0 ] + ':' + key .split (':' )[1 ] + ':' , '' )
42
+ ip_addr = key .split (':' , 2 )[2 ]
46
43
neighbor_entries .append ((vlan_name , mac , ip_addr ))
47
44
syslog .syslog (syslog .LOG_INFO , "Neighbor entry: [Vlan: %s, Mac: %s, Ip: %s]" % (vlan_name , mac , ip_addr ))
48
45
@@ -80,23 +77,58 @@ def get_bridge_port_id_2_port_id(db):
80
77
81
78
return bridge_port_id_2_port_id
82
79
83
- def get_map_port_id_2_iface_name (db ):
84
- port_id_2_iface = {}
85
- keys = db .keys (db .ASIC_DB , 'ASIC_STATE:SAI_OBJECT_TYPE_HOSTIF:oid:*' )
80
+ def get_lag_by_member (member_name , app_db ):
81
+ keys = app_db .keys (app_db .APPL_DB , 'LAG_MEMBER_TABLE:*' )
86
82
keys = [] if keys is None else keys
87
83
for key in keys :
88
- value = db .get_all (db .ASIC_DB , key )
84
+ _ , lag_name , lag_member_name = key .split (":" )
85
+ if lag_member_name == member_name :
86
+ return lag_name
87
+ return None
88
+
89
+ def get_map_host_port_id_2_iface_name (asic_db ):
90
+ host_port_id_2_iface = {}
91
+ keys = asic_db .keys (asic_db .ASIC_DB , 'ASIC_STATE:SAI_OBJECT_TYPE_HOSTIF:oid:*' )
92
+ keys = [] if keys is None else keys
93
+ for key in keys :
94
+ value = asic_db .get_all (asic_db .ASIC_DB , key )
89
95
if value ['SAI_HOSTIF_ATTR_TYPE' ] != 'SAI_HOSTIF_TYPE_NETDEV' :
90
96
continue
91
97
port_id = value ['SAI_HOSTIF_ATTR_OBJ_ID' ]
92
98
iface_name = value ['SAI_HOSTIF_ATTR_NAME' ]
93
- port_id_2_iface [port_id ] = iface_name
99
+ host_port_id_2_iface [port_id ] = iface_name
100
+
101
+ return host_port_id_2_iface
102
+
103
+ def get_map_lag_port_id_2_portchannel_name (asic_db , app_db , host_port_id_2_iface ):
104
+ lag_port_id_2_iface = {}
105
+ keys = asic_db .keys (asic_db .ASIC_DB , 'ASIC_STATE:SAI_OBJECT_TYPE_LAG_MEMBER:oid:*' )
106
+ keys = [] if keys is None else keys
107
+ for key in keys :
108
+ value = asic_db .get_all (asic_db .ASIC_DB , key )
109
+ lag_id = value ['SAI_LAG_MEMBER_ATTR_LAG_ID' ]
110
+ if lag_id in lag_port_id_2_iface :
111
+ continue
112
+ member_id = value ['SAI_LAG_MEMBER_ATTR_PORT_ID' ]
113
+ member_name = host_port_id_2_iface [member_id ]
114
+ lag_name = get_lag_by_member (member_name , app_db )
115
+ if lag_name is not None :
116
+ lag_port_id_2_iface [lag_id ] = lag_name
117
+
118
+ return lag_port_id_2_iface
119
+
120
+ def get_map_port_id_2_iface_name (asic_db , app_db ):
121
+ port_id_2_iface = {}
122
+ host_port_id_2_iface = get_map_host_port_id_2_iface_name (asic_db )
123
+ port_id_2_iface .update (host_port_id_2_iface )
124
+ lag_port_id_2_iface = get_map_lag_port_id_2_portchannel_name (asic_db , app_db , host_port_id_2_iface )
125
+ port_id_2_iface .update (lag_port_id_2_iface )
94
126
95
127
return port_id_2_iface
96
128
97
- def get_map_bridge_port_id_2_iface_name (db ):
98
- bridge_port_id_2_port_id = get_bridge_port_id_2_port_id (db )
99
- port_id_2_iface = get_map_port_id_2_iface_name (db )
129
+ def get_map_bridge_port_id_2_iface_name (asic_db , app_db ):
130
+ bridge_port_id_2_port_id = get_bridge_port_id_2_port_id (asic_db )
131
+ port_id_2_iface = get_map_port_id_2_iface_name (asic_db , app_db )
100
132
101
133
bridge_port_id_2_iface_name = {}
102
134
@@ -158,29 +190,37 @@ def get_fdb(db, vlan_name, vlan_id, bridge_id_2_iface):
158
190
return fdb_entries , available_macs , map_mac_ip
159
191
160
192
def generate_fdb_entries (filename ):
161
- fdb_entries = []
193
+ asic_db = swsssdk .SonicV2Connector (host = '127.0.0.1' )
194
+ app_db = swsssdk .SonicV2Connector (host = '127.0.0.1' )
195
+ asic_db .connect (asic_db .ASIC_DB , False ) # Make one attempt only
196
+ app_db .connect (app_db .APPL_DB , False ) # Make one attempt only
162
197
163
- db = SonicV2Connector (use_unix_socket_path = False )
164
- db .connect (db .ASIC_DB , False ) # Make one attempt only
198
+ vlan_ifaces = get_vlan_ifaces ()
165
199
166
- bridge_id_2_iface = get_map_bridge_port_id_2_iface_name ( db )
200
+ fdb_entries , all_available_macs , map_mac_ip_per_vlan = generate_fdb_entries_logic ( asic_db , app_db , vlan_ifaces )
167
201
168
- vlan_ifaces = get_vlan_ifaces ()
202
+ asic_db .close (asic_db .ASIC_DB )
203
+ app_db .close (app_db .APPL_DB )
204
+
205
+ with open (filename , 'w' ) as fp :
206
+ json .dump (fdb_entries , fp , indent = 2 , separators = (',' , ': ' ))
169
207
208
+ return all_available_macs , map_mac_ip_per_vlan
209
+
210
+ def generate_fdb_entries_logic (asic_db , app_db , vlan_ifaces ):
211
+ fdb_entries = []
170
212
all_available_macs = set ()
171
213
map_mac_ip_per_vlan = {}
214
+
215
+ bridge_id_2_iface = get_map_bridge_port_id_2_iface_name (asic_db , app_db )
216
+
172
217
for vlan in vlan_ifaces :
173
218
vlan_id = int (vlan .replace ('Vlan' , '' ))
174
- fdb_entry , available_macs , map_mac_ip_per_vlan [vlan ] = get_fdb (db , vlan , vlan_id , bridge_id_2_iface )
219
+ fdb_entry , available_macs , map_mac_ip_per_vlan [vlan ] = get_fdb (asic_db , vlan , vlan_id , bridge_id_2_iface )
175
220
all_available_macs |= available_macs
176
221
fdb_entries .extend (fdb_entry )
177
222
178
- db .close (db .ASIC_DB )
179
-
180
- with open (filename , 'w' ) as fp :
181
- json .dump (fdb_entries , fp , indent = 2 , separators = (',' , ': ' ))
182
-
183
- return all_available_macs , map_mac_ip_per_vlan
223
+ return fdb_entries , all_available_macs , map_mac_ip_per_vlan
184
224
185
225
def get_if (iff , cmd ):
186
226
s = socket .socket ()
0 commit comments