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 <stdint.h>
daniele 2:540f6e142d59 9 #include "pico_config.h"
daniele 2:540f6e142d59 10 #include "pico_stack.h"
daniele 2:540f6e142d59 11 #include "pico_protocol.h"
daniele 2:540f6e142d59 12 #include "pico_http_util.h"
daniele 2:540f6e142d59 13
daniele 2:540f6e142d59 14 #define TRUE 1
daniele 2:540f6e142d59 15 #define FALSE 0
daniele 2:540f6e142d59 16
daniele 2:540f6e142d59 17 #define HTTP_PROTO_TOK "http://"
daniele 2:540f6e142d59 18 #define HTTP_PROTO_LEN 7u
daniele 2:540f6e142d59 19
daniele 2:540f6e142d59 20 #if defined PICO_SUPPORT_HTTP_CLIENT || defined PICO_SUPPORT_HTTP_SERVER
daniele 2:540f6e142d59 21
daniele 2:540f6e142d59 22 int pico_itoaHex(uint16_t port, char * ptr)
daniele 2:540f6e142d59 23 {
daniele 2:540f6e142d59 24 int size = 0;
daniele 2:540f6e142d59 25 int index;
daniele 2:540f6e142d59 26
daniele 2:540f6e142d59 27 // transform to from number to string [ in backwards ]
daniele 2:540f6e142d59 28 while(port)
daniele 2:540f6e142d59 29 {
daniele 2:540f6e142d59 30 ptr[size] = ((port & 0xF) < 10) ? ((port & 0xF) + '0') : ((port & 0xF) - 10 + 'a');
daniele 2:540f6e142d59 31 port = port>>4u; //divide by 16
daniele 2:540f6e142d59 32 size++;
daniele 2:540f6e142d59 33 }
daniele 2:540f6e142d59 34
daniele 2:540f6e142d59 35 // invert positions
daniele 2:540f6e142d59 36 for(index=0 ;index < size>>1u ;index++)
daniele 2:540f6e142d59 37 {
daniele 2:540f6e142d59 38 char c = ptr[index];
daniele 2:540f6e142d59 39 ptr[index] = ptr[size-index-1];
daniele 2:540f6e142d59 40 ptr[size-index-1] = c;
daniele 2:540f6e142d59 41 }
daniele 2:540f6e142d59 42 ptr[size] = '\0';
daniele 2:540f6e142d59 43 return size;
daniele 2:540f6e142d59 44 }
daniele 2:540f6e142d59 45
daniele 2:540f6e142d59 46 int pico_itoa(uint16_t port, char * ptr)
daniele 2:540f6e142d59 47 {
daniele 2:540f6e142d59 48 int size = 0;
daniele 2:540f6e142d59 49 int index;
daniele 2:540f6e142d59 50
daniele 2:540f6e142d59 51 // transform to from number to string [ in backwards ]
daniele 2:540f6e142d59 52 while(port)
daniele 2:540f6e142d59 53 {
daniele 2:540f6e142d59 54 ptr[size] = port%10 + '0';
daniele 2:540f6e142d59 55 port = port/10;
daniele 2:540f6e142d59 56 size++;
daniele 2:540f6e142d59 57 }
daniele 2:540f6e142d59 58
daniele 2:540f6e142d59 59 // invert positions
daniele 2:540f6e142d59 60 for(index=0 ;index < size>>1u ;index++)
daniele 2:540f6e142d59 61 {
daniele 2:540f6e142d59 62 char c = ptr[index];
daniele 2:540f6e142d59 63 ptr[index] = ptr[size-index-1];
daniele 2:540f6e142d59 64 ptr[size-index-1] = c;
daniele 2:540f6e142d59 65 }
daniele 2:540f6e142d59 66 ptr[size] = '\0';
daniele 2:540f6e142d59 67 return size;
daniele 2:540f6e142d59 68 }
daniele 2:540f6e142d59 69
daniele 2:540f6e142d59 70
daniele 2:540f6e142d59 71 int pico_processURI(const char * uri, struct pico_http_uri * urikey)
daniele 2:540f6e142d59 72 {
daniele 2:540f6e142d59 73
daniele 2:540f6e142d59 74 uint16_t lastIndex = 0, index;
daniele 2:540f6e142d59 75
daniele 2:540f6e142d59 76 if(!uri || !urikey || uri[0] == '/')
daniele 2:540f6e142d59 77 {
daniele 2:540f6e142d59 78 pico_err = PICO_ERR_EINVAL;
daniele 2:540f6e142d59 79 goto error;
daniele 2:540f6e142d59 80 }
daniele 2:540f6e142d59 81
daniele 2:540f6e142d59 82 // detect protocol => search for "://"
daniele 2:540f6e142d59 83 if(memcmp(uri,HTTP_PROTO_TOK,HTTP_PROTO_LEN) == 0) // could be optimized
daniele 2:540f6e142d59 84 { // protocol identified, it is http
daniele 2:540f6e142d59 85 urikey->protoHttp = TRUE;
daniele 2:540f6e142d59 86 lastIndex = HTTP_PROTO_LEN;
daniele 2:540f6e142d59 87 }
daniele 2:540f6e142d59 88 else
daniele 2:540f6e142d59 89 {
daniele 2:540f6e142d59 90 if(strstr(uri,"://")) // different protocol specified
daniele 2:540f6e142d59 91 {
daniele 2:540f6e142d59 92 urikey->protoHttp = FALSE;
daniele 2:540f6e142d59 93 goto error;
daniele 2:540f6e142d59 94 }
daniele 2:540f6e142d59 95 // no protocol specified, assuming by default it's http
daniele 2:540f6e142d59 96 urikey->protoHttp = TRUE;
daniele 2:540f6e142d59 97 }
daniele 2:540f6e142d59 98
daniele 2:540f6e142d59 99 // detect hostname
daniele 2:540f6e142d59 100 index = lastIndex;
daniele 2:540f6e142d59 101 while(uri[index] && uri[index]!='/' && uri[index]!=':') index++;
daniele 2:540f6e142d59 102
daniele 2:540f6e142d59 103 if(index == lastIndex)
daniele 2:540f6e142d59 104 {
daniele 2:540f6e142d59 105 // wrong format
daniele 2:540f6e142d59 106 urikey->host = urikey->resource = NULL;
daniele 2:540f6e142d59 107 urikey->port = urikey->protoHttp = 0u;
daniele 2:540f6e142d59 108
daniele 2:540f6e142d59 109 goto error;
daniele 2:540f6e142d59 110 }
daniele 2:540f6e142d59 111 else
daniele 2:540f6e142d59 112 {
daniele 2:540f6e142d59 113 // extract host
daniele 2:540f6e142d59 114 urikey->host = (char *)pico_zalloc(index-lastIndex+1);
daniele 2:540f6e142d59 115
daniele 2:540f6e142d59 116 if(!urikey->host)
daniele 2:540f6e142d59 117 {
daniele 2:540f6e142d59 118 // no memory
daniele 2:540f6e142d59 119 goto error;
daniele 2:540f6e142d59 120 }
daniele 2:540f6e142d59 121 memcpy(urikey->host,uri+lastIndex,index-lastIndex);
daniele 2:540f6e142d59 122 }
daniele 2:540f6e142d59 123
daniele 2:540f6e142d59 124 if(!uri[index])
daniele 2:540f6e142d59 125 {
daniele 2:540f6e142d59 126 // nothing specified
daniele 2:540f6e142d59 127 urikey->port = 80u;
daniele 2:540f6e142d59 128 urikey->resource = pico_zalloc(2u);
daniele 2:540f6e142d59 129 urikey->resource[0] = '/';
daniele 2:540f6e142d59 130 return HTTP_RETURN_OK;
daniele 2:540f6e142d59 131 }
daniele 2:540f6e142d59 132 else if(uri[index] == '/')
daniele 2:540f6e142d59 133 {
daniele 2:540f6e142d59 134 urikey->port = 80u;
daniele 2:540f6e142d59 135 }
daniele 2:540f6e142d59 136 else if(uri[index] == ':')
daniele 2:540f6e142d59 137 {
daniele 2:540f6e142d59 138 urikey->port = 0u;
daniele 2:540f6e142d59 139 index++;
daniele 2:540f6e142d59 140 while(uri[index] && uri[index]!='/')
daniele 2:540f6e142d59 141 {
daniele 2:540f6e142d59 142 // should check if every component is a digit
daniele 2:540f6e142d59 143 urikey->port = urikey->port*10 + (uri[index] - '0');
daniele 2:540f6e142d59 144 index++;
daniele 2:540f6e142d59 145 }
daniele 2:540f6e142d59 146 }
daniele 2:540f6e142d59 147
daniele 2:540f6e142d59 148 // extract resource
daniele 2:540f6e142d59 149 if(!uri[index])
daniele 2:540f6e142d59 150 {
daniele 2:540f6e142d59 151 urikey->resource = pico_zalloc(2u);
daniele 2:540f6e142d59 152 urikey->resource[0] = '/';
daniele 2:540f6e142d59 153 }
daniele 2:540f6e142d59 154 else
daniele 2:540f6e142d59 155 {
daniele 2:540f6e142d59 156 lastIndex = index;
daniele 2:540f6e142d59 157 while(uri[index] && uri[index]!='?' && uri[index]!='&' && uri[index]!='#') index++;
daniele 2:540f6e142d59 158 urikey->resource = (char *)pico_zalloc(index-lastIndex+1);
daniele 2:540f6e142d59 159
daniele 2:540f6e142d59 160 if(!urikey->resource)
daniele 2:540f6e142d59 161 {
daniele 2:540f6e142d59 162 // no memory
daniele 2:540f6e142d59 163 pico_err = PICO_ERR_ENOMEM;
daniele 2:540f6e142d59 164 goto error;
daniele 2:540f6e142d59 165 }
daniele 2:540f6e142d59 166
daniele 2:540f6e142d59 167 memcpy(urikey->resource,uri+lastIndex,index-lastIndex);
daniele 2:540f6e142d59 168 }
daniele 2:540f6e142d59 169
daniele 2:540f6e142d59 170 return HTTP_RETURN_OK;
daniele 2:540f6e142d59 171
daniele 2:540f6e142d59 172 error :
daniele 2:540f6e142d59 173 if(urikey->resource)
daniele 2:540f6e142d59 174 {
daniele 2:540f6e142d59 175 pico_free(urikey->resource);
daniele 2:540f6e142d59 176 urikey->resource = NULL;
daniele 2:540f6e142d59 177 }
daniele 2:540f6e142d59 178 if(urikey->host)
daniele 2:540f6e142d59 179 {
daniele 2:540f6e142d59 180 pico_free(urikey->host);
daniele 2:540f6e142d59 181 urikey->host = NULL;
daniele 2:540f6e142d59 182 }
daniele 2:540f6e142d59 183
daniele 2:540f6e142d59 184 return HTTP_RETURN_ERROR;
daniele 2:540f6e142d59 185 }
daniele 2:540f6e142d59 186 #endif