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.
snet.h@0:6df0a6ed91d4, 2015-03-04 (annotated)
- Committer:
- altasoul
- Date:
- Wed Mar 04 02:04:32 2015 +0000
- Revision:
- 0:6df0a6ed91d4
- Child:
- 1:9c211ac06a12
refactor into Snet
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| altasoul | 0:6df0a6ed91d4 | 1 | #ifndef _SNET_H_ |
| altasoul | 0:6df0a6ed91d4 | 2 | #define _SNET_H_ |
| altasoul | 0:6df0a6ed91d4 | 3 | |
| altasoul | 0:6df0a6ed91d4 | 4 | #include "mbed.h" |
| altasoul | 0:6df0a6ed91d4 | 5 | |
| altasoul | 0:6df0a6ed91d4 | 6 | #define ETH_RxOverrunInt (1 << 0) |
| altasoul | 0:6df0a6ed91d4 | 7 | #define ETH_RxErrorInt (1 << 1) |
| altasoul | 0:6df0a6ed91d4 | 8 | #define ETH_RxFinishedInt (1 << 2) |
| altasoul | 0:6df0a6ed91d4 | 9 | #define ETH_RxDoneInt (1 << 3) |
| altasoul | 0:6df0a6ed91d4 | 10 | #define ETH_TxUnderrunInt (1 << 4) |
| altasoul | 0:6df0a6ed91d4 | 11 | #define ETH_TxErrorInt (1 << 5) |
| altasoul | 0:6df0a6ed91d4 | 12 | #define ETH_TxFinishedInt (1 << 6) |
| altasoul | 0:6df0a6ed91d4 | 13 | #define ETH_TxDoneInt (1 << 7) |
| altasoul | 0:6df0a6ed91d4 | 14 | |
| altasoul | 0:6df0a6ed91d4 | 15 | #define ETH_RxStatus (1 << 0) |
| altasoul | 0:6df0a6ed91d4 | 16 | #define ETH_TxStatus (1 << 1) |
| altasoul | 0:6df0a6ed91d4 | 17 | |
| altasoul | 0:6df0a6ed91d4 | 18 | // offsets into an ethernet packet |
| altasoul | 0:6df0a6ed91d4 | 19 | #define ENET_DMAC_O 0 |
| altasoul | 0:6df0a6ed91d4 | 20 | #define ENET_SMAC_O 6 |
| altasoul | 0:6df0a6ed91d4 | 21 | #define ENET_ETHERTYPE_O 12 |
| altasoul | 0:6df0a6ed91d4 | 22 | #define ENET_PAYLOAD_O 14 |
| altasoul | 0:6df0a6ed91d4 | 23 | |
| altasoul | 0:6df0a6ed91d4 | 24 | // ARP offsets |
| altasoul | 0:6df0a6ed91d4 | 25 | #define ENET_ARP_HTYPE_O (ENET_PAYLOAD + 0) |
| altasoul | 0:6df0a6ed91d4 | 26 | #define ENET_ARP_PTYPE_O (ENET_PAYLOAD + 2) |
| altasoul | 0:6df0a6ed91d4 | 27 | #define ENET_ARP_HLEN_O (ENET_PAYLOAD + 4) |
| altasoul | 0:6df0a6ed91d4 | 28 | #define ENET_ARP_PLEN_O (ENET_PAYLOAD + 5) |
| altasoul | 0:6df0a6ed91d4 | 29 | #define ENET_ARP_OPER_O (ENET_PAYLOAD_O + 6) |
| altasoul | 0:6df0a6ed91d4 | 30 | #define ENET_ARP_SHA_O (ENET_PAYLOAD_O + 8) |
| altasoul | 0:6df0a6ed91d4 | 31 | #define ENET_ARP_SPA_O (ENET_PAYLOAD_O + 14) |
| altasoul | 0:6df0a6ed91d4 | 32 | #define ENET_ARP_THA_O (ENET_PAYLOAD_O + 18) |
| altasoul | 0:6df0a6ed91d4 | 33 | #define ENET_ARP_TPA_O (ENET_PAYLOAD_O + 24) |
| altasoul | 0:6df0a6ed91d4 | 34 | |
| altasoul | 0:6df0a6ed91d4 | 35 | // IP offsets |
| altasoul | 0:6df0a6ed91d4 | 36 | #define IP_HEADER_O ENET_PAYLOAD_O |
| altasoul | 0:6df0a6ed91d4 | 37 | #define IP_VIHL_O (ENET_PAYLOAD_O + 0) |
| altasoul | 0:6df0a6ed91d4 | 38 | #define IP_DSCP_ECN_O (ENET_PAYLOAD_O + 1) |
| altasoul | 0:6df0a6ed91d4 | 39 | #define IP_TOTAL_LENGTH_O (ENET_PAYLOAD_O + 2) // Total Length |
| altasoul | 0:6df0a6ed91d4 | 40 | #define IP_ID_O (ENET_PAYLOAD_O + 4) |
| altasoul | 0:6df0a6ed91d4 | 41 | #define IP_FLAGS_FRAGOFF_O (ENET_PAYLOAD_O + 6) |
| altasoul | 0:6df0a6ed91d4 | 42 | #define IP_TTL_O (ENET_PAYLOAD_O + 8) |
| altasoul | 0:6df0a6ed91d4 | 43 | #define IP_PROTO_O (ENET_PAYLOAD_O + 9) |
| altasoul | 0:6df0a6ed91d4 | 44 | #define IP_CHKSUM_O (ENET_PAYLOAD_O + 10) |
| altasoul | 0:6df0a6ed91d4 | 45 | #define IP_SADDR_O (ENET_PAYLOAD_O + 12) |
| altasoul | 0:6df0a6ed91d4 | 46 | #define IP_DADDR_O (ENET_PAYLOAD_O + 16) |
| altasoul | 0:6df0a6ed91d4 | 47 | #define IP_PAYLOAD_O (ENET_PAYLOAD_O + 20) |
| altasoul | 0:6df0a6ed91d4 | 48 | #define IP_HEADER_LEN (IP_PAYLOAD_O - ENET_PAYLOAD_O) |
| altasoul | 0:6df0a6ed91d4 | 49 | |
| altasoul | 0:6df0a6ed91d4 | 50 | // ICMP offsets |
| altasoul | 0:6df0a6ed91d4 | 51 | #define ICMP_HEADER_O IP_PAYLOAD_O |
| altasoul | 0:6df0a6ed91d4 | 52 | #define ICMP_TYPE_O (ICMP_HEADER_O + 0) |
| altasoul | 0:6df0a6ed91d4 | 53 | #define ICMP_CODE_O (ICMP_HEADER_O + 1) |
| altasoul | 0:6df0a6ed91d4 | 54 | #define ICMP_CHECKSUM_O (ICMP_HEADER_O + 2) |
| altasoul | 0:6df0a6ed91d4 | 55 | #define ICMP_REST_OF_HEADER_O (ICMP_HEADER_O + 4) |
| altasoul | 0:6df0a6ed91d4 | 56 | #define ICMP_PAYLOAD_O (ICMP_HEADER_O + 8) |
| altasoul | 0:6df0a6ed91d4 | 57 | #define ICMP_HEADER_LEN (ICMP_PAYLOAD_O - ICMP_HEADER_O) |
| altasoul | 0:6df0a6ed91d4 | 58 | |
| altasoul | 0:6df0a6ed91d4 | 59 | // UDP offsets |
| altasoul | 0:6df0a6ed91d4 | 60 | #define UDP_HEADER_O IP_PAYLOAD_O |
| altasoul | 0:6df0a6ed91d4 | 61 | #define UDP_SRC_PORT_O (UDP_HEADER_O + 0) |
| altasoul | 0:6df0a6ed91d4 | 62 | #define UDP_DST_PORT_O (UDP_HEADER_O + 2) |
| altasoul | 0:6df0a6ed91d4 | 63 | #define UDP_LENGTH_O (UDP_HEADER_O + 4) |
| altasoul | 0:6df0a6ed91d4 | 64 | #define UDP_CHECKSUM_O (UDP_HEADER_O + 6) |
| altasoul | 0:6df0a6ed91d4 | 65 | #define UDP_PAYLOAD_O (UDP_HEADER_O + 8) |
| altasoul | 0:6df0a6ed91d4 | 66 | #define UDP_HEADER_LEN (UDP_PAYLOAD_O - UDP_HEADER_O) |
| altasoul | 0:6df0a6ed91d4 | 67 | |
| altasoul | 0:6df0a6ed91d4 | 68 | class Snet { |
| altasoul | 0:6df0a6ed91d4 | 69 | private: |
| altasoul | 0:6df0a6ed91d4 | 70 | static const uint8_t broadcast_mac[];// = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; |
| altasoul | 0:6df0a6ed91d4 | 71 | //const char ourEtherType[] = { 0x82, 0x48 }; |
| altasoul | 0:6df0a6ed91d4 | 72 | static const uint8_t ipEtherType[];// = { 0x08, 0x00 }; |
| altasoul | 0:6df0a6ed91d4 | 73 | static const uint8_t arp_req_payload_prefix[];// = { 0x0, 0x1, 0x8, 0x0, 0x6, 0x4, 0x0, 0x1 }; |
| altasoul | 0:6df0a6ed91d4 | 74 | Ethernet eth; |
| altasoul | 0:6df0a6ed91d4 | 75 | |
| altasoul | 0:6df0a6ed91d4 | 76 | uint8_t correspondent_facing_packet_header[UDP_PAYLOAD_O]; |
| altasoul | 0:6df0a6ed91d4 | 77 | |
| altasoul | 0:6df0a6ed91d4 | 78 | void got_broadcast(uint8_t *buf, int len); |
| altasoul | 0:6df0a6ed91d4 | 79 | void got_unicast(uint8_t *buf, int len); |
| altasoul | 0:6df0a6ed91d4 | 80 | void handle_arp_request(uint8_t *buf, int len); |
| altasoul | 0:6df0a6ed91d4 | 81 | uint16_t ones_complement_sum(const uint8_t *buf, int len, int sum); |
| altasoul | 0:6df0a6ed91d4 | 82 | uint16_t ip_checksum_of(const uint8_t *buf, const int len); |
| altasoul | 0:6df0a6ed91d4 | 83 | void turn_ip_packet_around(uint8_t *buf); |
| altasoul | 0:6df0a6ed91d4 | 84 | void handle_icmp_packet(uint8_t *buf, int len); |
| altasoul | 0:6df0a6ed91d4 | 85 | void interpret_inet_packet(uint8_t *buf, int len); |
| altasoul | 0:6df0a6ed91d4 | 86 | void turn_udp_packet_around(uint8_t *buf); |
| altasoul | 0:6df0a6ed91d4 | 87 | void send_udp_packet(uint8_t *buf, const uint8_t *payload, int payload_len); |
| altasoul | 0:6df0a6ed91d4 | 88 | void return_udp_packet(uint8_t *buf, const uint8_t *payload, int payload_len); |
| altasoul | 0:6df0a6ed91d4 | 89 | void tell_correspondent(char *s); |
| altasoul | 0:6df0a6ed91d4 | 90 | void register_correspondent_for_updates(uint8_t *buf, int len, char updates); |
| altasoul | 0:6df0a6ed91d4 | 91 | void handle_quaddb_packet(uint8_t *buf, int len); |
| altasoul | 0:6df0a6ed91d4 | 92 | void handle_udp_packet(uint8_t *buf, int len); |
| altasoul | 0:6df0a6ed91d4 | 93 | public: |
| altasoul | 0:6df0a6ed91d4 | 94 | Snet(); |
| altasoul | 0:6df0a6ed91d4 | 95 | Snet(const uint8_t *my_ip); |
| altasoul | 0:6df0a6ed91d4 | 96 | uint8_t my_mac[6]; |
| altasoul | 0:6df0a6ed91d4 | 97 | uint8_t my_ip[4]; |
| altasoul | 0:6df0a6ed91d4 | 98 | volatile uint32_t enet_rx_cnt; |
| altasoul | 0:6df0a6ed91d4 | 99 | uint8_t correspondent_mac[6]; // correspondent's MAC |
| altasoul | 0:6df0a6ed91d4 | 100 | int rx_and_process_one_packet(); |
| altasoul | 0:6df0a6ed91d4 | 101 | void send_to_correspondent(const uint8_t *what, int what_len); |
| altasoul | 0:6df0a6ed91d4 | 102 | }; |
| altasoul | 0:6df0a6ed91d4 | 103 | |
| altasoul | 0:6df0a6ed91d4 | 104 | #endif |