@@ -83,7 +83,8 @@ void SflowMgr::sflowUpdatePortInfo(Consumer &consumer)
83
83
if (sflowPortConf == m_sflowPortConfMap.end ())
84
84
{
85
85
new_port = true ;
86
- port_info.local_conf = false ;
86
+ port_info.local_rate_cfg = false ;
87
+ port_info.local_admin_cfg = false ;
87
88
port_info.speed = SFLOW_ERROR_SPEED_STR;
88
89
port_info.rate = " " ;
89
90
port_info.admin = " " ;
@@ -107,8 +108,8 @@ void SflowMgr::sflowUpdatePortInfo(Consumer &consumer)
107
108
108
109
if (m_gEnable && m_intfAllConf)
109
110
{
110
- // If the Local Conf is already present, dont't override it even though the speed is changed
111
- if (new_port || (speed_change && !m_sflowPortConfMap[key].local_conf ))
111
+ // If the Local rate Conf is already present, dont't override it even though the speed is changed
112
+ if (new_port || (speed_change && !m_sflowPortConfMap[key].local_rate_cfg ))
112
113
{
113
114
vector<FieldValueTuple> fvs;
114
115
sflowGetGlobalInfo (fvs, m_sflowPortConfMap[key].speed );
@@ -121,7 +122,8 @@ void SflowMgr::sflowUpdatePortInfo(Consumer &consumer)
121
122
auto sflowPortConf = m_sflowPortConfMap.find (key);
122
123
if (sflowPortConf != m_sflowPortConfMap.end ())
123
124
{
124
- bool local_cfg = m_sflowPortConfMap[key].local_conf ;
125
+ bool local_cfg = m_sflowPortConfMap[key].local_rate_cfg ||
126
+ m_sflowPortConfMap[key].local_admin_cfg ;
125
127
126
128
m_sflowPortConfMap.erase (key);
127
129
if ((m_intfAllConf && m_gEnable) || local_cfg)
@@ -138,18 +140,27 @@ void SflowMgr::sflowHandleSessionAll(bool enable)
138
140
{
139
141
for (auto it: m_sflowPortConfMap)
140
142
{
141
- if (!it. second . local_conf )
143
+ if (enable )
142
144
{
143
145
vector<FieldValueTuple> fvs;
144
- sflowGetGlobalInfo (fvs, it.second .speed );
145
- if (enable)
146
+ if (it.second .local_rate_cfg || it.second .local_admin_cfg )
146
147
{
147
- m_appSflowSessionTable.set (it.first , fvs);
148
+ sflowGetPortInfo (fvs, it.second );
149
+ /* Use global admin state if there is not a local one */
150
+ if (!it.second .local_admin_cfg ) {
151
+ FieldValueTuple fv1 (" admin_state" , " up" );
152
+ fvs.push_back (fv1);
153
+ }
148
154
}
149
155
else
150
156
{
151
- m_appSflowSessionTable. del ( it.first );
157
+ sflowGetGlobalInfo (fvs, it.second . speed );
152
158
}
159
+ m_appSflowSessionTable.set (it.first , fvs);
160
+ }
161
+ else if (!it.second .local_admin_cfg )
162
+ {
163
+ m_appSflowSessionTable.del (it.first );
153
164
}
154
165
}
155
166
}
@@ -158,7 +169,7 @@ void SflowMgr::sflowHandleSessionLocal(bool enable)
158
169
{
159
170
for (auto it: m_sflowPortConfMap)
160
171
{
161
- if (it.second .local_conf )
172
+ if (it.second .local_admin_cfg || it. second . local_rate_cfg )
162
173
{
163
174
vector<FieldValueTuple> fvs;
164
175
sflowGetPortInfo (fvs, it.second );
@@ -194,7 +205,7 @@ void SflowMgr::sflowGetGlobalInfo(vector<FieldValueTuple> &fvs, string speed)
194
205
195
206
void SflowMgr::sflowGetPortInfo (vector<FieldValueTuple> &fvs, SflowPortInfo &local_info)
196
207
{
197
- if (local_info.admin . length () > 0 )
208
+ if (local_info.local_admin_cfg )
198
209
{
199
210
FieldValueTuple fv1 (" admin_state" , local_info.admin );
200
211
fvs.push_back (fv1);
@@ -217,13 +228,15 @@ void SflowMgr::sflowCheckAndFillValues(string alias, vector<FieldValueTuple> &va
217
228
{
218
229
rate_present = true ;
219
230
m_sflowPortConfMap[alias].rate = fvValue (i);
231
+ m_sflowPortConfMap[alias].local_rate_cfg = true ;
220
232
FieldValueTuple fv (fvField (i), fvValue (i));
221
233
fvs.push_back (fv);
222
234
}
223
235
if (fvField (i) == " admin_state" )
224
236
{
225
237
admin_present = true ;
226
238
m_sflowPortConfMap[alias].admin = fvValue (i);
239
+ m_sflowPortConfMap[alias].local_admin_cfg = true ;
227
240
FieldValueTuple fv (fvField (i), fvValue (i));
228
241
fvs.push_back (fv);
229
242
}
@@ -235,7 +248,11 @@ void SflowMgr::sflowCheckAndFillValues(string alias, vector<FieldValueTuple> &va
235
248
236
249
if (!rate_present)
237
250
{
238
- if (m_sflowPortConfMap[alias].rate == " " )
251
+ /* Go back to default sample-rate if there is not existing rate OR
252
+ * if a local config has been done but the rate has been removed
253
+ */
254
+ if (m_sflowPortConfMap[alias].rate == " " ||
255
+ m_sflowPortConfMap[alias].local_rate_cfg )
239
256
{
240
257
string speed = m_sflowPortConfMap[alias].speed ;
241
258
@@ -249,6 +266,7 @@ void SflowMgr::sflowCheckAndFillValues(string alias, vector<FieldValueTuple> &va
249
266
}
250
267
m_sflowPortConfMap[alias].rate = rate;
251
268
}
269
+ m_sflowPortConfMap[alias].local_rate_cfg = false ;
252
270
FieldValueTuple fv (" sample_rate" , m_sflowPortConfMap[alias].rate );
253
271
fvs.push_back (fv);
254
272
}
@@ -257,9 +275,10 @@ void SflowMgr::sflowCheckAndFillValues(string alias, vector<FieldValueTuple> &va
257
275
{
258
276
if (m_sflowPortConfMap[alias].admin == " " )
259
277
{
260
- /* By default admin state is enable if not set explicitly */
278
+ /* By default admin state is enabled if not set explicitly */
261
279
m_sflowPortConfMap[alias].admin = " up" ;
262
280
}
281
+ m_sflowPortConfMap[alias].local_admin_cfg = false ;
263
282
FieldValueTuple fv (" admin_state" , m_sflowPortConfMap[alias].admin );
264
283
fvs.push_back (fv);
265
284
}
@@ -347,7 +366,6 @@ void SflowMgr::doTask(Consumer &consumer)
347
366
}
348
367
vector<FieldValueTuple> fvs;
349
368
sflowCheckAndFillValues (key, values, fvs);
350
- m_sflowPortConfMap[key].local_conf = true ;
351
369
if (m_gEnable)
352
370
{
353
371
m_appSflowSessionTable.set (key, fvs);
@@ -384,7 +402,8 @@ void SflowMgr::doTask(Consumer &consumer)
384
402
else
385
403
{
386
404
m_appSflowSessionTable.del (key);
387
- m_sflowPortConfMap[key].local_conf = false ;
405
+ m_sflowPortConfMap[key].local_rate_cfg = false ;
406
+ m_sflowPortConfMap[key].local_admin_cfg = false ;
388
407
m_sflowPortConfMap[key].rate = " " ;
389
408
m_sflowPortConfMap[key].admin = " " ;
390
409
0 commit comments