CDC/ECM driver for mbed, based on USBDevice by mbed-official. Uses PicoTCP to access Ethernet USB device. License: GPLv2

Dependents:   USBEthernet_TEST

Fork of USB_Ethernet by Daniele Lacamera

Committer:
daniele
Date:
Sat Aug 03 13:16:14 2013 +0000
Revision:
2:540f6e142d59
Moved to single package

Who changed what in which revision?

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