|
|
@@ -57,6 +57,11 @@ static void udp_server_task(void *pvParameters)
|
|
|
}
|
|
|
ESP_LOGI(TAG, "Socket created");
|
|
|
|
|
|
+#if defined(CONFIG_LWIP_NETBUF_RECVINFO) && !defined(CONFIG_EXAMPLE_IPV6)
|
|
|
+ int enable = 1;
|
|
|
+ lwip_setsockopt(sock, IPPROTO_IP, IP_PKTINFO, &enable, sizeof(enable));
|
|
|
+#endif
|
|
|
+
|
|
|
#if defined(CONFIG_EXAMPLE_IPV4) && defined(CONFIG_EXAMPLE_IPV6)
|
|
|
if (addr_family == AF_INET6) {
|
|
|
// Note that by default IPV6 binds to both protocols, it is must be disabled
|
|
|
@@ -73,13 +78,33 @@ static void udp_server_task(void *pvParameters)
|
|
|
}
|
|
|
ESP_LOGI(TAG, "Socket bound, port %d", PORT);
|
|
|
|
|
|
- while (1) {
|
|
|
+ struct sockaddr_storage source_addr; // Large enough for both IPv4 or IPv6
|
|
|
+ socklen_t socklen = sizeof(source_addr);
|
|
|
+
|
|
|
+#if defined(CONFIG_LWIP_NETBUF_RECVINFO) && !defined(CONFIG_EXAMPLE_IPV6)
|
|
|
+ struct iovec iov;
|
|
|
+ struct msghdr msg;
|
|
|
+ struct cmsghdr *cmsgtmp;
|
|
|
+ u8_t cmsg_buf[CMSG_SPACE(sizeof(struct in_pktinfo))];
|
|
|
+
|
|
|
+ iov.iov_base = rx_buffer;
|
|
|
+ iov.iov_len = sizeof(rx_buffer);
|
|
|
+ msg.msg_control = cmsg_buf;
|
|
|
+ msg.msg_controllen = sizeof(cmsg_buf);
|
|
|
+ msg.msg_flags = 0;
|
|
|
+ msg.msg_iov = &iov;
|
|
|
+ msg.msg_iovlen = 1;
|
|
|
+ msg.msg_name = (struct sockaddr *)&source_addr;
|
|
|
+ msg.msg_namelen = socklen;
|
|
|
+#endif
|
|
|
|
|
|
+ while (1) {
|
|
|
ESP_LOGI(TAG, "Waiting for data");
|
|
|
- struct sockaddr_storage source_addr; // Large enough for both IPv4 or IPv6
|
|
|
- socklen_t socklen = sizeof(source_addr);
|
|
|
+#if defined(CONFIG_LWIP_NETBUF_RECVINFO) && !defined(CONFIG_EXAMPLE_IPV6)
|
|
|
+ int len = recvmsg(sock, &msg, 0);
|
|
|
+#else
|
|
|
int len = recvfrom(sock, rx_buffer, sizeof(rx_buffer) - 1, 0, (struct sockaddr *)&source_addr, &socklen);
|
|
|
-
|
|
|
+#endif
|
|
|
// Error occurred during receiving
|
|
|
if (len < 0) {
|
|
|
ESP_LOGE(TAG, "recvfrom failed: errno %d", errno);
|
|
|
@@ -90,6 +115,15 @@ static void udp_server_task(void *pvParameters)
|
|
|
// Get the sender's ip address as string
|
|
|
if (source_addr.ss_family == PF_INET) {
|
|
|
inet_ntoa_r(((struct sockaddr_in *)&source_addr)->sin_addr, addr_str, sizeof(addr_str) - 1);
|
|
|
+#if defined(CONFIG_LWIP_NETBUF_RECVINFO) && !defined(CONFIG_EXAMPLE_IPV6)
|
|
|
+ for ( cmsgtmp = CMSG_FIRSTHDR(&msg); cmsgtmp != NULL; cmsgtmp = CMSG_NXTHDR(&msg, cmsgtmp) ) {
|
|
|
+ if ( cmsgtmp->cmsg_level == IPPROTO_IP && cmsgtmp->cmsg_type == IP_PKTINFO ) {
|
|
|
+ struct in_pktinfo *pktinfo;
|
|
|
+ pktinfo = (struct in_pktinfo*)CMSG_DATA(cmsgtmp);
|
|
|
+ ESP_LOGI(TAG, "dest ip: %s\n", inet_ntoa(pktinfo->ipi_addr));
|
|
|
+ }
|
|
|
+ }
|
|
|
+#endif
|
|
|
} else if (source_addr.ss_family == PF_INET6) {
|
|
|
inet6_ntoa_r(((struct sockaddr_in6 *)&source_addr)->sin6_addr, addr_str, sizeof(addr_str) - 1);
|
|
|
}
|