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 Author: Andrei Carp <andrei.carp@tass.be>
daniele 2:540f6e142d59 6 *********************************************************************/
daniele 2:540f6e142d59 7
daniele 2:540f6e142d59 8 #include "pico_config.h"
daniele 2:540f6e142d59 9 #include "pico_socket.h"
daniele 2:540f6e142d59 10 #include "pico_tcp.h"
daniele 2:540f6e142d59 11 #include "pico_ipv4.h"
daniele 2:540f6e142d59 12 #include "pico_simple_http.h"
daniele 2:540f6e142d59 13
daniele 2:540f6e142d59 14 /* The HTTP Server cannot be available without TCP support */
daniele 2:540f6e142d59 15 #if (defined PICO_SUPPORT_HTTP) && (defined PICO_SUPPORT_IPV4) && (defined PICO_SUPPORT_TCP)
daniele 2:540f6e142d59 16
daniele 2:540f6e142d59 17 #define HTTP_LISTEN_PORT 80u
daniele 2:540f6e142d59 18 #define HTTP_BACKLOG 5u
daniele 2:540f6e142d59 19 #define HTTP_HEADER_SIZE 256u
daniele 2:540f6e142d59 20
daniele 2:540f6e142d59 21 #define HTTP_SUCCESS 0
daniele 2:540f6e142d59 22 #define HTTP_ERROR -1
daniele 2:540f6e142d59 23
daniele 2:540f6e142d59 24 static struct pico_socket * httpServer = NULL;
daniele 2:540f6e142d59 25 static char httpResponse[] =
daniele 2:540f6e142d59 26 "HTTP/1.0 200 OK\r\n\
daniele 2:540f6e142d59 27 Content-Type: text/html\r\n\
daniele 2:540f6e142d59 28 \r\n\
daniele 2:540f6e142d59 29 <html><head>\r\n\
daniele 2:540f6e142d59 30 <title>picoTCP Simple Http server</title>\r\n\
daniele 2:540f6e142d59 31 </head>\r\n\
daniele 2:540f6e142d59 32 <body>\r\n\
daniele 2:540f6e142d59 33 <h1>Hello world from picoTCP !!</h1>\r\n\
daniele 2:540f6e142d59 34 </body>\r\n";
daniele 2:540f6e142d59 35
daniele 2:540f6e142d59 36 static void httpEventCbk(uint16_t ev, struct pico_socket *self)
daniele 2:540f6e142d59 37 {
daniele 2:540f6e142d59 38 static struct pico_socket * client = NULL;
daniele 2:540f6e142d59 39 uint32_t peer;
daniele 2:540f6e142d59 40 uint16_t port;
daniele 2:540f6e142d59 41 int r;
daniele 2:540f6e142d59 42 char buffer[HTTP_HEADER_SIZE];
daniele 2:540f6e142d59 43
daniele 2:540f6e142d59 44 switch(ev)
daniele 2:540f6e142d59 45 {
daniele 2:540f6e142d59 46 case PICO_SOCK_EV_CONN :
daniele 2:540f6e142d59 47 if(!client)
daniele 2:540f6e142d59 48 client = pico_socket_accept(self, &peer, &port);
daniele 2:540f6e142d59 49 break;
daniele 2:540f6e142d59 50
daniele 2:540f6e142d59 51 case PICO_SOCK_EV_RD:
daniele 2:540f6e142d59 52 // do not check http integrity, just mark that the http header has arrived
daniele 2:540f6e142d59 53 // prepare to send the response
daniele 2:540f6e142d59 54 r = pico_socket_recvfrom(self, buffer, HTTP_HEADER_SIZE, &peer, &port);
daniele 2:540f6e142d59 55 if(r>0 && memcmp(buffer,"GET",3u) == 0u)
daniele 2:540f6e142d59 56 { // it is an http header asking for data, return data and close
daniele 2:540f6e142d59 57 pico_socket_write(self,httpResponse,sizeof(httpResponse));
daniele 2:540f6e142d59 58 pico_socket_close(self);
daniele 2:540f6e142d59 59 }
daniele 2:540f6e142d59 60 else
daniele 2:540f6e142d59 61 {
daniele 2:540f6e142d59 62 // kill the connection, invalid header
daniele 2:540f6e142d59 63 pico_socket_close(self);
daniele 2:540f6e142d59 64 }
daniele 2:540f6e142d59 65 break;
daniele 2:540f6e142d59 66
daniele 2:540f6e142d59 67 case PICO_SOCK_EV_ERR:
daniele 2:540f6e142d59 68 case PICO_SOCK_EV_CLOSE:
daniele 2:540f6e142d59 69 // free the used socket
daniele 2:540f6e142d59 70 client = NULL;
daniele 2:540f6e142d59 71 break;
daniele 2:540f6e142d59 72
daniele 2:540f6e142d59 73 default :
daniele 2:540f6e142d59 74 break;
daniele 2:540f6e142d59 75 }
daniele 2:540f6e142d59 76 }
daniele 2:540f6e142d59 77
daniele 2:540f6e142d59 78 int pico_startHttpServer(struct pico_ip4 * address)
daniele 2:540f6e142d59 79 {
daniele 2:540f6e142d59 80
daniele 2:540f6e142d59 81 uint16_t localHttpPort = short_be(HTTP_LISTEN_PORT);
daniele 2:540f6e142d59 82
daniele 2:540f6e142d59 83 if(!pico_is_port_free(localHttpPort,PICO_PROTO_TCP, address, &pico_proto_ipv4))
daniele 2:540f6e142d59 84 {
daniele 2:540f6e142d59 85 pico_err = PICO_ERR_EADDRINUSE;
daniele 2:540f6e142d59 86 return HTTP_ERROR;
daniele 2:540f6e142d59 87 }
daniele 2:540f6e142d59 88
daniele 2:540f6e142d59 89 httpServer = pico_socket_open(PICO_PROTO_IPV4, PICO_PROTO_TCP, httpEventCbk);
daniele 2:540f6e142d59 90
daniele 2:540f6e142d59 91 if(!httpServer)
daniele 2:540f6e142d59 92 {
daniele 2:540f6e142d59 93 pico_err = PICO_ERR_ENOMEM;
daniele 2:540f6e142d59 94 return HTTP_ERROR;
daniele 2:540f6e142d59 95 }
daniele 2:540f6e142d59 96
daniele 2:540f6e142d59 97 // both functions set the pico_err themselves.
daniele 2:540f6e142d59 98 if(pico_socket_bind(httpServer,address,&localHttpPort))
daniele 2:540f6e142d59 99 return HTTP_ERROR;
daniele 2:540f6e142d59 100
daniele 2:540f6e142d59 101 if(pico_socket_listen(httpServer,HTTP_BACKLOG))
daniele 2:540f6e142d59 102 return HTTP_ERROR;
daniele 2:540f6e142d59 103
daniele 2:540f6e142d59 104 return HTTP_SUCCESS;
daniele 2:540f6e142d59 105 }
daniele 2:540f6e142d59 106
daniele 2:540f6e142d59 107 int pico_stopHttpServer(void)
daniele 2:540f6e142d59 108 {
daniele 2:540f6e142d59 109 if(!httpServer)
daniele 2:540f6e142d59 110 {
daniele 2:540f6e142d59 111 pico_err = PICO_ERR_EINVAL;
daniele 2:540f6e142d59 112 return HTTP_ERROR;
daniele 2:540f6e142d59 113 }
daniele 2:540f6e142d59 114
daniele 2:540f6e142d59 115 if(pico_socket_close(httpServer))
daniele 2:540f6e142d59 116 {
daniele 2:540f6e142d59 117 // no need to set the error here, function already set it
daniele 2:540f6e142d59 118 httpServer = NULL;
daniele 2:540f6e142d59 119 return HTTP_ERROR;
daniele 2:540f6e142d59 120 }
daniele 2:540f6e142d59 121
daniele 2:540f6e142d59 122 httpServer = NULL;
daniele 2:540f6e142d59 123 return HTTP_SUCCESS;
daniele 2:540f6e142d59 124 }
daniele 2:540f6e142d59 125
daniele 2:540f6e142d59 126 #endif
daniele 2:540f6e142d59 127
daniele 2:540f6e142d59 128