/// <summary> Generate a pseudo-random ARP header. /// </summary> public static byte[] generateRandomARPHeader() { byte[] bytes = new byte[Packets.ARPFields.ARP_HEADER_LEN]; ArrayHelper.insertLong(bytes, Packets.ARPFields.ARP_ETH_ADDR_CODE, Packets.ARPFields.ARP_HW_TYPE_POS, Packets.ARPFields.ARP_ADDR_TYPE_LEN); ArrayHelper.insertLong(bytes, Packets.ARPFields.ARP_IP_ADDR_CODE, Packets.ARPFields.ARP_PR_TYPE_POS, Packets.ARPFields.ARP_ADDR_TYPE_LEN); ArrayHelper.insertLong(bytes, IPAddress.WIDTH, Packets.ARPFields.ARP_HW_LEN_POS, Packets.ARPFields.ARP_ADDR_SIZE_LEN); ArrayHelper.insertLong(bytes, MACAddress.WIDTH, Packets.ARPFields.ARP_PR_LEN_POS, Packets.ARPFields.ARP_ADDR_SIZE_LEN); ArrayHelper.insertLong(bytes, test(Settings.PROB_ARP_REQUEST)?Packets.ARPFields.ARP_OP_REQ_CODE:Packets.ARPFields.ARP_OP_REP_CODE, Packets.ARPFields.ARP_OP_POS, Packets.ARPFields.ARP_OP_LEN); ArrayHelper.insertLong(bytes, MACAddress.random(), Packets.ARPFields.ARP_S_HW_ADDR_POS, MACAddress.WIDTH); int srcAddress = IPAddress.random(Settings.SIM_NETWORK, Settings.SIM_NETMASK); ArrayHelper.insertLong(bytes, srcAddress, Packets.ARPFields.ARP_S_PR_ADDR_POS, IPAddress.WIDTH); ArrayHelper.insertLong(bytes, MACAddress.random(), Packets.ARPFields.ARP_T_HW_ADDR_POS, MACAddress.WIDTH); int dstAddress = srcAddress; int count = 0; // cheezy way to make sure that the source and dest address aren't the same while (dstAddress == srcAddress && count++ < randomRetryCount) { dstAddress = IPAddress.random(Settings.SIM_NETWORK, Settings.SIM_NETMASK); } ArrayHelper.insertLong(bytes, dstAddress, Packets.ARPFields.ARP_T_PR_ADDR_POS, IPAddress.WIDTH); return(bytes); }
/// <summary> Generate a pseudo-random IP header. /// </summary> public static byte[] generateRandomIPHeader() { byte[] bytes = new byte[Packets.IPFields_Fields.IP_HEADER_LEN]; // ipv4. WARNING: only IPv4 is currently supported ArrayHelper.insertLong(bytes, 0x45, Packets.IPFields_Fields.IP_VER_POS, Packets.IPFields_Fields.IP_VER_LEN); // specify no special handling flag in type of service code ArrayHelper.insertLong(bytes, 0x2, Packets.IPFields_Fields.IP_TOS_POS, Packets.IPFields_Fields.IP_TOS_LEN); // random packet contains only a header, no payload ArrayHelper.insertLong(bytes, Packets.IPFields_Fields.IP_HEADER_LEN, Packets.IPFields_Fields.IP_LEN_POS, Packets.IPFields_Fields.IP_LEN_LEN); // increment id each time a packet is generated ArrayHelper.insertLong(bytes, fakeId++, Packets.IPFields_Fields.IP_ID_POS, Packets.IPFields_Fields.IP_ID_LEN); // header length and flags (none specified).. ArrayHelper.insertLong(bytes, 0x4000, Packets.IPFields_Fields.IP_FRAG_POS, Packets.IPFields_Fields.IP_FRAG_LEN); // time-to-live ArrayHelper.insertLong(bytes, 0xff, Packets.IPFields_Fields.IP_TTL_POS, Packets.IPFields_Fields.IP_TTL_LEN); // protocol ArrayHelper.insertLong(bytes, randomIPProtocol(), Packets.IPFields_Fields.IP_CODE_POS, Packets.IPFields_Fields.IP_CODE_LEN); // checksum. todo: generate real checksum ArrayHelper.insertLong(bytes, 0xcccc, Packets.IPFields_Fields.IP_CSUM_POS, Packets.IPFields_Fields.IP_CSUM_LEN); int srcAddress = IPAddress.random(Settings.SIM_NETWORK, Settings.SIM_NETMASK); // source ip ArrayHelper.insertLong(bytes, srcAddress, Packets.IPFields_Fields.IP_SRC_POS, IPAddress.WIDTH); int dstAddress = srcAddress; int count = 0; // cheezy way to make sure that the source and dest address aren't the same while (dstAddress == srcAddress && count++ < randomRetryCount) { dstAddress = IPAddress.random(Settings.SIM_NETWORK, Settings.SIM_NETMASK); } // dest ip ArrayHelper.insertLong(bytes, dstAddress, Packets.IPFields_Fields.IP_DST_POS, IPAddress.WIDTH); return(bytes); }