@@ -318,29 +318,30 @@ bool DashVnetOrch::addOutboundCaToPa(const string& key, VnetMapBulkContext& ctxt
318318 return false ;
319319 }
320320
321+ uint32_t routing_type_tunnel_key = 0 ;
322+ sai_dash_encapsulation_t encap_type = SAI_DASH_ENCAPSULATION_INVALID;
321323 for (auto action: route_type_actions.items ())
322324 {
323325 if (action.action_type () == dash::route_type::ACTION_TYPE_STATICENCAP)
324326 {
325- outbound_ca_to_pa_attr.id = SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_DASH_ENCAPSULATION;
326327 if (action.encap_type () == dash::route_type::ENCAP_TYPE_VXLAN)
327328 {
328- outbound_ca_to_pa_attr. value . u32 = SAI_DASH_ENCAPSULATION_VXLAN;
329+ encap_type = SAI_DASH_ENCAPSULATION_VXLAN;
329330 }
330331 else if (action.encap_type () == dash::route_type::ENCAP_TYPE_NVGRE)
331332 {
332- outbound_ca_to_pa_attr. value . u32 = SAI_DASH_ENCAPSULATION_NVGRE;
333+ encap_type = SAI_DASH_ENCAPSULATION_NVGRE;
333334 }
334335 else
335336 {
336337 SWSS_LOG_ERROR (" Invalid encap type %d for %s" , action.encap_type (), key.c_str ());
337338 return true ;
338339 }
339- outbound_ca_to_pa_attrs.push_back (outbound_ca_to_pa_attr);
340340
341- outbound_ca_to_pa_attr.id = SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_TUNNEL_KEY;
342- outbound_ca_to_pa_attr.value .u32 = action.vni ();
343- outbound_ca_to_pa_attrs.push_back (outbound_ca_to_pa_attr);
341+ if (action.has_vni ())
342+ {
343+ routing_type_tunnel_key = action.vni ();
344+ }
344345
345346 outbound_ca_to_pa_attr.id = SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP;
346347 to_sai (ctxt.metadata .underlay_ip (), outbound_ca_to_pa_attr.value .ipaddr );
@@ -349,6 +350,7 @@ bool DashVnetOrch::addOutboundCaToPa(const string& key, VnetMapBulkContext& ctxt
349350 }
350351 }
351352
353+ // Setting SAI attributes that are valid for all values of SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_ACTION
352354 if (ctxt.metadata .has_tunnel ())
353355 {
354356 auto tunnel_oid = gDirectory .get <DashTunnelOrch*>()->getTunnelOid (ctxt.metadata .tunnel ());
@@ -362,12 +364,25 @@ bool DashVnetOrch::addOutboundCaToPa(const string& key, VnetMapBulkContext& ctxt
362364 outbound_ca_to_pa_attrs.push_back (outbound_ca_to_pa_attr);
363365 }
364366
367+ if (ctxt.metadata .has_metering_class_or ())
368+ {
369+ outbound_ca_to_pa_attr.id = SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS_OR;
370+ outbound_ca_to_pa_attr.value .u32 = ctxt.metadata .metering_class_or ();
371+ outbound_ca_to_pa_attrs.push_back (outbound_ca_to_pa_attr);
372+ }
373+
365374 if (ctxt.metadata .routing_type () == dash::route_type::ROUTING_TYPE_PRIVATELINK)
366375 {
376+ SWSS_LOG_DEBUG (" Creating private link outbound CA to PA entry for %s" , key.c_str ());
377+ // Setting SAI attributes specific to private link routing type
367378 outbound_ca_to_pa_attr.id = SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_ACTION;
368379 outbound_ca_to_pa_attr.value .u32 = SAI_OUTBOUND_CA_TO_PA_ENTRY_ACTION_SET_PRIVATE_LINK_MAPPING;
369380 outbound_ca_to_pa_attrs.push_back (outbound_ca_to_pa_attr);
370381
382+ outbound_ca_to_pa_attr.id = SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_DASH_ENCAPSULATION;
383+ outbound_ca_to_pa_attr.value .u32 = encap_type;
384+ outbound_ca_to_pa_attrs.push_back (outbound_ca_to_pa_attr);
385+
371386 outbound_ca_to_pa_attr.id = SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DIP;
372387 to_sai (ctxt.metadata .overlay_dip_prefix ().ip (), outbound_ca_to_pa_attr.value .ipaddr );
373388 outbound_ca_to_pa_attrs.push_back (outbound_ca_to_pa_attr);
@@ -376,7 +391,6 @@ bool DashVnetOrch::addOutboundCaToPa(const string& key, VnetMapBulkContext& ctxt
376391 to_sai (ctxt.metadata .overlay_dip_prefix ().mask (), outbound_ca_to_pa_attr.value .ipaddr );
377392 outbound_ca_to_pa_attrs.push_back (outbound_ca_to_pa_attr);
378393
379-
380394 outbound_ca_to_pa_attr.id = SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_SIP;
381395 to_sai (ctxt.metadata .overlay_sip_prefix ().ip (), outbound_ca_to_pa_attr.value .ipaddr );
382396 outbound_ca_to_pa_attrs.push_back (outbound_ca_to_pa_attr);
@@ -385,6 +399,13 @@ bool DashVnetOrch::addOutboundCaToPa(const string& key, VnetMapBulkContext& ctxt
385399 to_sai (ctxt.metadata .overlay_sip_prefix ().mask (), outbound_ca_to_pa_attr.value .ipaddr );
386400 outbound_ca_to_pa_attrs.push_back (outbound_ca_to_pa_attr);
387401
402+ if (routing_type_tunnel_key != 0 )
403+ {
404+ outbound_ca_to_pa_attr.id = SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_TUNNEL_KEY;
405+ outbound_ca_to_pa_attr.value .u32 = routing_type_tunnel_key;
406+ outbound_ca_to_pa_attrs.push_back (outbound_ca_to_pa_attr);
407+ }
408+
388409 if (ctxt.metadata .has_port_map ())
389410 {
390411 auto port_map_oid =
@@ -400,26 +421,22 @@ bool DashVnetOrch::addOutboundCaToPa(const string& key, VnetMapBulkContext& ctxt
400421 outbound_ca_to_pa_attrs.push_back (outbound_ca_to_pa_attr);
401422 }
402423 }
403-
404- if (ctxt.metadata .has_metering_class_or ())
405- {
406- outbound_ca_to_pa_attr.id = SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS_OR;
407- outbound_ca_to_pa_attr.value .u32 = ctxt.metadata .metering_class_or ();
408- outbound_ca_to_pa_attrs.push_back (outbound_ca_to_pa_attr);
409- }
410-
411- if (ctxt.metadata .has_mac_address ())
424+ else
412425 {
413- outbound_ca_to_pa_attr.id = SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC;
414- memcpy (outbound_ca_to_pa_attr.value .mac , ctxt.metadata .mac_address ().c_str (), sizeof (sai_mac_t ));
415- outbound_ca_to_pa_attrs.push_back (outbound_ca_to_pa_attr);
416- }
426+ // Setting SAI attributes specific to non-private link routing types
427+ if (ctxt.metadata .has_mac_address ())
428+ {
429+ outbound_ca_to_pa_attr.id = SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC;
430+ memcpy (outbound_ca_to_pa_attr.value .mac , ctxt.metadata .mac_address ().c_str (), sizeof (sai_mac_t ));
431+ outbound_ca_to_pa_attrs.push_back (outbound_ca_to_pa_attr);
432+ }
417433
418- if (ctxt.metadata .has_use_dst_vni ())
419- {
420- outbound_ca_to_pa_attr.id = SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI;
421- outbound_ca_to_pa_attr.value .booldata = ctxt.metadata .use_dst_vni ();
422- outbound_ca_to_pa_attrs.push_back (outbound_ca_to_pa_attr);
434+ if (ctxt.metadata .has_use_dst_vni ())
435+ {
436+ outbound_ca_to_pa_attr.id = SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI;
437+ outbound_ca_to_pa_attr.value .booldata = ctxt.metadata .use_dst_vni ();
438+ outbound_ca_to_pa_attrs.push_back (outbound_ca_to_pa_attr);
439+ }
423440 }
424441
425442 object_statuses.emplace_back ();
0 commit comments