/* * Starts a blocking and never-returning loop dispatching CoAP requests. * * When using gnrc, make sure the calling thread has an initialized msg queue. */ void microcoap_server_loop(void) { static const sock_udp_ep_t local = { .family = AF_INET6, .port = COAP_SERVER_PORT }; sock_udp_ep_t remote; sock_udp_t sock; int rc = sock_udp_create(&sock, &local, NULL, 0); while (1) { DEBUG("Waiting for incoming UDP packet...\n"); rc = sock_udp_recv(&sock, (char *)_udp_buf, sizeof(_udp_buf), SOCK_NO_TIMEOUT, &remote); if (rc < 0) { DEBUG("Error in sock_udp_recv(). rc=%u\n", rc); continue; } size_t n = rc; coap_packet_t pkt; DEBUG("Received packet: "); coap_dump(_udp_buf, n, true); DEBUG("\n"); /* parse UDP packet to CoAP */ if (0 != (rc = coap_parse(&pkt, _udp_buf, n))) { DEBUG("Bad packet rc=%d\n", rc); } else { coap_packet_t rsppkt; DEBUG("content:\n"); coap_dumpPacket(&pkt); /* handle CoAP request */ coap_handle_req(&scratch_buf, &pkt, &rsppkt); /* build reply */ size_t rsplen = sizeof(_udp_buf); if ((rc = coap_build(_udp_buf, &rsplen, &rsppkt)) != 0) { DEBUG("coap_build failed rc=%d\n", rc); } else { DEBUG("Sending packet: "); coap_dump(_udp_buf, rsplen, true); DEBUG("\n"); DEBUG("content:\n"); coap_dumpPacket(&rsppkt); /* send reply via UDP */ rc = sock_udp_send(&sock, _udp_buf, rsplen, &remote); if (rc < 0) { DEBUG("Error sending CoAP reply via udp; %u\n", rc); } } } } }
void coap_dumpPacket(coap_packet_t *pkt) { coap_dumpHeader(&pkt->hdr); coap_dumpOptions(pkt->opts, pkt->numopts); printf("Payload: "); coap_dump(pkt->payload.p, pkt->payload.len, true); printf("\n"); }
void coap_dumpOptions(coap_option_t *opts, size_t numopt) { size_t i; printf(" Options:\n"); for (i=0;i<numopt;i++) { printf(" 0x%02X [ ", opts[i].num); coap_dump(opts[i].buf.p, opts[i].buf.len, true); printf(" ]\n"); } }
void ICACHE_FLASH_ATTR coap_dumpOptions(coap_option_t *opts, size_t numopt) { size_t i; os_printf(" Options:\n"); for (i=0;i<numopt;i++) { os_printf(" 0x%02X [ ", opts[i].num); coap_dump(opts[i].buf.p, opts[i].buf.len, true); os_printf(" ]\n"); } }
int main(void){ //READ IN HOW MANY TAP DEVICE TO CREATE (MAX 9999) //File locker struct flock fl; pid_t tid = syscall(SYS_gettid); fl.l_type = F_RDLCK; /* F_RDLCK, F_WRLCK, F_UNLCK */ fl.l_whence = SEEK_SET; /* SEEK_SET, SEEK_CUR, SEEK_END */ fl.l_start = 0; /* Offset from l_whence */ fl.l_len = 0; /* length, 0 = to EOF */ fl.l_pid = tid; /* our PID */ //READ THE SIZE OF TAP_CONTROL_SIZE FILE char ffile_size[2]; int file_size,tap_num; int fp = open("./coap/tap_control_size.txt", O_RDONLY); fcntl(fp, F_SETLKW, &fl); //Locks the file for reading if(0 > fp) { printf("\n tap_control_size:open() Error!!!\n"); return 1; } read(fp,ffile_size,2); //CLOSE FILE if(0 > close(fp)) { printf("\n tap_control_size:close() Error!!!\n"); return 1; } fl.l_type = F_UNLCK; /* tell it to unlock the region */ fcntl(fp, F_SETLK, &fl); /* set the region to unlocked */ file_size = (int)(ffile_size[0] - '0'); //OPEN FILE TO DETERMINE WHICH CLIENT IS THIS ONE char file_num[file_size]; fl.l_type = F_RDLCK; fp = open("./coap/tap_control.txt", O_RDONLY); fcntl(fp, F_SETLKW, &fl); //Locks the file for reading if(0 > fp) { printf("\n tap_control:open() Error!!!\n"); return 1; } read(fp,file_num,file_size); //CLOSE FILE if(0 > close(fp)) { printf("\n tap_control:close() Error!!!\n"); return 1; } fl.l_type = F_UNLCK; /* tell it to unlock the region */ fcntl(fp, F_SETLK, &fl); /* set the region to unlocked */ //CONVERT IT TO INT tap_num=0; if(file_size == 4){ tap_num += (int)(file_num[0] - '0')*1000; tap_num += (int)(file_num[1] - '0')*100; tap_num += (int)(file_num[2] - '0')*10; tap_num += (int)(file_num[3] - '0'); } else if(file_size == 3){ tap_num += (int)(file_num[0] - '0')*100; tap_num += (int)(file_num[1] - '0')*10; tap_num += (int)(file_num[2] - '0'); } else if(file_size == 2){ tap_num += (int)(file_num[0] - '0')*10; tap_num += (int)(file_num[1] - '0'); } else tap_num += (int)(file_num[0] - '0'); //CREATE TAP DEVICE puts("Starting the RIOT\n"); int fd; char name[3+file_size]; strcpy(name,"tap"); int i; for(i=0;i<file_size;i++) name[3+i]=file_num[i]; name[3+file_size]=0; printf("TAP DEIVCE: %s\n",name); struct sockaddr_in6 servaddr; // struct ifreq ifr;// struct sockaddr_in6 cliaddr; uint8_t buf[4096]; uint8_t scratch_raw[4096]; coap_rw_buffer_t scratch_buf = {scratch_raw, sizeof(scratch_raw)}; fd = socket(AF_INET6,SOCK_DGRAM,0);//Socket file descriptor init bzero(&servaddr,sizeof(servaddr)); servaddr.sin6_family = AF_INET6;//inet family servaddr.sin6_flowinfo = 0;//?? int ip8_1=0,ip8_2=0; servaddr.sin6_addr.s6_addr[0] = (uint8_t)0x30;//IPv6 Address 1 servaddr.sin6_addr.s6_addr[1] = (uint8_t)0x00; servaddr.sin6_addr.s6_addr[2] = (uint8_t)0x00;//IPv6 Address 2 servaddr.sin6_addr.s6_addr[3] = (uint8_t)0x00; servaddr.sin6_addr.s6_addr[4] = (uint8_t)0x00;//IPv6 Address 3 servaddr.sin6_addr.s6_addr[5] = (uint8_t)0x00; servaddr.sin6_addr.s6_addr[6] = (uint8_t)0x00;//IPv6 Address 4 servaddr.sin6_addr.s6_addr[7] = (uint8_t)0x00; servaddr.sin6_addr.s6_addr[8] = (uint8_t)0x11;//IPv6 Address 5 servaddr.sin6_addr.s6_addr[9] = (uint8_t)0x11; servaddr.sin6_addr.s6_addr[10] = (uint8_t)0x22;//IPv6 Address 6 servaddr.sin6_addr.s6_addr[11] = (uint8_t)0x22; servaddr.sin6_addr.s6_addr[12] = (uint8_t)0x33;//IPv6 Address 7 servaddr.sin6_addr.s6_addr[13] = (uint8_t)0x33; if(file_size == 4){ ip8_1 += (int)(file_num[0] - '0')*16; ip8_1 += (int)(file_num[1] - '0'); ip8_2 += (int)(file_num[2] - '0')*16; ip8_2 += (int)(file_num[3] - '0'); } else if(file_size == 3){ ip8_1 += (int)(file_num[0] - '0'); ip8_2 += (int)(file_num[1] - '0')*16; ip8_2 += (int)(file_num[2] - '0'); } else if(file_size == 2){ ip8_2 += (int)(file_num[0] - '0')*16; ip8_2 += (int)(file_num[1] - '0'); } else ip8_2 += (int)(file_num[0] - '0'); servaddr.sin6_addr.s6_addr[14] = (uint8_t)ip8_1;//IPv6 Address 8 //TODO servaddr.sin6_addr.s6_addr[15] = (uint8_t)ip8_2; servaddr.sin6_port = htons(PORT); //PORT (5683) bind(fd,(struct sockaddr *)&servaddr, sizeof(servaddr)); endpoint_setup(); while(1) { int n, rc; socklen_t len = sizeof(cliaddr); coap_packet_t pkt; n = recvfrom(fd, buf, sizeof(buf), 0, (struct sockaddr *)&cliaddr, &len); //#ifdef DEBUG printf("Received: "); coap_dump(buf, n, true); printf("\n"); //#endif if (0 != (rc = coap_parse(&pkt, buf, n))) printf("Bad packet rc=%d\n", rc); else { size_t rsplen = sizeof(buf); coap_packet_t rsppkt; #ifdef DEBUG coap_dumpPacket(&pkt); #endif coap_handle_req(&scratch_buf, &pkt, &rsppkt); if (0 != (rc = coap_build(buf, &rsplen, &rsppkt))) printf("coap_build failed rc=%d\n", rc); else { #ifdef DEBUG printf("Sending: "); coap_dump(buf, rsplen, true); printf("\n"); #endif #ifdef DEBUG coap_dumpPacket(&rsppkt); #endif sendto(fd, buf, rsplen, 0, (struct sockaddr *)&cliaddr, sizeof(cliaddr)); } } } }
int main(void) { int fd; #ifdef IPV6 struct sockaddr_in6 servaddr, cliaddr; #else /* IPV6 */ struct sockaddr_in servaddr, cliaddr; #endif /* IPV6 */ uint8_t buf[1024]; #ifdef IPV6 fd = socket(AF_INET6,SOCK_DGRAM,0); #else /* IPV6 */ fd = socket(AF_INET,SOCK_DGRAM,0); #endif /* IPV6 */ bzero(&servaddr,sizeof(servaddr)); #ifdef IPV6 servaddr.sin6_family = AF_INET6; servaddr.sin6_addr = in6addr_any; servaddr.sin6_port = htons(COAP_DEFAULT_PORT); #else /* IPV6 */ servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(COAP_DEFAULT_PORT); #endif /* IPV6 */ bind(fd,(struct sockaddr *)&servaddr, sizeof(servaddr)); resource_setup(resources); while(1) { int n, rc; socklen_t len = sizeof(cliaddr); coap_packet_t pkt; n = recvfrom(fd, buf, sizeof(buf), 0, (struct sockaddr *)&cliaddr, &len); #ifdef YACOAP_DEBUG printf("Received: "); coap_dump(buf, n, true); printf("\n"); #endif if ((rc = coap_parse(buf, n, &pkt)) > COAP_ERR) printf("Bad packet rc=%d\n", rc); else { size_t buflen = sizeof(buf); coap_packet_t rsppkt; #ifdef YACOAP_DEBUG coap_dump_packet(&pkt); #endif coap_handle_request(resources, &pkt, &rsppkt); if ((rc = coap_build(&rsppkt, buf, &buflen)) > COAP_ERR) printf("coap_build failed rc=%d\n", rc); else { #ifdef YACOAP_DEBUG printf("Sending: "); coap_dump(buf, buflen, true); printf("\n"); #endif #ifdef YACOAP_DEBUG coap_dump_packet(&rsppkt); #endif sendto(fd, buf, buflen, 0, (struct sockaddr *)&cliaddr, sizeof(cliaddr)); } } } }
int main(int argc, char **argv) { (void)argc; (void)argv; puts("Starting the RIOT\n"); int fd,tap_fd; const char *clonedev = "/dev/net/tun"; char *name = "tap0"; struct sockaddr_in6 servaddr, cliaddr; struct ifreq ifr; uint8_t buf[4096]; uint8_t scratch_raw[4096]; coap_rw_buffer_t scratch_buf = {scratch_raw, sizeof(scratch_raw)}; fd = socket(AF_INET6,SOCK_DGRAM,0);//Socket file descriptor init bzero(&servaddr,sizeof(servaddr)); servaddr.sin6_family = AF_INET6;//inet family servaddr.sin6_flowinfo = 0;//?? servaddr.sin6_addr.s6_addr[0] = (uint8_t)0x30;//IPv6 Address 1 servaddr.sin6_addr.s6_addr[1] = (uint8_t)0x00; servaddr.sin6_addr.s6_addr[2] = (uint8_t)0x00;//IPv6 Address 2 servaddr.sin6_addr.s6_addr[3] = (uint8_t)0x00; servaddr.sin6_addr.s6_addr[4] = (uint8_t)0x00;//IPv6 Address 3 servaddr.sin6_addr.s6_addr[5] = (uint8_t)0x00; servaddr.sin6_addr.s6_addr[6] = (uint8_t)0x00;//IPv6 Address 4 servaddr.sin6_addr.s6_addr[7] = (uint8_t)0x00; servaddr.sin6_addr.s6_addr[8] = (uint8_t)0x11;//IPv6 Address 5 servaddr.sin6_addr.s6_addr[9] = (uint8_t)0x11; servaddr.sin6_addr.s6_addr[10] = (uint8_t)0x22;//IPv6 Address 6 servaddr.sin6_addr.s6_addr[11] = (uint8_t)0x22; servaddr.sin6_addr.s6_addr[12] = (uint8_t)0x33;//IPv6 Address 7 servaddr.sin6_addr.s6_addr[13] = (uint8_t)0x33; servaddr.sin6_addr.s6_addr[14] = (uint8_t)0x00;//IPv6 Address 8 servaddr.sin6_addr.s6_addr[15] = (uint8_t)0x01; servaddr.sin6_port = htons(PORT); //PORT (5683) bind(fd,(struct sockaddr *)&servaddr, sizeof(servaddr)); //Set TAP device up, give it local ipv6 address /* implicitly create the tap interface */ if ((tap_fd = real_open(clonedev , O_RDWR)) == -1) { err(EXIT_FAILURE, "open(%s)", clonedev); } memset(&ifr, 0, sizeof(ifr)); ifr.ifr_flags = IFF_TAP | IFF_NO_PI; strncpy(ifr.ifr_name, name, IFNAMSIZ); if (real_ioctl(tap_fd, TUNSETIFF, (void *)&ifr) == -1) { _native_in_syscall++; warn("ioctl TUNSETIFF"); warnx("probably the tap interface (%s) does not exist or is already in use", name); real_exit(EXIT_FAILURE); } //TODO Add Global IP endpoint_setup(); while(1) { int n, rc; socklen_t len = sizeof(cliaddr); coap_packet_t pkt; n = recvfrom(fd, buf, sizeof(buf), 0, (struct sockaddr *)&cliaddr, &len); //#ifdef DEBUG printf("Received: "); coap_dump(buf, n, true); printf("\n"); //#endif if (0 != (rc = coap_parse(&pkt, buf, n))) printf("Bad packet rc=%d\n", rc); else { size_t rsplen = sizeof(buf); coap_packet_t rsppkt; #ifdef DEBUG coap_dumpPacket(&pkt); #endif coap_handle_req(&scratch_buf, &pkt, &rsppkt); if (0 != (rc = coap_build(buf, &rsplen, &rsppkt))) printf("coap_build failed rc=%d\n", rc); else { #ifdef DEBUG printf("Sending: "); coap_dump(buf, rsplen, true); printf("\n"); #endif #ifdef DEBUG coap_dumpPacket(&rsppkt); #endif sendto(fd, buf, rsplen, 0, (struct sockaddr *)&cliaddr, sizeof(cliaddr)); } } } }