aboutsummaryrefslogtreecommitdiff
path: root/schemas/relaxng/rrdp.rng
blob: a36d60b1b3f1bea10c543e224a7f5c807b3dabad (plain) (blame)
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
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
<?xml version="1.0" encoding="UTF-8"?>
<!--
  $Id: rrdp.rnc 5875 2014-06-26 17:48:53Z sra $
  
  RelaxNG schema for RPKI Repository Delta Protocol (RRDP).
  
  Copyright (C) 2014  Dragon Research Labs ("DRL")
  
  Permission to use, copy, modify, and distribute this software for any
  purpose with or without fee is hereby granted, provided that the above
  copyright notice and this permission notice appear in all copies.
  
  THE SOFTWARE IS PROVIDED "AS IS" AND DRL DISCLAIMS ALL WARRANTIES WITH
  REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
  AND FITNESS.  IN NO EVENT SHALL DRL BE LIABLE FOR ANY SPECIAL, DIRECT,
  INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
  LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
  OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  PERFORMANCE OF THIS SOFTWARE.
-->
<grammar ns="http://www.ripe.net/rpki/rrdp" xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
  <!--
    I find the use of "version" for both the protocol version and the database version
    unncessarily confusing, so I'd prefer "serial" for the latter.  For the moment,
    I'm keeping the attribute names as in Tim's document and just using "serial" for
    the data type.
    
    The xsd:string types here are me being lazy in the initial version.
    We should also think about length limits for all of these types.
  -->
  <define name="version">
    <data type="positiveInteger">
      <param name="maxInclusive">1</param>
    </data>
  </define>
  <define name="serial">
    <data type="nonNegativeInteger"/>
  </define>
  <define name="uri">
    <data type="anyURI"/>
  </define>
  <define name="uuid">
    <data type="string"/>
  </define>
  <define name="sha256">
    <data type="string"/>
  </define>
  <define name="base64">
    <data type="base64Binary"/>
  </define>
  <define name="index">
    <data type="positiveInteger"/>
  </define>
  <!--
    Notification file: lists current snapshots and deltas
    
    We want to get rid of the multiple segment thing from Tim's original
    specification.  I think this means that the multiple
    <snapshot-segment/> elements collapse down to a single snapshot, the
    attributes of which probably float up to the <snapshot/> element.
    Or maybe we just require exactly one snapshot-segment element; it's
    a bit verbose, but leaves an easy way to change our minds later,
    and it's XML so who's going to notice one more element?
    
    Specify as in the -01 draft for the moment, simplify later.
  -->
  <start combine="choice">
    <element name="msg">
      <attribute name="version">
        <ref name="version"/>
      </attribute>
      <attribute name="type">
        <value>notification</value>
      </attribute>
      <element name="notification">
        <attribute name="session_id">
          <ref name="uuid"/>
        </attribute>
        <attribute name="current_version">
          <ref name="serial"/>
        </attribute>
        <element name="snapshot">
          <attribute name="version">
            <ref name="serial"/>
          </attribute>
          <oneOrMore>
            <element name="snapshot-segment">
              <attribute name="uri">
                <ref name="uri"/>
              </attribute>
              <attribute name="hash">
                <ref name="sha256"/>
              </attribute>
            </element>
          </oneOrMore>
        </element>
        <optional>
          <element name="deltas">
            <oneOrMore>
              <element name="delta-segment">
                <attribute name="from">
                  <ref name="serial"/>
                </attribute>
                <attribute name="to">
                  <ref name="serial"/>
                </attribute>
                <attribute name="uri">
                  <ref name="uri"/>
                </attribute>
                <attribute name="hash">
                  <ref name="sha256"/>
                </attribute>
              </element>
            </oneOrMore>
          </element>
        </optional>
      </element>
    </element>
  </start>
  <!--
    If we're getting rid of multiple snapshot segments, I think the
    index attributes go away.
    
    -01 is a bit vague on <publish/> and <withdraw/> elements:
    Zero-or-more? One-or-more? Does "exact copy" include using the
    publication protocol's XML namespace instead of RRDP's?  Tag
    attribute allowed?  Wing it for now.
  -->
  <!-- Snapshot segment: think DNS AXFR. -->
  <start combine="choice">
    <element name="msg">
      <attribute name="version">
        <ref name="version"/>
      </attribute>
      <attribute name="type">
        <value>snapshot</value>
      </attribute>
      <element name="snapshot">
        <attribute name="session_id">
          <ref name="uuid"/>
        </attribute>
        <attribute name="repository_version">
          <ref name="serial"/>
        </attribute>
        <attribute name="index">
          <ref name="index"/>
        </attribute>
        <zeroOrMore>
          <element name="publish">
            <attribute name="uri">
              <ref name="uri"/>
            </attribute>
            <ref name="base64"/>
          </element>
        </zeroOrMore>
      </element>
    </element>
  </start>
  <!-- Delta segment: think DNS IXFR. -->
  <!-- -01 doesn't say whether <delta/> is zero-or-more or one-or-more. -->
  <start combine="choice">
    <element name="msg">
      <attribute name="version">
        <ref name="version"/>
      </attribute>
      <attribute name="type">
        <value>deltas</value>
      </attribute>
      <element name="deltas">
        <attribute name="session_id">
          <ref name="uuid"/>
        </attribute>
        <attribute name="from">
          <ref name="serial"/>
        </attribute>
        <attribute name="to">
          <ref name="serial"/>
        </attribute>
        <attribute name="index">
          <ref name="index"/>
        </attribute>
        <zeroOrMore>
          <element name="delta">
            <attribute name="version">
              <ref name="serial"/>
            </attribute>
            <zeroOrMore>
              <choice>
                <element name="publish">
                  <attribute name="uri">
                    <ref name="uri"/>
                  </attribute>
                  <ref name="base64"/>
                </element>
                <element name="withdraw">
                  <attribute name="uri">
                    <ref name="uri"/>
                  </attribute>
                </element>
              </choice>
            </zeroOrMore>
          </element>
        </zeroOrMore>
      </element>
    </element>
  </start>
</grammar>
<!--
  Local Variables:
  indent-tabs-mode: nil
  comment-start: "# "
  comment-start-skip: "#[ \t]*"
  End:
-->