Example #1
0
        def test_encode(self):
            mac = parse('''
    Frame(
      Header(
        preamble  = 0b10101010*7,
        start     = 0b10101011,
        destn     = 010203040506x0,
        source    = 0708090a0b0cx0,
        ethertype = 0800x0
      ),
      Data(1/8,2/8,3/8,4/8),
      CRC(234d0/4.)
    )
    ''')

            serial = simple_serialiser(mac, dispatch_table())
            bs = serial.bytes()
            for _index in range(7):
                b = next(bs)
                assert b == BitString.from_int('0b10101010').to_int(), b
            b = next(bs)
            assert b == BitString.from_int('0b10101011').to_int(), b
Example #2
0
        def test_match(self):
            #basicConfig(level=DEBUG)

            # first, define some test data - we'll use a simple definition
            # language, but you could also construct this directly in Python
            # (Frame, Header etc are auto-generated subclasses of Node).
            mac = parse('''
    Frame(
      Header(
        preamble  = 0b10101010*7,
        start     = 0b10101011,
        destn     = 010203040506x0,
        source    = 0708090a0b0cx0,
        ethertype = 0800x0
      ),
      Data(1/8,2/8,3/8,4/8),
      CRC(234d0/4.)
    )
    ''')

            # next, define a parser for the header structure
            # this is mainly literal values, but we make the two addresses
            # big-endian integers, which will be read from the data

            # this looks very like "normal" lepl because it is - there's
            # nothing in lepl that forces the data being parsed to be text.

            preamble = ~Const('0b10101010')[7]
            start = ~Const('0b10101011')
            destn = BEnd(6.0) > 'destn'
            source = BEnd(6.0) > 'source'
            ethertype = ~Const('0800x0')
            header = preamble & start & destn & source & ethertype > Node

            # so, what do the test data look like?
            #            print(mac)
            # Frame
            #  +- Header
            #  |   +- preamble BitString(b'\xaa\xaa\xaa\xaa\xaa\xaa\xaa', 56, 0)
            #  |   +- start BitString(b'\xab', 8, 0)
            #  |   +- destn BitString(b'\x01\x02\x03\x04\x05\x06', 48, 0)
            #  |   +- source BitString(b'\x07\x08\t\n\x0b\x0c', 48, 0)
            #  |   `- ethertype BitString(b'\x08\x00', 16, 0)
            #  +- Data
            #  |   +- BitString(b'\x01', 8, 0)
            #  |   +- BitString(b'\x02', 8, 0)
            #  |   +- BitString(b'\x03', 8, 0)
            #  |   `- BitString(b'\x04', 8, 0)
            #  `- CRC
            #      `- BitString(b'\x00\x00\x00\xea', 32, 0)

            # we can serialize that to a BitString
            b = simple_serialiser(mac, dispatch_table())
            assert str(b) == 'aaaaaaaaaaaaaaab123456789abc801234000eax0/240'

            # and then we can parse it
            header.config.no_full_first_match()
            p = header.parse(b)[0]
            #            print(p)
            # Node
            #  +- destn Int(1108152157446,48)
            #  `- source Int(7731092785932,48)

            # the destination address
            assert hex(p.destn[0]) == '0x10203040506'

            # the source address
            assert hex(p.source[0]) == '0x708090a0b0c'
Example #3
0
        def test_match(self):
            #basicConfig(level=DEBUG)
            
            # first, define some test data - we'll use a simple definition
            # language, but you could also construct this directly in Python
            # (Frame, Header etc are auto-generated subclasses of Node). 
            mac = parse('''
    Frame(
      Header(
        preamble  = 0b10101010*7,
        start     = 0b10101011,
        destn     = 010203040506x0,
        source    = 0708090a0b0cx0,
        ethertype = 0800x0
      ),
      Data(1/8,2/8,3/8,4/8),
      CRC(234d0/4.)
    )
    ''')
        
            # next, define a parser for the header structure
            # this is mainly literal values, but we make the two addresses
            # big-endian integers, which will be read from the data
            
            # this looks very like "normal" lepl because it is - there's 
            # nothing in lepl that forces the data being parsed to be text. 
            
            preamble  = ~Const('0b10101010')[7]
            start     = ~Const('0b10101011')
            destn     = BEnd(6.0)                > 'destn'
            source    = BEnd(6.0)                > 'source'
            ethertype = ~Const('0800x0') 
            header    = preamble & start & destn & source & ethertype > Node
            
            # so, what do the test data look like?
#            print(mac)
    # Frame
    #  +- Header
    #  |   +- preamble BitString(b'\xaa\xaa\xaa\xaa\xaa\xaa\xaa', 56, 0)
    #  |   +- start BitString(b'\xab', 8, 0)
    #  |   +- destn BitString(b'\x01\x02\x03\x04\x05\x06', 48, 0)
    #  |   +- source BitString(b'\x07\x08\t\n\x0b\x0c', 48, 0)
    #  |   `- ethertype BitString(b'\x08\x00', 16, 0)
    #  +- Data
    #  |   +- BitString(b'\x01', 8, 0)
    #  |   +- BitString(b'\x02', 8, 0)
    #  |   +- BitString(b'\x03', 8, 0)
    #  |   `- BitString(b'\x04', 8, 0)
    #  `- CRC
    #      `- BitString(b'\x00\x00\x00\xea', 32, 0)    
    
            # we can serialize that to a BitString        
            b = simple_serialiser(mac, dispatch_table())
            assert str(b) == 'aaaaaaaaaaaaaaab123456789abc801234000eax0/240'
    
            # and then we can parse it
            header.config.no_full_first_match()
            p = header.parse(b)[0]
#            print(p)
    # Node
    #  +- destn Int(1108152157446,48)
    #  `- source Int(7731092785932,48)
    
            # the destination address
            assert hex(p.destn[0]) == '0x10203040506'
    
            # the source address
            assert hex(p.source[0]) == '0x708090a0b0c'