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.
Diff: snet.h
- Revision:
 - 0:6df0a6ed91d4
 - Child:
 - 1:9c211ac06a12
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/snet.h	Wed Mar 04 02:04:32 2015 +0000
@@ -0,0 +1,104 @@
+#ifndef _SNET_H_
+#define _SNET_H_
+
+#include "mbed.h"
+
+#define ETH_RxOverrunInt     (1 << 0)
+#define ETH_RxErrorInt       (1 << 1)
+#define ETH_RxFinishedInt    (1 << 2)
+#define ETH_RxDoneInt        (1 << 3) 
+#define ETH_TxUnderrunInt    (1 << 4)
+#define ETH_TxErrorInt       (1 << 5)
+#define ETH_TxFinishedInt    (1 << 6)
+#define ETH_TxDoneInt        (1 << 7)
+
+#define ETH_RxStatus         (1 << 0)
+#define ETH_TxStatus         (1 << 1)
+
+// offsets into an ethernet packet
+#define ENET_DMAC_O 0
+#define ENET_SMAC_O 6
+#define ENET_ETHERTYPE_O 12
+#define ENET_PAYLOAD_O 14
+
+// ARP offsets
+#define ENET_ARP_HTYPE_O (ENET_PAYLOAD + 0)
+#define ENET_ARP_PTYPE_O (ENET_PAYLOAD + 2)
+#define ENET_ARP_HLEN_O (ENET_PAYLOAD + 4)
+#define ENET_ARP_PLEN_O (ENET_PAYLOAD + 5)
+#define ENET_ARP_OPER_O (ENET_PAYLOAD_O + 6)
+#define ENET_ARP_SHA_O (ENET_PAYLOAD_O + 8)
+#define ENET_ARP_SPA_O (ENET_PAYLOAD_O + 14)
+#define ENET_ARP_THA_O (ENET_PAYLOAD_O + 18)
+#define ENET_ARP_TPA_O (ENET_PAYLOAD_O + 24)
+
+// IP offsets
+#define IP_HEADER_O ENET_PAYLOAD_O
+#define IP_VIHL_O (ENET_PAYLOAD_O + 0)
+#define IP_DSCP_ECN_O (ENET_PAYLOAD_O + 1)
+#define IP_TOTAL_LENGTH_O (ENET_PAYLOAD_O + 2)  // Total Length
+#define IP_ID_O (ENET_PAYLOAD_O + 4)
+#define IP_FLAGS_FRAGOFF_O (ENET_PAYLOAD_O + 6)
+#define IP_TTL_O (ENET_PAYLOAD_O + 8)
+#define IP_PROTO_O (ENET_PAYLOAD_O + 9)
+#define IP_CHKSUM_O (ENET_PAYLOAD_O + 10)
+#define IP_SADDR_O (ENET_PAYLOAD_O + 12)
+#define IP_DADDR_O (ENET_PAYLOAD_O + 16)
+#define IP_PAYLOAD_O (ENET_PAYLOAD_O + 20)
+#define IP_HEADER_LEN (IP_PAYLOAD_O - ENET_PAYLOAD_O)
+
+// ICMP offsets
+#define ICMP_HEADER_O IP_PAYLOAD_O
+#define ICMP_TYPE_O (ICMP_HEADER_O + 0)
+#define ICMP_CODE_O (ICMP_HEADER_O + 1)
+#define ICMP_CHECKSUM_O (ICMP_HEADER_O + 2)
+#define ICMP_REST_OF_HEADER_O (ICMP_HEADER_O + 4)
+#define ICMP_PAYLOAD_O (ICMP_HEADER_O + 8)
+#define ICMP_HEADER_LEN (ICMP_PAYLOAD_O - ICMP_HEADER_O)
+
+// UDP offsets
+#define UDP_HEADER_O IP_PAYLOAD_O
+#define UDP_SRC_PORT_O (UDP_HEADER_O + 0)
+#define UDP_DST_PORT_O (UDP_HEADER_O + 2)
+#define UDP_LENGTH_O (UDP_HEADER_O + 4)
+#define UDP_CHECKSUM_O (UDP_HEADER_O + 6)
+#define UDP_PAYLOAD_O (UDP_HEADER_O + 8)
+#define UDP_HEADER_LEN (UDP_PAYLOAD_O - UDP_HEADER_O)
+
+class Snet {
+    private:
+        static const uint8_t broadcast_mac[];// = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
+        //const char ourEtherType[] = { 0x82, 0x48 };
+        static const uint8_t ipEtherType[];// = { 0x08, 0x00 };
+        static const uint8_t arp_req_payload_prefix[];// = { 0x0, 0x1, 0x8, 0x0, 0x6, 0x4, 0x0, 0x1 };
+        Ethernet eth;
+        
+        uint8_t correspondent_facing_packet_header[UDP_PAYLOAD_O];
+        
+        void got_broadcast(uint8_t *buf, int len);
+        void got_unicast(uint8_t *buf, int len);
+        void handle_arp_request(uint8_t *buf, int len);
+        uint16_t ones_complement_sum(const uint8_t *buf, int len, int sum);
+        uint16_t ip_checksum_of(const uint8_t *buf, const int len);
+        void turn_ip_packet_around(uint8_t *buf);
+        void handle_icmp_packet(uint8_t *buf, int len);
+        void interpret_inet_packet(uint8_t *buf, int len);
+        void turn_udp_packet_around(uint8_t *buf);
+        void send_udp_packet(uint8_t *buf, const uint8_t *payload, int payload_len);
+        void return_udp_packet(uint8_t *buf, const uint8_t *payload, int payload_len);
+        void tell_correspondent(char *s);
+        void register_correspondent_for_updates(uint8_t *buf, int len, char updates);
+        void handle_quaddb_packet(uint8_t *buf, int len);
+        void handle_udp_packet(uint8_t *buf, int len);
+    public:
+        Snet();
+        Snet(const uint8_t *my_ip);
+        uint8_t my_mac[6];
+        uint8_t my_ip[4];
+        volatile uint32_t enet_rx_cnt;
+        uint8_t correspondent_mac[6];    // correspondent's MAC
+        int rx_and_process_one_packet();
+        void send_to_correspondent(const uint8_t *what, int what_len);
+};
+
+#endif