Ethernet test for tinydtls-0.5.0

Dependencies:   EthernetInterface mbed-rtos mbed tinydtls

Fork of tinydtls_test_ethernet by Ashley Mills

Committer:
ashleymills
Date:
Fri Oct 11 14:04:03 2013 +0000
Revision:
3:0caeed7fd9f0
Parent:
2:21019cad4c93
Child:
4:4d466a913c11
Removed some junk.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ashleymills 1:391ec57807fa 1 #define __DEBUG__ 4
ashleymills 1:391ec57807fa 2
ashleymills 1:391ec57807fa 3 #ifndef __MODULE__
ashleymills 1:391ec57807fa 4 #define __MODULE__ "main.cpp"
ashleymills 1:391ec57807fa 5 #endif
ashleymills 1:391ec57807fa 6
ashleymills 0:6ae42a2aff75 7 #include "mbed.h"
ashleymills 0:6ae42a2aff75 8 #include "rtos.h"
ashleymills 0:6ae42a2aff75 9 #include "bsd_socket.h"
ashleymills 0:6ae42a2aff75 10
ashleymills 1:391ec57807fa 11 #include <dtls.h>
ashleymills 1:391ec57807fa 12 #include "global.h"
ashleymills 1:391ec57807fa 13 #include "debug.h"
ashleymills 1:391ec57807fa 14 #include "errno.h"
ashleymills 1:391ec57807fa 15 #include "dbg.h"
ashleymills 1:391ec57807fa 16
ashleymills 1:391ec57807fa 17 #include "EthernetInterface.h"
ashleymills 0:6ae42a2aff75 18 DigitalOut myled(LED1);
ashleymills 0:6ae42a2aff75 19
ashleymills 1:391ec57807fa 20 void fail(int code) {
ashleymills 1:391ec57807fa 21 while(1) {
ashleymills 1:391ec57807fa 22 myled = !myled;
ashleymills 1:391ec57807fa 23 Thread::wait(100);
ashleymills 1:391ec57807fa 24 }
ashleymills 1:391ec57807fa 25 }
ashleymills 1:391ec57807fa 26
ashleymills 1:391ec57807fa 27 /* This function is the "key store" for tinyDTLS. It is called to
ashleymills 1:391ec57807fa 28 * retrieve a key for the given identiy within this particular
ashleymills 1:391ec57807fa 29 * session. */
ashleymills 1:391ec57807fa 30 int
ashleymills 1:391ec57807fa 31 get_key(struct dtls_context_t *ctx,
ashleymills 1:391ec57807fa 32 const session_t *session,
ashleymills 1:391ec57807fa 33 const unsigned char *id, size_t id_len,
ashleymills 1:391ec57807fa 34 const dtls_key_t **result) {
ashleymills 1:391ec57807fa 35 DBG("Entered get_key");
ashleymills 1:391ec57807fa 36
ashleymills 1:391ec57807fa 37 static const dtls_key_t psk = {
ashleymills 1:391ec57807fa 38 .type = DTLS_KEY_PSK,
ashleymills 1:391ec57807fa 39 .key.psk.id = (unsigned char *)"Client_identity",
ashleymills 1:391ec57807fa 40 .key.psk.id_length = 15,
ashleymills 1:391ec57807fa 41 .key.psk.key = (unsigned char *)"secretPSK",
ashleymills 1:391ec57807fa 42 .key.psk.key_length = 9
ashleymills 1:391ec57807fa 43 };
ashleymills 1:391ec57807fa 44
ashleymills 1:391ec57807fa 45 *result = &psk;
ashleymills 1:391ec57807fa 46 return 0;
ashleymills 1:391ec57807fa 47 }
ashleymills 1:391ec57807fa 48
ashleymills 1:391ec57807fa 49 #define APN_GDSP
ashleymills 1:391ec57807fa 50 //#define APN_CONTRACT
ashleymills 1:391ec57807fa 51
ashleymills 1:391ec57807fa 52 #ifdef APN_GDSP
ashleymills 1:391ec57807fa 53 #define APN "ppinternetd.gdsp"
ashleymills 1:391ec57807fa 54 #define APN_USERNAME ""
ashleymills 1:391ec57807fa 55 #define APN_PASSWORD ""
ashleymills 1:391ec57807fa 56 #endif
ashleymills 1:391ec57807fa 57
ashleymills 1:391ec57807fa 58 #ifdef APN_CONTRACT
ashleymills 1:391ec57807fa 59 #define APN "internet"
ashleymills 1:391ec57807fa 60 #define APN_USERNAME "web"
ashleymills 1:391ec57807fa 61 #define APN_PASSWORD "web"
ashleymills 1:391ec57807fa 62 #endif
ashleymills 1:391ec57807fa 63
ashleymills 1:391ec57807fa 64 sockaddr_in bindAddr,serverAddress;
ashleymills 1:391ec57807fa 65 bool connectToSocketUDP(char *ipAddress, int port, int *sockfd) {
ashleymills 1:391ec57807fa 66 *sockfd = -1;
ashleymills 1:391ec57807fa 67 // create the socket
ashleymills 1:391ec57807fa 68 if((*sockfd=socket(AF_INET,SOCK_DGRAM,0))<0) {
ashleymills 1:391ec57807fa 69 DBG("Error opening socket");
ashleymills 1:391ec57807fa 70 return false;
ashleymills 1:391ec57807fa 71 }
ashleymills 1:391ec57807fa 72 socklen_t sockAddrInLen = sizeof(struct sockaddr_in);
ashleymills 1:391ec57807fa 73
ashleymills 1:391ec57807fa 74 // bind socket
ashleymills 1:391ec57807fa 75 memset(&bindAddr, 0x00, sockAddrInLen);
ashleymills 1:391ec57807fa 76 bindAddr.sin_family = AF_INET; // IP family
ashleymills 1:391ec57807fa 77 bindAddr.sin_port = htons(port);
ashleymills 1:391ec57807fa 78 bindAddr.sin_addr.s_addr = IPADDR_ANY; // 32 bit IP representation
ashleymills 1:391ec57807fa 79 // call bind
ashleymills 1:391ec57807fa 80 if(bind(*sockfd,(const struct sockaddr *)&bindAddr,sockAddrInLen)!=0) {
ashleymills 1:391ec57807fa 81 DBG("Error binding socket");
ashleymills 1:391ec57807fa 82 perror(NULL);
ashleymills 1:391ec57807fa 83 }
ashleymills 1:391ec57807fa 84
ashleymills 1:391ec57807fa 85 INFO("UDP socket created and bound to: %s:%d",inet_ntoa(bindAddr.sin_addr),ntohs(bindAddr.sin_port));
ashleymills 1:391ec57807fa 86
ashleymills 1:391ec57807fa 87 // create the socket address
ashleymills 1:391ec57807fa 88 memset(&serverAddress, 0x00, sizeof(struct sockaddr_in));
ashleymills 1:391ec57807fa 89 serverAddress.sin_addr.s_addr = inet_addr(ipAddress);
ashleymills 1:391ec57807fa 90 serverAddress.sin_family = AF_INET;
ashleymills 1:391ec57807fa 91 serverAddress.sin_port = htons(port);
ashleymills 1:391ec57807fa 92
ashleymills 1:391ec57807fa 93 // do socket connect
ashleymills 1:391ec57807fa 94 //LOG("Connecting socket to %s:%d", inet_ntoa(serverAddress.sin_addr), ntohs(serverAddress.sin_port));
ashleymills 1:391ec57807fa 95 if(connect(*sockfd, (const struct sockaddr *)&serverAddress, sizeof(serverAddress))<0) {
ashleymills 1:391ec57807fa 96 shutdown(*sockfd,SHUT_RDWR);
ashleymills 1:391ec57807fa 97 close(*sockfd);
ashleymills 1:391ec57807fa 98 DBG("Could not connect");
ashleymills 1:391ec57807fa 99 return false;
ashleymills 1:391ec57807fa 100 }
ashleymills 1:391ec57807fa 101 return true;
ashleymills 1:391ec57807fa 102 }
ashleymills 1:391ec57807fa 103
ashleymills 1:391ec57807fa 104 int read_from_peer(struct dtls_context_t *ctx, session_t *session, uint8 *data, size_t len) {
ashleymills 1:391ec57807fa 105 DBG("read_from_peer called");
ashleymills 1:391ec57807fa 106 size_t i;
ashleymills 1:391ec57807fa 107 for (i = 0; i < len; i++)
ashleymills 1:391ec57807fa 108 printf("%c", data[i]);
ashleymills 1:391ec57807fa 109 return 0;
ashleymills 1:391ec57807fa 110 }
ashleymills 1:391ec57807fa 111
ashleymills 1:391ec57807fa 112 int send_to_peer(struct dtls_context_t *ctx, session_t *session, uint8 *data, size_t len) {
ashleymills 1:391ec57807fa 113 DBG("send_to_peer called");
ashleymills 1:391ec57807fa 114 int fd = *(int *)dtls_get_app_data(ctx);
ashleymills 1:391ec57807fa 115 return sendto(fd, data, len, MSG_DONTWAIT,
ashleymills 1:391ec57807fa 116 &session->addr.sa, session->size);
ashleymills 1:391ec57807fa 117 }
ashleymills 1:391ec57807fa 118
ashleymills 1:391ec57807fa 119
ashleymills 1:391ec57807fa 120 int
ashleymills 1:391ec57807fa 121 dtls_handle_read(struct dtls_context_t *ctx) {
ashleymills 1:391ec57807fa 122 DBG("dtls_handle_read called");
ashleymills 1:391ec57807fa 123 int fd;
ashleymills 1:391ec57807fa 124 session_t session;
ashleymills 1:391ec57807fa 125 #define MAX_READ_BUF 512
ashleymills 1:391ec57807fa 126 static uint8 buf[MAX_READ_BUF];
ashleymills 1:391ec57807fa 127 int len;
ashleymills 1:391ec57807fa 128
ashleymills 1:391ec57807fa 129 fd = *(int *)dtls_get_app_data(ctx);
ashleymills 1:391ec57807fa 130 /*
ashleymills 1:391ec57807fa 131 if(!fd) {
ashleymills 1:391ec57807fa 132 DBG("FD NULL");
ashleymills 1:391ec57807fa 133 return -1;
ashleymills 1:391ec57807fa 134 }*/
ashleymills 1:391ec57807fa 135
ashleymills 1:391ec57807fa 136 memset(&session, 0x00, sizeof(session_t));
ashleymills 1:391ec57807fa 137 DBG("BEFORE: ");
ashleymills 1:391ec57807fa 138 for(uint8_t i=0; i<sizeof(session_t); i++) {
ashleymills 1:391ec57807fa 139 DBGX("%x ",((uint8_t*)&session)[i]);
ashleymills 1:391ec57807fa 140 }
ashleymills 1:391ec57807fa 141 DBGX("\r\n");
ashleymills 1:391ec57807fa 142 session.size = sizeof(sockaddr_in);
ashleymills 1:391ec57807fa 143 uint32_t bullshit = sizeof(sockaddr_in);
ashleymills 1:391ec57807fa 144 len = recvfrom(fd, buf, MAX_READ_BUF, 0,
ashleymills 1:391ec57807fa 145 &session.addr.sa, &bullshit);
ashleymills 1:391ec57807fa 146
ashleymills 1:391ec57807fa 147 //((uint8_t*)&session)[4] = 0x00;
ashleymills 1:391ec57807fa 148 //session.addr.sin.sin_family = AF_INET;
ashleymills 1:391ec57807fa 149 DBG("AFTER: %d",bullshit);
ashleymills 1:391ec57807fa 150 for(uint8_t i=0; i<sizeof(session_t); i++) {
ashleymills 1:391ec57807fa 151 DBGX("%x ",((uint8_t*)&session)[i]);
ashleymills 1:391ec57807fa 152 }
ashleymills 1:391ec57807fa 153 DBGX("\r\n");
ashleymills 1:391ec57807fa 154 short x = session.addr.sin.sin_family;
ashleymills 1:391ec57807fa 155 if(session.addr.sin.sin_family==AF_INET) {
ashleymills 1:391ec57807fa 156 DBG("AF_INET alright");
ashleymills 1:391ec57807fa 157 }
ashleymills 1:391ec57807fa 158 DBG("%x %x",((uint8_t*)x)[0],((uint8_t*)x)[1]);
ashleymills 1:391ec57807fa 159 if (len < 0) {
ashleymills 1:391ec57807fa 160 DBG("Got nothing from read");
ashleymills 1:391ec57807fa 161 perror("recvfrom");
ashleymills 1:391ec57807fa 162 return -1;
ashleymills 1:391ec57807fa 163 } else {
ashleymills 1:391ec57807fa 164 #ifndef NDEBUG
ashleymills 1:391ec57807fa 165 unsigned char addrbuf[72];
ashleymills 1:391ec57807fa 166 dsrv_print_addr(&session, addrbuf, sizeof(addrbuf));
ashleymills 1:391ec57807fa 167 DBG("got %d bytes from %s\n", len, (char *)addrbuf);
ashleymills 1:391ec57807fa 168 dump((unsigned char *)&session, sizeof(session_t));
ashleymills 1:391ec57807fa 169 DBGX("\r\n");
ashleymills 1:391ec57807fa 170 dump(buf, len);
ashleymills 1:391ec57807fa 171 DBGX("\r\n");
ashleymills 1:391ec57807fa 172 #endif
ashleymills 1:391ec57807fa 173 }
ashleymills 1:391ec57807fa 174
ashleymills 1:391ec57807fa 175 return dtls_handle_message(ctx, &session, buf, len);
ashleymills 1:391ec57807fa 176 }
ashleymills 1:391ec57807fa 177
ashleymills 1:391ec57807fa 178 static dtls_handler_t cb = {
ashleymills 1:391ec57807fa 179 .write = send_to_peer,
ashleymills 1:391ec57807fa 180 .read = read_from_peer,
ashleymills 1:391ec57807fa 181 .event = NULL,
ashleymills 1:391ec57807fa 182 .get_key = get_key
ashleymills 1:391ec57807fa 183 };
ashleymills 1:391ec57807fa 184
ashleymills 0:6ae42a2aff75 185 int main() {
ashleymills 1:391ec57807fa 186 DBG_INIT();
ashleymills 1:391ec57807fa 187 DBG_SET_SPEED(115200);
ashleymills 1:391ec57807fa 188 DBG_SET_NEWLINE("\r\n");
ashleymills 1:391ec57807fa 189
ashleymills 1:391ec57807fa 190 DBG("Tiny DTLS test");
ashleymills 1:391ec57807fa 191
ashleymills 1:391ec57807fa 192 // DTLS context struct
ashleymills 1:391ec57807fa 193 dtls_context_t *dtls_context = NULL;
ashleymills 1:391ec57807fa 194 int ret = 0;
ashleymills 1:391ec57807fa 195 fd_set rfds, wfds;
ashleymills 1:391ec57807fa 196 struct timeval timeout;
ashleymills 1:391ec57807fa 197 session_t dst;
ashleymills 1:391ec57807fa 198
ashleymills 1:391ec57807fa 199 // structure for getting address of incoming packets
ashleymills 1:391ec57807fa 200 sockaddr_in fromAddr;
ashleymills 1:391ec57807fa 201 socklen_t fromAddrLen = sizeof(struct sockaddr_in);
ashleymills 1:391ec57807fa 202 memset(&fromAddr,0x00,fromAddrLen);
ashleymills 1:391ec57807fa 203
ashleymills 1:391ec57807fa 204 // connect to cellular network
ashleymills 1:391ec57807fa 205 /*
ashleymills 1:391ec57807fa 206 VodafoneUSBModem modem;
ashleymills 1:391ec57807fa 207 modem.connect(APN,APN_USERNAME,APN_PASSWORD);
ashleymills 1:391ec57807fa 208 */
ashleymills 1:391ec57807fa 209 EthernetInterface modem;
ashleymills 1:391ec57807fa 210 DBG("Connecting to network interface");
ashleymills 1:391ec57807fa 211 modem.init();
ashleymills 1:391ec57807fa 212 if(modem.connect(10000)) {
ashleymills 1:391ec57807fa 213 DBG("Error initialising ethernet interface");
ashleymills 1:391ec57807fa 214 }
ashleymills 1:391ec57807fa 215 DBG("DONE.");
ashleymills 1:391ec57807fa 216
ashleymills 1:391ec57807fa 217 dtls_init();
ashleymills 1:391ec57807fa 218 dtls_set_log_level(LOG_DEBUG);
ashleymills 1:391ec57807fa 219
ashleymills 1:391ec57807fa 220 // setup socket to remote server
ashleymills 1:391ec57807fa 221 int sockfd = NULL;
ashleymills 1:391ec57807fa 222
ashleymills 1:391ec57807fa 223
ashleymills 2:21019cad4c93 224 if(!connectToSocketUDP("109.74.199.96", 4433, &sockfd)) {
ashleymills 2:21019cad4c93 225 //if(!connectToSocketUDP("192.168.1.99", 4433, &sockfd)) {
ashleymills 1:391ec57807fa 226 DBG("Error connecting to socket");
ashleymills 1:391ec57807fa 227 fail(1);
ashleymills 0:6ae42a2aff75 228 }
ashleymills 1:391ec57807fa 229 DBG("\"Connected\" to UDP socket, sockfd: %d",sockfd);
ashleymills 1:391ec57807fa 230 /*
ashleymills 1:391ec57807fa 231 int on = 1;
ashleymills 1:391ec57807fa 232 if(setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on) ) < 0) {
ashleymills 1:391ec57807fa 233 dsrv_log(LOG_ALERT, "setsockopt SO_REUSEADDR: %s\n", strerror(errno));
ashleymills 1:391ec57807fa 234 }*/
ashleymills 1:391ec57807fa 235
ashleymills 1:391ec57807fa 236 // tinydtls stuff
ashleymills 1:391ec57807fa 237
ashleymills 1:391ec57807fa 238 // destination address is stored in a session type
ashleymills 1:391ec57807fa 239
ashleymills 1:391ec57807fa 240 memset(&dst, 0x00, sizeof(session_t));
ashleymills 1:391ec57807fa 241 dst.size = sizeof(sockaddr_in);
ashleymills 1:391ec57807fa 242 DBG("starting copy at offset: %d",(int)&dst.addr-(int)&dst);
ashleymills 1:391ec57807fa 243 serverAddress.sin_len = dst.size;
ashleymills 1:391ec57807fa 244 memcpy(&dst.addr, &serverAddress, dst.size);
ashleymills 1:391ec57807fa 245
ashleymills 1:391ec57807fa 246
ashleymills 1:391ec57807fa 247 //dst.addr.sin.sin_port = htons(4433);
ashleymills 1:391ec57807fa 248
ashleymills 1:391ec57807fa 249 // dtls init must always be called for memory allocation
ashleymills 1:391ec57807fa 250
ashleymills 1:391ec57807fa 251 // setup DTLS context
ashleymills 1:391ec57807fa 252 DBG("Creating DTLS context");
ashleymills 1:391ec57807fa 253 dtls_context = dtls_new_context(&sockfd);
ashleymills 1:391ec57807fa 254 if(!dtls_context) {
ashleymills 1:391ec57807fa 255 DBG("Cannot create context");
ashleymills 1:391ec57807fa 256 fail(3);
ashleymills 1:391ec57807fa 257 }
ashleymills 1:391ec57807fa 258 DBG("DTLS context created");
ashleymills 1:391ec57807fa 259
ashleymills 1:391ec57807fa 260 // forced to use this call back system
ashleymills 1:391ec57807fa 261
ashleymills 1:391ec57807fa 262 dtls_set_handler(dtls_context, &cb);
ashleymills 1:391ec57807fa 263
ashleymills 1:391ec57807fa 264 DBG("Issuing dtls_connect");
ashleymills 1:391ec57807fa 265 ret = dtls_connect(dtls_context, &dst);
ashleymills 1:391ec57807fa 266 if(ret<0) {
ashleymills 1:391ec57807fa 267 DBG("Error in dtls_connect: %d",ret);
ashleymills 1:391ec57807fa 268 modem.disconnect();
ashleymills 1:391ec57807fa 269 fail(4);
ashleymills 1:391ec57807fa 270 }
ashleymills 1:391ec57807fa 271 if(ret==0) {
ashleymills 1:391ec57807fa 272 DBG("Channel already exists");
ashleymills 1:391ec57807fa 273 modem.disconnect();
ashleymills 1:391ec57807fa 274 fail(5);
ashleymills 1:391ec57807fa 275 }
ashleymills 1:391ec57807fa 276 DBG("dtls_connect successfull");
ashleymills 1:391ec57807fa 277 while (1) {
ashleymills 1:391ec57807fa 278 // setup file descriptor lists for select
ashleymills 1:391ec57807fa 279 FD_ZERO(&rfds);
ashleymills 1:391ec57807fa 280 FD_ZERO(&wfds);
ashleymills 1:391ec57807fa 281 //FD_SET(fileno(stdin), &rfds);
ashleymills 1:391ec57807fa 282 FD_SET(sockfd, &rfds);
ashleymills 1:391ec57807fa 283 // FD_SET(sockfd, &wfds);
ashleymills 1:391ec57807fa 284
ashleymills 1:391ec57807fa 285 timeout.tv_sec = 5;
ashleymills 1:391ec57807fa 286 timeout.tv_usec = 0;
ashleymills 1:391ec57807fa 287
ashleymills 1:391ec57807fa 288 int result = select(sockfd+1, &rfds, &wfds, 0, &timeout);
ashleymills 1:391ec57807fa 289
ashleymills 1:391ec57807fa 290 if(result < 0) { // error
ashleymills 1:391ec57807fa 291 if (errno != EINTR)
ashleymills 1:391ec57807fa 292 perror("select");
ashleymills 1:391ec57807fa 293 } else if (result == 0) {
ashleymills 1:391ec57807fa 294 // timeout
ashleymills 1:391ec57807fa 295 } else {
ashleymills 1:391ec57807fa 296 // OK
ashleymills 1:391ec57807fa 297 // check which file descriptor had an event
ashleymills 1:391ec57807fa 298 if(FD_ISSET(sockfd, &wfds)) {
ashleymills 1:391ec57807fa 299 // FIXME (from tinydtls)
ashleymills 1:391ec57807fa 300 } else if (FD_ISSET(sockfd, &rfds))
ashleymills 1:391ec57807fa 301 if(dtls_handle_read(dtls_context)<0) {
ashleymills 1:391ec57807fa 302 modem.disconnect();
ashleymills 1:391ec57807fa 303 fail(6);
ashleymills 1:391ec57807fa 304 }
ashleymills 1:391ec57807fa 305 }
ashleymills 1:391ec57807fa 306 //else if (FD_ISSET(fileno(stdin), &rfds))
ashleymills 1:391ec57807fa 307 //handle_stdin();
ashleymills 1:391ec57807fa 308 //}
ashleymills 1:391ec57807fa 309
ashleymills 1:391ec57807fa 310 //if(len) {
ashleymills 1:391ec57807fa 311 // try_send(dtls_context, &dst);
ashleymills 1:391ec57807fa 312 //}
ashleymills 1:391ec57807fa 313 }
ashleymills 1:391ec57807fa 314
ashleymills 0:6ae42a2aff75 315 }