@@ -102,92 +102,157 @@ void MsgBusImpl_redis::update_Peer(obj_bgp_peer &peer, obj_peer_up_event *up, ob
102102/* *
103103 * Abstract method Implementation - See MsgBusInterface.hpp for details
104104 */
105- void MsgBusImpl_redis::update_unicastPrefix (obj_bgp_peer &peer, vector<obj_rib> &rib,
106- obj_path_attr *attr, unicast_prefix_action_code code) {
107- if (attr == NULL )
105+ void MsgBusImpl_redis::update_unicastPrefix (obj_bgp_peer &peer,
106+ std::vector<obj_rib> &rib,
107+ obj_path_attr *attr,
108+ unicast_prefix_action_code code)
109+ {
110+ if (code == UNICAST_PREFIX_ACTION_ADD && attr == nullptr ) {
111+ LOG_INFO (" update_unicastPrefix: ADD requested but attr==NULL (peer=%s) — ignoring" , peer.peer_addr );
108112 return ;
113+ }
114+
115+ const char * actionStr = (code == UNICAST_PREFIX_ACTION_ADD) ? " add" : " del" ;
116+
117+ std::string ts, path_hash_str, peer_hash_str, router_hash_str;
118+ getTimestamp (peer.timestamp_secs , peer.timestamp_us , ts);
119+ if (attr) hash_toStr (attr->hash_id , path_hash_str);
120+ hash_toStr (peer.hash_id , peer_hash_str);
121+ hash_toStr (peer.router_hash_id , router_hash_str);
122+
123+ LOG_INFO (" MsgBusImpl_redis update_unicastPrefix[start] action=%s peer=%s as=%u ts=%s rib_size=%zu isAdjIn=%d isPrePolicy=%d" ,
124+ actionStr, peer.peer_addr , peer.peer_as , ts.c_str (), rib.size (),
125+ (int )peer.isAdjIn , (int )peer.isPrePolicy );
126+
127+ std::vector<std::string> del_keys;
128+ del_keys.reserve (rib.size ());
129+
130+ size_t add_count = 0 , del_count = 0 ;
109131
110- vector<string> del_keys;
111- string neigh = peer.peer_addr ;
112-
113- for (size_t i = 0 ; i < rib.size (); i++) {
114- // Loop through the vector array of rib entries
115- vector<swss::FieldValueTuple> addFieldValues;
116- addFieldValues.reserve (MAX_ATTRIBUTES_COUNT);
117-
118- // rib table schema as BGP_RIB_OUT_TABLE|192.181.168.0/25|10.0.0.59
119- vector<string> keys;
120- string redisMgr_pfx = rib[i].prefix ;
121- redisMgr_pfx += " /" ;
122- redisMgr_pfx += to_string (rib[i].prefix_len );
123- keys.reserve (MAX_ATTRIBUTES_COUNT);
124- keys.emplace_back (redisMgr_pfx);
132+ for (size_t i = 0 ; i < rib.size (); ++i) {
133+ // Compose "prefix/len"
134+ std::string pfx_len = std::string (rib[i].prefix ) + " /" + std::to_string (rib[i].prefix_len );
135+
136+ // Redis key parts
137+ std::vector<std::string> keys;
138+ keys.reserve (2 );
139+ keys.emplace_back (pfx_len);
125140 keys.emplace_back (peer.peer_addr );
126141
127- switch (code) {
142+ // RIB hash
143+ std::string rib_hash_str;
144+ hash_toStr (rib[i].hash_id , rib_hash_str);
145+
146+ LOG_INFO (" MsgBusImpl_redis RIB[%zu] prefix=%s/%d isIPv4=%d path_id=%u labels=%s rib_hash=%s" ,
147+ i, rib[i].prefix , rib[i].prefix_len , (int )rib[i].isIPv4 ,
148+ (unsigned )rib[i].path_id , rib[i].labels , rib_hash_str.c_str ());
149+
150+ if (code == UNICAST_PREFIX_ACTION_ADD) {
151+ const char * origin = attr->origin ; // C-string
152+ const std::string& as_path = attr->as_path ; // std::string
153+ uint32_t as_path_count = attr->as_path_count ;
154+ uint32_t origin_as = attr->origin_as ;
155+ const char * next_hop = attr->next_hop ; // C-string
156+ uint32_t med = attr->med ;
157+ uint32_t local_pref = attr->local_pref ;
158+ const char * aggregator = attr->aggregator ; // C-string
159+ const std::string& comm = attr->community_list ; // std::string
160+ const std::string& ext_comm = attr->ext_community_list ;// std::string
161+ const char * cluster_list = attr->cluster_list ; // C-string
162+ int atomic_agg = (int )attr->atomic_agg ;
163+ int nexthop_isIPv4 = (int )attr->nexthop_isIPv4 ;
164+ const char * originator_id = attr->originator_id ; // C-string
165+ uint32_t path_id = rib[i].path_id ;
166+ const char * labels = rib[i].labels ; // C-string
167+ int isPrePolicy = (int )peer.isPrePolicy ;
168+ int isAdjIn = (int )peer.isAdjIn ;
169+ const std::string& large_comm= attr->large_community_list ;
128170
129- case UNICAST_PREFIX_ACTION_ADD:
130171 {
131- addFieldValues.emplace_back (make_pair (" origin" , string (attr->origin )));
132- addFieldValues.emplace_back (make_pair (" as_path" , attr->as_path ));
133- stringstream as_path_count;
134- as_path_count << attr->as_path_count ;
135- addFieldValues.emplace_back (make_pair (" as_path_count" , as_path_count.str ()));
136- stringstream origin_as;
137- origin_as << attr->origin_as ;
138- addFieldValues.emplace_back (make_pair (" origin_as" , origin_as.str ()));
139- addFieldValues.emplace_back (make_pair (" next_hop" , string (attr->next_hop )));
140- stringstream local_pref;
141- local_pref << attr->local_pref ;
142- addFieldValues.emplace_back (make_pair (" local_pref" , local_pref.str ()));
143- addFieldValues.emplace_back (make_pair (" community_list" , attr->community_list ));
144- addFieldValues.emplace_back (make_pair (" ext_community_list" , attr->ext_community_list ));
145- addFieldValues.emplace_back (make_pair (" large_community_list" , attr->large_community_list ));
146- addFieldValues.emplace_back (make_pair (" originator_id" , string (attr->originator_id )));
147-
148- for (const auto & fieldValue : addFieldValues) {
149- const std::string& field = std::get<0 >(fieldValue);
150- const std::string& value = std::get<1 >(fieldValue);
151- DEBUG (" MsgBusImpl_redis update_unicastPrefix field = %s, value = %s" , field.c_str (), value.c_str ());
152- }
153- if (peer.isAdjIn )
154- {
155- redisMgr_.WriteBMPTable (BMP_TABLE_RIB_IN, keys, addFieldValues);
156- }
157- else
158- {
159- redisMgr_.WriteBMPTable (BMP_TABLE_RIB_OUT, keys, addFieldValues);
160- }
172+ char raw[4096 ];
173+ std::snprintf (raw, sizeof (raw),
174+ " %s\t %llu\t %s\t %s\t %s\t %s\t %s\t %" PRIu32 " \t %s\t %s\t %d\t %d\t %s\t %s\t %u\t %u\t %s\t %u\t %u\t %s\t %s\t %s\t %s\t %d\t %d\t %s\t %u\t %s\t %d\t %d\t %s" ,
175+ actionStr,
176+ (unsigned long long )0 , /* seq if you have one */
177+ rib_hash_str.c_str (), router_hash_str.c_str (),
178+ path_hash_str.c_str (), peer_hash_str.c_str (),
179+ peer.peer_addr ,
180+ (unsigned )peer.peer_as , ts.c_str (),
181+ rib[i].prefix , rib[i].prefix_len , (int )rib[i].isIPv4 ,
182+ origin, as_path.c_str (), as_path_count,
183+ origin_as, next_hop, med, local_pref,
184+ aggregator, comm.c_str (), ext_comm.c_str (), cluster_list,
185+ atomic_agg, nexthop_isIPv4,
186+ originator_id, path_id,
187+ labels, isPrePolicy, isAdjIn,
188+ large_comm.c_str ());
189+
190+ LOG_INFO (" RAW_LINE[%zu]=%s" , i, raw);
161191 }
162- break ;
163192
164- case UNICAST_PREFIX_ACTION_DEL:
165- {
166- string com_key;
167- if (peer.isAdjIn )
168- {
169- com_key = BMP_TABLE_RIB_IN;
170- }
171- else
172- {
173- com_key = BMP_TABLE_RIB_OUT;
174- }
175- com_key += redisMgr_.GetKeySeparator ();
176- com_key += redisMgr_pfx;
177- com_key += redisMgr_.GetKeySeparator ();
178- com_key += neigh;
179- del_keys.push_back (com_key);
180- }
181- break ;
193+
194+ std::vector<swss::FieldValueTuple> fvs;
195+ fvs.reserve (32 );
196+ fvs.emplace_back (std::make_pair (" origin" , std::string (origin)));
197+ fvs.emplace_back (std::make_pair (" as_path" , as_path));
198+ fvs.emplace_back (std::make_pair (" as_path_count" , std::to_string (as_path_count)));
199+ fvs.emplace_back (std::make_pair (" origin_as" , std::to_string (origin_as)));
200+ fvs.emplace_back (std::make_pair (" next_hop" , std::string (next_hop)));
201+ fvs.emplace_back (std::make_pair (" med" , std::to_string (med)));
202+ fvs.emplace_back (std::make_pair (" local_pref" , std::to_string (local_pref)));
203+ fvs.emplace_back (std::make_pair (" aggregator" , std::string (aggregator)));
204+ fvs.emplace_back (std::make_pair (" community_list" , comm));
205+ fvs.emplace_back (std::make_pair (" ext_community_list" , ext_comm));
206+ fvs.emplace_back (std::make_pair (" cluster_list" , std::string (cluster_list)));
207+ fvs.emplace_back (std::make_pair (" atomic_agg" , std::to_string (atomic_agg)));
208+ fvs.emplace_back (std::make_pair (" nexthop_isIPv4" , std::to_string (nexthop_isIPv4)));
209+ fvs.emplace_back (std::make_pair (" originator_id" , std::string (originator_id)));
210+ fvs.emplace_back (std::make_pair (" large_community_list" , large_comm));
211+
212+ // RIB & peer context; hashes & ts
213+ fvs.emplace_back (std::make_pair (" path_id" , std::to_string (path_id)));
214+ fvs.emplace_back (std::make_pair (" labels" , std::string (labels)));
215+ fvs.emplace_back (std::make_pair (" isIPv4" , std::to_string ((int )rib[i].isIPv4 )));
216+ fvs.emplace_back (std::make_pair (" peer_as" , std::to_string (peer.peer_as )));
217+ fvs.emplace_back (std::make_pair (" isPrePolicy" , std::to_string (isPrePolicy)));
218+ fvs.emplace_back (std::make_pair (" isAdjIn" , std::to_string (isAdjIn)));
219+ fvs.emplace_back (std::make_pair (" rib_hash" , rib_hash_str));
220+ fvs.emplace_back (std::make_pair (" path_hash" , path_hash_str));
221+ fvs.emplace_back (std::make_pair (" peer_hash" , peer_hash_str));
222+ fvs.emplace_back (std::make_pair (" router_hash" , router_hash_str));
223+ fvs.emplace_back (std::make_pair (" ts" , ts));
224+
225+
226+ const char * table = peer.isAdjIn ? BMP_TABLE_RIB_IN : BMP_TABLE_RIB_OUT;
227+ LOG_INFO (" MsgBusImpl_redis ADD -> table=%s key=%s|%s fields_count=%zu" ,
228+ table, pfx_len.c_str (), peer.peer_addr , fvs.size ());
229+
230+ if (peer.isAdjIn )
231+ redisMgr_.WriteBMPTable (BMP_TABLE_RIB_IN, keys, fvs);
232+ else
233+ redisMgr_.WriteBMPTable (BMP_TABLE_RIB_OUT, keys, fvs);
234+
235+ ++add_count;
236+ } else {
237+ std::string com_key = peer.isAdjIn ? BMP_TABLE_RIB_IN : BMP_TABLE_RIB_OUT;
238+ com_key += redisMgr_.GetKeySeparator () + pfx_len;
239+ com_key += redisMgr_.GetKeySeparator () + peer.peer_addr ;
240+ LOG_INFO (" MsgBusImpl_redis DEL -> key=%s" , com_key.c_str ());
241+ del_keys.push_back (com_key);
242+ ++del_count;
182243 }
183244 }
184245
185246 if (!del_keys.empty ()) {
247+ LOG_INFO (" MsgBusImpl_redis RemoveEntityFromBMPTable count=%zu" , del_keys.size ());
186248 redisMgr_.RemoveEntityFromBMPTable (del_keys);
187249 }
250+
251+ LOG_INFO (" MsgBusImpl_redis update_unicastPrefix[done] action=%s adds=%zu dels=%zu" , actionStr, add_count, del_count);
188252}
189253
190254
255+
191256/* *
192257 * Abstract method Implementation - See MsgBusInterface.hpp for details
193258 */
0 commit comments