import argparse import binascii def generate_apf_program(device_name, mac_raw, ip_raw): """ Generates an APF program that supports mDNS offload. Args: device_name: The device name. mac_raw: The MAC address in raw string format (e.g., "00:11:22:33:44:55"). ip_raw: The IPv4 address in raw string format (e.g., "192.168.1.100"). Returns: The generated APF program as a hex string. """ mac_list = mac_raw.split(":") ip_list = ip_raw.split(".") ip_addr = "".join([f"{int(i):02x}" for i in ip_list]) mac_addr = "".join(mac_list) device_name_hex = binascii.hexlify(device_name.encode()).decode() program = ( "7501430203040506070806000108000604000201005E0000FB0203040506" "070800450000000000401100000A000001E00000FB14E914E90000840000" "000004000000000B5F676F6F676C6563617374045F746370056C6F63616C" "00000C000100000078001F066161616161610B5F676F6F676C6563617374" "045F746370056C6F63616C00066161616161610B5F676F6F676C65636173" "74045F746370056C6F63616C0000210001000000780015000000001F4907" "416E64726F6964056C6F63616C00066161616161610B5F676F6F676C6563" "617374045F746370056C6F63616C000010000100000078000605656D7074" "7907416E64726F6964056C6F63616C000001000100000078000401010101" "3333000000FB02030405060786DD600000001140FE800000000000000000" "000000000003FF0200000000000000000000000000FB14E914E9AA3009E5" "AA0FBA06AA09BA07AA08BA086A03BA096A06A20206020304050607021112" "0CAA2F021A888E080686DD88B40800033484006F08066A0EA30206000108" "000604033B12147A27017A020203401A1C820200033D68A30206FFFFFFFF" "FFFF020E1A267E000000020A000001033C020B1A267E000000020A000001" "033CAB24003CCA0606CB0306CB090ACB0306C60A000001CA0606CA1C04AA" "0A3A12AA1AAA25FFFF033F020D68A40130100602030405060701005E0000" "FB3333000000FB120C8400290800AA0E8A023502121A14563FFF00FF8401" "1600111A1E860000010BE00000FB122484010414E96A2A722A120C8400F9" "86DD0A1482F4116A26A2DF10FF0200000000000000000000000000FB1238" "8400D814E96A3EAB2B720C0B5F474F4F474C4543415354045F544350054C" "4F43414C0000AB2B4E21064141414141410B5F474F4F474C454341535404" "5F544350054C4F43414C0000AB2B2A10064141414141410B5F474F4F474C" "4543415354045F544350054C4F43414C0000AB2B160107414E44524F4944" "054C4F43414C0000AB2B021C07414E44524F4944054C4F43414C00007245" "120C84001E0800AB240101CB1310C400F3CB2314C600DF0000CB37D7AB25" "0E281A00F00339AB240115CD010E12C400DFCD012026C600DF0000CB37D7" "AB250E3C1600F003390338120C84006508001A14563FFF00FF821511AB0D" "2A10820E446A3238A2020602030405060702100A1E52F08202E003271A1E" "8600000002FFFFFFFF032586000000020A0000FF03260A1782100612149C" "00091FFFAB0D2A10820207033A68A30206FFFFFFFFFFFF0214032402127C" "000E86DD68A30206FFFFFFFFFFFF021C031F0A14820200021E7A093A0A26" "8202FF032E021B0A36840125008768A5000228063333000000013333FF44" "11223333FF5566773333FFBBCCDD020304050607FFFFFFFFFFFF03306A26" "A2110DFF0200000000000000000001FF3A0DA500020803000003BBCCDD03" "307227A500020810FE800000000000000000000000000003200100000000" "00000100001BAABBCCDD03300A157A02FF032F12128A0217032F0A377A02" "00032F6A3EA500020810FE80000000000000000000000000000320010000" "000000000100001BAABBCCDD03306A16A202100000000000000000000000" "0000000000021712128A021F02190A4E7A020102190A16AA2F0201FF0003" "2F0A509A02017202032FAB240056CA5006CB0306C486DDC660000000C600" "203AFFCA3E10CA1610C688000020C6E0000000CA3E10C40201CB0306AA25" "0E3816003A0331820285032A8216886A26A2020FFF020000000000000000" "0000000000032B0215" ) program = program.replace("020304050607", mac_addr) program = program.replace("0A000001", ip_addr) program = program.replace("01010101", ip_addr) program = program.replace("616161616161", device_name_hex) return program def main(): """ The main method. """ parser = argparse.ArgumentParser(description="Generate an mDNS offload APF program.") parser.add_argument("device_name", help="The DUT's device name, length must be 6 (e.g., 'gambit')") parser.add_argument("mac", help="The DUT's MAC address (e.g., '00:11:22:33:44:55')") parser.add_argument("ip", help="The DUT's IPv4 address (e.g., '192.168.1.100')") args = parser.parse_args() if len(args.device_name) != 6: raise ValueError(f"Invalid input length: expected 6, got {len(args.device_name)}") out_program = generate_apf_program(args.device_name, args.mac, args.ip) print("APF Program:\n", out_program) if __name__ == '__main__': main()