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_PROTOCOL
daniele 2:540f6e142d59 7 #define _INCLUDE_PICO_PROTOCOL
daniele 2:540f6e142d59 8 #include <stdint.h>
daniele 2:540f6e142d59 9 #include "pico_queue.h"
daniele 2:540f6e142d59 10
daniele 2:540f6e142d59 11 #define PICO_LOOP_DIR_IN 1
daniele 2:540f6e142d59 12 #define PICO_LOOP_DIR_OUT 2
daniele 2:540f6e142d59 13
daniele 2:540f6e142d59 14 enum pico_layer {
daniele 2:540f6e142d59 15 PICO_LAYER_DATALINK = 2, /* Ethernet only. */
daniele 2:540f6e142d59 16 PICO_LAYER_NETWORK = 3, /* IPv4, IPv6, ARP. Arp is there because it communicates with L2 */
daniele 2:540f6e142d59 17 PICO_LAYER_TRANSPORT = 4, /* UDP, TCP, ICMP */
daniele 2:540f6e142d59 18 PICO_LAYER_SOCKET = 5 /* Socket management */
daniele 2:540f6e142d59 19 };
daniele 2:540f6e142d59 20
daniele 2:540f6e142d59 21 enum pico_err_e {
daniele 2:540f6e142d59 22 PICO_ERR_NOERR = 0,
daniele 2:540f6e142d59 23 PICO_ERR_EPERM,
daniele 2:540f6e142d59 24 PICO_ERR_ENOENT,
daniele 2:540f6e142d59 25 /* ... */
daniele 2:540f6e142d59 26 PICO_ERR_EINTR = 4,
daniele 2:540f6e142d59 27 PICO_ERR_EIO,
daniele 2:540f6e142d59 28 PICO_ERR_ENXIO,
daniele 2:540f6e142d59 29 /* ... */
daniele 2:540f6e142d59 30 PICO_ERR_EAGAIN = 11,
daniele 2:540f6e142d59 31 PICO_ERR_ENOMEM,
daniele 2:540f6e142d59 32 PICO_ERR_EACCESS,
daniele 2:540f6e142d59 33 PICO_ERR_EFAULT,
daniele 2:540f6e142d59 34 /* ... */
daniele 2:540f6e142d59 35 PICO_ERR_EBUSY = 16,
daniele 2:540f6e142d59 36 PICO_ERR_EEXIST = 17,
daniele 2:540f6e142d59 37 /* ... */
daniele 2:540f6e142d59 38 PICO_ERR_EINVAL = 22,
daniele 2:540f6e142d59 39 /* ... */
daniele 2:540f6e142d59 40 PICO_ERR_EPROTO = 71,
daniele 2:540f6e142d59 41 PICO_ERR_ENOPROTOOPT = 92,
daniele 2:540f6e142d59 42 PICO_ERR_EPROTONOSUPPORT = 93,
daniele 2:540f6e142d59 43
daniele 2:540f6e142d59 44 /* ... */
daniele 2:540f6e142d59 45 PICO_ERR_EADDRINUSE = 98,
daniele 2:540f6e142d59 46 PICO_ERR_EADDRNOTAVAIL,
daniele 2:540f6e142d59 47 PICO_ERR_ENETUNREACH,
daniele 2:540f6e142d59 48
daniele 2:540f6e142d59 49 /* ... */
daniele 2:540f6e142d59 50 PICO_ERR_ECONNRESET = 104,
daniele 2:540f6e142d59 51
daniele 2:540f6e142d59 52 /* ... */
daniele 2:540f6e142d59 53 PICO_ERR_EISCONN = 106,
daniele 2:540f6e142d59 54 PICO_ERR_ENOTCONN,
daniele 2:540f6e142d59 55 PICO_ERR_ESHUTDOWN,
daniele 2:540f6e142d59 56 /* ... */
daniele 2:540f6e142d59 57 PICO_ERR_ETIMEDOUT = 110,
daniele 2:540f6e142d59 58 PICO_ERR_ECONNREFUSED = 111,
daniele 2:540f6e142d59 59 PICO_ERR_EHOSTDOWN,
daniele 2:540f6e142d59 60 PICO_ERR_EHOSTUNREACH,
daniele 2:540f6e142d59 61 /* ... */
daniele 2:540f6e142d59 62 PICO_ERR_EOPNOTSUPP = 122,
daniele 2:540f6e142d59 63
daniele 2:540f6e142d59 64 };
daniele 2:540f6e142d59 65
daniele 2:540f6e142d59 66 typedef enum pico_err_e pico_err_t;
daniele 2:540f6e142d59 67 extern volatile pico_err_t pico_err;
daniele 2:540f6e142d59 68
daniele 2:540f6e142d59 69 #define IS_IPV6(f) ((((uint8_t *)(f->net_hdr))[0] & 0xf0) == 0x60)
daniele 2:540f6e142d59 70 #define IS_IPV4(f) ((((uint8_t *)(f->net_hdr))[0] & 0xf0) == 0x40)
daniele 2:540f6e142d59 71
daniele 2:540f6e142d59 72 #define MAX_PROTOCOL_NAME 16
daniele 2:540f6e142d59 73
daniele 2:540f6e142d59 74 struct pico_protocol {
daniele 2:540f6e142d59 75 char name[MAX_PROTOCOL_NAME];
daniele 2:540f6e142d59 76 uint32_t hash;
daniele 2:540f6e142d59 77 enum pico_layer layer;
daniele 2:540f6e142d59 78 int proto_number;
daniele 2:540f6e142d59 79 struct pico_queue *q_in;
daniele 2:540f6e142d59 80 struct pico_queue *q_out;
daniele 2:540f6e142d59 81 struct pico_frame *(*alloc)(struct pico_protocol *self, int size); /* Frame allocation. */
daniele 2:540f6e142d59 82 int (*push) (struct pico_protocol *self, struct pico_frame *p); /* Push function, for active outgoing pkts from above */
daniele 2:540f6e142d59 83 int (*process_out)(struct pico_protocol *self, struct pico_frame *p); /* Send loop. */
daniele 2:540f6e142d59 84 int (*process_in)(struct pico_protocol *self, struct pico_frame *p); /* Recv loop. */
daniele 2:540f6e142d59 85 };
daniele 2:540f6e142d59 86
daniele 2:540f6e142d59 87 int pico_protocols_loop(int loop_score);
daniele 2:540f6e142d59 88 void pico_protocol_init(struct pico_protocol *p);
daniele 2:540f6e142d59 89
daniele 2:540f6e142d59 90 int pico_protocol_datalink_loop(int loop_score, int direction);
daniele 2:540f6e142d59 91 int pico_protocol_network_loop(int loop_score, int direction);
daniele 2:540f6e142d59 92 int pico_protocol_transport_loop(int loop_score, int direction);
daniele 2:540f6e142d59 93 int pico_protocol_socket_loop(int loop_score, int direction);
daniele 2:540f6e142d59 94
daniele 2:540f6e142d59 95 #endif