@@ -23,12 +23,14 @@ extern Directory<Orch*> gDirectory;
23
23
extern sai_router_interface_api_t * sai_router_intfs_api;
24
24
extern sai_route_api_t * sai_route_api;
25
25
extern sai_neighbor_api_t * sai_neighbor_api;
26
+ extern sai_switch_api_t * sai_switch_api;
26
27
27
28
extern sai_object_id_t gSwitchId ;
28
29
extern PortsOrch *gPortsOrch ;
29
30
extern RouteOrch *gRouteOrch ;
30
31
extern CrmOrch *gCrmOrch ;
31
32
extern BufferOrch *gBufferOrch ;
33
+ extern bool gIsNatSupported ;
32
34
33
35
const int intfsorch_pri = 35 ;
34
36
@@ -165,6 +167,35 @@ bool IntfsOrch::setRouterIntfsMtu(const Port &port)
165
167
return true ;
166
168
}
167
169
170
+ bool IntfsOrch::setRouterIntfsNatZoneId (Port &port)
171
+ {
172
+ SWSS_LOG_ENTER ();
173
+
174
+ /* Return true if the router interface is not exists */
175
+ if (!port.m_rif_id )
176
+ {
177
+ SWSS_LOG_WARN (" Router interface is not exists on %s" ,
178
+ port.m_alias .c_str ());
179
+ return true ;
180
+ }
181
+
182
+ sai_attribute_t attr;
183
+ attr.id = SAI_ROUTER_INTERFACE_ATTR_NAT_ZONE_ID;
184
+ attr.value .u32 = port.m_nat_zone_id ;
185
+
186
+ sai_status_t status = sai_router_intfs_api->
187
+ set_router_interface_attribute (port.m_rif_id , &attr);
188
+ if (status != SAI_STATUS_SUCCESS)
189
+ {
190
+ SWSS_LOG_ERROR (" Failed to set router interface %s NAT Zone Id to %u, rv:%d" ,
191
+ port.m_alias .c_str (), port.m_nat_zone_id , status);
192
+ return false ;
193
+ }
194
+ SWSS_LOG_NOTICE (" Set router interface %s NAT Zone Id to %u" ,
195
+ port.m_alias .c_str (), port.m_nat_zone_id );
196
+ return true ;
197
+ }
198
+
168
199
bool IntfsOrch::setRouterIntfsAdminStatus (const Port &port)
169
200
{
170
201
SWSS_LOG_ENTER ();
@@ -404,9 +435,11 @@ void IntfsOrch::doTask(Consumer &consumer)
404
435
}
405
436
406
437
const vector<FieldValueTuple>& data = kfvFieldsValues (t);
407
- string vrf_name = " " , vnet_name = " " ;
438
+ string vrf_name = " " , vnet_name = " " , nat_zone = " " ;
408
439
uint32_t mtu;
409
440
bool adminUp;
441
+ uint32_t nat_zone_id = 0 ;
442
+
410
443
for (auto idx : data)
411
444
{
412
445
const auto &field = fvField (idx);
@@ -419,6 +452,19 @@ void IntfsOrch::doTask(Consumer &consumer)
419
452
{
420
453
vnet_name = value;
421
454
}
455
+ else if (field == " nat_zone" )
456
+ {
457
+ try
458
+ {
459
+ nat_zone_id = (uint32_t )stoul (value);
460
+ }
461
+ catch (...)
462
+ {
463
+ SWSS_LOG_ERROR (" Invalid argument %s for nat zone" , value.c_str ());
464
+ continue ;
465
+ }
466
+ nat_zone = value;
467
+ }
422
468
else if (field == " mtu" )
423
469
{
424
470
try
@@ -452,6 +498,10 @@ void IntfsOrch::doTask(Consumer &consumer)
452
498
}
453
499
}
454
500
}
501
+ else if (field == " nat_zone" )
502
+ {
503
+ nat_zone = value;
504
+ }
455
505
}
456
506
457
507
if (alias == " eth0" || alias == " docker0" )
@@ -555,6 +605,23 @@ void IntfsOrch::doTask(Consumer &consumer)
555
605
it++;
556
606
continue ;
557
607
}
608
+
609
+ /* Set nat zone id */
610
+ if ((!nat_zone.empty ()) and (port.m_nat_zone_id != nat_zone_id))
611
+ {
612
+ port.m_nat_zone_id = nat_zone_id;
613
+
614
+ if (gIsNatSupported )
615
+ {
616
+ setRouterIntfsNatZoneId (port);
617
+ }
618
+ else
619
+ {
620
+ SWSS_LOG_NOTICE (" Not set router interface %s NAT Zone Id to %u, as NAT is not supported" ,
621
+ port.m_alias .c_str (), port.m_nat_zone_id );
622
+ }
623
+ gPortsOrch ->setPort (alias, port);
624
+ }
558
625
}
559
626
560
627
it = consumer.m_toSync .erase (it);
@@ -739,6 +806,15 @@ bool IntfsOrch::addRouterIntfs(sai_object_id_t vrf_id, Port &port)
739
806
attr.value .u32 = port.m_mtu ;
740
807
attrs.push_back (attr);
741
808
809
+ if (gIsNatSupported )
810
+ {
811
+ attr.id = SAI_ROUTER_INTERFACE_ATTR_NAT_ZONE_ID;
812
+ attr.value .u32 = port.m_nat_zone_id ;
813
+
814
+ SWSS_LOG_INFO (" Assinging NAT zone id %d to interface %s\n " , attr.value .u32 , port.m_alias .c_str ());
815
+ attrs.push_back (attr);
816
+ }
817
+
742
818
sai_status_t status = sai_router_intfs_api->create_router_interface (&port.m_rif_id , gSwitchId , (uint32_t )attrs.size (), attrs.data ());
743
819
if (status != SAI_STATUS_SUCCESS)
744
820
{
@@ -779,6 +855,7 @@ bool IntfsOrch::removeRouterIntfs(Port &port)
779
855
780
856
port.m_rif_id = 0 ;
781
857
port.m_vr_id = 0 ;
858
+ port.m_nat_zone_id = 0 ;
782
859
gPortsOrch ->setPort (port.m_alias , port);
783
860
784
861
SWSS_LOG_NOTICE (" Remove router interface for port %s" , port.m_alias .c_str ());
0 commit comments