cddl 0.8.7 → 0.8.12
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/cddl.gemspec +2 -1
- data/data/cddl.abnf +1 -0
- data/lib/cddl.rb +63 -12
- 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/dotsize.cddl +7 -0
- data/test-data/feat1.cddl +4 -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: 2ede21b4292e6f546745029c7a071eb1af1259366e676d90e19f400dfe089d7a
|
4
|
+
data.tar.gz: 57ed90f75d58941bd28c5afef7d5eb29eea5d5483a6a3b2c4fc65d49df0370aa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 65de704e842bb6d48265e7024922edf0406d6cb521d2977b07db2926d396b8b2d6bdc103619d579b861cb53b8914b4383e25c2e610e86f7b4d88d89983a64dff
|
7
|
+
data.tar.gz: c0919845b3ee5bba3b2a5d77f9e182a4a9f1904f187843501abf29954d37033d62f1cfd50545865ba878c92583f26151f9024dc1093c0d4607442038b36008b0
|
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.12'
|
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
|
@@ -392,15 +396,19 @@ module CDDL
|
|
392
396
|
case where[1]
|
393
397
|
when :size
|
394
398
|
should_be_int = generate1(control)
|
395
|
-
unless (target
|
399
|
+
unless (Array === target && target[0] == :prim && [0, 2, 3].include?(target[1])) && Integer === should_be_int && should_be_int >= 0
|
396
400
|
fail "Don't know yet how to generate #{where}"
|
397
401
|
end
|
398
402
|
s = Random.new.bytes(should_be_int)
|
399
|
-
|
403
|
+
case target[1]
|
404
|
+
when 0
|
400
405
|
# silently restrict to what we can put into a uint
|
401
406
|
s[0...8].bytes.inject(0) {|a, b| a << 8 | b }
|
402
|
-
|
407
|
+
when 2
|
403
408
|
s
|
409
|
+
when 3
|
410
|
+
Base64.urlsafe_encode64(s)[0...should_be_int]
|
411
|
+
# XXX generate word a la w = gen_word
|
404
412
|
end
|
405
413
|
when :bits
|
406
414
|
set_of_bits = Array.new(10) { generate1(control) } # XXX: ten?
|
@@ -431,6 +439,8 @@ module CDDL
|
|
431
439
|
$default_warned = true
|
432
440
|
end
|
433
441
|
generate1(target, inmap)
|
442
|
+
when :feature
|
443
|
+
generate1(target, inmap)
|
434
444
|
when :eq
|
435
445
|
content = generate1(control)
|
436
446
|
if validate1(content, where)
|
@@ -519,7 +529,7 @@ module CDDL
|
|
519
529
|
end
|
520
530
|
end
|
521
531
|
|
522
|
-
VALUE_TYPE = {text: String, int: Integer, float: Float}
|
532
|
+
VALUE_TYPE = {text: String, bytes: String, int: Integer, float: Float}
|
523
533
|
SIMPLE_VALUE = {
|
524
534
|
[:prim, 7, 20] => [true, false, :bool],
|
525
535
|
[:prim, 7, 21] => [true, true, :bool],
|
@@ -543,11 +553,17 @@ module CDDL
|
|
543
553
|
|
544
554
|
def validate(d, warn=true)
|
545
555
|
@recursion = 0
|
556
|
+
$features = Hash.new {|h, k| h[k] = {}}
|
546
557
|
result = validate1a(d, rules)
|
547
|
-
|
548
|
-
if
|
558
|
+
if warn
|
559
|
+
if result
|
560
|
+
if $features != {}
|
561
|
+
warn "** Features potentially used: #{$features.map {|k, v| "#{k}: #{v.keys}"}.join(", ")}"
|
562
|
+
end
|
563
|
+
else
|
549
564
|
warn "CDDL validation failure (#{result.inspect} for #{d.inspect}):"
|
550
565
|
PP::pp(validate_diag, STDERR)
|
566
|
+
puts(validate_diag.cbor_diagnostic)
|
551
567
|
end
|
552
568
|
end
|
553
569
|
result
|
@@ -737,9 +753,12 @@ module CDDL
|
|
737
753
|
idx, ann = validate_forward(d, 0, where)
|
738
754
|
ann if validate_result(idx == d.size) { "#{validate_diag.inspect} -- cannot complete (#{idx}, #{d.size}) array #{d} for #{where}" }
|
739
755
|
end
|
740
|
-
when :
|
756
|
+
when :int, :float
|
741
757
|
_, v = extract_value(where)
|
742
758
|
[] if d == v
|
759
|
+
when :text, :bytes
|
760
|
+
_, v = extract_value(where)
|
761
|
+
[] if d == v && ((d.encoding == Encoding::BINARY) == (v.encoding == Encoding::BINARY))
|
743
762
|
when :range
|
744
763
|
[] if where[2] === d && where[1].include?(d)
|
745
764
|
when :anno
|
@@ -785,6 +804,10 @@ module CDDL
|
|
785
804
|
$default_warned = true
|
786
805
|
end
|
787
806
|
ann
|
807
|
+
when :feature
|
808
|
+
ok, v, vt = extract_value(control)
|
809
|
+
$features[v][d] = true
|
810
|
+
ann
|
788
811
|
when :lt, :le, :gt, :ge, :eq, :ne
|
789
812
|
op = OPERATORS[where[1]]
|
790
813
|
ok, v, _vt = extract_value(control)
|
@@ -833,6 +856,14 @@ module CDDL
|
|
833
856
|
when 3
|
834
857
|
String === d && d.encoding != Encoding::BINARY # cheat
|
835
858
|
when 6
|
859
|
+
if Integer === d
|
860
|
+
t = 2 # assuming only 2/3 match an Integer
|
861
|
+
if d < 0
|
862
|
+
d = ~d
|
863
|
+
t = 3
|
864
|
+
end
|
865
|
+
d = CBOR::Tagged.new(t, d == 0 ? "".b : d.digits(256).reverse!.pack("C*"))
|
866
|
+
end
|
836
867
|
CBOR::Tagged === d && d.tag == where[2] && validate1a(d.data, where[3])
|
837
868
|
when 7
|
838
869
|
t, v = extract_value(where)
|
@@ -955,7 +986,7 @@ module CDDL
|
|
955
986
|
when ""
|
956
987
|
parts[1].b
|
957
988
|
when "h"
|
958
|
-
parts[1].gsub(/\s/, "").chars.each_slice(2).map{ |x| Integer(x.join, 16).chr("BINARY") }.join
|
989
|
+
parts[1].gsub(/\s/, "").chars.each_slice(2).map{ |x| Integer(x.join, 16).chr("BINARY") }.join.b
|
959
990
|
when "b64"
|
960
991
|
Base64.urlsafe_decode64(parts[1])
|
961
992
|
else
|
@@ -1138,7 +1169,7 @@ module CDDL
|
|
1138
1169
|
end
|
1139
1170
|
when :recurse_grpent # XXX we don't have the entry yet
|
1140
1171
|
when :member
|
1141
|
-
fail "map entry without member key given: #{member}" unless member[3] || member[4][0] == :grpent || member[4][0] == :grpchoice
|
1172
|
+
fail "map entry #{member.inspect} without member key given: #{member}" unless member[3] || member[4][0] == :grpent || member[4][0] == :grpchoice
|
1142
1173
|
else
|
1143
1174
|
fail ["type1 member", member].inspect unless member[0] == :member
|
1144
1175
|
end
|
@@ -1148,7 +1179,7 @@ module CDDL
|
|
1148
1179
|
BRACE = {"{" => :map, "[" => :array}
|
1149
1180
|
RANGE_EXCLUDE_END = {".." => false, "..." => true}
|
1150
1181
|
SUPPORTED_ANNOTATIONS = [:bits, :size, :regexp, :cbor, :cborseq, :within, :and,
|
1151
|
-
:default, :lt, :le, :gt, :ge, :eq, :ne]
|
1182
|
+
:default, :lt, :le, :gt, :ge, :eq, :ne, :feature]
|
1152
1183
|
|
1153
1184
|
def type1(n, canbegroup = false)
|
1154
1185
|
# puts "NVALUE #{n.value.inspect}"
|
@@ -1210,6 +1241,26 @@ module CDDL
|
|
1210
1241
|
v
|
1211
1242
|
}
|
1212
1243
|
]
|
1244
|
+
when /\A~/
|
1245
|
+
if tn = n.typename
|
1246
|
+
s = type_recall(tn.to_s, false, n.genericarg).flatten(1)
|
1247
|
+
else
|
1248
|
+
fail "No typename in unwrap #{n}"
|
1249
|
+
end
|
1250
|
+
if s[0] != :type1
|
1251
|
+
fail [:UNWRAPs0, s].inspect
|
1252
|
+
end
|
1253
|
+
case s[1]
|
1254
|
+
when :map, :array
|
1255
|
+
[:grpent, s[2..-1]]
|
1256
|
+
when :prim
|
1257
|
+
if s[2] != 6
|
1258
|
+
fail [:UNWRAPs2, s].inspect
|
1259
|
+
end
|
1260
|
+
s[4] # check :type1?
|
1261
|
+
else
|
1262
|
+
fail [:UNWRAPs1, s].inspect
|
1263
|
+
end
|
1213
1264
|
else
|
1214
1265
|
"unimplemented #{n}"
|
1215
1266
|
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
|
+
]
|