Adding SLM YANG model, and moving PM model to remote MEP level#1479
Adding SLM YANG model, and moving PM model to remote MEP level#1479cyama1225 wants to merge 7 commits into
Conversation
There was a problem hiding this comment.
Code Review
This pull request updates the openconfig-oam-cfm YANG model to introduce Synthetic Loss Measurement (SLM) and relocates performance measurement profiles to the remote MEP level, deprecating the previous implementation. The changes include refactoring loss measurement groupings to share common statistics. Review feedback identifies opportunities to improve consistency by using standard configuration groupings for profiles and recommends nesting synthetic loss measurement data within the state container to adhere to OpenConfig's configuration and state separation patterns.
| container config { | ||
| description "Associated performance measurement profile."; | ||
| leaf profile-name { | ||
| description "A unique profile name identifying the profile"; | ||
| type string; | ||
| } | ||
| } |
There was a problem hiding this comment.
The config container in the pm-profile list manually defines profile-name instead of using the performance-measurement-config grouping. This is inconsistent with the state container (lines 265-270) and prevents the configuration of other profile parameters (e.g., enable, measurement-type) at the remote MEP level. Following the OpenConfig style, the config container should use the common configuration grouping.
container config {
description "Associated performance measurement profile.";
uses performance-measurement-config;
}
There was a problem hiding this comment.
I simply moved over the existing container from local-mep to remote-mep level.
| container state { | ||
| description "Operational data for performance measurement."; | ||
| config false; | ||
| uses performance-measurement-config; | ||
| uses performance-measurement-state; | ||
| } | ||
|
|
||
| uses synthetic-loss-measurement-state; |
There was a problem hiding this comment.
The synthetic-loss-measurement-state grouping is used outside of the state container. In OpenConfig, all operational state data should be nested within the state container to maintain the configuration/state separation pattern. This also applies to the usage at line 321.
| container state { | |
| description "Operational data for performance measurement."; | |
| config false; | |
| uses performance-measurement-config; | |
| uses performance-measurement-state; | |
| } | |
| uses synthetic-loss-measurement-state; | |
| container state { | |
| description "Operational data for performance measurement."; | |
| config false; | |
| uses performance-measurement-config; | |
| uses performance-measurement-state; | |
| uses synthetic-loss-measurement-state; | |
| } |
There was a problem hiding this comment.
This was done intentionally to avoid the /state/.../state path.
|
/gcbrun |
|
No major YANG version changes in commit af290e5 |
|
I'm not an expert on CFM, but one of my colleagues has looked at it. His comments are summarised as:
|
|
/gcbrun |
I believe test ID is a publicly exposed notion, and is carried in the SLM PDU. For example, the following SNMP MIB model exposes the testId. https://www.mplify.net/resources/mef-36-1-service-oam-snmp-mib-for-performance-monitoring/ As for CoS, I believe the proposed model leaves room for configuring multiple CoS per profile if needed. This would, for example, mitigate the need to repeat the same performance measurement profile configuration for each of the CoS value. |
Change Scope
Platform Implementations
References
Tree View
augment /oc-oam:oam: +--rw cfm +--rw domains | +--rw maintenance-domain* [md-id] | +--rw md-id -> ../config/md-id | +--rw config | | +--rw md-id? oc-cfm-types:name-key-type | | +--rw level? uint8 | | +--rw md-name-type? enumeration | | +--rw none? boolean | | +--rw dns-like-name? string | | +--rw address oc-yang:mac-address | | +--rw unsigned-int uint16 | | +--rw char-string? string | +--ro state | | +--ro md-id? oc-cfm-types:name-key-type | | +--ro level? uint8 | | +--ro md-name-type? enumeration | | +--ro none? boolean | | +--ro dns-like-name? string | | +--ro address oc-yang:mac-address | | +--ro unsigned-int uint16 | | +--ro char-string? string | +--rw maintenance-associations | +--rw maintenance-association* [ma-id] | +--rw ma-id -> ../config/ma-id | +--rw config | | +--rw ma-id? oc-cfm-types:name-key-type | | +--rw group-name? string | | +--rw ma-name-type? enumeration | | +--rw primary-vid oc-vlan-types:vlan-id | | +--rw char-string string | | +--rw unsigned-int16 uint16 | | +--rw vpn-oui uint32 | | +--rw vpn-index uint32 | | +--rw ccm-interval? enumeration | | +--rw loss-threshold? uint16 | +--ro state | | +--ro ma-id? oc-cfm-types:name-key-type | | +--ro group-name? string | | +--ro ma-name-type? enumeration | | +--ro primary-vid oc-vlan-types:vlan-id | | +--ro char-string string | | +--ro unsigned-int16 uint16 | | +--ro vpn-oui uint32 | | +--ro vpn-index uint32 | | +--ro ccm-interval? enumeration | | +--ro loss-threshold? uint16 | +--rw mep-endpoints | +--rw mep-endpoint* [local-mep-id] | +--rw local-mep-id -> ../config/local-mep-id | +--rw config | | +--rw ccm-enabled? boolean | | +--rw lowest-priority-defect? oc-cfm-types:lowest-alarm-priority-type | | +--rw fng-alarm-time? uint16 | | +--rw fng-reset-time? uint16 | | +--rw local-mep-id? oc-cfm-types:mep-id-type | | +--rw interface? -> /oc-if:interfaces/interface/name | | +--rw include-mep-port-status-in-tlv? boolean | | +--rw include-mep-interface-status-in-tlv? boolean | | +--rw direction? enumeration | | +--rw auto-discovery? boolean | +--ro state | | +--ro ccm-enabled? boolean | | +--ro lowest-priority-defect? oc-cfm-types:lowest-alarm-priority-type | | +--ro fng-alarm-time? uint16 | | +--ro fng-reset-time? uint16 | | +--ro local-mep-id? oc-cfm-types:mep-id-type | | +--ro interface? -> /oc-if:interfaces/interface/name | | +--ro include-mep-port-status-in-tlv? boolean | | +--ro include-mep-interface-status-in-tlv? boolean | | +--ro direction? enumeration | | +--ro auto-discovery? boolean | | +--ro oper-state? oc-cfm-types:operational-state-type | | +--ro interface-state? oc-cfm-types:interface-status-type | | +--ro fng-state? oc-cfm-types:fng-state-type | | +--ro highest-priority-defect? oc-cfm-types:highest-defect-priority-type | | +--ro mep-defects* oc-cfm-types:mep-defects-type | | +--ro present-rdi? boolean | | +--ro config-errors-detected* oc-cfm-types:config-error-type | | +--ro error-ccm-last-failure? binary | | +--ro counters | | +--ro mep-ccm-sequence-errors oc-yang:counter64 | | +--ro mep-ccms-sent oc-yang:counter64 - | +--rw pm-profiles + | x--rw pm-profiles | | +--rw pm-profile* [profile-name] | | +--rw profile-name -> ../config/profile-name | | +--rw config | | | +--rw profile-name? string | | +--ro state | | +--ro profile-name? string | | +--ro enable? boolean | | +--ro measurement-type? enumeration | | +--ro protocol-type? enumeration | | +--ro frame-size? uint16 | | +--ro measurement-interval? uint32 | | +--ro repetition-period? uint32 | | +--ro intervals-archived? uint16 | | +--ro packets-per-meaurement-period? uint16 | | +--ro burst-interval? uint32 | | +--ro packet-per-burst? uint32 | | +--ro loss-measurement-state | | | +--ro far-end-min-frame-loss-ratio? uint32 | | | +--ro far-end-max-frame-loss-ratio? uint32 | | | +--ro far-end-average-frame-loss-ratio? uint32 | | | +--ro near-end-min-frame-loss-ratio? uint32 | | | +--ro near-end-max-frame-loss-ratio? uint32 | | | +--ro near-end-average-frame-loss-ratio? uint32 | | | +--ro counters | | | +--ro slm-sent? oc-yang:counter64 | | | +--ro slm-received? oc-yang:counter64 | | | +--ro slr-sent? oc-yang:counter64 | | | +--ro slr-received? oc-yang:counter64 | | +--ro delay-measurement-state | | +--ro frame-delay-two-way-min? uint32 | | +--ro frame-delay-two-way-max? uint32 | | +--ro frame-delay-two-way-average? uint32 | | +--ro frame-delay-two-way-stddev? uint32 | | +--ro counters | | +--ro dmm-sent? oc-yang:counter64 | | +--ro dmm-received? oc-yang:counter64 | | +--ro dmr-sent? oc-yang:counter64 | | +--ro dmr-received? oc-yang:counter64 | +--rw rdi | | +--rw config | | | +--rw transmit-on-defect? boolean | | +--ro state | | +--ro transmit-on-defect? boolean | +--rw link-loss-forwarding | | +--rw config | | | +--rw enable? boolean | | | +--rw damping-timer? uint64 | | | +--rw action? enumeration | | +--ro state | | +--ro enable? boolean | | +--ro damping-timer? uint64 | | +--ro action? enumeration | +--rw remote-meps | +--rw remote-mep* [id] | +--rw id -> ../config/id | +--rw config | | +--rw id? oc-cfm-types:mep-id-type | | +--rw mac-address? oc-yang:mac-address | +--ro state - | +--ro id? oc-cfm-types:mep-id-type - | +--ro mac-address? oc-yang:mac-address - | +--ro oper-state? oc-cfm-types:operational-state-type - | +--ro interface-state? oc-cfm-types:interface-status-type - | +--ro fng-state? oc-cfm-types:fng-state-type - | +--ro highest-priority-defect? oc-cfm-types:highest-defect-priority-type - | +--ro mep-defects* oc-cfm-types:mep-defects-type - | +--ro present-rdi? boolean - | +--ro config-errors-detected* oc-cfm-types:config-error-type - | +--ro error-ccm-last-failure? binary + | | +--ro id? oc-cfm-types:mep-id-type + | | +--ro mac-address? oc-yang:mac-address + | | +--ro oper-state? oc-cfm-types:operational-state-type + | | +--ro interface-state? oc-cfm-types:interface-status-type + | | +--ro fng-state? oc-cfm-types:fng-state-type + | | +--ro highest-priority-defect? oc-cfm-types:highest-defect-priority-type + | | +--ro mep-defects* oc-cfm-types:mep-defects-type + | | +--ro present-rdi? boolean + | | +--ro config-errors-detected* oc-cfm-types:config-error-type + | | +--ro error-ccm-last-failure? binary + | | +--ro counters + | | +--ro mep-ccm-sequence-errors oc-yang:counter64 + | | +--ro mep-ccms-sent oc-yang:counter64 + | +--rw pm-profiles + | +--rw pm-profile* [profile-name] + | +--rw profile-name -> ../config/profile-name + | +--rw config + | | +--rw profile-name? string + | +--ro state + | | +--ro profile-name? string + | | +--ro enable? boolean + | | +--ro measurement-type? enumeration + | | +--ro protocol-type? enumeration + | | +--ro frame-size? uint16 + | | +--ro measurement-interval? uint32 + | | +--ro repetition-period? uint32 + | | +--ro intervals-archived? uint16 + | | +--ro packets-per-meaurement-period? uint16 + | | +--ro burst-interval? uint32 + | | +--ro packet-per-burst? uint32 + | | +--ro loss-measurement-state + | | | +--ro far-end-min-frame-loss-ratio? uint32 + | | | +--ro far-end-max-frame-loss-ratio? uint32 + | | | +--ro far-end-average-frame-loss-ratio? uint32 + | | | +--ro near-end-min-frame-loss-ratio? uint32 + | | | +--ro near-end-max-frame-loss-ratio? uint32 + | | | +--ro near-end-average-frame-loss-ratio? uint32 + | | | +--ro counters + | | | +--ro slm-sent? oc-yang:counter64 + | | | +--ro slm-received? oc-yang:counter64 + | | | +--ro slr-sent? oc-yang:counter64 + | | | +--ro slr-received? oc-yang:counter64 + | | +--ro delay-measurement-state + | | +--ro frame-delay-two-way-min? uint32 + | | +--ro frame-delay-two-way-max? uint32 + | | +--ro frame-delay-two-way-average? uint32 + | | +--ro frame-delay-two-way-stddev? uint32 + | | +--ro counters + | | +--ro dmm-sent? oc-yang:counter64 + | | +--ro dmm-received? oc-yang:counter64 + | | +--ro dmr-sent? oc-yang:counter64 + | | +--ro dmr-received? oc-yang:counter64 + | +--ro synthetic-loss-measurement-states + | +--ro synthetic-loss-measurement-state* [cos test-id] + | +--ro cos -> ../state/cos + | +--ro test-id -> ../state/test-id + | +--ro state + | +--ro cos? uint8 + | +--ro test-id? uint32 + | +--ro far-end-min-frame-loss-ratio? uint32 + | +--ro far-end-max-frame-loss-ratio? uint32 + | +--ro far-end-average-frame-loss-ratio? uint32 + | +--ro near-end-min-frame-loss-ratio? uint32 + | +--ro near-end-max-frame-loss-ratio? uint32 + | +--ro near-end-average-frame-loss-ratio? uint32 | +--ro counters - | +--ro mep-ccm-sequence-errors oc-yang:counter64 - | +--ro mep-ccms-sent oc-yang:counter64 + | +--ro slm-sent? oc-yang:counter64 + | +--ro slm-received? oc-yang:counter64 + | +--ro slr-sent? oc-yang:counter64 + | +--ro slr-received? oc-yang:counter64 +--ro state | +--ro local-meps? uint32 | +--ro local-meps-operational? uint32 | +--ro cfm-domains? uint32 | +--ro cfm-services? uint32 | +--ro down-meps? uint32 | +--ro up-meps? uint32 | +--ro disabled-misconfigured? uint32 | +--ro disabled-operational-errors? uint32 | +--ro disabled-out-of-resources? uint32 | +--ro peer-meps? uint32 | +--ro operational-peer-meps? uint32 | +--ro peer-meps-with-defects? uint32 | +--ro peer-meps-timed-out? uint32 +--rw performance-measurement-profiles-global +--rw performance-measurement-profile* [profile-name] +--rw profile-name -> ../config/profile-name +--rw config | +--rw profile-name? string | +--rw enable? boolean | +--rw measurement-type? enumeration | +--rw protocol-type? enumeration | +--rw frame-size? uint16 | +--rw measurement-interval? uint32 | +--rw repetition-period? uint32 | +--rw intervals-archived? uint16 | +--rw packets-per-meaurement-period? uint16 | +--rw burst-interval? uint32 | +--rw packet-per-burst? uint32 +--ro state - +--ro profile-name? string - +--ro enable? boolean - +--ro measurement-type? enumeration - +--ro protocol-type? enumeration - +--ro frame-size? uint16 - +--ro measurement-interval? uint32 - +--ro repetition-period? uint32 - +--ro intervals-archived? uint16 - +--ro packets-per-meaurement-period? uint16 - +--ro burst-interval? uint32 - +--ro packet-per-burst? uint32 - +--ro loss-measurement-state - | +--ro far-end-min-frame-loss-ratio? uint32 - | +--ro far-end-max-frame-loss-ratio? uint32 - | +--ro far-end-average-frame-loss-ratio? uint32 - | +--ro near-end-min-frame-loss-ratio? uint32 - | +--ro near-end-max-frame-loss-ratio? uint32 - | +--ro near-end-average-frame-loss-ratio? uint32 + | +--ro profile-name? string + | +--ro enable? boolean + | +--ro measurement-type? enumeration + | +--ro protocol-type? enumeration + | +--ro frame-size? uint16 + | +--ro measurement-interval? uint32 + | +--ro repetition-period? uint32 + | +--ro intervals-archived? uint16 + | +--ro packets-per-meaurement-period? uint16 + | +--ro burst-interval? uint32 + | +--ro packet-per-burst? uint32 + | +--ro loss-measurement-state + | | +--ro far-end-min-frame-loss-ratio? uint32 + | | +--ro far-end-max-frame-loss-ratio? uint32 + | | +--ro far-end-average-frame-loss-ratio? uint32 + | | +--ro near-end-min-frame-loss-ratio? uint32 + | | +--ro near-end-max-frame-loss-ratio? uint32 + | | +--ro near-end-average-frame-loss-ratio? uint32 + | | +--ro counters + | | +--ro slm-sent? oc-yang:counter64 + | | +--ro slm-received? oc-yang:counter64 + | | +--ro slr-sent? oc-yang:counter64 + | | +--ro slr-received? oc-yang:counter64 + | +--ro delay-measurement-state + | +--ro frame-delay-two-way-min? uint32 + | +--ro frame-delay-two-way-max? uint32 + | +--ro frame-delay-two-way-average? uint32 + | +--ro frame-delay-two-way-stddev? uint32 | +--ro counters - | +--ro slm-sent? oc-yang:counter64 - | +--ro slm-received? oc-yang:counter64 - | +--ro slr-sent? oc-yang:counter64 - | +--ro slr-received? oc-yang:counter64 - +--ro delay-measurement-state - +--ro frame-delay-two-way-min? uint32 - +--ro frame-delay-two-way-max? uint32 - +--ro frame-delay-two-way-average? uint32 - +--ro frame-delay-two-way-stddev? uint32 + | +--ro dmm-sent? oc-yang:counter64 + | +--ro dmm-received? oc-yang:counter64 + | +--ro dmr-sent? oc-yang:counter64 + | +--ro dmr-received? oc-yang:counter64 + +--ro synthetic-loss-measurement-states + +--ro synthetic-loss-measurement-state* [cos test-id] + +--ro cos -> ../state/cos + +--ro test-id -> ../state/test-id + +--ro state + +--ro cos? uint8 + +--ro test-id? uint32 + +--ro far-end-min-frame-loss-ratio? uint32 + +--ro far-end-max-frame-loss-ratio? uint32 + +--ro far-end-average-frame-loss-ratio? uint32 + +--ro near-end-min-frame-loss-ratio? uint32 + +--ro near-end-max-frame-loss-ratio? uint32 + +--ro near-end-average-frame-loss-ratio? uint32 +--ro counters - +--ro dmm-sent? oc-yang:counter64 - +--ro dmm-received? oc-yang:counter64 - +--ro dmr-sent? oc-yang:counter64 - +--ro dmr-received? oc-yang:counter64 + +--ro slm-sent? oc-yang:counter64 + +--ro slm-received? oc-yang:counter64 + +--ro slr-sent? oc-yang:counter64 + +--ro slr-received? oc-yang:counter64 +