cddl 0.8.8 → 0.8.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/cddl.gemspec +2 -1
- data/data/cddl.abnf +1 -0
- data/lib/cddl.rb +78 -9
- data/test-data/7807.cddl +14 -0
- data/test-data/abignum.cddl +1 -0
- data/test-data/bpv7.cddl +136 -0
- data/test-data/bpv7a.cddl +181 -0
- data/test-data/bpv7b.cddl +167 -0
- data/test-data/coral.cddl +10 -0
- data/test-data/coral1.cddl +5 -0
- data/test-data/coral2.cddl +7 -0
- data/test-data/coral3.cddl +7 -0
- data/test-data/feat1.cddl +4 -0
- data/test-data/feature-detail.cddl +5 -0
- data/test-data/foo.cddl +1 -0
- data/test-data/jim-cut-2.cddl +11 -0
- data/test-data/jim-cut.cddl +12 -0
- data/test-data/jsoniodef.cddl +719 -0
- data/test-data/mdl-ble.cddl +9 -0
- data/test-data/mdl-deve.cddl +54 -0
- data/test-data/mdl-dp.cddl +11 -0
- data/test-data/mdl-mso.cddl +20 -0
- data/test-data/mdl-request.cddl +26 -0
- data/test-data/mdl-response.cddl +66 -0
- data/test-data/mdl.cddl +11 -0
- data/test-data/mon-val.cddl +1 -0
- data/test-data/multipart-ct.cddl +2 -0
- data/test-data/named-group.cddl +7 -0
- data/test-data/test-gen.cddl +3 -0
- data/test/test-cddl.rb +51 -0
- metadata +32 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bbd414d9d4fbc897f8f31c03437fa57155547c0f02978de2da4f75844cf0e1ef
|
4
|
+
data.tar.gz: 9aa239d57c5e70f8352da90cc8023273a2793577df84ee6e003a1ac0fdc200dc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 00dac4c95e0b94e0bc3ae775b1bf1ab33a41507bb06774ccaa0838daf6c9fffc0c2d4b3d049199c3ae35858888be853058248c710ea056edd718a0938fd7d8e3
|
7
|
+
data.tar.gz: 18ea8731c6ab8ec9ae547331be276b9ca1c58c490c6986969824a0a56c7870478ca01418f8ae83a5504d393c14e9fcc5764bfc0cb65c7f2f267cd1757dfbdbac
|
data/cddl.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
spec = Gem::Specification.new do |s|
|
2
2
|
s.name = 'cddl'
|
3
|
-
s.version = '0.8.
|
3
|
+
s.version = '0.8.13'
|
4
4
|
s.summary = "CDDL generator and validator."
|
5
5
|
s.description = %{A parser, generator, and validator for CDDL}
|
6
6
|
s.add_dependency('cbor-diag')
|
@@ -19,3 +19,4 @@ spec = Gem::Specification.new do |s|
|
|
19
19
|
s.homepage = "http://github.com/cabo/cddl"
|
20
20
|
s.license = 'MIT'
|
21
21
|
end
|
22
|
+
|
data/data/cddl.abnf
CHANGED
@@ -16,6 +16,7 @@ type1 = type2 [S (rangeop / annotator) S type2]
|
|
16
16
|
/ "#" "6" ["." uint] "(" S type S ")" ; note no space!
|
17
17
|
/ "#" DIGIT ["." uint] ; major/ai
|
18
18
|
/ "#" ; any
|
19
|
+
/ "~" S typename [genericarg]
|
19
20
|
/ "{" S group S "}"
|
20
21
|
/ "[" S group S "]"
|
21
22
|
/ "&" S "(" S group S ")"
|
data/lib/cddl.rb
CHANGED
@@ -329,8 +329,12 @@ module CDDL
|
|
329
329
|
unless kr
|
330
330
|
case vr[0]
|
331
331
|
when :grpent
|
332
|
-
fail "grpent in map #{vr.inspect}" unless vr.size == 2
|
333
|
-
g = Array.new(st) {
|
332
|
+
# fail "grpent in map #{vr.inspect}" unless vr.size == 2
|
333
|
+
g = Array.new(st) {
|
334
|
+
vr[1..-1].map{ |vrx|
|
335
|
+
generate1(vrx, true)
|
336
|
+
}.flatten(1)
|
337
|
+
}.flatten(1)
|
334
338
|
# warn "GGG #{g.inspect}"
|
335
339
|
return g
|
336
340
|
when :grpchoice
|
@@ -435,6 +439,8 @@ module CDDL
|
|
435
439
|
$default_warned = true
|
436
440
|
end
|
437
441
|
generate1(target, inmap)
|
442
|
+
when :feature
|
443
|
+
generate1(target, inmap)
|
438
444
|
when :eq
|
439
445
|
content = generate1(control)
|
440
446
|
if validate1(content, where)
|
@@ -523,7 +529,7 @@ module CDDL
|
|
523
529
|
end
|
524
530
|
end
|
525
531
|
|
526
|
-
VALUE_TYPE = {text: String, int: Integer, float: Float}
|
532
|
+
VALUE_TYPE = {text: String, bytes: String, int: Integer, float: Float}
|
527
533
|
SIMPLE_VALUE = {
|
528
534
|
[:prim, 7, 20] => [true, false, :bool],
|
529
535
|
[:prim, 7, 21] => [true, true, :bool],
|
@@ -541,17 +547,33 @@ module CDDL
|
|
541
547
|
end
|
542
548
|
end
|
543
549
|
|
550
|
+
def extract_array(t)
|
551
|
+
return [false] unless t[0] == :array
|
552
|
+
[true, *t[1..-1].map { |el|
|
553
|
+
return [false] unless el[0..3] == [:member, 1, 1, nil]
|
554
|
+
ok, v, vt = extract_value(el[4])
|
555
|
+
return [false] unless ok
|
556
|
+
[v, vt]
|
557
|
+
}]
|
558
|
+
end
|
559
|
+
|
544
560
|
def validate_diag
|
545
561
|
[@last_data, @last_rule, @last_message]
|
546
562
|
end
|
547
563
|
|
548
564
|
def validate(d, warn=true)
|
549
565
|
@recursion = 0
|
566
|
+
$features = Hash.new {|h, k| h[k] = {}}
|
550
567
|
result = validate1a(d, rules)
|
551
|
-
|
552
|
-
if
|
568
|
+
if warn
|
569
|
+
if result
|
570
|
+
if $features != {}
|
571
|
+
warn "** Features potentially used: #{$features.map {|k, v| "#{k}: #{v.keys}"}.join(", ")}"
|
572
|
+
end
|
573
|
+
else
|
553
574
|
warn "CDDL validation failure (#{result.inspect} for #{d.inspect}):"
|
554
575
|
PP::pp(validate_diag, STDERR)
|
576
|
+
puts(validate_diag.cbor_diagnostic)
|
555
577
|
end
|
556
578
|
end
|
557
579
|
result
|
@@ -741,9 +763,12 @@ module CDDL
|
|
741
763
|
idx, ann = validate_forward(d, 0, where)
|
742
764
|
ann if validate_result(idx == d.size) { "#{validate_diag.inspect} -- cannot complete (#{idx}, #{d.size}) array #{d} for #{where}" }
|
743
765
|
end
|
744
|
-
when :
|
766
|
+
when :int, :float
|
745
767
|
_, v = extract_value(where)
|
746
768
|
[] if d == v
|
769
|
+
when :text, :bytes
|
770
|
+
_, v = extract_value(where)
|
771
|
+
[] if d == v && ((d.encoding == Encoding::BINARY) == (v.encoding == Encoding::BINARY))
|
747
772
|
when :range
|
748
773
|
[] if where[2] === d && where[1].include?(d)
|
749
774
|
when :anno
|
@@ -789,6 +814,22 @@ module CDDL
|
|
789
814
|
$default_warned = true
|
790
815
|
end
|
791
816
|
ann
|
817
|
+
when :feature
|
818
|
+
ok, v, vt = extract_value(control)
|
819
|
+
if ok
|
820
|
+
nm = v
|
821
|
+
det = d
|
822
|
+
else
|
823
|
+
ok, *v = extract_array(control)
|
824
|
+
if ok && v.size == 2
|
825
|
+
nm = v[0][0]
|
826
|
+
det = v[1][0]
|
827
|
+
else
|
828
|
+
warn "*** feature controller not implemented: #{control.inspect}"
|
829
|
+
end
|
830
|
+
end
|
831
|
+
$features[nm][det] = true
|
832
|
+
ann
|
792
833
|
when :lt, :le, :gt, :ge, :eq, :ne
|
793
834
|
op = OPERATORS[where[1]]
|
794
835
|
ok, v, _vt = extract_value(control)
|
@@ -837,6 +878,14 @@ module CDDL
|
|
837
878
|
when 3
|
838
879
|
String === d && d.encoding != Encoding::BINARY # cheat
|
839
880
|
when 6
|
881
|
+
if Integer === d
|
882
|
+
t = 2 # assuming only 2/3 match an Integer
|
883
|
+
if d < 0
|
884
|
+
d = ~d
|
885
|
+
t = 3
|
886
|
+
end
|
887
|
+
d = CBOR::Tagged.new(t, d == 0 ? "".b : d.digits(256).reverse!.pack("C*"))
|
888
|
+
end
|
840
889
|
CBOR::Tagged === d && d.tag == where[2] && validate1a(d.data, where[3])
|
841
890
|
when 7
|
842
891
|
t, v = extract_value(where)
|
@@ -959,7 +1008,7 @@ module CDDL
|
|
959
1008
|
when ""
|
960
1009
|
parts[1].b
|
961
1010
|
when "h"
|
962
|
-
parts[1].gsub(/\s/, "").chars.each_slice(2).map{ |x| Integer(x.join, 16).chr("BINARY") }.join
|
1011
|
+
parts[1].gsub(/\s/, "").chars.each_slice(2).map{ |x| Integer(x.join, 16).chr("BINARY") }.join.b
|
963
1012
|
when "b64"
|
964
1013
|
Base64.urlsafe_decode64(parts[1])
|
965
1014
|
else
|
@@ -1142,7 +1191,7 @@ module CDDL
|
|
1142
1191
|
end
|
1143
1192
|
when :recurse_grpent # XXX we don't have the entry yet
|
1144
1193
|
when :member
|
1145
|
-
fail "map entry without member key given: #{member}" unless member[3] || member[4][0] == :grpent || member[4][0] == :grpchoice
|
1194
|
+
fail "map entry #{member.inspect} without member key given: #{member}" unless member[3] || member[4][0] == :grpent || member[4][0] == :grpchoice
|
1146
1195
|
else
|
1147
1196
|
fail ["type1 member", member].inspect unless member[0] == :member
|
1148
1197
|
end
|
@@ -1152,7 +1201,7 @@ module CDDL
|
|
1152
1201
|
BRACE = {"{" => :map, "[" => :array}
|
1153
1202
|
RANGE_EXCLUDE_END = {".." => false, "..." => true}
|
1154
1203
|
SUPPORTED_ANNOTATIONS = [:bits, :size, :regexp, :cbor, :cborseq, :within, :and,
|
1155
|
-
:default, :lt, :le, :gt, :ge, :eq, :ne]
|
1204
|
+
:default, :lt, :le, :gt, :ge, :eq, :ne, :feature]
|
1156
1205
|
|
1157
1206
|
def type1(n, canbegroup = false)
|
1158
1207
|
# puts "NVALUE #{n.value.inspect}"
|
@@ -1214,6 +1263,26 @@ module CDDL
|
|
1214
1263
|
v
|
1215
1264
|
}
|
1216
1265
|
]
|
1266
|
+
when /\A~/
|
1267
|
+
if tn = n.typename
|
1268
|
+
s = type_recall(tn.to_s, false, n.genericarg).flatten(1)
|
1269
|
+
else
|
1270
|
+
fail "No typename in unwrap #{n}"
|
1271
|
+
end
|
1272
|
+
if s[0] != :type1
|
1273
|
+
fail [:UNWRAPs0, s].inspect
|
1274
|
+
end
|
1275
|
+
case s[1]
|
1276
|
+
when :map, :array
|
1277
|
+
[:grpent, s[2..-1]]
|
1278
|
+
when :prim
|
1279
|
+
if s[2] != 6
|
1280
|
+
fail [:UNWRAPs2, s].inspect
|
1281
|
+
end
|
1282
|
+
s[4] # check :type1?
|
1283
|
+
else
|
1284
|
+
fail [:UNWRAPs1, s].inspect
|
1285
|
+
end
|
1217
1286
|
else
|
1218
1287
|
"unimplemented #{n}"
|
1219
1288
|
end
|
data/test-data/7807.cddl
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
coap-problem-details = {
|
2
|
+
type => uint,
|
3
|
+
? title => text,
|
4
|
+
? response-code => bstr .size 1,
|
5
|
+
? detail => text,
|
6
|
+
? instance => uri,
|
7
|
+
* $$coap-problem-details-extension,
|
8
|
+
}
|
9
|
+
|
10
|
+
type = 0
|
11
|
+
title = 1
|
12
|
+
response-code = 2
|
13
|
+
detail = 3
|
14
|
+
instance = 4
|
@@ -0,0 +1 @@
|
|
1
|
+
abignum = unsigned
|
data/test-data/bpv7.cddl
ADDED
@@ -0,0 +1,136 @@
|
|
1
|
+
start = bundle
|
2
|
+
|
3
|
+
dtn-time = uint
|
4
|
+
|
5
|
+
creation-timestamp = [dtn-time, sequence: uint]
|
6
|
+
|
7
|
+
eid-generic = [uri-code, SSP: any]
|
8
|
+
|
9
|
+
uri-code = uint
|
10
|
+
|
11
|
+
eid = eid-choice .within eid-generic
|
12
|
+
|
13
|
+
eid-choice /= [dtn-code, SSP: (text / 0)]
|
14
|
+
|
15
|
+
dtn-code = 1 ; TBD
|
16
|
+
|
17
|
+
eid-choice /= [ipn-code, SSP: [nodenum: uint, servicenum: uint]]
|
18
|
+
|
19
|
+
ipn-code = 2 ; TBD
|
20
|
+
|
21
|
+
bundle-control-flags = uint .bits bundleflagbits
|
22
|
+
|
23
|
+
bundleflagbits = &(
|
24
|
+
|
25
|
+
reserved: 15
|
26
|
+
|
27
|
+
reserved: 14
|
28
|
+
|
29
|
+
reserved: 13
|
30
|
+
|
31
|
+
bundle-deletion-status-reports-are-requested: 12
|
32
|
+
|
33
|
+
bundle-delivery-status-reports-are-requested: 11
|
34
|
+
|
35
|
+
bundle-forwarding-status-reports-are-requested: 10
|
36
|
+
|
37
|
+
reserved: 9
|
38
|
+
|
39
|
+
bundle-reception-status-reports-are-requested: 8
|
40
|
+
|
41
|
+
bundle-contains-a-Manifest-block: 7
|
42
|
+
|
43
|
+
status-time-is-requested-in-all-status-reports: 6
|
44
|
+
|
45
|
+
user-application-acknowledgement-is-requested: 5
|
46
|
+
|
47
|
+
reserved: 4
|
48
|
+
|
49
|
+
reserved: 3
|
50
|
+
|
51
|
+
bundle-must-not-be-fragmented: 2
|
52
|
+
|
53
|
+
payload-is-an-administrative-record: 1
|
54
|
+
|
55
|
+
bundle-is-a-fragment: 0
|
56
|
+
|
57
|
+
)
|
58
|
+
|
59
|
+
crc = bytes
|
60
|
+
|
61
|
+
block-control-flags = uint .bits blockflagbits
|
62
|
+
|
63
|
+
blockflagbits = &(
|
64
|
+
|
65
|
+
reserved: 7
|
66
|
+
|
67
|
+
reserved: 6
|
68
|
+
|
69
|
+
reserved: 5
|
70
|
+
|
71
|
+
reserved: 4
|
72
|
+
|
73
|
+
bundle-must-be-deleted-if-block-cannot-be-processed: 3
|
74
|
+
|
75
|
+
status-report-must-be-transmitted-if-block-cannot-be-processed: 2
|
76
|
+
|
77
|
+
block-must-be-removed-from-bundle-if-it-cannot-be-processed: 1
|
78
|
+
|
79
|
+
block-must-be-replicated-in-every-fragment: 0
|
80
|
+
|
81
|
+
)
|
82
|
+
|
83
|
+
bundle = [primary-block, *extension-block, payload-block]
|
84
|
+
|
85
|
+
primary-block = [
|
86
|
+
|
87
|
+
version: 7,
|
88
|
+
|
89
|
+
bundle-control-flags,
|
90
|
+
|
91
|
+
crc-type: uint,
|
92
|
+
|
93
|
+
destination: eid,
|
94
|
+
|
95
|
+
source-node: eid,
|
96
|
+
|
97
|
+
report-to: eid,
|
98
|
+
|
99
|
+
creation-timestamp,
|
100
|
+
|
101
|
+
lifetime: uint,
|
102
|
+
|
103
|
+
? fragment-offset: uint,
|
104
|
+
|
105
|
+
? total-application-data-length: uint,
|
106
|
+
|
107
|
+
? crc,
|
108
|
+
|
109
|
+
]
|
110
|
+
|
111
|
+
canonical-block = [
|
112
|
+
|
113
|
+
block-type-code: uint,
|
114
|
+
|
115
|
+
canonical-block-common,
|
116
|
+
|
117
|
+
? crc
|
118
|
+
|
119
|
+
]
|
120
|
+
|
121
|
+
canonical-block-common = (
|
122
|
+
|
123
|
+
block-number: uint,
|
124
|
+
|
125
|
+
block-control-flags,
|
126
|
+
|
127
|
+
crc-type: uint,
|
128
|
+
|
129
|
+
block-type-specific-data: bytes
|
130
|
+
|
131
|
+
)
|
132
|
+
|
133
|
+
|
134
|
+
payload-block = ([block-type-code: 1, canonical-block-common, ?crc]) .within canonical-block
|
135
|
+
|
136
|
+
extension-block = ([block-type-code: (uint .ne 1), canonical-block-common, ?crc]) .within canonical-block
|
@@ -0,0 +1,181 @@
|
|
1
|
+
start = bundle / #6.55799(bundle)
|
2
|
+
|
3
|
+
; Times before 2000 are invalid
|
4
|
+
dtn-time = uint
|
5
|
+
|
6
|
+
; CRC enumerated type
|
7
|
+
crc-type = 0 / 1 / 2
|
8
|
+
; Either 16-bit or 32-bit
|
9
|
+
crc-value = (bstr .size 2) / (bstr .size 4)
|
10
|
+
|
11
|
+
creation-timestamp = [dtn-time, sequence: uint]
|
12
|
+
|
13
|
+
eid = $eid-choice .within eid-structure
|
14
|
+
eid-structure = [
|
15
|
+
uri-code: uint,
|
16
|
+
SSP: any
|
17
|
+
]
|
18
|
+
$eid-choice /= [
|
19
|
+
uri-code: 1,
|
20
|
+
SSP: (tstr / 0)
|
21
|
+
]
|
22
|
+
$eid-choice /= [
|
23
|
+
uri-code: 2,
|
24
|
+
SSP: [
|
25
|
+
nodenum: uint,
|
26
|
+
servicenum: uint
|
27
|
+
]
|
28
|
+
]
|
29
|
+
|
30
|
+
bundle-control-flags = uint .bits bundleflagbits
|
31
|
+
bundleflagbits = &(
|
32
|
+
reserved: 15
|
33
|
+
reserved: 14
|
34
|
+
reserved: 13
|
35
|
+
bundle-deletion-status-reports-are-requested: 12
|
36
|
+
bundle-delivery-status-reports-are-requested: 11
|
37
|
+
bundle-forwarding-status-reports-are-requested: 10
|
38
|
+
reserved: 9
|
39
|
+
bundle-reception-status-reports-are-requested: 8
|
40
|
+
bundle-contains-a-Manifest-block: 7
|
41
|
+
status-time-is-requested-in-all-status-reports: 6
|
42
|
+
user-application-acknowledgement-is-requested: 5
|
43
|
+
reserved: 4
|
44
|
+
reserved: 3
|
45
|
+
bundle-must-not-be-fragmented: 2
|
46
|
+
payload-is-an-administrative-record: 1
|
47
|
+
bundle-is-a-fragment: 0
|
48
|
+
)
|
49
|
+
|
50
|
+
block-control-flags = uint .bits blockflagbits
|
51
|
+
blockflagbits = &(
|
52
|
+
reserved: 7
|
53
|
+
reserved: 6
|
54
|
+
reserved: 5
|
55
|
+
reserved: 4
|
56
|
+
bundle-must-be-deleted-if-block-cannot-be-processed: 3
|
57
|
+
status-report-must-be-transmitted-if-block-cannot-be-processed: 2
|
58
|
+
block-must-be-removed-from-bundle-if-it-cannot-be-processed: 1
|
59
|
+
block-must-be-replicated-in-every-fragment: 0
|
60
|
+
)
|
61
|
+
|
62
|
+
bundle = [primary-block, *extension-block, payload-block]
|
63
|
+
|
64
|
+
primary-block = [
|
65
|
+
version: 7,
|
66
|
+
bundle-control-flags,
|
67
|
+
crc-type,
|
68
|
+
destination: eid,
|
69
|
+
source-node: eid,
|
70
|
+
report-to: eid,
|
71
|
+
creation-timestamp,
|
72
|
+
lifetime: uint,
|
73
|
+
? (
|
74
|
+
fragment-offset: uint,
|
75
|
+
; total-application-data-length: uint,
|
76
|
+
)
|
77
|
+
? crc-value,
|
78
|
+
]
|
79
|
+
|
80
|
+
; Abstract shared structure of all non-primary blocks
|
81
|
+
canonical-block-structure = [
|
82
|
+
block-type-code: uint,
|
83
|
+
block-number: uint,
|
84
|
+
block-control-flags,
|
85
|
+
crc-type,
|
86
|
+
; Each block type defines the content within the bytestring
|
87
|
+
block-type-specific-data,
|
88
|
+
? crc-value
|
89
|
+
]
|
90
|
+
block-type-specific-data = bstr / #6.24(bstr)
|
91
|
+
; Extension block type, which does not specialize any more than the code/number
|
92
|
+
extension-block = $extension-block-structure .within canonical-block-structure
|
93
|
+
$extension-block-structure = [
|
94
|
+
block-type-code: (uint .gt 1),
|
95
|
+
extension-block-number,
|
96
|
+
block-control-flags,
|
97
|
+
crc-type,
|
98
|
+
($extension-block-data .within block-type-specific-data)
|
99
|
+
? crc-value
|
100
|
+
]
|
101
|
+
extension-block-number = (uint .ne 0)
|
102
|
+
; Payload block type
|
103
|
+
payload-block = payload-block-structure .within canonical-block-structure
|
104
|
+
payload-block-structure = [
|
105
|
+
block-type-code: 1,
|
106
|
+
block-number: 0,
|
107
|
+
block-control-flags,
|
108
|
+
crc-type,
|
109
|
+
($payload-block-data .within block-type-specific-data)
|
110
|
+
? crc-value
|
111
|
+
]
|
112
|
+
|
113
|
+
; Arbitrary payload data
|
114
|
+
$payload-block-data /= bstr
|
115
|
+
|
116
|
+
|
117
|
+
; Administrative record as a payload data specialization
|
118
|
+
$payload-block-data /= block-type-specific-data .cbor admin-record
|
119
|
+
admin-record = $admin-record .within admin-record-structure
|
120
|
+
admin-record-structure = [
|
121
|
+
record-type-code: uint,
|
122
|
+
record-content: any
|
123
|
+
]
|
124
|
+
; Only one defined record type
|
125
|
+
$admin-record /= [1, status-record-content]
|
126
|
+
status-record-content = [
|
127
|
+
bundle-status-information,
|
128
|
+
status-report-reason-code: uint,
|
129
|
+
source-node-eid: eid,
|
130
|
+
subject-creation-timestamp: creation-timestamp,
|
131
|
+
? (
|
132
|
+
subject-payload-offset: uint,
|
133
|
+
subject-payload-length: uint
|
134
|
+
)
|
135
|
+
]
|
136
|
+
bundle-status-information = [
|
137
|
+
reporting-node-received-bundle: status-info-content,
|
138
|
+
reporting-node-forwarded-bundle: status-info-content,
|
139
|
+
reporting-node-delivered-bundle: status-info-content,
|
140
|
+
reporting-node-deleted-bundle: status-info-content
|
141
|
+
]
|
142
|
+
status-info-content = [
|
143
|
+
status-indicator: bool,
|
144
|
+
? timestamp: dtn-time
|
145
|
+
]
|
146
|
+
|
147
|
+
; Previous Node extension block
|
148
|
+
$extension-block-structure /= [
|
149
|
+
block-type-code: 7,
|
150
|
+
extension-block-number,
|
151
|
+
block-control-flags,
|
152
|
+
crc-type,
|
153
|
+
(block-type-specific-data .cbor ext-data-previous-node)
|
154
|
+
? crc-value
|
155
|
+
]
|
156
|
+
ext-data-previous-node = eid
|
157
|
+
|
158
|
+
; Bundle Age extension block
|
159
|
+
$extension-block-structure /= [
|
160
|
+
block-type-code: 8,
|
161
|
+
extension-block-number,
|
162
|
+
block-control-flags,
|
163
|
+
crc-type,
|
164
|
+
(block-type-specific-data .cbor ext-data-bundle-age)
|
165
|
+
? crc-value
|
166
|
+
]
|
167
|
+
ext-data-bundle-age = uint
|
168
|
+
|
169
|
+
; Hop Count extension block
|
170
|
+
$extension-block-structure /= [
|
171
|
+
block-type-code: 9,
|
172
|
+
extension-block-number,
|
173
|
+
block-control-flags,
|
174
|
+
crc-type,
|
175
|
+
(block-type-specific-data .cbor ext-data-hop-count)
|
176
|
+
? crc-value
|
177
|
+
]
|
178
|
+
ext-data-hop-count = [
|
179
|
+
hop-limit: uint,
|
180
|
+
hop-count: uint
|
181
|
+
]
|