1010 CFG_SWITCH_TRIMMING ,
1111 STATE_SWITCH_CAPABILITY ,
1212 STATE_CAP_TRIMMING_CAPABLE_KEY ,
13+ STATE_CAP_DSCP_MODE_KEY ,
14+ STATE_CAP_DSCP_MODE_DSCP_VALUE ,
15+ STATE_CAP_DSCP_MODE_FROM_TC ,
1316 STATE_CAP_QUEUE_MODE_KEY ,
1417 STATE_CAP_QUEUE_MODE_DYNAMIC ,
1518 STATE_CAP_QUEUE_MODE_STATIC ,
19+ STATE_CAP_TC_NUM_KEY ,
20+ STATE_CAP_QUEUE_NUM_KEY ,
21+ CFG_TRIM_DSCP_VALUE_FROM_TC ,
1622 CFG_TRIM_QUEUE_INDEX_DYNAMIC ,
1723 CFG_TRIM_KEY ,
1824 STATE_CAP_KEY ,
25+ DSCP_MIN ,
26+ DSCP_MAX ,
1927 UINT32_MAX ,
2028 UINT8_MAX ,
2129 SYSLOG_IDENTIFIER ,
3240# Validators ----------------------------------------------------------------------------------------------------------
3341#
3442
43+ def generic_validator (ctx , db ):
44+ """ Generic configuration validator """
45+ entry = db .get_all (db .STATE_DB , "{}|{}" .format (STATE_SWITCH_CAPABILITY , STATE_CAP_KEY ))
46+ value = entry .get (STATE_CAP_TRIMMING_CAPABLE_KEY , "false" )
47+
48+ if value != "true" :
49+ ctx .fail ("Failed to configure switch trimming: operation is not supported" )
50+
3551
3652class SizeTypeValidator (click .ParamType ):
3753 """ Size option validator """
@@ -44,10 +60,68 @@ def convert(self, value, param, ctx):
4460
4561class DscpTypeValidator (click .ParamType ):
4662 """ Dscp option validator """
63+ name = "text"
64+
65+ def get_metavar (self , param ):
66+ db = get_db (click .get_current_context ())
67+
68+ entry = db .get_all (db .STATE_DB , "{}|{}" .format (STATE_SWITCH_CAPABILITY , STATE_CAP_KEY ))
69+ entry .setdefault (STATE_CAP_DSCP_MODE_KEY , "N/A" )
70+
71+ cap_list = entry [STATE_CAP_DSCP_MODE_KEY ].split (',' )
72+
73+ if cap_list .count (STATE_CAP_DSCP_MODE_FROM_TC ) == len (cap_list ):
74+ return "from-tc"
75+ elif cap_list .count (STATE_CAP_DSCP_MODE_DSCP_VALUE ) == len (cap_list ):
76+ return "INTEGER"
77+
78+ return "[INTEGER|from-tc]"
79+
80+ def convert (self , value , param , ctx ):
81+ db = get_db (ctx )
82+
83+ entry = db .get_all (db .STATE_DB , "{}|{}" .format (STATE_SWITCH_CAPABILITY , STATE_CAP_KEY ))
84+ entry .setdefault (STATE_CAP_DSCP_MODE_KEY , "N/A" )
85+
86+ if not entry [STATE_CAP_DSCP_MODE_KEY ]:
87+ raise click .UsageError ("Failed to configure {}: no dscp resolution mode capabilities" .format (
88+ param .get_error_hint (ctx )), ctx
89+ )
90+
91+ verify_cap = True
92+
93+ if entry [STATE_CAP_DSCP_MODE_KEY ] == "N/A" :
94+ verify_cap = False
95+
96+ cap_list = entry [STATE_CAP_DSCP_MODE_KEY ].split (',' )
97+
98+ if value == CFG_TRIM_DSCP_VALUE_FROM_TC :
99+ if verify_cap and (STATE_CAP_DSCP_MODE_FROM_TC not in cap_list ):
100+ self .fail ("asymmetric dscp resolution mode is not supported" , param , ctx )
101+ else :
102+ if verify_cap and (STATE_CAP_DSCP_MODE_DSCP_VALUE not in cap_list ):
103+ self .fail ("symmetric dscp resolution mode is not supported" , param , ctx )
104+
105+ click .IntRange (DSCP_MIN , DSCP_MAX ).convert (value , param , ctx )
106+
107+ return value
108+
109+
110+ class TcTypeValidator (click .ParamType ):
111+ """ Tc option validator """
47112 name = "integer"
48113
49114 def convert (self , value , param , ctx ):
50- click .IntRange (0 , UINT8_MAX ).convert (value , param , ctx )
115+ db = get_db (ctx )
116+
117+ entry = db .get_all (db .STATE_DB , "{}|{}" .format (STATE_SWITCH_CAPABILITY , STATE_CAP_KEY ))
118+ entry .setdefault (STATE_CAP_TC_NUM_KEY , "N/A" )
119+
120+ if entry [STATE_CAP_TC_NUM_KEY ] == "N/A" :
121+ click .IntRange (0 , UINT8_MAX ).convert (value , param , ctx )
122+ else :
123+ click .IntRange (0 , int (entry [STATE_CAP_TC_NUM_KEY ])- 1 ).convert (value , param , ctx )
124+
51125 return value
52126
53127
@@ -74,14 +148,8 @@ def convert(self, value, param, ctx):
74148 db = get_db (ctx )
75149
76150 entry = db .get_all (db .STATE_DB , "{}|{}" .format (STATE_SWITCH_CAPABILITY , STATE_CAP_KEY ))
77-
78- entry .setdefault (STATE_CAP_TRIMMING_CAPABLE_KEY , "false" )
79151 entry .setdefault (STATE_CAP_QUEUE_MODE_KEY , "N/A" )
80-
81- if entry [STATE_CAP_TRIMMING_CAPABLE_KEY ] == "false" :
82- raise click .UsageError ("Failed to configure {}: operation is not supported" .format (
83- param .get_error_hint (ctx )), ctx
84- )
152+ entry .setdefault (STATE_CAP_QUEUE_NUM_KEY , "N/A" )
85153
86154 if not entry [STATE_CAP_QUEUE_MODE_KEY ]:
87155 raise click .UsageError ("Failed to configure {}: no queue resolution mode capabilities" .format (
@@ -102,7 +170,10 @@ def convert(self, value, param, ctx):
102170 if verify_cap and (STATE_CAP_QUEUE_MODE_STATIC not in cap_list ):
103171 self .fail ("static queue resolution mode is not supported" , param , ctx )
104172
105- click .IntRange (0 , UINT8_MAX ).convert (value , param , ctx )
173+ if entry [STATE_CAP_QUEUE_NUM_KEY ] == "N/A" :
174+ click .IntRange (0 , UINT8_MAX ).convert (value , param , ctx )
175+ else :
176+ click .IntRange (0 , int (entry [STATE_CAP_QUEUE_NUM_KEY ])- 1 ).convert (value , param , ctx )
106177
107178 return value
108179
@@ -176,33 +247,41 @@ def SWITCH_TRIMMING():
176247@click .option (
177248 "-s" , "--size" , "size" ,
178249 help = "Configures size (in bytes) to trim eligible packet" ,
179- type = SizeTypeValidator (),
250+ type = SizeTypeValidator ()
180251)
181252@click .option (
182253 "-d" , "--dscp" , "dscp" ,
183254 help = "Configures DSCP value assigned to a packet after trimming" ,
184- type = DscpTypeValidator (),
255+ type = DscpTypeValidator ()
256+ )
257+ @click .option (
258+ "-t" , "--tc" , "tc" ,
259+ help = "Configures TC value assigned to a packet after trimming" ,
260+ type = TcTypeValidator ()
185261)
186262@click .option (
187263 "-q" , "--queue" , "queue" ,
188264 help = "Configures queue index to use for transmission of a packet after trimming" ,
189- type = QueueTypeValidator (),
265+ type = QueueTypeValidator ()
190266)
191267@clicommon .pass_db
192268@click .pass_context
193- def SWITCH_TRIMMING_GLOBAL (ctx , db , size , dscp , queue ):
269+ def SWITCH_TRIMMING_GLOBAL (ctx , db , size , dscp , tc , queue ):
194270 """ Configure switch trimming global """
195271
196- if not (size or dscp or queue ):
272+ if not (size or dscp or tc or queue ):
197273 raise click .UsageError ("Failed to configure switch trimming global: no options are provided" , ctx )
198274
275+ generic_validator (ctx , db .db )
276+
199277 table = CFG_SWITCH_TRIMMING
200278 key = CFG_TRIM_KEY
201279
202280 data = {
203281 "size" : size ,
204282 "dscp_value" : dscp ,
205- "queue_index" : queue ,
283+ "tc_value" : tc ,
284+ "queue_index" : queue
206285 }
207286
208287 try :
0 commit comments