test icmp

Dependencies:   mbed

Fork of ethspam by Rolf Meyer

Committer:
jamessayer
Date:
Fri Apr 24 03:11:02 2015 +0000
Revision:
1:feaa107f56b3
Parent:
0:852db76de235
first version;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rolf 0:852db76de235 1 #include "mbed.h" // Importing the mbed classes and tools.
rolf 0:852db76de235 2 #include "Ethernet.h"
jamessayer 1:feaa107f56b3 3 #include "util/types.h"
jamessayer 1:feaa107f56b3 4 #include "net/net.h"
jamessayer 1:feaa107f56b3 5 #include "sniffer.h"
jamessayer 1:feaa107f56b3 6
rolf 0:852db76de235 7
rolf 0:852db76de235 8 using namespace mbed;
rolf 0:852db76de235 9
rolf 0:852db76de235 10 __packed // A __packed struct to have no gaps between the members http://en.wikipedia.org/wiki/Data_structure_alignment
rolf 0:852db76de235 11 struct ethpkt { // Ethernet layer: http://en.wikipedia.org/wiki/Ethernet#Physical_layer
rolf 0:852db76de235 12 unsigned char dest[6]; // Destination MAC
rolf 0:852db76de235 13 unsigned char src[6]; // Source MAC
rolf 0:852db76de235 14 unsigned short type; // Payload type. ARP is 0x0806
rolf 0:852db76de235 15 // ARP layer: http://en.wikipedia.org/wiki/Address_Resolution_Protocol
rolf 0:852db76de235 16 unsigned short hwtype; // Each data link layer protocol is assigned a number used in this field. Ethernet is 0x0001
rolf 0:852db76de235 17 unsigned short proto; // Each protocol is assigned a number used in this field. IP is 0x0800.
rolf 0:852db76de235 18 unsigned char hwlen; // Length in bytes of a hardware address. Ethernet addresses are 6 bytes long.
rolf 0:852db76de235 19 unsigned char protolen; // Length in bytes of a logical address. IPv4 address are 4 bytes long.
rolf 0:852db76de235 20 unsigned short opcode; // Specifies the operation the sender is performing:
rolf 0:852db76de235 21 // 1 for request, 2 for reply, 3 for RARP request, and 4 for RARP reply.
rolf 0:852db76de235 22 unsigned char shwaddr[6]; // Hardware address of the sender.
rolf 0:852db76de235 23 unsigned char sipaddr[4]; // Protocol address of the sender.
rolf 0:852db76de235 24 unsigned char dhwaddr[6]; // Hardware address of the intended receiver. This field is ignored in requests.
rolf 0:852db76de235 25 unsigned char dipaddr[4]; // Protocol address of the intended receiver.
rolf 0:852db76de235 26 };
jamessayer 1:feaa107f56b3 27 Sniffer sniffer;
jamessayer 1:feaa107f56b3 28 Ethernet_MAC your_mac;
jamessayer 1:feaa107f56b3 29 //Ethernet eth; // The ethernet device
rolf 0:852db76de235 30 DigitalOut led4(LED4); // A LED for showing activity
rolf 0:852db76de235 31
rolf 0:852db76de235 32 unsigned short htons(unsigned short n) { // Host short to network shor
rolf 0:852db76de235 33 return ((n & 0xff) << 8) | ((n & 0xff00) >> 8); // Byte swapping
rolf 0:852db76de235 34 }
rolf 0:852db76de235 35
jamessayer 1:feaa107f56b3 36 #define PING_BUFEFERSIZE (sizeof(IP_PacketHeader) + sizeof(ICMP_Packet))
rolf 0:852db76de235 37
jamessayer 1:feaa107f56b3 38 void send(const char *ipaddr) {
jamessayer 1:feaa107f56b3 39 IP_Address dest_ip;
jamessayer 1:feaa107f56b3 40 IP_Address my_ip;
jamessayer 1:feaa107f56b3 41 str2ipaddr(ipaddr,&dest_ip);
jamessayer 1:feaa107f56b3 42 str2ipaddr("192.168.0.16",&my_ip);
jamessayer 1:feaa107f56b3 43
jamessayer 1:feaa107f56b3 44 u8 buffer[PING_BUFEFERSIZE];
jamessayer 1:feaa107f56b3 45 IP_PacketHeader *ip_packet = (IP_PacketHeader*)buffer;
jamessayer 1:feaa107f56b3 46 ICMP_Packet *ping_packet = (ICMP_Packet*)ip_packet->data;
jamessayer 1:feaa107f56b3 47
jamessayer 1:feaa107f56b3 48 memset(buffer, '\0', PING_BUFEFERSIZE);
jamessayer 1:feaa107f56b3 49
jamessayer 1:feaa107f56b3 50 *ip_packet = (IP_PacketHeader){0x04, 5, 0, sizeof(IP_PacketHeader)+sizeof(ICMP_Packet), 0, 0, 0, 0, 0, 32, IPPROTO_ICMP, 0x00, my_ip, dest_ip};
jamessayer 1:feaa107f56b3 51 *ping_packet = (ICMP_Packet){ICMP_ECHO_REQUEST, 0x00, 0x00, 0x00, 0x00};
jamessayer 1:feaa107f56b3 52
jamessayer 1:feaa107f56b3 53 fix_endian_icmp(ping_packet);
jamessayer 1:feaa107f56b3 54 fix_endian_ip(ip_packet);
jamessayer 1:feaa107f56b3 55 ip_packet->header_checksum = checksum(ip_packet, sizeof(IP_PacketHeader), &ip_packet->header_checksum, 2);
jamessayer 1:feaa107f56b3 56 ping_packet->checksum = checksum(ping_packet, sizeof(ICMP_Packet), &ping_packet->checksum, 2);
jamessayer 1:feaa107f56b3 57
jamessayer 1:feaa107f56b3 58
jamessayer 1:feaa107f56b3 59 printf("PING sent...\n");
jamessayer 1:feaa107f56b3 60
jamessayer 1:feaa107f56b3 61 sniffer.inject(your_mac, ETHERTYPE_IPV4, buffer, PING_BUFEFERSIZE);
jamessayer 1:feaa107f56b3 62
jamessayer 1:feaa107f56b3 63
jamessayer 1:feaa107f56b3 64
jamessayer 1:feaa107f56b3 65 // printf("a\n");
jamessayer 1:feaa107f56b3 66 // IP_Address dest_ip;
jamessayer 1:feaa107f56b3 67 // IP_Address my_ip;
jamessayer 1:feaa107f56b3 68 // str2ipaddr(ipaddr,&dest_ip);
jamessayer 1:feaa107f56b3 69 // str2ipaddr("192.168.0.5",&my_ip);
jamessayer 1:feaa107f56b3 70 // printf("b\n");
jamessayer 1:feaa107f56b3 71 // u8 buffer[PING_BUFEFERSIZE];
jamessayer 1:feaa107f56b3 72 // IP_PacketHeader *ip_packet = (IP_PacketHeader*)buffer;
jamessayer 1:feaa107f56b3 73 // ICMP_Packet *ping_packet = (ICMP_Packet*)ip_packet->data;
jamessayer 1:feaa107f56b3 74 // printf("c\n");
jamessayer 1:feaa107f56b3 75 // memset(buffer, '\0', PING_BUFEFERSIZE);
jamessayer 1:feaa107f56b3 76 // printf("d\n");
jamessayer 1:feaa107f56b3 77 // *ip_packet = (IP_PacketHeader){0x4, 5, 0, sizeof(IP_PacketHeader)+sizeof(ICMP_Packet), 0, 0, 0, 0, 0, 32, IPPROTO_ICMP, 0x00, my_ip, dest_ip};
jamessayer 1:feaa107f56b3 78 // *ping_packet = (ICMP_Packet){ICMP_ECHO_REQUEST, 0x00, 0x00, 0x00, 0x00};
jamessayer 1:feaa107f56b3 79 // printf("e\n");
jamessayer 1:feaa107f56b3 80
jamessayer 1:feaa107f56b3 81
jamessayer 1:feaa107f56b3 82 /// fix_endian_icmp(ping_packet);
jamessayer 1:feaa107f56b3 83 // fix_endian_ip(ip_packet);
jamessayer 1:feaa107f56b3 84 // printf("f\n");
jamessayer 1:feaa107f56b3 85 // ip_packet->header_checksum = checksum(ip_packet, sizeof(IP_PacketHeader), &ip_packet->header_checksum, 2);
jamessayer 1:feaa107f56b3 86 // ping_packet->checksum = checksum(ping_packet, sizeof(ICMP_Packet), &ping_packet->checksum, 2);
jamessayer 1:feaa107f56b3 87 // printf("h\n");
jamessayer 1:feaa107f56b3 88 //
jamessayer 1:feaa107f56b3 89 // print_icmp(ping_packet);
jamessayer 1:feaa107f56b3 90 // print_ip(ip_packet);
jamessayer 1:feaa107f56b3 91 //
jamessayer 1:feaa107f56b3 92 // printf("i\n");
jamessayer 1:feaa107f56b3 93 // eth.write((char*)buffer, PING_BUFEFERSIZE); // Write the package
jamessayer 1:feaa107f56b3 94 // eth.send(); // Send the package
jamessayer 1:feaa107f56b3 95 // printf("j\n");
rolf 0:852db76de235 96
jamessayer 1:feaa107f56b3 97 // static char data[0x600]; // Packet buffer
jamessayer 1:feaa107f56b3 98 // const unsigned char arplen = 6; // Hardware address length
jamessayer 1:feaa107f56b3 99 // const unsigned char ethlen = 4; // IP address length
jamessayer 1:feaa107f56b3 100 // char hwaddr[arplen]; // Hardware address buffer
jamessayer 1:feaa107f56b3 101 // struct ethpkt *pkg = (struct ethpkt *) &data[0]; // Force the buffer to an ethpkg
jamessayer 1:feaa107f56b3 102 // unsigned char pos = arplen; // Hardware/IP address position
jamessayer 1:feaa107f56b3 103 //
jamessayer 1:feaa107f56b3 104 // eth.address(hwaddr); // Get own hardware address
jamessayer 1:feaa107f56b3 105 //
jamessayer 1:feaa107f56b3 106 // pkg->type = htons(0x0806); // Set type to ARP (0x0806)
jamessayer 1:feaa107f56b3 107 // pkg->hwtype = htons(0x0001); // Hardware type is Ethernet (0x0001)
jamessayer 1:feaa107f56b3 108 // pkg->proto = htons(0x0800); // Protocol is ARP Request (0x0800)
jamessayer 1:feaa107f56b3 109 // pkg->hwlen = arplen; // Hardware addresses are 6 Bytes long
jamessayer 1:feaa107f56b3 110 // pkg->protolen = ethlen; // And protocol addresses 4 Bytes
jamessayer 1:feaa107f56b3 111 // pkg->opcode = htons(0x0001); // Send: whois XX:XX:XX:XX:XX:XX?
jamessayer 1:feaa107f56b3 112 //
jamessayer 1:feaa107f56b3 113 // while(pos-- > 0) { // Write IP/MAC-Addresses (combined loop for all addresses)
jamessayer 1:feaa107f56b3 114 // pkg->src[pos] = hwaddr[pos]; // Set source MAC address to hwaddr on ethernet layer
jamessayer 1:feaa107f56b3 115 // pkg->dest[pos] = 0xFF; // Set destination MAC address to everybody (FF:FF:FF:FF:FF:FF) on ethernet layer
jamessayer 1:feaa107f56b3 116 // pkg->shwaddr[pos] = hwaddr[pos]; // Set source MAC address on ARP layer
jamessayer 1:feaa107f56b3 117 // pkg->dhwaddr[pos] = 0xFF; // Set destination MAC address on ARP layer
jamessayer 1:feaa107f56b3 118 // if(pos < ethlen) { // Check if we can copy IP addresses too.
jamessayer 1:feaa107f56b3 119 // pkg->sipaddr[pos] = 0xFF; // Set source ip address to 255.255.255.255
jamessayer 1:feaa107f56b3 120 // pkg->dipaddr[pos] = ipaddr[pos]; // Set destination ip address to ipaddr
jamessayer 1:feaa107f56b3 121 // }
jamessayer 1:feaa107f56b3 122 // }
jamessayer 1:feaa107f56b3 123 //
jamessayer 1:feaa107f56b3 124 // eth.write(data, 60); // Write the package
jamessayer 1:feaa107f56b3 125 // eth.send(); // Send the package
rolf 0:852db76de235 126 }
rolf 0:852db76de235 127 // In this example we would like to make ARP requests to ask for every ip address.
rolf 0:852db76de235 128 int main() { // The programm starts here!
rolf 0:852db76de235 129 unsigned int i = 1; // The integer we use as counter and target IP address.
jamessayer 1:feaa107f56b3 130 //char *c = (char *)&i; // We cast the integer to an array of char c[4] to handle it as IP address.
rolf 0:852db76de235 131
rolf 0:852db76de235 132 printf("Lowlevel Ethernet Spammer\n\n"); // Print out that the programm has been started.
rolf 0:852db76de235 133
jamessayer 1:feaa107f56b3 134 while(1) {
jamessayer 1:feaa107f56b3 135 char* ip = "192.168.10.10"; // Do forever:
jamessayer 1:feaa107f56b3 136 send(ip); // Assamble and send our request. See eth_send function!
rolf 0:852db76de235 137 i++; // Increment counter. What will increment the IP (c[4]) address as well.
rolf 0:852db76de235 138
rolf 0:852db76de235 139 led4 = 1; // Show activity, by blinking with led 4:
rolf 0:852db76de235 140 wait(0.02); //
rolf 0:852db76de235 141 led4 = 0; // Put the led on and wait for 0.2 seconds
rolf 0:852db76de235 142 wait(0.02); // Put the led off and wait for 0.2 seconds
rolf 0:852db76de235 143 }
rolf 0:852db76de235 144 }