CDC/ECM driver for mbed, based on USBDevice by mbed-official. Uses PicoTCP to access Ethernet USB device. License: GPLv2
Fork of USB_Ethernet by
include/pico_socket.h@2:540f6e142d59, 2013-08-03 (annotated)
- Committer:
- daniele
- Date:
- Sat Aug 03 13:16:14 2013 +0000
- Revision:
- 2:540f6e142d59
Moved to single package
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
daniele | 2:540f6e142d59 | 1 | /********************************************************************* |
daniele | 2:540f6e142d59 | 2 | PicoTCP. Copyright (c) 2012 TASS Belgium NV. Some rights reserved. |
daniele | 2:540f6e142d59 | 3 | See LICENSE and COPYING for usage. |
daniele | 2:540f6e142d59 | 4 | |
daniele | 2:540f6e142d59 | 5 | *********************************************************************/ |
daniele | 2:540f6e142d59 | 6 | #ifndef _INCLUDE_PICO_SOCKET |
daniele | 2:540f6e142d59 | 7 | #define _INCLUDE_PICO_SOCKET |
daniele | 2:540f6e142d59 | 8 | #include "pico_queue.h" |
daniele | 2:540f6e142d59 | 9 | #include "pico_addressing.h" |
daniele | 2:540f6e142d59 | 10 | #include "pico_config.h" |
daniele | 2:540f6e142d59 | 11 | #include "pico_protocol.h" |
daniele | 2:540f6e142d59 | 12 | |
daniele | 2:540f6e142d59 | 13 | //#define PICO_DEFAULT_SOCKETQ (128 * 1024) |
daniele | 2:540f6e142d59 | 14 | #define PICO_DEFAULT_SOCKETQ (4 * 1024) |
daniele | 2:540f6e142d59 | 15 | |
daniele | 2:540f6e142d59 | 16 | #define PICO_SHUT_RD 1 |
daniele | 2:540f6e142d59 | 17 | #define PICO_SHUT_WR 2 |
daniele | 2:540f6e142d59 | 18 | #define PICO_SHUT_RDWR 3 |
daniele | 2:540f6e142d59 | 19 | |
daniele | 2:540f6e142d59 | 20 | |
daniele | 2:540f6e142d59 | 21 | struct pico_socket { |
daniele | 2:540f6e142d59 | 22 | struct pico_protocol *proto; |
daniele | 2:540f6e142d59 | 23 | struct pico_protocol *net; |
daniele | 2:540f6e142d59 | 24 | |
daniele | 2:540f6e142d59 | 25 | union { |
daniele | 2:540f6e142d59 | 26 | struct pico_ip4 ip4; |
daniele | 2:540f6e142d59 | 27 | struct pico_ip6 ip6; |
daniele | 2:540f6e142d59 | 28 | } local_addr; |
daniele | 2:540f6e142d59 | 29 | |
daniele | 2:540f6e142d59 | 30 | union { |
daniele | 2:540f6e142d59 | 31 | struct pico_ip4 ip4; |
daniele | 2:540f6e142d59 | 32 | struct pico_ip6 ip6; |
daniele | 2:540f6e142d59 | 33 | } remote_addr; |
daniele | 2:540f6e142d59 | 34 | |
daniele | 2:540f6e142d59 | 35 | uint16_t local_port; |
daniele | 2:540f6e142d59 | 36 | uint16_t remote_port; |
daniele | 2:540f6e142d59 | 37 | |
daniele | 2:540f6e142d59 | 38 | struct pico_queue q_in; |
daniele | 2:540f6e142d59 | 39 | struct pico_queue q_out; |
daniele | 2:540f6e142d59 | 40 | |
daniele | 2:540f6e142d59 | 41 | void (*wakeup)(uint16_t ev, struct pico_socket *s); |
daniele | 2:540f6e142d59 | 42 | |
daniele | 2:540f6e142d59 | 43 | |
daniele | 2:540f6e142d59 | 44 | #ifdef PICO_SUPPORT_TCP |
daniele | 2:540f6e142d59 | 45 | /* For the TCP backlog queue */ |
daniele | 2:540f6e142d59 | 46 | struct pico_socket *backlog; |
daniele | 2:540f6e142d59 | 47 | struct pico_socket *next; |
daniele | 2:540f6e142d59 | 48 | struct pico_socket *parent; |
daniele | 2:540f6e142d59 | 49 | int max_backlog; |
daniele | 2:540f6e142d59 | 50 | #endif |
daniele | 2:540f6e142d59 | 51 | #ifdef PICO_SUPPORT_MCAST |
daniele | 2:540f6e142d59 | 52 | struct pico_tree *MCASTListen; |
daniele | 2:540f6e142d59 | 53 | #endif |
daniele | 2:540f6e142d59 | 54 | uint16_t ev_pending; |
daniele | 2:540f6e142d59 | 55 | |
daniele | 2:540f6e142d59 | 56 | struct pico_device *dev; |
daniele | 2:540f6e142d59 | 57 | |
daniele | 2:540f6e142d59 | 58 | /* Private field. */ |
daniele | 2:540f6e142d59 | 59 | int id; |
daniele | 2:540f6e142d59 | 60 | uint16_t state; |
daniele | 2:540f6e142d59 | 61 | uint16_t opt_flags; |
daniele | 2:540f6e142d59 | 62 | void *priv; |
daniele | 2:540f6e142d59 | 63 | }; |
daniele | 2:540f6e142d59 | 64 | |
daniele | 2:540f6e142d59 | 65 | struct pico_remote_duple { |
daniele | 2:540f6e142d59 | 66 | union { |
daniele | 2:540f6e142d59 | 67 | struct pico_ip4 ip4; |
daniele | 2:540f6e142d59 | 68 | struct pico_ip6 ip6; |
daniele | 2:540f6e142d59 | 69 | } remote_addr; |
daniele | 2:540f6e142d59 | 70 | |
daniele | 2:540f6e142d59 | 71 | uint16_t remote_port; |
daniele | 2:540f6e142d59 | 72 | }; |
daniele | 2:540f6e142d59 | 73 | |
daniele | 2:540f6e142d59 | 74 | |
daniele | 2:540f6e142d59 | 75 | /* request struct for multicast socket opt */ |
daniele | 2:540f6e142d59 | 76 | struct pico_ip_mreq { |
daniele | 2:540f6e142d59 | 77 | struct pico_ip4 mcast_group_addr; |
daniele | 2:540f6e142d59 | 78 | struct pico_ip4 mcast_link_addr; |
daniele | 2:540f6e142d59 | 79 | }; |
daniele | 2:540f6e142d59 | 80 | |
daniele | 2:540f6e142d59 | 81 | struct pico_ip_mreq_source { |
daniele | 2:540f6e142d59 | 82 | struct pico_ip4 mcast_group_addr; |
daniele | 2:540f6e142d59 | 83 | struct pico_ip4 mcast_source_addr; |
daniele | 2:540f6e142d59 | 84 | struct pico_ip4 mcast_link_addr; |
daniele | 2:540f6e142d59 | 85 | }; |
daniele | 2:540f6e142d59 | 86 | |
daniele | 2:540f6e142d59 | 87 | #define PICO_SOCKET_STATE_UNDEFINED 0x0000 |
daniele | 2:540f6e142d59 | 88 | #define PICO_SOCKET_STATE_SHUT_LOCAL 0x0001 |
daniele | 2:540f6e142d59 | 89 | #define PICO_SOCKET_STATE_SHUT_REMOTE 0x0002 |
daniele | 2:540f6e142d59 | 90 | #define PICO_SOCKET_STATE_BOUND 0x0004 |
daniele | 2:540f6e142d59 | 91 | #define PICO_SOCKET_STATE_CONNECTED 0x0008 |
daniele | 2:540f6e142d59 | 92 | #define PICO_SOCKET_STATE_CLOSING 0x0010 |
daniele | 2:540f6e142d59 | 93 | #define PICO_SOCKET_STATE_CLOSED 0x0020 |
daniele | 2:540f6e142d59 | 94 | |
daniele | 2:540f6e142d59 | 95 | # define PICO_SOCKET_STATE_TCP 0xFF00 |
daniele | 2:540f6e142d59 | 96 | # define PICO_SOCKET_STATE_TCP_UNDEF 0x00FF |
daniele | 2:540f6e142d59 | 97 | # define PICO_SOCKET_STATE_TCP_CLOSED 0x0100 |
daniele | 2:540f6e142d59 | 98 | # define PICO_SOCKET_STATE_TCP_LISTEN 0x0200 |
daniele | 2:540f6e142d59 | 99 | # define PICO_SOCKET_STATE_TCP_SYN_SENT 0x0300 |
daniele | 2:540f6e142d59 | 100 | # define PICO_SOCKET_STATE_TCP_SYN_RECV 0x0400 |
daniele | 2:540f6e142d59 | 101 | # define PICO_SOCKET_STATE_TCP_ESTABLISHED 0x0500 |
daniele | 2:540f6e142d59 | 102 | # define PICO_SOCKET_STATE_TCP_CLOSE_WAIT 0x0600 |
daniele | 2:540f6e142d59 | 103 | # define PICO_SOCKET_STATE_TCP_LAST_ACK 0x0700 |
daniele | 2:540f6e142d59 | 104 | # define PICO_SOCKET_STATE_TCP_FIN_WAIT1 0x0800 |
daniele | 2:540f6e142d59 | 105 | # define PICO_SOCKET_STATE_TCP_FIN_WAIT2 0x0900 |
daniele | 2:540f6e142d59 | 106 | # define PICO_SOCKET_STATE_TCP_CLOSING 0x0a00 |
daniele | 2:540f6e142d59 | 107 | # define PICO_SOCKET_STATE_TCP_TIME_WAIT 0x0b00 |
daniele | 2:540f6e142d59 | 108 | # define PICO_SOCKET_STATE_TCP_ARRAYSIZ 0x0c |
daniele | 2:540f6e142d59 | 109 | |
daniele | 2:540f6e142d59 | 110 | # define PICO_TCP_NODELAY 1 |
daniele | 2:540f6e142d59 | 111 | |
daniele | 2:540f6e142d59 | 112 | # define PICO_SOCKET_OPT_TCPNODELAY 0x0000 |
daniele | 2:540f6e142d59 | 113 | |
daniele | 2:540f6e142d59 | 114 | # define PICO_IP_MULTICAST_EXCLUDE 0 |
daniele | 2:540f6e142d59 | 115 | # define PICO_IP_MULTICAST_INCLUDE 1 |
daniele | 2:540f6e142d59 | 116 | # define PICO_IP_MULTICAST_IF 32 |
daniele | 2:540f6e142d59 | 117 | # define PICO_IP_MULTICAST_TTL 33 |
daniele | 2:540f6e142d59 | 118 | # define PICO_IP_MULTICAST_LOOP 34 |
daniele | 2:540f6e142d59 | 119 | # define PICO_IP_ADD_MEMBERSHIP 35 |
daniele | 2:540f6e142d59 | 120 | # define PICO_IP_DROP_MEMBERSHIP 36 |
daniele | 2:540f6e142d59 | 121 | # define PICO_IP_UNBLOCK_SOURCE 37 |
daniele | 2:540f6e142d59 | 122 | # define PICO_IP_BLOCK_SOURCE 38 |
daniele | 2:540f6e142d59 | 123 | # define PICO_IP_ADD_SOURCE_MEMBERSHIP 39 |
daniele | 2:540f6e142d59 | 124 | # define PICO_IP_DROP_SOURCE_MEMBERSHIP 40 |
daniele | 2:540f6e142d59 | 125 | |
daniele | 2:540f6e142d59 | 126 | # define PICO_SOCKET_OPT_MULTICAST_LOOP 1 |
daniele | 2:540f6e142d59 | 127 | |
daniele | 2:540f6e142d59 | 128 | # define PICO_IP_DEFAULT_MULTICAST_TTL 1 |
daniele | 2:540f6e142d59 | 129 | # define PICO_IP_DEFAULT_MULTICAST_LOOP 1 |
daniele | 2:540f6e142d59 | 130 | |
daniele | 2:540f6e142d59 | 131 | #define PICO_SOCKET_SHUTDOWN_WRITE 0x01 |
daniele | 2:540f6e142d59 | 132 | #define PICO_SOCKET_SHUTDOWN_READ 0x02 |
daniele | 2:540f6e142d59 | 133 | #define TCPSTATE(s) ((s)->state & PICO_SOCKET_STATE_TCP) |
daniele | 2:540f6e142d59 | 134 | |
daniele | 2:540f6e142d59 | 135 | #define PICO_SOCK_EV_RD 1 |
daniele | 2:540f6e142d59 | 136 | #define PICO_SOCK_EV_WR 2 |
daniele | 2:540f6e142d59 | 137 | #define PICO_SOCK_EV_CONN 4 |
daniele | 2:540f6e142d59 | 138 | #define PICO_SOCK_EV_CLOSE 8 |
daniele | 2:540f6e142d59 | 139 | #define PICO_SOCK_EV_FIN 0x10 |
daniele | 2:540f6e142d59 | 140 | #define PICO_SOCK_EV_ERR 0x80 |
daniele | 2:540f6e142d59 | 141 | |
daniele | 2:540f6e142d59 | 142 | |
daniele | 2:540f6e142d59 | 143 | struct pico_socket *pico_socket_open(uint16_t net, uint16_t proto, void (*wakeup)(uint16_t ev, struct pico_socket *s)); |
daniele | 2:540f6e142d59 | 144 | |
daniele | 2:540f6e142d59 | 145 | int pico_socket_read(struct pico_socket *s, void *buf, int len); |
daniele | 2:540f6e142d59 | 146 | int pico_socket_write(struct pico_socket *s, void *buf, int len); |
daniele | 2:540f6e142d59 | 147 | |
daniele | 2:540f6e142d59 | 148 | int pico_socket_sendto(struct pico_socket *s, void *buf, int len, void *dst, uint16_t remote_port); |
daniele | 2:540f6e142d59 | 149 | int pico_socket_recvfrom(struct pico_socket *s, void *buf, int len, void *orig, uint16_t *local_port); |
daniele | 2:540f6e142d59 | 150 | |
daniele | 2:540f6e142d59 | 151 | int pico_socket_send(struct pico_socket *s, void *buf, int len); |
daniele | 2:540f6e142d59 | 152 | int pico_socket_recv(struct pico_socket *s, void *buf, int len); |
daniele | 2:540f6e142d59 | 153 | |
daniele | 2:540f6e142d59 | 154 | int pico_socket_bind(struct pico_socket *s, void *local_addr, uint16_t *port); |
daniele | 2:540f6e142d59 | 155 | int pico_socket_connect(struct pico_socket *s, void *srv_addr, uint16_t remote_port); |
daniele | 2:540f6e142d59 | 156 | int pico_socket_listen(struct pico_socket *s, int backlog); |
daniele | 2:540f6e142d59 | 157 | struct pico_socket *pico_socket_accept(struct pico_socket *s, void *orig, uint16_t *port); |
daniele | 2:540f6e142d59 | 158 | int pico_socket_del(struct pico_socket *s); |
daniele | 2:540f6e142d59 | 159 | |
daniele | 2:540f6e142d59 | 160 | int pico_socket_setoption(struct pico_socket *s, int option, void *value); |
daniele | 2:540f6e142d59 | 161 | int pico_socket_getoption(struct pico_socket *s, int option, void *value); |
daniele | 2:540f6e142d59 | 162 | |
daniele | 2:540f6e142d59 | 163 | int pico_socket_shutdown(struct pico_socket *s, int mode); |
daniele | 2:540f6e142d59 | 164 | int pico_socket_close(struct pico_socket *s); |
daniele | 2:540f6e142d59 | 165 | |
daniele | 2:540f6e142d59 | 166 | struct pico_frame *pico_socket_frame_alloc(struct pico_socket *s, int len); |
daniele | 2:540f6e142d59 | 167 | |
daniele | 2:540f6e142d59 | 168 | #ifdef PICO_SUPPORT_IPV4 |
daniele | 2:540f6e142d59 | 169 | # define is_sock_ipv4(x) (x->net == &pico_proto_ipv4) |
daniele | 2:540f6e142d59 | 170 | #else |
daniele | 2:540f6e142d59 | 171 | # define is_sock_ipv4(x) (0) |
daniele | 2:540f6e142d59 | 172 | #endif |
daniele | 2:540f6e142d59 | 173 | |
daniele | 2:540f6e142d59 | 174 | #ifdef PICO_SUPPORT_IPV6 |
daniele | 2:540f6e142d59 | 175 | # define is_sock_ipv6(x) (x->net == &pico_proto_ipv6) |
daniele | 2:540f6e142d59 | 176 | #else |
daniele | 2:540f6e142d59 | 177 | # define is_sock_ipv6(x) (0) |
daniele | 2:540f6e142d59 | 178 | #endif |
daniele | 2:540f6e142d59 | 179 | |
daniele | 2:540f6e142d59 | 180 | #ifdef PICO_SUPPORT_UDP |
daniele | 2:540f6e142d59 | 181 | # define is_sock_udp(x) (x->net == &pico_proto_udp) |
daniele | 2:540f6e142d59 | 182 | #else |
daniele | 2:540f6e142d59 | 183 | # define is_sock_udp(x) (0) |
daniele | 2:540f6e142d59 | 184 | #endif |
daniele | 2:540f6e142d59 | 185 | |
daniele | 2:540f6e142d59 | 186 | #ifdef PICO_SUPPORT_TCP |
daniele | 2:540f6e142d59 | 187 | # define is_sock_tcp(x) (x->net == &pico_proto_tcp) |
daniele | 2:540f6e142d59 | 188 | #else |
daniele | 2:540f6e142d59 | 189 | # define is_sock_tcp(x) (0) |
daniele | 2:540f6e142d59 | 190 | #endif |
daniele | 2:540f6e142d59 | 191 | |
daniele | 2:540f6e142d59 | 192 | /* Interface towards transport protocol */ |
daniele | 2:540f6e142d59 | 193 | int pico_transport_process_in(struct pico_protocol *self, struct pico_frame *f); |
daniele | 2:540f6e142d59 | 194 | struct pico_socket *pico_socket_clone(struct pico_socket *facsimile); |
daniele | 2:540f6e142d59 | 195 | int pico_socket_add(struct pico_socket *s); |
daniele | 2:540f6e142d59 | 196 | int pico_transport_error(struct pico_frame *f, uint8_t proto, int code); |
daniele | 2:540f6e142d59 | 197 | |
daniele | 2:540f6e142d59 | 198 | /* Socket loop */ |
daniele | 2:540f6e142d59 | 199 | int pico_sockets_loop(int loop_score); |
daniele | 2:540f6e142d59 | 200 | |
daniele | 2:540f6e142d59 | 201 | /* Port check */ |
daniele | 2:540f6e142d59 | 202 | int pico_is_port_free(uint16_t proto, uint16_t port, void *addr, void *net); |
daniele | 2:540f6e142d59 | 203 | |
daniele | 2:540f6e142d59 | 204 | |
daniele | 2:540f6e142d59 | 205 | #endif |