Ethernet test for tinydtls-0.5.0
Dependencies: EthernetInterface mbed-rtos mbed tinydtls
Fork of tinydtls_test_ethernet by
main.cpp@1:391ec57807fa, 2013-10-10 (annotated)
- Committer:
- ashleymills
- Date:
- Thu Oct 10 21:38:25 2013 +0000
- Revision:
- 1:391ec57807fa
- Parent:
- 0:6ae42a2aff75
- Child:
- 2:21019cad4c93
Ethernet test of tinydtls
Who changed what in which revision?
User | Revision | Line number | New 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 | /* stolen from libcoap: */ |
ashleymills | 1:391ec57807fa | 65 | int |
ashleymills | 1:391ec57807fa | 66 | resolve_address(const char *server, struct sockaddr *dst) { |
ashleymills | 1:391ec57807fa | 67 | |
ashleymills | 1:391ec57807fa | 68 | struct addrinfo *res, *ainfo; |
ashleymills | 1:391ec57807fa | 69 | struct addrinfo hints; |
ashleymills | 1:391ec57807fa | 70 | static char addrstr[256]; |
ashleymills | 1:391ec57807fa | 71 | int error; |
ashleymills | 1:391ec57807fa | 72 | |
ashleymills | 1:391ec57807fa | 73 | memset(addrstr, 0, sizeof(addrstr)); |
ashleymills | 1:391ec57807fa | 74 | if (server && strlen(server) > 0) |
ashleymills | 1:391ec57807fa | 75 | memcpy(addrstr, server, strlen(server)); |
ashleymills | 1:391ec57807fa | 76 | else |
ashleymills | 1:391ec57807fa | 77 | memcpy(addrstr, "localhost", 9); |
ashleymills | 1:391ec57807fa | 78 | |
ashleymills | 1:391ec57807fa | 79 | memset ((char *)&hints, 0, sizeof(hints)); |
ashleymills | 1:391ec57807fa | 80 | hints.ai_socktype = SOCK_DGRAM; |
ashleymills | 1:391ec57807fa | 81 | hints.ai_family = AF_UNSPEC; |
ashleymills | 1:391ec57807fa | 82 | |
ashleymills | 1:391ec57807fa | 83 | error = getaddrinfo(addrstr, "", &hints, &res); |
ashleymills | 1:391ec57807fa | 84 | |
ashleymills | 1:391ec57807fa | 85 | if (error != 0) { |
ashleymills | 1:391ec57807fa | 86 | DBG("Some bullshit error");//fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(error)); |
ashleymills | 1:391ec57807fa | 87 | return error; |
ashleymills | 1:391ec57807fa | 88 | } |
ashleymills | 1:391ec57807fa | 89 | |
ashleymills | 1:391ec57807fa | 90 | for (ainfo = res; ainfo != NULL; ainfo = ainfo->ai_next) { |
ashleymills | 1:391ec57807fa | 91 | |
ashleymills | 1:391ec57807fa | 92 | switch (ainfo->ai_family) { |
ashleymills | 1:391ec57807fa | 93 | case AF_INET: |
ashleymills | 1:391ec57807fa | 94 | |
ashleymills | 1:391ec57807fa | 95 | memcpy(dst, ainfo->ai_addr, ainfo->ai_addrlen); |
ashleymills | 1:391ec57807fa | 96 | return ainfo->ai_addrlen; |
ashleymills | 1:391ec57807fa | 97 | default: |
ashleymills | 1:391ec57807fa | 98 | ; |
ashleymills | 1:391ec57807fa | 99 | } |
ashleymills | 1:391ec57807fa | 100 | } |
ashleymills | 1:391ec57807fa | 101 | |
ashleymills | 1:391ec57807fa | 102 | freeaddrinfo(res); |
ashleymills | 1:391ec57807fa | 103 | return -1; |
ashleymills | 1:391ec57807fa | 104 | } |
ashleymills | 1:391ec57807fa | 105 | |
ashleymills | 1:391ec57807fa | 106 | |
ashleymills | 1:391ec57807fa | 107 | sockaddr_in bindAddr,serverAddress; |
ashleymills | 1:391ec57807fa | 108 | bool connectToSocketUDP(char *ipAddress, int port, int *sockfd) { |
ashleymills | 1:391ec57807fa | 109 | *sockfd = -1; |
ashleymills | 1:391ec57807fa | 110 | // create the socket |
ashleymills | 1:391ec57807fa | 111 | if((*sockfd=socket(AF_INET,SOCK_DGRAM,0))<0) { |
ashleymills | 1:391ec57807fa | 112 | DBG("Error opening socket"); |
ashleymills | 1:391ec57807fa | 113 | return false; |
ashleymills | 1:391ec57807fa | 114 | } |
ashleymills | 1:391ec57807fa | 115 | socklen_t sockAddrInLen = sizeof(struct sockaddr_in); |
ashleymills | 1:391ec57807fa | 116 | |
ashleymills | 1:391ec57807fa | 117 | // bind socket |
ashleymills | 1:391ec57807fa | 118 | memset(&bindAddr, 0x00, sockAddrInLen); |
ashleymills | 1:391ec57807fa | 119 | bindAddr.sin_family = AF_INET; // IP family |
ashleymills | 1:391ec57807fa | 120 | bindAddr.sin_port = htons(port); |
ashleymills | 1:391ec57807fa | 121 | bindAddr.sin_addr.s_addr = IPADDR_ANY; // 32 bit IP representation |
ashleymills | 1:391ec57807fa | 122 | // call bind |
ashleymills | 1:391ec57807fa | 123 | if(bind(*sockfd,(const struct sockaddr *)&bindAddr,sockAddrInLen)!=0) { |
ashleymills | 1:391ec57807fa | 124 | DBG("Error binding socket"); |
ashleymills | 1:391ec57807fa | 125 | perror(NULL); |
ashleymills | 1:391ec57807fa | 126 | } |
ashleymills | 1:391ec57807fa | 127 | |
ashleymills | 1:391ec57807fa | 128 | INFO("UDP socket created and bound to: %s:%d",inet_ntoa(bindAddr.sin_addr),ntohs(bindAddr.sin_port)); |
ashleymills | 1:391ec57807fa | 129 | |
ashleymills | 1:391ec57807fa | 130 | // create the socket address |
ashleymills | 1:391ec57807fa | 131 | memset(&serverAddress, 0x00, sizeof(struct sockaddr_in)); |
ashleymills | 1:391ec57807fa | 132 | serverAddress.sin_addr.s_addr = inet_addr(ipAddress); |
ashleymills | 1:391ec57807fa | 133 | serverAddress.sin_family = AF_INET; |
ashleymills | 1:391ec57807fa | 134 | serverAddress.sin_port = htons(port); |
ashleymills | 1:391ec57807fa | 135 | |
ashleymills | 1:391ec57807fa | 136 | // do socket connect |
ashleymills | 1:391ec57807fa | 137 | //LOG("Connecting socket to %s:%d", inet_ntoa(serverAddress.sin_addr), ntohs(serverAddress.sin_port)); |
ashleymills | 1:391ec57807fa | 138 | if(connect(*sockfd, (const struct sockaddr *)&serverAddress, sizeof(serverAddress))<0) { |
ashleymills | 1:391ec57807fa | 139 | shutdown(*sockfd,SHUT_RDWR); |
ashleymills | 1:391ec57807fa | 140 | close(*sockfd); |
ashleymills | 1:391ec57807fa | 141 | DBG("Could not connect"); |
ashleymills | 1:391ec57807fa | 142 | return false; |
ashleymills | 1:391ec57807fa | 143 | } |
ashleymills | 1:391ec57807fa | 144 | return true; |
ashleymills | 1:391ec57807fa | 145 | } |
ashleymills | 1:391ec57807fa | 146 | |
ashleymills | 1:391ec57807fa | 147 | int read_from_peer(struct dtls_context_t *ctx, session_t *session, uint8 *data, size_t len) { |
ashleymills | 1:391ec57807fa | 148 | DBG("read_from_peer called"); |
ashleymills | 1:391ec57807fa | 149 | size_t i; |
ashleymills | 1:391ec57807fa | 150 | for (i = 0; i < len; i++) |
ashleymills | 1:391ec57807fa | 151 | printf("%c", data[i]); |
ashleymills | 1:391ec57807fa | 152 | return 0; |
ashleymills | 1:391ec57807fa | 153 | } |
ashleymills | 1:391ec57807fa | 154 | |
ashleymills | 1:391ec57807fa | 155 | int send_to_peer(struct dtls_context_t *ctx, session_t *session, uint8 *data, size_t len) { |
ashleymills | 1:391ec57807fa | 156 | DBG("send_to_peer called"); |
ashleymills | 1:391ec57807fa | 157 | int fd = *(int *)dtls_get_app_data(ctx); |
ashleymills | 1:391ec57807fa | 158 | return sendto(fd, data, len, MSG_DONTWAIT, |
ashleymills | 1:391ec57807fa | 159 | &session->addr.sa, session->size); |
ashleymills | 1:391ec57807fa | 160 | } |
ashleymills | 1:391ec57807fa | 161 | |
ashleymills | 1:391ec57807fa | 162 | |
ashleymills | 1:391ec57807fa | 163 | int |
ashleymills | 1:391ec57807fa | 164 | dtls_handle_read(struct dtls_context_t *ctx) { |
ashleymills | 1:391ec57807fa | 165 | DBG("dtls_handle_read called"); |
ashleymills | 1:391ec57807fa | 166 | int fd; |
ashleymills | 1:391ec57807fa | 167 | session_t session; |
ashleymills | 1:391ec57807fa | 168 | #define MAX_READ_BUF 512 |
ashleymills | 1:391ec57807fa | 169 | static uint8 buf[MAX_READ_BUF]; |
ashleymills | 1:391ec57807fa | 170 | int len; |
ashleymills | 1:391ec57807fa | 171 | |
ashleymills | 1:391ec57807fa | 172 | fd = *(int *)dtls_get_app_data(ctx); |
ashleymills | 1:391ec57807fa | 173 | /* |
ashleymills | 1:391ec57807fa | 174 | if(!fd) { |
ashleymills | 1:391ec57807fa | 175 | DBG("FD NULL"); |
ashleymills | 1:391ec57807fa | 176 | return -1; |
ashleymills | 1:391ec57807fa | 177 | }*/ |
ashleymills | 1:391ec57807fa | 178 | |
ashleymills | 1:391ec57807fa | 179 | memset(&session, 0x00, sizeof(session_t)); |
ashleymills | 1:391ec57807fa | 180 | DBG("BEFORE: "); |
ashleymills | 1:391ec57807fa | 181 | for(uint8_t i=0; i<sizeof(session_t); i++) { |
ashleymills | 1:391ec57807fa | 182 | DBGX("%x ",((uint8_t*)&session)[i]); |
ashleymills | 1:391ec57807fa | 183 | } |
ashleymills | 1:391ec57807fa | 184 | DBGX("\r\n"); |
ashleymills | 1:391ec57807fa | 185 | session.size = sizeof(sockaddr_in); |
ashleymills | 1:391ec57807fa | 186 | uint32_t bullshit = sizeof(sockaddr_in); |
ashleymills | 1:391ec57807fa | 187 | len = recvfrom(fd, buf, MAX_READ_BUF, 0, |
ashleymills | 1:391ec57807fa | 188 | &session.addr.sa, &bullshit); |
ashleymills | 1:391ec57807fa | 189 | |
ashleymills | 1:391ec57807fa | 190 | //((uint8_t*)&session)[4] = 0x00; |
ashleymills | 1:391ec57807fa | 191 | //session.addr.sin.sin_family = AF_INET; |
ashleymills | 1:391ec57807fa | 192 | DBG("AFTER: %d",bullshit); |
ashleymills | 1:391ec57807fa | 193 | for(uint8_t i=0; i<sizeof(session_t); i++) { |
ashleymills | 1:391ec57807fa | 194 | DBGX("%x ",((uint8_t*)&session)[i]); |
ashleymills | 1:391ec57807fa | 195 | } |
ashleymills | 1:391ec57807fa | 196 | DBGX("\r\n"); |
ashleymills | 1:391ec57807fa | 197 | short x = session.addr.sin.sin_family; |
ashleymills | 1:391ec57807fa | 198 | if(session.addr.sin.sin_family==AF_INET) { |
ashleymills | 1:391ec57807fa | 199 | DBG("AF_INET alright"); |
ashleymills | 1:391ec57807fa | 200 | } |
ashleymills | 1:391ec57807fa | 201 | DBG("%x %x",((uint8_t*)x)[0],((uint8_t*)x)[1]); |
ashleymills | 1:391ec57807fa | 202 | if (len < 0) { |
ashleymills | 1:391ec57807fa | 203 | DBG("Got nothing from read"); |
ashleymills | 1:391ec57807fa | 204 | perror("recvfrom"); |
ashleymills | 1:391ec57807fa | 205 | return -1; |
ashleymills | 1:391ec57807fa | 206 | } else { |
ashleymills | 1:391ec57807fa | 207 | #ifndef NDEBUG |
ashleymills | 1:391ec57807fa | 208 | unsigned char addrbuf[72]; |
ashleymills | 1:391ec57807fa | 209 | dsrv_print_addr(&session, addrbuf, sizeof(addrbuf)); |
ashleymills | 1:391ec57807fa | 210 | DBG("got %d bytes from %s\n", len, (char *)addrbuf); |
ashleymills | 1:391ec57807fa | 211 | dump((unsigned char *)&session, sizeof(session_t)); |
ashleymills | 1:391ec57807fa | 212 | DBGX("\r\n"); |
ashleymills | 1:391ec57807fa | 213 | dump(buf, len); |
ashleymills | 1:391ec57807fa | 214 | DBGX("\r\n"); |
ashleymills | 1:391ec57807fa | 215 | #endif |
ashleymills | 1:391ec57807fa | 216 | } |
ashleymills | 1:391ec57807fa | 217 | |
ashleymills | 1:391ec57807fa | 218 | return dtls_handle_message(ctx, &session, buf, len); |
ashleymills | 1:391ec57807fa | 219 | } |
ashleymills | 1:391ec57807fa | 220 | |
ashleymills | 1:391ec57807fa | 221 | static dtls_handler_t cb = { |
ashleymills | 1:391ec57807fa | 222 | .write = send_to_peer, |
ashleymills | 1:391ec57807fa | 223 | .read = read_from_peer, |
ashleymills | 1:391ec57807fa | 224 | .event = NULL, |
ashleymills | 1:391ec57807fa | 225 | .get_key = get_key |
ashleymills | 1:391ec57807fa | 226 | }; |
ashleymills | 1:391ec57807fa | 227 | |
ashleymills | 0:6ae42a2aff75 | 228 | int main() { |
ashleymills | 1:391ec57807fa | 229 | DBG_INIT(); |
ashleymills | 1:391ec57807fa | 230 | DBG_SET_SPEED(115200); |
ashleymills | 1:391ec57807fa | 231 | DBG_SET_NEWLINE("\r\n"); |
ashleymills | 1:391ec57807fa | 232 | |
ashleymills | 1:391ec57807fa | 233 | DBG("Tiny DTLS test"); |
ashleymills | 1:391ec57807fa | 234 | |
ashleymills | 1:391ec57807fa | 235 | // DTLS context struct |
ashleymills | 1:391ec57807fa | 236 | dtls_context_t *dtls_context = NULL; |
ashleymills | 1:391ec57807fa | 237 | int ret = 0; |
ashleymills | 1:391ec57807fa | 238 | fd_set rfds, wfds; |
ashleymills | 1:391ec57807fa | 239 | struct timeval timeout; |
ashleymills | 1:391ec57807fa | 240 | session_t dst; |
ashleymills | 1:391ec57807fa | 241 | |
ashleymills | 1:391ec57807fa | 242 | // structure for getting address of incoming packets |
ashleymills | 1:391ec57807fa | 243 | sockaddr_in fromAddr; |
ashleymills | 1:391ec57807fa | 244 | socklen_t fromAddrLen = sizeof(struct sockaddr_in); |
ashleymills | 1:391ec57807fa | 245 | memset(&fromAddr,0x00,fromAddrLen); |
ashleymills | 1:391ec57807fa | 246 | |
ashleymills | 1:391ec57807fa | 247 | // connect to cellular network |
ashleymills | 1:391ec57807fa | 248 | /* |
ashleymills | 1:391ec57807fa | 249 | VodafoneUSBModem modem; |
ashleymills | 1:391ec57807fa | 250 | modem.connect(APN,APN_USERNAME,APN_PASSWORD); |
ashleymills | 1:391ec57807fa | 251 | */ |
ashleymills | 1:391ec57807fa | 252 | EthernetInterface modem; |
ashleymills | 1:391ec57807fa | 253 | DBG("Connecting to network interface"); |
ashleymills | 1:391ec57807fa | 254 | modem.init(); |
ashleymills | 1:391ec57807fa | 255 | if(modem.connect(10000)) { |
ashleymills | 1:391ec57807fa | 256 | DBG("Error initialising ethernet interface"); |
ashleymills | 1:391ec57807fa | 257 | } |
ashleymills | 1:391ec57807fa | 258 | DBG("DONE."); |
ashleymills | 1:391ec57807fa | 259 | |
ashleymills | 1:391ec57807fa | 260 | dtls_init(); |
ashleymills | 1:391ec57807fa | 261 | dtls_set_log_level(LOG_DEBUG); |
ashleymills | 1:391ec57807fa | 262 | |
ashleymills | 1:391ec57807fa | 263 | // setup socket to remote server |
ashleymills | 1:391ec57807fa | 264 | int sockfd = NULL; |
ashleymills | 1:391ec57807fa | 265 | |
ashleymills | 1:391ec57807fa | 266 | |
ashleymills | 1:391ec57807fa | 267 | //if(!connectToSocketUDP("109.74.199.96", 5683, &sockfd)) { |
ashleymills | 1:391ec57807fa | 268 | if(!connectToSocketUDP("192.168.1.99", 4433, &sockfd)) { |
ashleymills | 1:391ec57807fa | 269 | DBG("Error connecting to socket"); |
ashleymills | 1:391ec57807fa | 270 | fail(1); |
ashleymills | 0:6ae42a2aff75 | 271 | } |
ashleymills | 1:391ec57807fa | 272 | DBG("\"Connected\" to UDP socket, sockfd: %d",sockfd); |
ashleymills | 1:391ec57807fa | 273 | /* |
ashleymills | 1:391ec57807fa | 274 | int on = 1; |
ashleymills | 1:391ec57807fa | 275 | if(setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on) ) < 0) { |
ashleymills | 1:391ec57807fa | 276 | dsrv_log(LOG_ALERT, "setsockopt SO_REUSEADDR: %s\n", strerror(errno)); |
ashleymills | 1:391ec57807fa | 277 | }*/ |
ashleymills | 1:391ec57807fa | 278 | |
ashleymills | 1:391ec57807fa | 279 | /* |
ashleymills | 1:391ec57807fa | 280 | memset(&dst, 0, sizeof(session_t)); |
ashleymills | 1:391ec57807fa | 281 | // resolve destination address where server should be sent |
ashleymills | 1:391ec57807fa | 282 | //int res = resolve_address("192.168.1.99", &dst.addr.sa); |
ashleymills | 1:391ec57807fa | 283 | int res = resolve_address("109.74.199.96", &dst.addr.sa); |
ashleymills | 1:391ec57807fa | 284 | if (res < 0) { |
ashleymills | 1:391ec57807fa | 285 | dsrv_log(LOG_EMERG, "failed to resolve address\n"); |
ashleymills | 1:391ec57807fa | 286 | fail(9); |
ashleymills | 1:391ec57807fa | 287 | } |
ashleymills | 1:391ec57807fa | 288 | dst.size = res; |
ashleymills | 1:391ec57807fa | 289 | |
ashleymills | 1:391ec57807fa | 290 | // use port number from command line when specified or the listen port, otherwise |
ashleymills | 1:391ec57807fa | 291 | dst.addr.sin.sin_port = htons(4433);//atoi(optind < argc ? argv[optind++] : port_str)); |
ashleymills | 1:391ec57807fa | 292 | |
ashleymills | 1:391ec57807fa | 293 | // init socket and set it to non-blocking |
ashleymills | 1:391ec57807fa | 294 | sockfd = socket(dst.addr.sa.sa_family, SOCK_DGRAM, 0); |
ashleymills | 1:391ec57807fa | 295 | if (sockfd < 0) { |
ashleymills | 1:391ec57807fa | 296 | dsrv_log(LOG_ALERT, "socket: %s\n", strerror(errno)); |
ashleymills | 1:391ec57807fa | 297 | return 0; |
ashleymills | 1:391ec57807fa | 298 | }*/ |
ashleymills | 1:391ec57807fa | 299 | |
ashleymills | 1:391ec57807fa | 300 | // tinydtls stuff |
ashleymills | 1:391ec57807fa | 301 | |
ashleymills | 1:391ec57807fa | 302 | // destination address is stored in a session type |
ashleymills | 1:391ec57807fa | 303 | |
ashleymills | 1:391ec57807fa | 304 | memset(&dst, 0x00, sizeof(session_t)); |
ashleymills | 1:391ec57807fa | 305 | dst.size = sizeof(sockaddr_in); |
ashleymills | 1:391ec57807fa | 306 | DBG("starting copy at offset: %d",(int)&dst.addr-(int)&dst); |
ashleymills | 1:391ec57807fa | 307 | serverAddress.sin_len = dst.size; |
ashleymills | 1:391ec57807fa | 308 | memcpy(&dst.addr, &serverAddress, dst.size); |
ashleymills | 1:391ec57807fa | 309 | |
ashleymills | 1:391ec57807fa | 310 | |
ashleymills | 1:391ec57807fa | 311 | //dst.addr.sin.sin_port = htons(4433); |
ashleymills | 1:391ec57807fa | 312 | |
ashleymills | 1:391ec57807fa | 313 | // dtls init must always be called for memory allocation |
ashleymills | 1:391ec57807fa | 314 | |
ashleymills | 1:391ec57807fa | 315 | // setup DTLS context |
ashleymills | 1:391ec57807fa | 316 | DBG("Creating DTLS context"); |
ashleymills | 1:391ec57807fa | 317 | dtls_context = dtls_new_context(&sockfd); |
ashleymills | 1:391ec57807fa | 318 | if(!dtls_context) { |
ashleymills | 1:391ec57807fa | 319 | DBG("Cannot create context"); |
ashleymills | 1:391ec57807fa | 320 | fail(3); |
ashleymills | 1:391ec57807fa | 321 | } |
ashleymills | 1:391ec57807fa | 322 | DBG("DTLS context created"); |
ashleymills | 1:391ec57807fa | 323 | |
ashleymills | 1:391ec57807fa | 324 | // forced to use this call back system |
ashleymills | 1:391ec57807fa | 325 | |
ashleymills | 1:391ec57807fa | 326 | dtls_set_handler(dtls_context, &cb); |
ashleymills | 1:391ec57807fa | 327 | |
ashleymills | 1:391ec57807fa | 328 | DBG("Issuing dtls_connect"); |
ashleymills | 1:391ec57807fa | 329 | ret = dtls_connect(dtls_context, &dst); |
ashleymills | 1:391ec57807fa | 330 | if(ret<0) { |
ashleymills | 1:391ec57807fa | 331 | DBG("Error in dtls_connect: %d",ret); |
ashleymills | 1:391ec57807fa | 332 | modem.disconnect(); |
ashleymills | 1:391ec57807fa | 333 | fail(4); |
ashleymills | 1:391ec57807fa | 334 | } |
ashleymills | 1:391ec57807fa | 335 | if(ret==0) { |
ashleymills | 1:391ec57807fa | 336 | DBG("Channel already exists"); |
ashleymills | 1:391ec57807fa | 337 | modem.disconnect(); |
ashleymills | 1:391ec57807fa | 338 | fail(5); |
ashleymills | 1:391ec57807fa | 339 | } |
ashleymills | 1:391ec57807fa | 340 | DBG("dtls_connect successfull"); |
ashleymills | 1:391ec57807fa | 341 | while (1) { |
ashleymills | 1:391ec57807fa | 342 | // setup file descriptor lists for select |
ashleymills | 1:391ec57807fa | 343 | FD_ZERO(&rfds); |
ashleymills | 1:391ec57807fa | 344 | FD_ZERO(&wfds); |
ashleymills | 1:391ec57807fa | 345 | //FD_SET(fileno(stdin), &rfds); |
ashleymills | 1:391ec57807fa | 346 | FD_SET(sockfd, &rfds); |
ashleymills | 1:391ec57807fa | 347 | // FD_SET(sockfd, &wfds); |
ashleymills | 1:391ec57807fa | 348 | |
ashleymills | 1:391ec57807fa | 349 | timeout.tv_sec = 5; |
ashleymills | 1:391ec57807fa | 350 | timeout.tv_usec = 0; |
ashleymills | 1:391ec57807fa | 351 | |
ashleymills | 1:391ec57807fa | 352 | int result = select(sockfd+1, &rfds, &wfds, 0, &timeout); |
ashleymills | 1:391ec57807fa | 353 | |
ashleymills | 1:391ec57807fa | 354 | if(result < 0) { // error |
ashleymills | 1:391ec57807fa | 355 | if (errno != EINTR) |
ashleymills | 1:391ec57807fa | 356 | perror("select"); |
ashleymills | 1:391ec57807fa | 357 | } else if (result == 0) { |
ashleymills | 1:391ec57807fa | 358 | // timeout |
ashleymills | 1:391ec57807fa | 359 | } else { |
ashleymills | 1:391ec57807fa | 360 | // OK |
ashleymills | 1:391ec57807fa | 361 | // check which file descriptor had an event |
ashleymills | 1:391ec57807fa | 362 | if(FD_ISSET(sockfd, &wfds)) { |
ashleymills | 1:391ec57807fa | 363 | // FIXME (from tinydtls) |
ashleymills | 1:391ec57807fa | 364 | } else if (FD_ISSET(sockfd, &rfds)) |
ashleymills | 1:391ec57807fa | 365 | if(dtls_handle_read(dtls_context)<0) { |
ashleymills | 1:391ec57807fa | 366 | modem.disconnect(); |
ashleymills | 1:391ec57807fa | 367 | fail(6); |
ashleymills | 1:391ec57807fa | 368 | } |
ashleymills | 1:391ec57807fa | 369 | } |
ashleymills | 1:391ec57807fa | 370 | //else if (FD_ISSET(fileno(stdin), &rfds)) |
ashleymills | 1:391ec57807fa | 371 | //handle_stdin(); |
ashleymills | 1:391ec57807fa | 372 | //} |
ashleymills | 1:391ec57807fa | 373 | |
ashleymills | 1:391ec57807fa | 374 | //if(len) { |
ashleymills | 1:391ec57807fa | 375 | // try_send(dtls_context, &dst); |
ashleymills | 1:391ec57807fa | 376 | //} |
ashleymills | 1:391ec57807fa | 377 | } |
ashleymills | 1:391ec57807fa | 378 | |
ashleymills | 0:6ae42a2aff75 | 379 | } |