Hi Joergen,

-----Original Message-----
From: Joergen Andreasen <joergen.andrea...@microchip.com> 
Sent: 2020年7月16日 16:51

> >> >> Chain 0:           The default chain - today this is in IS2. If we 
> >> >> proceed
> >> >>                     with this as is - then this will change.
> >> >> Chain 1-9999:      These are offloaded by "basic" classification.
> >> >> Chain 10000-19999: These are offloaded in IS1
> >> >>                     Chain 10000: Lookup-0 in IS1, and here we could 
> >> >> limit the
> >> >>                                  action to do QoS related stuff 
> >> >> (priority
> >> >>                                  update)
> >> >>                     Chain 11000: Lookup-1 in IS1, here we could do VLAN
> >> >>                                  stuff
> >> >>                     Chain 12000: Lookup-2 in IS1, here we could apply 
> >> >> the
> >> >>                                  "PAG" which is essentially a GOTO.
> >> >>
> >> >> Chain 20000-29999: These are offloaded in IS2
> >> >>                     Chain 20000-20255: Lookup-0 in IS2, where CHAIN-ID -
> >> >>                                        20000 is the PAG value.
> >> >>                     Chain 21000-21000: Lookup-1 in IS2.
> >> >>
> >> >> All these chains should be optional - users should only need to 
> >> >> configure the chains they need. To make this work, we need to 
> >> >> configure both the desired actions (could be priority update) and the 
> >> >> goto action.
> >> >> Remember in HW, all packets goes through this process, while in 
> >> >> SW they only follow the "goto" path.
> >> >>
>>
>> I agree with this chain assignment, following is an example to set rules:
>>
>> 1. Set a matchall rule for each chain, the last chain do not need goto chain 
>> action.
>> # tc filter add dev swp0 chain 0 flower skip_sw action goto chain 
>> 10000 # tc filter add dev swp0 chain 10000 flower skip_sw action goto 
>> chain 21000 In driver, use these rules to register the chain.
>>
>> 2. Set normal rules.
>> # tc filter add dev swp0 chain 10000 protocol 802.1Q parent ffff: 
>> flower skip_sw vlan_id 1 vlan_prio 1 action skbedit priority 1 action 
>> goto chain 21000 # tc filter add dev swp0 chain 21000 protocol 802.1Q 
>> parent ffff: flower skip_sw vlan_id 1 vlan_prio 1 action drop
>>
>> In driver, we check if the chain ID has been registered, and goto chain is 
>> the same as first matchall rule, if is not, then return error. Each rule 
>> need has goto action except last chain.
>>
>> I also have check about chain template, it can not set an action template 
>> for each chain, so I think it's no use for our case. If this way to set 
>> rules is OK, I will update the patch to do as this.
>>
>> Thanks,
>> Xiaoliang Yang
>

> I agree that you cannot set an action template for each chain but you can set 
> a match template which for example can be used for setting up which IS1 key 
> to generate for the device/port.
> The template ensures that you cannot add an illegal match.
> I have attached a snippet from a testcase I wrote in order to test these 
> ideas.
> Note that not all actions are valid for the hardware.
>
> SMAC       = "00:00:00:11:11:11"
> DMAC       = "00:00:00:dd:dd:dd"
> VID1       = 0x10
> VID2       = 0x20
> PCP1       = 3
> PCP2       = 5
> DEI        = 1
> SIP        = "10.10.0.1"
> DIP        = "10.10.0.2"
>
> IS1_L0     = 10000 # IS1 lookup 0
> IS1_L1     = 11000 # IS1 lookup 1
> IS1_L2     = 12000 # IS1 lookup 2
>
> IS2_L0     = 20000 # IS2 lookup 0 # IS2 20000 - 20255 -> pag 0-255
> IS2_L0_P1  = 20001 # IS2 lookup 0 pag 1
> IS2_L0_P2  = 20002 # IS2 lookup 0 pag 2
>
> IS2_L1     = 21000 # IS2 lookup 1
>
> $skip = "skip_hw" # or "skip_sw"
>
> test "Chain templates and goto" do
>     t_i "'prio #' sets the sequence of filters. Lowest number = highest 
> priority = checked first. 0..0xffff"
>     t_i "'handle #' is a reference to the filter. Use this is if you need to 
> reference the filter later. 0..0xffffffff"
>     t_i "'chain #' is the chain to use. Chain 0 is the default. Different 
> chains can have different templates. 0..0xffffffff"
>     $ts.dut.run "tc qdisc add dev #{$dp[0]} clsact"
>
>     t_i "Add templates"
>     t_i "Configure the VCAP port configuration to match the shortest key that 
> fulfill the purpose"

>     t_i "Create a template that sets IS1 lookup 0 to generate S1_NORMAL with 
> S1_DMAC_DIP_ENA"
>     t_i "If you match on both src and dst you will generate S1_7TUPLE"
>     $ts.dut.run "tc chain add dev #{$dp[0]} ingress protocol ip chain 
> #{IS1_L0} flower #{$skip} "\
>                 "dst_mac 00:00:00:00:00:00 "\
>                 "dst_ip 0.0.0.0 "
>
>     t_i "Create a template that sets IS1 lookup 1 to generate S1_5TUPLE_IP4"
>     $ts.dut.run "tc chain add dev #{$dp[0]} ingress protocol ip chain 
> #{IS1_L1} flower #{$skip} "\
>                 "src_ip 0.0.0.0 "\
>                 "dst_ip 0.0.0.0 "
>
>     t_i "Create a template that sets IS1 lookup 2 to generate S1_DBL_VID"
>     $ts.dut.run "tc chain add dev #{$dp[0]} ingress protocol 802.1ad chain 
> #{IS1_L2} flower #{$skip} "\
>                 "vlan_id 0 "\
>                 "vlan_prio 0 "\
>                 "vlan_ethtype 802.1q "\
>                 "cvlan_id 0 "\
>                 "cvlan_prio 0 "
>
>     $ts.dut.run "tc chain show dev #{$dp[0]} ingress"

Why you set different filter keys on different lookup? Each lookup only filter 
one type of keys?
If I want to filter a same key like dst_mac and do both QoS classified action 
and vlan modify action, how to implement this in the same chain #{IS1_L0} ?

I think it's more reasonable to distinguish different lookup by different 
action like this:
IS1_L0     = 10000 # IS1 lookup 0       # do QoS classified action
IS1_L1     = 11000 # IS1 lookup 1       # do vlan modify action
IS1_L2     = 12000 # IS1 lookup 2       # do goto PAG action

IS2_L0     = 20000 # IS2 lookup 0 # IS2 20000 - 20255 -> pag 0-255
IS2_L1    = 21000 # IS2 lookup 1

So it’s no need to add templates, each lookup can support filtering mac, IP or 
vlan tag, but only support one action.

Thanks,
Xiaoliang

Reply via email to