@@ -39,10 +39,7 @@ def generate_neighbor_entries(filename, all_available_macs):
3939 }
4040 arp_output .append (obj )
4141
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 ]
4643 neighbor_entries .append ((vlan_name , mac , ip_addr ))
4744 syslog .syslog (syslog .LOG_INFO , "Neighbor entry: [Vlan: %s, Mac: %s, Ip: %s]" % (vlan_name , mac , ip_addr ))
4845
@@ -80,23 +77,58 @@ def get_bridge_port_id_2_port_id(db):
8077
8178 return bridge_port_id_2_port_id
8279
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:*' )
8682 keys = [] if keys is None else keys
8783 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 )
8995 if value ['SAI_HOSTIF_ATTR_TYPE' ] != 'SAI_HOSTIF_TYPE_NETDEV' :
9096 continue
9197 port_id = value ['SAI_HOSTIF_ATTR_OBJ_ID' ]
9298 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 )
94126
95127 return port_id_2_iface
96128
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 )
100132
101133 bridge_port_id_2_iface_name = {}
102134
@@ -158,29 +190,37 @@ def get_fdb(db, vlan_name, vlan_id, bridge_id_2_iface):
158190 return fdb_entries , available_macs , map_mac_ip
159191
160192def 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
162197
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 ()
165199
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 )
167201
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 = (',' , ': ' ))
169207
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 = []
170212 all_available_macs = set ()
171213 map_mac_ip_per_vlan = {}
214+
215+ bridge_id_2_iface = get_map_bridge_port_id_2_iface_name (asic_db , app_db )
216+
172217 for vlan in vlan_ifaces :
173218 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 )
175220 all_available_macs |= available_macs
176221 fdb_entries .extend (fdb_entry )
177222
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
184224
185225def get_if (iff , cmd ):
186226 s = socket .socket ()
0 commit comments