blob: f3e332835475db53922b12c81a4daa8d5016d427 [file] [log] [blame]
# MIT License
# Copyright (c) 2018 Jose Amores
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
# This file is part of Scapy
# See http://www.secdev.org/projects/scapy for more information
# Copyright (C) Sebastian Baar <[email protected]>
# This program is published under a GPLv2 license
##########
##########
+ Basic operations
= Load module
load_contrib("automotive.someip", globals_dict=globals())
+ SOME/IP operation
= Basic build
p = SOMEIP()
pstr = bytes(p)
binstr = b"\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x01\x01\x00\x00"
assert pstr == binstr
= Build with empty payload
p.payload = Raw(b"")
pstr = bytes(p)
binstr = b"\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x01\x01\x00\x00"
assert pstr == binstr
= Build with non-empty payload
p.payload = Raw(b"\xde\xad\xbe\xef")
pstr = bytes(p)
binstr = b"\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x01\x01\x00\x00\xde\xad\xbe\xef"
assert pstr == binstr
= Dissect EVENT_ID packet
p = SOMEIP(b"\x11\x11\x81\x11\x00\x00\x00\x08\x33\x33\x44\x44\x02\x03\x04\x05")
assert p.srv_id == 0x1111
assert p.sub_id == 0x8111
assert p.client_id == 0x3333
assert p.session_id == 0x4444
assert p.proto_ver == 0x02
assert p.iface_ver == 0x03
assert p.msg_type == 0x04
assert p.retcode == 0x05
= Dissect METHOD_ID packet
p = SOMEIP(b"\x11\x11\x01\x11\x00\x00\x00\x08\x33\x33\x44\x44\x02\x03\x04\x05")
assert p.srv_id == 0x1111
assert p.sub_id == 0x0111
assert p.client_id == 0x3333
assert p.session_id == 0x4444
assert p.proto_ver == 0x02
assert p.iface_ver == 0x03
assert p.msg_type == 0x04
assert p.retcode == 0x05
+ SOME/IP-TP operation
= Build TP
p = SOMEIP()
p.msg_type = 0x20
pstr = bytes(p)
print(pstr)
binstr = b'\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x01\x01\x20\x00\x00\x00\x00\x00'
assert pstr == binstr
p.more_seg = 1
pstr = bytes(p)
binstr = b'\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x01\x01\x20\x00\x00\x00\x00\x01'
assert pstr == binstr
p.msg_type = 0x00
pstr = bytes(p)
binstr = b'\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x01\x01\x00\x00'
assert pstr == binstr
= Dissect TP
p = SOMEIP(b'\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x01\x01\x21\x00\x00\x00\x00\x01')
assert p.msg_type == 0x21
assert p.more_seg == 1
assert p.len == 12
p.msg_type = 0x00
pstr = bytes(p)
binstr = b"\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x01\x01\x00\x00"
assert pstr == binstr
= Build TP fragmented
p = SOMEIP()
p.msg_type = 0x20
p.add_payload(Raw("A"*1400))
f = p.fragment()
assert f[0].len == 1404
assert f[1].len == 20
assert f[0].payload == Raw("A"*1392)
assert f[1].payload == Raw("A"*8)
assert f[0].more_seg == 1
assert f[1].more_seg == 0
+ SD Entry Service
= Check packet length on empty build
p = SDEntry_Service()
assert len(bytes(p)) == SDENTRY_OVERALL_LEN
= Build 1
p = SDEntry_Service(type = SDENTRY_TYPE_SRV_OFFERSERVICE,
index_1 = 0x11, index_2 = 0x22, srv_id = 0x3333,
inst_id = 0x4444, major_ver = 0x55,
ttl = 0x666666, minor_ver = 0xdeadbeef)
p_str = bytes(p)
bin_str = b"\x01\x11\x22\x00\x33\x33\x44\x44\x55\x66\x66\x66\xde\xad\xbe\xef"
assert p_str == bin_str
assert len(p_str) == SDENTRY_OVERALL_LEN
= Build 2
p = SDEntry_Service(n_opt_1 = 0xf1, n_opt_2 = 0xf2)
p_str = bytes(p)
bin_str = b"\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
assert p_str == bin_str
assert len(p_str) == SDENTRY_OVERALL_LEN
= Dissect
p = SDEntry_Service(
b"\x01\x22\x33\x00\x44\x44\x55\x55\x66\x77\x77\x77\xde\xad\xbe\xef")
assert p.type == SDENTRY_TYPE_SRV_OFFERSERVICE
assert p.index_1 == 0x22
assert p.index_2 == 0x33
assert p.srv_id == 0x4444
assert p.inst_id == 0x5555
assert p.major_ver == 0x66
assert p.ttl == 0x777777
assert p.minor_ver == 0xdeadbeef
+ SD Entry Eventgroup
= Check packet length on empty build
p = SDEntry_EventGroup()
assert len(bytes(p)) == SDENTRY_OVERALL_LEN
= Build
p = SDEntry_EventGroup(index_1 = 0x11, index_2 = 0x22, srv_id = 0x3333,
inst_id = 0x4444, major_ver = 0x55, ttl = 0x666666,
cnt = 0x7, eventgroup_id = 0x8888)
p_str = bytes(p)
bin_str = b"\x06\x11\x22\x00\x33\x33\x44\x44\x55\x66\x66\x66\x00\x07\x88\x88"
assert p_str == bin_str
assert len(bytes(p)) == SDENTRY_OVERALL_LEN
= Dissect
p = SDEntry_EventGroup(
b"\x06\x11\x22\x00\x33\x33\x44\x44\x55\x66\x66\x66\x00\x07\x88\x88")
assert p.index_1 == 0x11
assert p.index_2 == 0x22
assert p.srv_id == 0x3333
assert p.inst_id == 0x4444
assert p.major_ver == 0x55
assert p.ttl == 0x666666
assert p.cnt == 0x7
assert p.eventgroup_id == 0x8888
+ SD Flags
= Build and check flags
p = SD()
p.flags = "REBOOT"
assert p.flags == 0x80
p.flags = ""
assert p.flags == 0x00
p.flags = "UNICAST"
assert p.flags == 0x40
p.flags = ""
assert p.flags == 0x00
p.flags = "EXPLICIT_INITIAL_DATA_CONTROL"
assert p.flags == 0x20
p.flags = ""
assert p.flags == 0x00
p.flags = "REBOOT+UNICAST+EXPLICIT_INITIAL_DATA_CONTROL"
assert p.flags == 0xe0
+ SD Get SOME/IP Packet
= Build empty
p = SOMEIP() / SD()
assert len(bytes(p)) == SOMEIP._OVERALL_LEN_NOPAYLOAD + 12
= Verify constants against spec TR_SOMEIP_00250
assert SD.SOMEIP_MSGID_SRVID == 0xffff
assert SD.SOMEIP_MSGID_SUBID == 0x8100
assert SD.SOMEIP_CLIENT_ID == 0x0000
assert SD.SOMEIP_MINIMUM_SESSION_ID == 0x0001
assert SD.SOMEIP_PROTO_VER == 0x01
assert SD.SOMEIP_IFACE_VER == 0x01
assert SD.SOMEIP_MSG_TYPE == 0x02
assert SD.SOMEIP_RETCODE == 0x00
= check that values are bound
assert p[SOMEIP].srv_id == SD.SOMEIP_MSGID_SRVID
assert p[SOMEIP].sub_id == SD.SOMEIP_MSGID_SUBID
assert p[SOMEIP].client_id == SD.SOMEIP_CLIENT_ID
assert p[SOMEIP].session_id != 0x0000
assert p[SOMEIP].session_id >= SD.SOMEIP_MINIMUM_SESSION_ID
assert p[SOMEIP].proto_ver == SD.SOMEIP_PROTO_VER
assert p[SOMEIP].iface_ver == SD.SOMEIP_IFACE_VER
assert p[SOMEIP].msg_type == SD.SOMEIP_MSG_TYPE
assert p[SOMEIP].retcode == SD.SOMEIP_RETCODE
# FIXME: Service Discovery messages shell be transported over UDP
# (TR_SOMEIP_00248)
# FIXME: The port 30490 (UDP and TCP as well) shall be only used for SOME/IP-SD
# and not used for applications communicating over SOME/IP (TR_SOMEIP_00020)
+ SD
= Check length of package without entries nor options
p = SD()
assert len(bytes(p)) == 12
= Check entries to array and size check
p.set_entryArray([SDEntry_Service(), SDEntry_EventGroup()])
assert struct.unpack("!L", bytes(p)[4:8])[0] == 32
p.set_entryArray([])
assert struct.unpack("!L", bytes(p)[4:8])[0] == 0
= Check Options to array and size check
p.set_optionArray([SDOption_IP4_EndPoint(), SDOption_IP4_EndPoint()])
assert struct.unpack("!L", bytes(p)[8:12])[0] == 24
p.set_optionArray([])
assert struct.unpack("!L", bytes(p)[8:12])[0] == 0
= Check Entries & Options to array and size check
p.set_entryArray([SDEntry_Service(), SDEntry_EventGroup()])
p.set_optionArray([SDOption_IP4_EndPoint(), SDOption_IP4_EndPoint()])
assert struct.unpack("!L", bytes(p)[4:8])[0] == 32
assert struct.unpack("!L", bytes(p)[40:44])[0] == 24
+ Git issue 2348: SOME/IP-SD Entry-Array is broken by building it from RAW
= Single SD entry
# offer service
ea1 = SDEntry_Service()
ea1.type = 1
ea1.srv_id = 0x1234
ea1.inst_id = 0x5678
ea1.ttl = 0x333333
# subscribe eventgroup
ea2 = SDEntry_EventGroup()
ea2.type = 0x6
ea2.srv_id = 0x8765
ea2.inst_id = 0x4321
ea2.ttl = 0x222222
ea2.eventgroup_id = 0x1357
sd1 = SD()
sd1.set_entryArray([ea1])
# this is computed on build, but we need it sooner for the assert
sd1.len_entry_array = 16
sd1.len_option_array = 0
assert sd1.show(dump=True) == SD(sd1.build()).show(dump=True)
= Double SD entry
sd2 = SD()
sd2.set_entryArray([ea2,ea1])
# this is computed on build, but we need it sooner for the assert
sd2.len_entry_array = 32
sd2.len_option_array = 0
assert sd2.show(dump=True) == SD(sd2.build()).show(dump=True)
= Flipped double SD entry
# flip the order
sd2.set_entryArray([ea1,ea2])
assert sd2.show(dump=True) == SD(sd2.build()).show(dump=True)
+ SD Options (individual)
= Verifying constants against spec
assert SDOPTION_CFG_TYPE == 0x01
assert SDOPTION_LOADBALANCE_TYPE == 0x02
assert SDOPTION_LOADBALANCE_LEN == 0x05
assert SDOPTION_IP4_ENDPOINT_TYPE == 0x04
assert SDOPTION_IP4_ENDPOINT_LEN == 0x0009
assert SDOPTION_IP4_MCAST_TYPE == 0x14
assert SDOPTION_IP4_MCAST_LEN == 0x0009
assert SDOPTION_IP4_SDENDPOINT_TYPE == 0x24
assert SDOPTION_IP4_SDENDPOINT_LEN == 0x0009
assert SDOPTION_IP6_ENDPOINT_TYPE == 0x06
assert SDOPTION_IP6_ENDPOINT_LEN == 0x0015
assert SDOPTION_IP6_MCAST_TYPE == 0x16
assert SDOPTION_IP6_MCAST_LEN == 0x0015
assert SDOPTION_IP6_SDENDPOINT_TYPE == 0x26
assert SDOPTION_IP6_SDENDPOINT_LEN == 0x0015
### SDOption_Config
= SDOption_Config: Verify make_string() method from dict
data = { "hello": "world" }
out = SDOption_Config.make_string(data)
assert out == b"\x0bhello=world\x00"
= SDOption_Config: Verify make_string() method from list
data = [
("x", "y"),
("abc", "def"),
("123", "456")
]
out = SDOption_Config.make_string(data)
assert out == b"\x03x=y\x07abc=def\x07123=456\x00"
= SDOption_Config: Build and dissect empty
opt = SDOption_Config()
optraw = opt.build()
assert optraw == b"\x00\x02\x01\x00\x00"
opt = SDOption_Config(optraw)
assert opt.len == 0x2
assert opt.type == SDOPTION_CFG_TYPE
assert opt.res_hdr == 0x0
assert opt.cfg_str == b"\x00"
= SDOption_Config: Build and dissect spec example
tststr = b"\x05abc=x\x07def=123\x00"
opt = SDOption_Config(cfg_str=tststr)
optraw = opt.build()
assert optraw == b"\x00\x10\x01\x00" + tststr
opt = SDOption_Config(optraw)
assert opt.len == 0x10
assert opt.type == SDOPTION_CFG_TYPE
assert opt.res_hdr == 0x00
assert opt.cfg_str == tststr
= SDOption_Config: Build and dissect fully populated
tststr = b"abcdefghijklmnopqrstuvwxyz"
opt = SDOption_Config(len=0x1234, type=0x56, res_hdr=0x78, cfg_str=tststr)
optraw = opt.build()
assert optraw == b"\x12\x34\x56\x78" + tststr
opt = SDOption_Config(optraw)
assert opt.len == 0x1234
assert opt.type == 0x56
assert opt.res_hdr == 0x78
assert opt.cfg_str == tststr
### SDOption_LoadBalance
= SDOption_LoadBalance: Build and dissect empty
opt = SDOption_LoadBalance()
optraw = opt.build()
assert optraw == b"\x00\x05\x02\x00\x00\x00\x00\x00"
opt = SDOption_LoadBalance(optraw)
assert opt.len == SDOPTION_LOADBALANCE_LEN
assert opt.type == SDOPTION_LOADBALANCE_TYPE
assert opt.res_hdr == 0x0
assert opt.priority == 0x0
assert opt.weight == 0x0
= SDOption_LoadBalance: Build and dissect example
opt = SDOption_LoadBalance(priority=0x1234, weight=0x5678)
optraw = opt.build()
assert optraw == b"\x00\x05\x02\x00\x12\x34\x56\x78"
opt = SDOption_LoadBalance(optraw)
assert opt.len == SDOPTION_LOADBALANCE_LEN
assert opt.type == SDOPTION_LOADBALANCE_TYPE
assert opt.res_hdr == 0x00
assert opt.priority == 0x1234
assert opt.weight == 0x5678
= SDOption_LoadBalance: Build and dissect fully populated
opt = SDOption_LoadBalance(len=0x1234, type=0x56, res_hdr=0x78, priority=0x9abc, weight=0xdef0)
optraw = opt.build()
assert optraw == b"\x12\x34\x56\x78\x9a\xbc\xde\xf0"
opt = SDOption_LoadBalance(optraw)
assert opt.len == 0x1234
assert opt.type == 0x56
assert opt.res_hdr == 0x78
assert opt.priority == 0x9abc
assert opt.weight == 0xdef0
### SDOption_IP4_EndPoint
= SDOption_IP4_EndPoint: Build and dissect empty
opt = SDOption_IP4_EndPoint()
optraw = opt.build()
assert optraw == b"\x00\x09\x04\x00\x00\x00\x00\x00\x00\x11\x00\x00"
opt = SDOption_IP4_EndPoint(optraw)
assert opt.len == SDOPTION_IP4_ENDPOINT_LEN
assert opt.type == SDOPTION_IP4_ENDPOINT_TYPE
assert opt.res_hdr == 0x0
assert opt.addr == "0.0.0.0"
assert opt.res_tail == 0x0
assert opt.l4_proto == 0x11
assert opt.port == 0x0
= SDOption_IP4_EndPoint: Build and dissect example
opt = SDOption_IP4_EndPoint(addr = "192.168.123.45", l4_proto = "TCP", port = 0x1234)
optraw = opt.build()
assert optraw == b"\x00\x09\x04\x00\xc0\xa8\x7b\x2d\x00\x06\x12\x34"
opt = SDOption_IP4_EndPoint(optraw)
assert opt.len == SDOPTION_IP4_ENDPOINT_LEN
assert opt.type == SDOPTION_IP4_ENDPOINT_TYPE
assert opt.res_hdr == 0x00
assert opt.addr == "192.168.123.45"
assert opt.res_tail == 0x0
assert opt.l4_proto == 0x06
assert opt.port == 0x1234
= SDOption_IP4_EndPoint: Build and dissect fully populated
opt = SDOption_IP4_EndPoint(len=0x1234, type=0x56, res_hdr=0x78, addr = "11.22.33.44", res_tail = 0x9a, l4_proto = 0xbc, port = 0xdef0)
optraw = opt.build()
assert optraw == b"\x12\x34\x56\x78\x0b\x16\x21\x2c\x9a\xbc\xde\xf0"
opt = SDOption_IP4_EndPoint(optraw)
assert opt.len == 0x1234
assert opt.type == 0x56
assert opt.res_hdr == 0x78
assert opt.addr == "11.22.33.44"
assert opt.res_tail == 0x9a
assert opt.l4_proto == 0xbc
assert opt.port == 0xdef0
### SDOption_IP4_Multicast
= SDOption_IP4_Multicast: Build and dissect empty
opt = SDOption_IP4_Multicast()
optraw = opt.build()
assert optraw == b"\x00\x09\x14\x00\x00\x00\x00\x00\x00\x11\x00\x00"
opt = SDOption_IP4_Multicast(optraw)
assert opt.len == SDOPTION_IP4_MCAST_LEN
assert opt.type == SDOPTION_IP4_MCAST_TYPE
assert opt.res_hdr == 0x0
assert opt.addr == "0.0.0.0"
assert opt.res_tail == 0x0
assert opt.l4_proto == 0x11
assert opt.port == 0x0
= SDOption_IP4_Multicast: Build and dissect example
opt = SDOption_IP4_Multicast(addr = "192.168.123.45", l4_proto = "TCP", port = 0x1234)
optraw = opt.build()
assert optraw == b"\x00\x09\x14\x00\xc0\xa8\x7b\x2d\x00\x06\x12\x34"
opt = SDOption_IP4_Multicast(optraw)
assert opt.len == SDOPTION_IP4_MCAST_LEN
assert opt.type == SDOPTION_IP4_MCAST_TYPE
assert opt.res_hdr == 0x00
assert opt.addr == "192.168.123.45"
assert opt.res_tail == 0x0
assert opt.l4_proto == 0x06
assert opt.port == 0x1234
= SDOption_IP4_Multicast: Build and dissect fully populated
opt = SDOption_IP4_Multicast(len=0x1234, type=0x56, res_hdr=0x78, addr = "11.22.33.44", res_tail = 0x9a, l4_proto = 0xbc, port = 0xdef0)
optraw = opt.build()
assert optraw == b"\x12\x34\x56\x78\x0b\x16\x21\x2c\x9a\xbc\xde\xf0"
opt = SDOption_IP4_Multicast(optraw)
assert opt.len == 0x1234
assert opt.type == 0x56
assert opt.res_hdr == 0x78
assert opt.addr == "11.22.33.44"
assert opt.res_tail == 0x9a
assert opt.l4_proto == 0xbc
assert opt.port == 0xdef0
### SDOption_IP4_SD_EndPoint
= SDOption_IP4_SD_EndPoint: Build and dissect empty
opt = SDOption_IP4_SD_EndPoint()
optraw = opt.build()
assert optraw == b"\x00\x09\x24\x00\x00\x00\x00\x00\x00\x11\x00\x00"
opt = SDOption_IP4_SD_EndPoint(optraw)
assert opt.len == SDOPTION_IP4_SDENDPOINT_LEN
assert opt.type == SDOPTION_IP4_SDENDPOINT_TYPE
assert opt.res_hdr == 0x0
assert opt.addr == "0.0.0.0"
assert opt.res_tail == 0x0
assert opt.l4_proto == 0x11
assert opt.port == 0x0
= SDOption_IP4_SD_EndPoint: Build and dissect example
opt = SDOption_IP4_SD_EndPoint(addr = "192.168.123.45", l4_proto = "TCP", port = 0x1234)
optraw = opt.build()
assert optraw == b"\x00\x09\x24\x00\xc0\xa8\x7b\x2d\x00\x06\x12\x34"
opt = SDOption_IP4_SD_EndPoint(optraw)
assert opt.len == SDOPTION_IP4_SDENDPOINT_LEN
assert opt.type == SDOPTION_IP4_SDENDPOINT_TYPE
assert opt.res_hdr == 0x00
assert opt.addr == "192.168.123.45"
assert opt.res_tail == 0x0
assert opt.l4_proto == 0x06
assert opt.port == 0x1234
= SDOption_IP4_SD_EndPoint: Build and dissect fully populated
opt = SDOption_IP4_SD_EndPoint(len=0x1234, type=0x56, res_hdr=0x78, addr = "11.22.33.44", res_tail = 0x9a, l4_proto = 0xbc, port = 0xdef0)
optraw = opt.build()
assert optraw == b"\x12\x34\x56\x78\x0b\x16\x21\x2c\x9a\xbc\xde\xf0"
opt = SDOption_IP4_SD_EndPoint(optraw)
assert opt.len == 0x1234
assert opt.type == 0x56
assert opt.res_hdr == 0x78
assert opt.addr == "11.22.33.44"
assert opt.res_tail == 0x9a
assert opt.l4_proto == 0xbc
assert opt.port == 0xdef0
### SDOption_IP6_EndPoint
= SDOption_IP6_EndPoint: Build and dissect empty
opt = SDOption_IP6_EndPoint()
optraw = opt.build()
assert optraw == b"\x00\x15\x06\x00" + b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + b"\x00\x11\x00\x00"
opt = SDOption_IP6_EndPoint(optraw)
assert opt.len == SDOPTION_IP6_ENDPOINT_LEN
assert opt.type == SDOPTION_IP6_ENDPOINT_TYPE
assert opt.res_hdr == 0x0
assert opt.addr == "::"
assert opt.res_tail == 0x0
assert opt.l4_proto == 0x11
assert opt.port == 0x0
= SDOption_IP6_EndPoint: Build and dissect example
opt = SDOption_IP6_EndPoint(addr = "2001:cdba::3257:9652", l4_proto = "TCP", port = 0x1234)
optraw = opt.build()
assert optraw == b"\x00\x15\x06\x00" + b"\x20\x01\xcd\xba\x00\x00\x00\x00\x00\x00\x00\x00\x32\x57\x96\x52" + b"\x00\x06\x12\x34"
opt = SDOption_IP6_EndPoint(optraw)
assert opt.len == SDOPTION_IP6_ENDPOINT_LEN
assert opt.type == SDOPTION_IP6_ENDPOINT_TYPE
assert opt.res_hdr == 0x00
assert opt.addr == "2001:cdba::3257:9652"
assert opt.res_tail == 0x0
assert opt.l4_proto == 0x06
assert opt.port == 0x1234
= SDOption_IP6_EndPoint: Build and dissect fully populated
opt = SDOption_IP6_EndPoint(len=0x1234, type=0x56, res_hdr=0x78, addr = "1234:5678:9abc:def0:0fed:cba9:8765:4321", res_tail = 0x9a, l4_proto = 0xbc, port = 0xdef0)
optraw = opt.build()
assert optraw == b"\x12\x34\x56\x78" + b"\x12\x34\x56\x78\x9a\xbc\xde\xf0\x0f\xed\xcb\xa9\x87\x65\x43\x21" + b"\x9a\xbc\xde\xf0"
opt = SDOption_IP6_EndPoint(optraw)
assert opt.len == 0x1234
assert opt.type == 0x56
assert opt.res_hdr == 0x78
assert opt.addr == "1234:5678:9abc:def0:fed:cba9:8765:4321"
assert opt.res_tail == 0x9a
assert opt.l4_proto == 0xbc
assert opt.port == 0xdef0
### SDOption_IP6_Multicast
= SDOption_IP6_Multicast: Build and dissect empty
opt = SDOption_IP6_Multicast()
optraw = opt.build()
assert optraw == b"\x00\x15\x16\x00" + b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + b"\x00\x11\x00\x00"
opt = SDOption_IP6_Multicast(optraw)
assert opt.len == SDOPTION_IP6_MCAST_LEN
assert opt.type == SDOPTION_IP6_MCAST_TYPE
assert opt.res_hdr == 0x0
assert opt.addr == "::"
assert opt.res_tail == 0x0
assert opt.l4_proto == 0x11
assert opt.port == 0x0
= SDOption_IP6_Multicast: Build and dissect example
opt = SDOption_IP6_Multicast(addr = "2001:cdba::3257:9652", l4_proto = "TCP", port = 0x1234)
optraw = opt.build()
assert optraw == b"\x00\x15\x16\x00" + b"\x20\x01\xcd\xba\x00\x00\x00\x00\x00\x00\x00\x00\x32\x57\x96\x52" + b"\x00\x06\x12\x34"
opt = SDOption_IP6_Multicast(optraw)
assert opt.len == SDOPTION_IP6_MCAST_LEN
assert opt.type == SDOPTION_IP6_MCAST_TYPE
assert opt.res_hdr == 0x00
assert opt.addr == "2001:cdba::3257:9652"
assert opt.res_tail == 0x0
assert opt.l4_proto == 0x06
assert opt.port == 0x1234
= SDOption_IP6_Multicast: Build and dissect fully populated
opt = SDOption_IP6_Multicast(len=0x1234, type=0x56, res_hdr=0x78, addr = "1234:5678:9abc:def0:0fed:cba9:8765:4321", res_tail = 0x9a, l4_proto = 0xbc, port = 0xdef0)
optraw = opt.build()
assert optraw == b"\x12\x34\x56\x78" + b"\x12\x34\x56\x78\x9a\xbc\xde\xf0\x0f\xed\xcb\xa9\x87\x65\x43\x21" + b"\x9a\xbc\xde\xf0"
opt = SDOption_IP6_Multicast(optraw)
assert opt.len == 0x1234
assert opt.type == 0x56
assert opt.res_hdr == 0x78
assert opt.addr == "1234:5678:9abc:def0:fed:cba9:8765:4321"
assert opt.res_tail == 0x9a
assert opt.l4_proto == 0xbc
assert opt.port == 0xdef0
### SDOption_IP6_SD_EndPoint
= SDOption_IP6_SD_EndPoint: Build and dissect empty
opt = SDOption_IP6_SD_EndPoint()
optraw = opt.build()
assert optraw == b"\x00\x15\x26\x00" + b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + b"\x00\x11\x00\x00"
opt = SDOption_IP6_SD_EndPoint(optraw)
assert opt.len == SDOPTION_IP6_SDENDPOINT_LEN
assert opt.type == SDOPTION_IP6_SDENDPOINT_TYPE
assert opt.res_hdr == 0x0
assert opt.addr == "::"
assert opt.res_tail == 0x0
assert opt.l4_proto == 0x11
assert opt.port == 0x0
= SDOption_IP6_SD_EndPoint: Build and dissect example
opt = SDOption_IP6_SD_EndPoint(addr = "2001:cdba::3257:9652", l4_proto = "TCP", port = 0x1234)
optraw = opt.build()
assert optraw == b"\x00\x15\x26\x00" + b"\x20\x01\xcd\xba\x00\x00\x00\x00\x00\x00\x00\x00\x32\x57\x96\x52" + b"\x00\x06\x12\x34"
opt = SDOption_IP6_SD_EndPoint(optraw)
assert opt.len == SDOPTION_IP6_SDENDPOINT_LEN
assert opt.type == SDOPTION_IP6_SDENDPOINT_TYPE
assert opt.res_hdr == 0x00
assert opt.addr == "2001:cdba::3257:9652"
assert opt.res_tail == 0x0
assert opt.l4_proto == 0x06
assert opt.port == 0x1234
= SDOption_IP6_SD_EndPoint: Build and dissect fully populated
opt = SDOption_IP6_SD_EndPoint(len=0x1234, type=0x56, res_hdr=0x78, addr = "1234:5678:9abc:def0:0fed:cba9:8765:4321", res_tail = 0x9a, l4_proto = 0xbc, port = 0xdef0)
optraw = opt.build()
assert optraw == b"\x12\x34\x56\x78" + b"\x12\x34\x56\x78\x9a\xbc\xde\xf0\x0f\xed\xcb\xa9\x87\x65\x43\x21" + b"\x9a\xbc\xde\xf0"
opt = SDOption_IP6_SD_EndPoint(optraw)
assert opt.len == 0x1234
assert opt.type == 0x56
assert opt.res_hdr == 0x78
assert opt.addr == "1234:5678:9abc:def0:fed:cba9:8765:4321"
assert opt.res_tail == 0x9a
assert opt.l4_proto == 0xbc
assert opt.port == 0xdef0
= verify building and parsing of multiple SDOptions
def _opts_check(opts):
optslen = sum([len(o) for o in opts])
sd = SD()
sd.set_optionArray(opts)
sd.len_entry_array = 0
sd.len_option_array = optslen
sd.show()
SD(sd.build()).show()
assert sd.show(dump=True) == SD(sd.build()).show(dump=True)
# options are built and reparsed, to make sure all is calculated
opts = [
SDOption_Config(SDOption_Config(cfg_str="hello world").build()),
SDOption_LoadBalance(SDOption_LoadBalance().build()),
SDOption_IP4_EndPoint(SDOption_IP4_EndPoint().build()),
SDOption_IP4_Multicast(SDOption_IP4_Multicast().build()),
SDOption_IP4_SD_EndPoint(SDOption_IP4_SD_EndPoint().build()),
SDOption_IP6_EndPoint(SDOption_IP6_EndPoint().build()),
SDOption_IP6_Multicast(SDOption_IP6_Multicast().build()),
SDOption_IP6_SD_EndPoint(SDOption_IP6_SD_EndPoint().build()),
]
_opts_check(opts[0:0])
_opts_check(opts[0:2])
_opts_check(opts)
_opts_check(opts[::-1])
_opts_check(opts + opts[::-1])
= build test SOMEIP/TP
p = SOMEIP(srv_id=1234, sub_id=4321, msg_type=0xff, retcode=0xff, offset=4294967040, data=[Raw(b"deadbeef")])
assert p.data[0].load == b"deadbeef"