diff --git a/net/local/local_sockif.c b/net/local/local_sockif.c index b27a41f86a..d7827a6943 100644 --- a/net/local/local_sockif.c +++ b/net/local/local_sockif.c @@ -882,6 +882,11 @@ static int local_ioctl(FAR struct socket *psock, int cmd, unsigned long arg) ret = -ENOTCONN; } break; + case FIOC_FILEPATH: + snprintf((FAR char *)(uintptr_t)arg, PATH_MAX, "local:[%s]", + conn->lc_path); + ret = OK; + break; case BIOC_FLUSH: ret = -EINVAL; break; diff --git a/net/tcp/tcp_ioctl.c b/net/tcp/tcp_ioctl.c index c53252dd26..3bf5905ce6 100644 --- a/net/tcp/tcp_ioctl.c +++ b/net/tcp/tcp_ioctl.c @@ -25,6 +25,7 @@ #include #include +#include #include #include #include @@ -37,6 +38,71 @@ #include "tcp/tcp.h" +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: tcp_path + * + * Description: + * This function generates tcp status as path. + * + * Parameters: + * conn The TCP connection of interest + * buf The buffer to get the path + * len The length of the buffer + * + ****************************************************************************/ + +static void tcp_path(FAR struct tcp_conn_s *conn, FAR char *buf, size_t len) +{ +#if defined(CONFIG_NET_IPv4) && defined(CONFIG_NET_IPv6) + uint8_t domain = conn->domain; +#elif defined(CONFIG_NET_IPv4) + const uint8_t domain = PF_INET; +#else + const uint8_t domain = PF_INET6; +#endif + char remote[INET6_ADDRSTRLEN]; + char local[INET6_ADDRSTRLEN]; + FAR void *laddr = net_ip_binding_laddr(&conn->u, domain); + FAR void *raddr = net_ip_binding_raddr(&conn->u, domain); + + snprintf(buf, len, "tcp:[" + "%s:%" PRIu16 "<->%s:%" PRIu16 +#if CONFIG_NET_SEND_BUFSIZE > 0 + ", tx %" PRIu32 "/%" PRId32 +#endif +#if CONFIG_NET_RECV_BUFSIZE > 0 + ", rx %u/%" PRId32 +# ifdef CONFIG_NET_TCP_OUT_OF_ORDER + " + ofo %d" +# endif +#endif + ", st %02" PRIx8 + ", flg %" PRIx8 + "]", + inet_ntop(domain, laddr, local, sizeof(local)), + ntohs(conn->lport), + inet_ntop(domain, raddr, remote, sizeof(remote)), + ntohs(conn->rport), +#if CONFIG_NET_SEND_BUFSIZE > 0 + tcp_wrbuffer_inqueue_size(conn), + conn->snd_bufs, +#endif +#if CONFIG_NET_RECV_BUFSIZE > 0 + (conn->readahead) ? conn->readahead->io_pktlen : 0, + conn->rcv_bufs, +# ifdef CONFIG_NET_TCP_OUT_OF_ORDER + tcp_ofoseg_bufsize(conn), +# endif +#endif + conn->tcpstateflags, + conn->sconn.s_flags + ); +} + /**************************************************************************** * Public Functions ****************************************************************************/ @@ -86,6 +152,10 @@ int tcp_ioctl(FAR struct tcp_conn_s *conn, int cmd, unsigned long arg) *(FAR int *)((uintptr_t)arg) = MIN_TCP_MSS; #endif break; + case FIOC_FILEPATH: + tcp_path(conn, (FAR char *)(uintptr_t)arg, PATH_MAX); + ret = OK; + break; default: ret = -ENOTTY; break; diff --git a/net/udp/udp_ioctl.c b/net/udp/udp_ioctl.c index 5b5fdc17e2..1262ef5245 100644 --- a/net/udp/udp_ioctl.c +++ b/net/udp/udp_ioctl.c @@ -25,6 +25,7 @@ #include #include +#include #include #include #include @@ -37,6 +38,63 @@ #include "udp/udp.h" +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: udp_path + * + * Description: + * This function generates udp status as path. + * + * Parameters: + * conn The UDP connection of interest + * buf The buffer to get the path + * len The length of the buffer + * + ****************************************************************************/ + +static void udp_path(FAR struct udp_conn_s *conn, FAR char *buf, size_t len) +{ +#if defined(CONFIG_NET_IPv4) && defined(CONFIG_NET_IPv6) + uint8_t domain = conn->domain; +#elif defined(CONFIG_NET_IPv4) + const uint8_t domain = PF_INET; +#else + const uint8_t domain = PF_INET6; +#endif + char remote[INET6_ADDRSTRLEN]; + char local[INET6_ADDRSTRLEN]; + FAR void *laddr = net_ip_binding_laddr(&conn->u, domain); + FAR void *raddr = net_ip_binding_raddr(&conn->u, domain); + + snprintf(buf, len, "udp:[" + "%s:%" PRIu16 "<->%s:%" PRIu16 +#if CONFIG_NET_SEND_BUFSIZE > 0 + ", tx %" PRIu32 "/%" PRId32 +#endif +#if CONFIG_NET_RECV_BUFSIZE > 0 + ", rx %u/%" PRId32 +#endif + ", flg %" PRIx8 + "]", + inet_ntop(domain, laddr, local, sizeof(local)), + ntohs(conn->lport), + inet_ntop(domain, raddr, remote, sizeof(remote)), + ntohs(conn->rport), +#if CONFIG_NET_SEND_BUFSIZE > 0 + udp_wrbuffer_inqueue_size(conn), + conn->sndbufs, +#endif +#if CONFIG_NET_RECV_BUFSIZE > 0 + (conn->readahead) ? conn->readahead->io_pktlen : 0, + conn->rcvbufs, +#endif + conn->sconn.s_flags + ); +} + /**************************************************************************** * Public Functions ****************************************************************************/ @@ -48,7 +106,7 @@ * This function performs udp specific ioctl() operations. * * Parameters: - * conn The TCP connection of interest + * conn The UDP connection of interest * cmd The ioctl command * arg The argument of the ioctl cmd * @@ -89,6 +147,10 @@ int udp_ioctl(FAR struct udp_conn_s *conn, int cmd, unsigned long arg) *(FAR int *)((uintptr_t)arg) = MIN_UDP_MSS; #endif break; + case FIOC_FILEPATH: + udp_path(conn, (FAR char *)(uintptr_t)arg, PATH_MAX); + ret = OK; + break; default: ret = -ENOTTY; break;