Tom Soulanille / snet
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?

UserRevisionLine numberNew 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