Sun, Apr 30, 2017 at 04:08:15PM CEST, j...@mojatatu.com wrote:
>Jiri,
>
>With "goto chain X" this will have to be more generalized. Maybe
>we have 0xAXXXXXXX Where "A" recognizes the extension with
>current values ACT_JUMP(0x1) and GOTO_CHAIN(maybe 0x2)
>and the rest "XXXXXXX" is a free floating parameter values
>which carry the goto count for ACT_JUMP and GOTO_CHAIN chain-id.

That is exactly what this patch is doing.


>
>cheers,
>jamal
>
>On 17-04-28 12:13 PM, Jiri Pirko wrote:
>> From: Jiri Pirko <j...@mellanox.com>
>> 
>> Jump is now the only one using value action opcode. This is going to
>> change soon. So introduce helpers to work with this. Convert TC_ACT_JUMP.
>> 
>> Signed-off-by: Jiri Pirko <j...@mellanox.com>
>> ---
>>  include/uapi/linux/pkt_cls.h | 15 ++++++++++++++-
>>  net/sched/act_api.c          |  2 +-
>>  2 files changed, 15 insertions(+), 2 deletions(-)
>> 
>> diff --git a/include/uapi/linux/pkt_cls.h b/include/uapi/linux/pkt_cls.h
>> index f1129e3..d613be3 100644
>> --- a/include/uapi/linux/pkt_cls.h
>> +++ b/include/uapi/linux/pkt_cls.h
>> @@ -37,7 +37,20 @@ enum {
>>  #define TC_ACT_QUEUED               5
>>  #define TC_ACT_REPEAT               6
>>  #define TC_ACT_REDIRECT             7
>> -#define TC_ACT_JUMP         0x10000000
>> +
>> +/* There is a special kind of actions called "extended actions",
>> + * which need a value parameter. These have a local opcode located in
>> + * the highest nibble, starting from 1. The rest of the bits
>> + * are used to carry the value. These two parts together make
>> + * a combined opcode.
>> + */
>> +#define __TC_ACT_EXT_SHIFT 28
>> +#define __TC_ACT_EXT(local) ((local) << __TC_ACT_EXT_SHIFT)
>> +#define TC_ACT_EXT_VAL_MASK ((1 << __TC_ACT_EXT_SHIFT) - 1)
>> +#define TC_ACT_EXT_CMP(combined, opcode) \
>> +    (((combined) & (~TC_ACT_EXT_VAL_MASK)) == opcode)
>> +
>> +#define TC_ACT_JUMP __TC_ACT_EXT(1)
>> 
>>  /* Action type identifiers*/
>>  enum {
>> diff --git a/net/sched/act_api.c b/net/sched/act_api.c
>> index 7f2cd70..a90e8f3 100644
>> --- a/net/sched/act_api.c
>> +++ b/net/sched/act_api.c
>> @@ -453,7 +453,7 @@ int tcf_action_exec(struct sk_buff *skb, struct 
>> tc_action **actions,
>>              if (ret == TC_ACT_REPEAT)
>>                      goto repeat;    /* we need a ttl - JHS */
>> 
>> -            if (ret & TC_ACT_JUMP) {
>> +            if (TC_ACT_EXT_CMP(ret, TC_ACT_JUMP)) {
>>                      jmp_prgcnt = ret & TCA_ACT_MAX_PRIO_MASK;
>>                      if (!jmp_prgcnt || (jmp_prgcnt > nr_actions)) {
>>                              /* faulty opcode, stop pipeline */
>> 
>

Reply via email to