summaryrefslogtreecommitdiffstats
path: root/v3po/api/src/main/yang/vpp-classifier.yang
blob: 0ba94f1cbb752be815b6cc5c52193fda0039369a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
module vpp-classifier {
  yang-version 1;
  namespace "urn:opendaylight:params:xml:ns:yang:vpp:classifier";
  prefix "vpp-classifier";

  revision "2015-06-03" {
    description
      "Initial revision of model for VPP packet classifier.
      The model can be used ony to implement ACLs.
      Other classify table usages are not supported yet,
      see https://jira.fd.io/browse/VPP-203 for details.";
    reference
      "https://wiki.fd.io/view/VPP/Introduction_To_N-tuple_Classifiers";
  }

  import ietf-yang-types {
    prefix "yang";
  }

  typedef classify-table-ref {
    type leafref {
      path "/vpp-classifier:vpp-classifier/classify-table/name";
    }
    description
      "This type is used by data models that need to reference
       configured classify tables.";
  }

  typedef packet-handling-action {
    type enumeration {
      enum "deny" {
        // by VPP convention, first neighbour node (at index 0) is a drop node
        value 0;
      }
      enum "permit" {
        value -1; // indicates that the next node not set
      }
    }
  }

  typedef vpp-node {
    type union {
      // FIXME: enable after VPP-203 is fixed
      // type string; // name of vpp-node neighbour, TODO: base node also needs to be defined
      type packet-handling-action;
    }
    description
      "Defines VPP node reference using relative node name or packet handling action.";
  }

  typedef opaque-index {
    type union {
      type vpp-node;
      type uint32;
    }
    description
      "Defines opaque-index type - metadata that can be attached to session-hit packets.
       Vpp nodes can't be referenced by index, because node indexes might change after vpp restart.";
  }

  grouping classify-session-attributes {
    description
      "Defines classify session attributes that are mapped to classify_add_del_session
       and classify_session_details messages parameters.";

    leaf hit_next_index {
      type vpp-node;
      mandatory true;
      description
        "Vpp node to which packet will be send when it produces a match.";
    }
    leaf opaque_index {
      type opaque-index;
    }
    leaf advance {
      type int32;
      default 0;
      description
        "Nodes like ip4/6-classify use the parameter to \"consume\" networking layer.
        Example: tunnel decapsulation.";
    }
  }

  grouping classify-table-attributes {
    description
      "Defines classify table attributes that are mapped to classify_add_del_table
       and classify_table_info_reply messages parameters.";

    leaf nbuckets {
      mandatory true;
      type uint32;
      description
        "Used by classifier hashing algorithm. It is not possible to resize the bucket array,
        therefore suggested value is approximate number of expected entries.";
    }
    leaf memory_size {
      mandatory true;
      type uint32;
      description
        "Memory size for classify table and its entries.";
    }
    leaf skip_n_vectors {
      type uint32;
      default 0;
      description
        "Number of 16 byte vectors to be skipped before applying mask.";
    }
    leaf next_table {
      type classify-table-ref;
      description
        "Reference to the next classify table. Required when multiple table chaining is used.";
    }
    leaf miss_next_index {
      mandatory true;
      type vpp-node;
      description
        "Vpp node to which packet will be send when it falis to produce a match";
    }
    leaf mask {
      type yang:hex-string;
      mandatory true;
      description
        "Defines match mask (multiple of 16 bytes)";
    }
    leaf active_sessions {
      type uint32;
      mandatory true;
      config false;
      description
        "Number of sessions defined for the classify table.";
    }

    list classify-session {
      key "match";

      leaf match {
        type yang:hex-string;
        description
          "Defines actual value to be matched that is
           a byte vector, which length is multiple of 16 bytes";

        must "string-length(match) = string-length(../../mask)" {
          error-message
            "Match length is not equal to classify table mask length.";
          description
            "Match length must be equal to classify table mask length.";
        }
      }

      uses classify-session-attributes;
    }
  }

  container vpp-classifier {
    list classify-table {
      key "name";

      leaf name {
        type string;
        description
          "Hides classify table identifier managed by vpp.";
      }

      uses classify-table-attributes;
    }
  }

}