cddl 0.8.6 → 0.8.11
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 +2 -2
 - data/lib/cddl.rb +43 -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: 77b28f069a663ccb82301ec6db8cf42db6b00127b36272020baf874416029a2b
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: c37387e5d6b1009d054cb9a345d337e43fbc2a9bcc826d009aa0b1cdfeded437
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: b7818289a708b07c08a58c8b114730777d70a4dbfb43ec94f10fbcacfae21cdbdcd72b11dd225e52471963e1570d30cb5703790f424b470015ab67064cc48ae8
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 301eb0733448db7eae4dff9404d51b436c018ede13ed9a2288a6285d783e58d479186e80193e90e38ed075bd24b33fccf1ed2055eb57fd99cd99594621aa1df7
         
     | 
    
        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.11'
         
     | 
| 
       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
    
    
    
        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}"
         
     | 
    
        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 
     | 
    
         
            +
            ]
         
     |