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
diff -r 000000000000 -r 6df0a6ed91d4 snet.h
--- /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