Ok. Will update the model to reflect the discussion on this thread.

Mahesh Jethanandani
mjethanand...@gmail.com

> On Nov 2, 2017, at 6:56 PM, Martin Bjorklund <m...@tail-f.com> wrote:
> 
> Robert Wilton <rwil...@cisco.com> wrote:
>> Hi Mahesh,
>> 
>> I also think that the model would be cleaner if you don't have
>> separate containers for each "type of ACL".  In particular, I think
>> that the model is easier for clients, and perhaps easier to implement,
>> if a given ACE field is always on the same path rather that being on a
>> different path based on ACL type.
> 
> +1
> 
>> I've suggested a minor change to
>> the model that may retain the same benefits, but keep consistent paths
>> for the ACE fields.
>> 
>> Hence, would the following help improve the model?
>> 
>> 1) Move the L2, IPv4, IPv6 match fields under their own containers, as
>> Juergen/Kristian have suggested.
>> 2) Under each of those containers remove the "if-feature", and change
>> the "must" statement to a "when statement".
>> 3) Add if-feature statements under the acl-type identity definitions,
>> allowing a device to control what acl-types mixes they support.
>> 
>> E.g.
>> 
>>  // ACL features defined as below.
>> 
>>  // ACL type identities updated to:
>>  identity ipv4-acl {
>>    base acl:acl-base;
>>    if-feature "ipv4-acl";
>>  }
>>  identity ipv6-acl {
>>    base acl:acl-base;
>>    if-feature "ipv6-acl";
>>  }
>>  identity eth-acl {
>>    base acl:acl-base;
>>    if-feature "l2-acl";
>>  }
>>  identity mixed-l2-l3-ipv4-acl {
>>    base "acl:ipv4-acl";
>>    base "acl:eth-acl";
>>    if-feature "mixed-ipv4-acl";
>>  }
> 
> There seem to be some inconsistencies in these names.  For example,
> why is the identity called "eth-acl" but the feature "l2-acl"?  And
> when the identity for eth is used with "mixed-" it is called "l2".
> 
> Also, why is "mixed-l2-l3-ipv4-acl" not called "mixed-l2-ipv4-acl"?
> And why is the corresponding feature just called "mixed-ipv4-acl"?
> 
> 
> 
> /martin
> 
> 
> 
> 
> 
>>  identity mixed-l2-l3-ipv6-acl {
>>    base "acl:ipv6-acl";
>>    base "acl:eth-acl";
>>    if-feature "mixed-ipv6-acl";
>>  }
>> 
>> ...
>> 
>> ...
>>      leaf acl-type {
>>        type acl-type;
>>      }
>>      container aces {
>>        list ace {
>>          key "rule-name";
>>          ordered-by user;
>>          leaf rule-name ...
>> 
>>          container matches {
>>            container l2 {
>>              when "derived-from(../../../../acl-type, 'acl:eth-acl')";
>>              uses packet-fields:acl-eth-header-fields;
>>              description
>>                "Rule set for L2 ACL.";
>>            }
>>            container ipv4 {
>>              when "derived-from(../../../../acl-type, acl:ipv4-acl')";
>>              uses packet-fields:acl-ip-header-fields;
>>                    uses packet-fields:acl-ipv4-header-fields;
>>              description
>>                "Rule set that supports IPv4 headers.";
>>            }
>>            container ipv6 {
>>              ...
>>            }
>> 
>> 
>> Thanks,
>> Rob
>> 
>> 
>>> On 02/11/2017 08:50, Mahesh Jethanandani wrote:
>>> Kristian,
>>> 
>>> I hear you. What I am providing is the rational for the current
>>> design.
>>> 
>>> I would like to hear from others in the WG. We have been reviewing
>>> this draft for the last couple of years, and we are now at the tail
>>> end of the LC. I would really like to see this draft move forward,
>>> particularly since it is not broken.
>>> 
>>> Thanks.
>>> 
>>>> On Nov 2, 2017, at 2:13 PM, Kristian Larsson <krist...@spritelink.net>
>>>> wrote:
>>>> 
>>>>> On Thu, Nov 02, 2017 at 06:13:04AM +0630, Mahesh Jethanandani wrote:
>>>>>    On Nov 1, 2017, at 5:52 PM, Juergen Schoenwaelder <
>>>>>    j.schoenwael...@jacobs-university.de> wrote:
>>>>> 
>>>>>    Mahesh,
>>>>> 
>>>>>    I think the question is why we need to have different match containers
>>>>>    for each possible feature set combination instead of having a single
>>>>>    match container with groups of leafs in it marked as features. This
>>>>>    would seem to cut down the size of the module and the tree diagram
>>>>>    significantly. I think this will also make clients simpler sicne they
>>>>>    do not have to select a certain container based on the feature set
>>>>>    announced.
>>>>> 
>>>>> 
>>>>> The current design of match containers was chosen to allow platforms
>>>>> to select
>>>>> one container that matched what the hardware supported from a l2, l3
>>>>> and ipv
>>>>> {4,6} perspective.
>>>> Sure, but you are conflating the structure of the model with the
>>>> feature-wraps. Without changing the features of the model, we can
>>>> structure it in a different way where there is not a 1:1 mapping
>>>> between features and containers under the matches container.
>>>> 
>>>> 
>>>>> I would argue that even though the overall diagram is bigger
>>>>> with this design, once the platform selects the container of choice,
>>>>> the tree
>>>>> and the configuration itself would be a little simpler/smaller.
>>>> I am arguing the opposite. It's really awkward to place the same
>>>> type of data, like IPv4 match conditions, under different paths
>>>> based on a feature.
>>>> 
>>>> If the system model had done the same we would have:
>>>> /system
>>>> /system-with-ntp
>>>> /system-with-ntp-and-radius
>>>> 
>>>> How do you augment in new leaves? While you are using groupings
>>>> which allows for a reuse of data across all these containers,
>>>> someone who is augmenting can't, since you can't augment a
>>>> container, only where it is used. Someone wishing to add a leaf
>>>> to the model needs to augment in three different locations to
>>>> support a new match condition for IPv4 (let's say some meta-data
>>>> attribute).
>>>> 
>>>> 
>>>>> Take the case where the desired selection is l2,-l3, ipv4 and
>>>>> ipv6. The current
>>>>> tree looks like this:
>>>>> 
>>>>> 
>>>>>        |        |  +--rw l2-l3-ipv4-ipv6-acl {l2-l3-ipv4-ipv6-acl}?
>>>>>        |        |  |  +--rw destination-mac-address?  yang:mac-address
>>>>>        |        |  |  +--rw destination-mac-address-mask?
>>>>>        |        |  |  yang:mac-address
>>>>>        |        |  |  +--rw source-mac-address?  yang:mac-address
>>>>>        |        |  |  +--rw source-mac-address-mask?  yang:mac-address
>>>>>        |        |  |  +--rw ethertype?                      eth:ethertype
>>>>>        |        |  |  +--rw dscp?                           inet:dscp
>>>>>        |        |  |  +--rw ecn?                            uint8
>>>>>        |        |  |  +--rw length?                         uint16
>>>>>        |        |  |  +--rw ttl?                            uint8
>>>>>        |        |  |  +--rw protocol?                       uint8
>>>>>        |        |  |  +--rw source-port-range!
>>>>>        |        |  |  |  +--rw lower-port    inet:port-number
>>>>>        |        |  |  |  +--rw upper-port?   inet:port-number
>>>>>        |        |  |  |  +--rw operation?    operator
>>>>>        |        |  |  +--rw destination-port-range!
>>>>>        |        |  |  |  +--rw lower-port    inet:port-number
>>>>>        |        |  |  |  +--rw upper-port?   inet:port-number
>>>>>        |        |  |  |  +--rw operations?   operator
>>>>>        |        |  |  +--rw ihl?                            uint8
>>>>>        |        |  |  +--rw flags?                          bits
>>>>>        |        |  |  +--rw offset?                         uint16
>>>>>        |        |  |  +--rw identification?                 uint16
>>>>>        |        |  |  +--rw destination-ipv4-network?  inet:ipv4-prefix
>>>>>        |        |  |  +--rw source-ipv4-network?  inet:ipv4-prefix
>>>>>        |        |  |  +--rw next-header?                    uint8
>>>>>        |        |  |  +--rw destination-ipv6-network?  inet:ipv6-prefix
>>>>>        |        |  |  +--rw source-ipv6-network?  inet:ipv6-prefix
>>>>> 
>>>>>        |        |  |  +--rw flow-label?
>>>>>        |        |  |          inet:ipv6-flow-label
>>>>> 
>>>>> 
>>>>> 
>>>>> whereas, if the design went with one match container with each group
>>>>> of leafs
>>>>> in their own container (to support the if-feature statement for that
>>>>> container), the tree would look like this:
>>>>> 
>>>>> 
>>>>>        |        |  +--rw l2-acl {l2-acl}?
>>>>>        |        |  |  +--rw destination-mac-address?  yang:mac-address
>>>>>        |        |  |  +--rw destination-mac-address-mask?
>>>>>        |        |  |  yang:mac-address
>>>>>        |        |  |  +--rw source-mac-address?  yang:mac-address
>>>>>        |        |  |  +--rw source-mac-address-mask?  yang:mac-address
>>>>>        |        |  |  +--rw ethertype?                      eth:ethertype
>>>>> 
>>>>>        |        |  +--rw ipv4-acl {ipv4-acl}?
>>>>>        |        |  |  +--rw dscp?                       inet:dscp
>>>>>        |        |  |  +--rw ecn?                        uint8
>>>>>        |        |  |  +--rw length?                     uint16
>>>>>        |        |  |  +--rw ttl?                        uint8
>>>>>        |        |  |  +--rw protocol?                   uint8
>>>>>        |        |  |  +--rw source-port-range!
>>>>>        |        |  |  |  +--rw lower-port    inet:port-number
>>>>>        |        |  |  |  +--rw upper-port?   inet:port-number
>>>>>        |        |  |  |  +--rw operation?    operator
>>>>>        |        |  |  +--rw destination-port-range!
>>>>>        |        |  |  |  +--rw lower-port    inet:port-number
>>>>>        |        |  |  |  +--rw upper-port?   inet:port-number
>>>>>        |        |  |  |  +--rw operations?   operator
>>>>>        |        |  |  +--rw ihl?                        uint8
>>>>>        |        |  |  +--rw flags?                      bits
>>>>>        |        |  |  +--rw offset?                     uint16
>>>>>        |        |  |  +--rw identification?             uint16
>>>>>        |        |  |  +--rw destination-ipv4-network?   inet:ipv4-prefix
>>>>>        |        |  |  +--rw source-ipv4-network?        inet:ipv4-prefix
>>>>>        |        |  +--rw ipv6-acl {ipv6-acl}?
>>>>>        |        |  |  +--rw dscp?                       inet:dscp
>>>>>        |        |  |  +--rw ecn?                        uint8
>>>>>        |        |  |  +--rw length?                     uint16
>>>>>        |        |  |  +--rw ttl?                        uint8
>>>>>        |        |  |  +--rw protocol?                   uint8
>>>>>        |        |  |  +--rw source-port-range!
>>>>>        |        |  |  |  +--rw lower-port    inet:port-number
>>>>>        |        |  |  |  +--rw upper-port?   inet:port-number
>>>>>        |        |  |  |  +--rw operation?    operator
>>>>>        |        |  |  +--rw destination-port-range!
>>>>>        |        |  |  |  +--rw lower-port    inet:port-number
>>>>>        |        |  |  |  +--rw upper-port?   inet:port-number
>>>>>        |        |  |  |  +--rw operations?   operator
>>>>>        |        |  |  +--rw next-header?                uint8
>>>>>        |        |  |  +--rw destination-ipv6-network?   inet:ipv6-prefix
>>>>>        |        |  |  +--rw source-ipv6-network?        inet:ipv6-prefix
>>>>>        |        |  |  +--rw flow-label?  inet:ipv6-flow-label
>>>>> 
>>>>> 
>>>>> The difference though is small and comes down to a preference. Select
>>>>> one
>>>>> feature statement and get one container with everything in it, or
>>>>> define
>>>>> multiple feature statements and assemble together the pieces to define
>>>>> the ACE
>>>>> entry.
>>>> Again, I think you mix up the features available vs the structure
>>>> of the data.
>>>> 
>>>> This is the current list of features (which again, I want to
>>>> change but that's separate):
>>>> * l2-acl
>>>> * ipv4-acl
>>>> * ipv6-acl
>>>> * mixed-ipv4-acl
>>>> * mixed-ipv6-acl
>>>> * l2-l3-ipv4-ipv6-acl
>>>> * tcp-acl
>>>> * udp-acl
>>>> * icmp-acl
>>>> * any-acl
>>>> 
>>>> As per your second example above we have an ipv4-acl container
>>>> under matches, i.e. /access-list/acl/aces/ace/matches/ipv4-acl.
>>>> It is only possible to define ipv4 matches if one of the
>>>> following features are present:
>>>> * ipv4-acl
>>>> * mixed-ipv4-acl
>>>> * l2-l3-ipv4-ipv6-acl
>>>> 
>>>> Thus you write an if-feature statement to reflect that, like
>>>> this:
>>>> 
>>>> if-feature "ipv4-acl mixed-ipv4-acl l2-l3-ipv4-ipv6-acl";
>>>> 
>>>> So you see, the tight coupling you have between the data
>>>> structure and the if-features isn't necessary.
>>>> 
>>>> I think the structure should first be established without
>>>> features and then features can be inserted where they make sense
>>>> to make part of the model optional. Starting with the list of
>>>> features and then designing the structure around them makes for a
>>>> much less natural data structure IMHO.
>>>> 
>>>> Kind regards,
>>>>   Kristian.
>>> Mahesh Jethanandani
>>> mjethanand...@gmail.com
>>> _______________________________________________
>>> netmod mailing list
>>> netmod@ietf.org
>>> https://www.ietf.org/mailman/listinfo/netmod
>>> .
>> 

_______________________________________________
netmod mailing list
netmod@ietf.org
https://www.ietf.org/mailman/listinfo/netmod

Reply via email to