Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Revision 0:852db76de235, committed 2009-09-04
- Comitter:
- rolf
- Date:
- Fri Sep 04 12:25:06 2009 +0000
- Commit message:
Changed in this revision
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
| mbed.bld | Show annotated file Show diff for this revision Revisions of this file |
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Fri Sep 04 12:25:06 2009 +0000
@@ -0,0 +1,78 @@
+#include "mbed.h" // Importing the mbed classes and tools.
+#include "Ethernet.h"
+
+using namespace mbed;
+
+__packed // A __packed struct to have no gaps between the members http://en.wikipedia.org/wiki/Data_structure_alignment
+struct ethpkt { // Ethernet layer: http://en.wikipedia.org/wiki/Ethernet#Physical_layer
+ unsigned char dest[6]; // Destination MAC
+ unsigned char src[6]; // Source MAC
+ unsigned short type; // Payload type. ARP is 0x0806
+ // ARP layer: http://en.wikipedia.org/wiki/Address_Resolution_Protocol
+ unsigned short hwtype; // Each data link layer protocol is assigned a number used in this field. Ethernet is 0x0001
+ unsigned short proto; // Each protocol is assigned a number used in this field. IP is 0x0800.
+ unsigned char hwlen; // Length in bytes of a hardware address. Ethernet addresses are 6 bytes long.
+ unsigned char protolen; // Length in bytes of a logical address. IPv4 address are 4 bytes long.
+ unsigned short opcode; // Specifies the operation the sender is performing:
+ // 1 for request, 2 for reply, 3 for RARP request, and 4 for RARP reply.
+ unsigned char shwaddr[6]; // Hardware address of the sender.
+ unsigned char sipaddr[4]; // Protocol address of the sender.
+ unsigned char dhwaddr[6]; // Hardware address of the intended receiver. This field is ignored in requests.
+ unsigned char dipaddr[4]; // Protocol address of the intended receiver.
+};
+
+Ethernet eth; // The ethernet device
+DigitalOut led4(LED4); // A LED for showing activity
+
+unsigned short htons(unsigned short n) { // Host short to network shor
+ return ((n & 0xff) << 8) | ((n & 0xff00) >> 8); // Byte swapping
+}
+
+void send(const char *ipaddr) {
+ static char data[0x600]; // Packet buffer
+ const unsigned char arplen = 6; // Hardware address length
+ const unsigned char ethlen = 4; // IP address length
+ char hwaddr[arplen]; // Hardware address buffer
+ struct ethpkt *pkg = (struct ethpkt *) &data[0]; // Force the buffer to an ethpkg
+ unsigned char pos = arplen; // Hardware/IP address position
+
+ eth.address(hwaddr); // Get own hardware address
+
+ pkg->type = htons(0x0806); // Set type to ARP (0x0806)
+ pkg->hwtype = htons(0x0001); // Hardware type is Ethernet (0x0001)
+ pkg->proto = htons(0x0800); // Protocol is ARP Request (0x0800)
+ pkg->hwlen = arplen; // Hardware addresses are 6 Bytes long
+ pkg->protolen = ethlen; // And protocol addresses 4 Bytes
+ pkg->opcode = htons(0x0001); // Send: whois XX:XX:XX:XX:XX:XX?
+
+ while(pos-- > 0) { // Write IP/MAC-Addresses (combined loop for all addresses)
+ pkg->src[pos] = hwaddr[pos]; // Set source MAC address to hwaddr on ethernet layer
+ pkg->dest[pos] = 0xFF; // Set destination MAC address to everybody (FF:FF:FF:FF:FF:FF) on ethernet layer
+ pkg->shwaddr[pos] = hwaddr[pos]; // Set source MAC address on ARP layer
+ pkg->dhwaddr[pos] = 0xFF; // Set destination MAC address on ARP layer
+ if(pos < ethlen) { // Check if we can copy IP addresses too.
+ pkg->sipaddr[pos] = 0xFF; // Set source ip address to 255.255.255.255
+ pkg->dipaddr[pos] = ipaddr[pos]; // Set destination ip address to ipaddr
+ }
+ }
+
+ eth.write(data, 60); // Write the package
+ eth.send(); // Send the package
+}
+ // In this example we would like to make ARP requests to ask for every ip address.
+int main() { // The programm starts here!
+ unsigned int i = 1; // The integer we use as counter and target IP address.
+ char *c = (char *)&i; // We cast the integer to an array of char c[4] to handle it as IP address.
+
+ printf("Lowlevel Ethernet Spammer\n\n"); // Print out that the programm has been started.
+
+ while(1) { // Do forever:
+ send(c); // Assamble and send our request. See eth_send function!
+ i++; // Increment counter. What will increment the IP (c[4]) address as well.
+
+ led4 = 1; // Show activity, by blinking with led 4:
+ wait(0.02); //
+ led4 = 0; // Put the led on and wait for 0.2 seconds
+ wait(0.02); // Put the led off and wait for 0.2 seconds
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Fri Sep 04 12:25:06 2009 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/f63353af7be8