@@ -28,6 +28,8 @@ bool VRFOrch::addOperation(const Request& request)
28
28
SWSS_LOG_ENTER ();
29
29
uint32_t vni = 0 ;
30
30
bool error = true ;
31
+ bool sync_mode = false ;
32
+  bool sync_mode_config = false ;
31
33
32
34
sai_attribute_t attr;
33
35
vector<sai_attribute_t > attrs;
@@ -75,6 +77,12 @@ bool VRFOrch::addOperation(const Request& request)
75
77
SWSS_LOG_INFO (" MGMT VRF field: %s ignored" , name.c_str ());
76
78
continue ;
77
79
}
80
+ else if (name == " sync_mode" )
81
+ {
82
+ sync_mode_config = true ;
83
+ sync_mode = request.getAttrBool (" sync_mode" );
84
+ continue ;
85
+ }
78
86
else
79
87
{
80
88
SWSS_LOG_ERROR (" Logic error: Unknown attribute: %s" , name.c_str ());
@@ -95,27 +103,46 @@ bool VRFOrch::addOperation(const Request& request)
95
103
attrs.data ());
96
104
if (status != SAI_STATUS_SUCCESS)
97
105
{
98
- ReturnCode rc = ReturnCode (status)
99
- << " Failed to create virtual router name: "
100
- << vrf_name << " , rv: " << sai_serialize_status (status);
101
- SWSS_LOG_ERROR (" %s" , rc.message ().c_str ());
102
- m_publisher.publish (request.getTableName (), request.getFullKey (),
103
- request.getFullAttrFields (), rc);
104
- handleSaiCreateStatus (SAI_API_VIRTUAL_ROUTER, status);
105
- // Remove from orchagent queue when there is SAI error
106
- return true ;
106
+ SWSS_LOG_ERROR (" Failed to create virtual router name: %s, rv: %d" , vrf_name.c_str (), status);
107
+ task_process_status handle_status = handleSaiCreateStatus (SAI_API_VIRTUAL_ROUTER, status);
108
+ if (sync_mode)
109
+ {
110
+ ReturnCode rc = ReturnCode (status)
111
+ << " Failed to create virtual router name: "
112
+ << vrf_name << " , rv: " << sai_serialize_status (status);
113
+ m_publisher.publish (request.getTableName (), request.getFullKey (),
114
+ request.getFullAttrFields (), rc);
115
+ return true ;
116
+ }
117
+ else if (handle_status != task_success)
118
+ {
119
+ return parseHandleSaiStatusFailure (handle_status);
120
+ }
107
121
}
108
122
109
123
vrf_table_[vrf_name].vrf_id = router_id;
110
124
vrf_table_[vrf_name].ref_count = 0 ;
125
+ vrf_table_[vrf_name].sync_mode = sync_mode;
111
126
vrf_id_table_[router_id] = vrf_name;
112
127
if (vni != 0 )
113
128
{
114
129
SWSS_LOG_INFO (" VRF '%s' vni %d add" , vrf_name.c_str (), vni);
115
130
error = updateVrfVNIMap (vrf_name, vni);
116
131
if (error == false )
117
132
{
118
- return false ;
133
+ if (sync_mode)
134
+ {
135
+ ReturnCode rc = ReturnCode (StatusCode::SWSS_RC_INVALID_PARAM)
136
+ << " Failed to update VRF vni map." ;
137
+ SWSS_LOG_ERROR (" %s" , rc.message ().c_str ());
138
+ m_publisher.publish (request.getTableName (), request.getFullKey (),
139
+ request.getFullAttrFields (), rc);
140
+ return true ;
141
+ }
142
+ else
143
+ {
144
+ return false ;
145
+ }
119
146
}
120
147
}
121
148
m_stateVrfObjectTable.hset (vrf_name, " state" , " ok" );
@@ -125,37 +152,65 @@ bool VRFOrch::addOperation(const Request& request)
125
152
{
126
153
// Update an existing vrf
127
154
155
+ if (sync_mode_config)
156
+ {
157
+ vrf_table_[vrf_name].sync_mode = sync_mode;
158
+ }
159
+
128
160
sai_object_id_t router_id = it->second .vrf_id ;
129
161
130
162
for (const auto & attr: attrs)
131
163
{
132
164
sai_status_t status = sai_virtual_router_api->set_virtual_router_attribute (router_id, &attr);
133
165
if (status != SAI_STATUS_SUCCESS)
134
166
{
135
- ReturnCode rc = ReturnCode (status)
136
- << " Failed to update virtual router attribute. vrf name: "
137
- << vrf_name << " , rv: " << sai_serialize_status (status);
138
- SWSS_LOG_ERROR (" %s" , rc.message ().c_str ());
139
- m_publisher.publish (request.getTableName (), request.getFullKey (),
140
- request.getFullAttrFields (), rc);
141
- handleSaiSetStatus (SAI_API_VIRTUAL_ROUTER, status);
142
- // Remove from orchagent queue when there is SAI error
143
- return true ;
167
+ SWSS_LOG_ERROR (" Failed to update virtual router attribute. vrf name: %s, rv: %d" , vrf_name.c_str (), status);
168
+ task_process_status handle_status = handleSaiSetStatus (SAI_API_VIRTUAL_ROUTER, status);
169
+ if (sync_mode)
170
+ {
171
+ ReturnCode rc = ReturnCode (status)
172
+ << " Failed to update virtual router attribute. vrf name: "
173
+ << vrf_name << " , rv: " << sai_serialize_status (status);
174
+ m_publisher.publish (request.getTableName (), request.getFullKey (),
175
+ request.getFullAttrFields (), rc);
176
+ return true ;
177
+ }
178
+ else if (handle_status != task_success)
179
+ {
180
+ return parseHandleSaiStatusFailure (handle_status);
181
+ }
182
+
144
183
}
145
184
}
146
185
147
186
SWSS_LOG_INFO (" VRF '%s' vni %d modify" , vrf_name.c_str (), vni);
148
187
error = updateVrfVNIMap (vrf_name, vni);
149
188
if (error == false )
150
189
{
151
- return false ;
190
+ if (sync_mode)
191
+ {
192
+ ReturnCode rc = ReturnCode (StatusCode::SWSS_RC_INVALID_PARAM)
193
+ << " Failed to update VRF vni map." ;
194
+ SWSS_LOG_ERROR (" %s" , rc.message ().c_str ());
195
+ m_publisher.publish (request.getTableName (), request.getFullKey (),
196
+ request.getFullAttrFields (), rc);
197
+ return true ;
198
+ }
199
+ else
200
+ {
201
+ return false ;
202
+ }
152
203
}
153
204
154
205
SWSS_LOG_NOTICE (" VRF '%s' was updated" , vrf_name.c_str ());
155
206
}
207
+
208
+ if (sync_mode)
209
+  {
210
+  m_publisher.publish (request.getTableName (), request.getFullKey (),
211
+  request.getFullAttrFields (), ReturnCode ());
212
+  }
156
213
157
- m_publisher.publish (request.getTableName (), request.getFullKey (),
158
- request.getFullAttrFields (), ReturnCode ());
159
214
return true ;
160
215
}
161
216
@@ -167,45 +222,78 @@ bool VRFOrch::delOperation(const Request& request)
167
222
const std::string& vrf_name = request.getKeyString (0 );
168
223
if (vrf_table_.find (vrf_name) == std::end (vrf_table_))
169
224
{
170
- ReturnCode rc = ReturnCode (StatusCode::SWSS_RC_NOT_FOUND)
171
- << " VRF '" << vrf_name << " ' doesn't exist" ;
172
- SWSS_LOG_ERROR (" %s" , rc.message ().c_str ());
173
- m_publisher.publish (request.getTableName (), request.getFullKey (),
174
- request.getFullAttrFields (), rc);
225
+ SWSS_LOG_ERROR (" VRF '%s' doesn't exist" , vrf_name.c_str ());
175
226
return true ;
176
227
}
177
228
229
+ bool sync_mode = vrf_table_[vrf_name].sync_mode ;
178
230
if (vrf_table_[vrf_name].ref_count )
179
- return false ;
231
+ {
232
+  if (sync_mode)
233
+  {
234
+  ReturnCode rc = ReturnCode (StatusCode::SWSS_RC_INVALID_PARAM)
235
+  << " Failed to delete VRF " << vrf_name
236
+  << " : reference count is not zero." ;
237
+  SWSS_LOG_ERROR (" %s" , rc.message ().c_str ());
238
+  m_publisher.publish (request.getTableName (), request.getFullKey (),
239
+  request.getFullAttrFields (), rc);
240
+  return true ;
241
+  }
242
+  else
243
+  {
244
+  return false ;
245
+  }
246
+  }
180
247
181
248
sai_object_id_t router_id = vrf_table_[vrf_name].vrf_id ;
182
249
sai_status_t status = sai_virtual_router_api->remove_virtual_router (router_id);
183
250
if (status != SAI_STATUS_SUCCESS)
184
251
{
185
- ReturnCode rc = ReturnCode (status)
186
- << " Failed to remove virtual router name: "
187
- << vrf_name << " , rv:" << sai_serialize_status (status);
188
- SWSS_LOG_ERROR (" %s" , rc.message ().c_str ());
189
- m_publisher.publish (request.getTableName (), request.getFullKey (),
190
- request.getFullAttrFields (), rc);
191
- handleSaiRemoveStatus (SAI_API_VIRTUAL_ROUTER, status);
192
- // Remove from orchagent queue when there is SAI error
193
- return true ;
252
+ SWSS_LOG_ERROR (" Failed to remove virtual router name: %s, rv:%d" , vrf_name.c_str (), status);
253
+ task_process_status handle_status = handleSaiRemoveStatus (SAI_API_VIRTUAL_ROUTER, status);
254
+ if (sync_mode)
255
+ {
256
+ ReturnCode rc = ReturnCode (status)
257
+ << " Failed to remove virtual router name: "
258
+ << vrf_name << " , rv:" << sai_serialize_status (status);
259
+ m_publisher.publish (request.getTableName (), request.getFullKey (),
260
+ request.getFullAttrFields (), rc);
261
+ return true ;
262
+ }
263
+ else if (handle_status != task_success)
264
+ {
265
+ return parseHandleSaiStatusFailure (handle_status);
266
+ }
194
267
}
195
268
196
269
vrf_table_.erase (vrf_name);
197
270
vrf_id_table_.erase (router_id);
198
271
error = delVrfVNIMap (vrf_name, 0 );
199
272
if (error == false )
200
273
{
201
- return false ;
274
+ if (sync_mode)
275
+  {
276
+  ReturnCode rc = ReturnCode (StatusCode::SWSS_RC_INVALID_PARAM)
277
+  << " Failed to delete VRF vni map." ;
278
+  SWSS_LOG_ERROR (" %s" , rc.message ().c_str ());
279
+  m_publisher.publish (request.getTableName (), request.getFullKey (),
280
+  request.getFullAttrFields (), rc);
281
+  return true ;
282
+  }
283
+  else
284
+  {
285
+  return false ;
286
+  }
202
287
}
203
288
m_stateVrfObjectTable.del (vrf_name);
204
289
205
290
SWSS_LOG_NOTICE (" VRF '%s' was removed" , vrf_name.c_str ());
206
291
207
- m_publisher.publish (request.getTableName (), request.getFullKey (),
208
- request.getFullAttrFields (), ReturnCode ());
292
+ if (sync_mode)
293
+  {
294
+  m_publisher.publish (request.getTableName (), request.getFullKey (),
295
+  request.getFullAttrFields (), ReturnCode ());
296
+  }
209
297
return true ;
210
298
}
211
299
0 commit comments