# 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 # 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"