On Fri, Jul 10, 2015 at 09:09:46AM +0200, Miha Marolt wrote: > > > On 07/09/2015 05:15 PM, Vadim Kochan wrote: > >On Thu, Jul 09, 2015 at 05:09:27PM +0200, Miha Marolt wrote: > >> > >>On 07/09/2015 04:57 PM, Nikolay Aleksandrov wrote: > >>>On 07/09/2015 04:55 PM, Vadim Kochan wrote: > >>>>On Thu, Jul 09, 2015 at 04:50:06PM +0200, Nikolay Aleksandrov wrote: > >>>>>On 07/09/2015 04:13 PM, Miha Marolt wrote: > >>>>>>Hi! > >>>>>> > >>>>>>I hope this is the right place to reports bugs. I apologize if it isn't. > >>>>>> > >>>>>>I have written a C program (see below for source code) that opens a raw > >>>>>>socket on CentOS 7.1 Linux and binds it to some address (it doesn't use > >>>>>>the port that I supplied, but that is not the point here). The > >>>>>>"netstat" program correctly recognizes the socket as "raw", while "ss" > >>>>>>program says it is "udp". Here are the relevant lines from the ss and > >>>>>>netstat commands: > >>>>>> > >>>>>>$ netstat -an > >>>>>>raw 0 0 127.0.0.1:6 0.0.0.0:* 7 > >>>>>> > >>>>>>$ ./ss -an > >>>>>>udp UNCONN 21569 0 127.0.0.1:6 *:* > >>>>>> > >>>>>>Here is the version information > >>>>>> > >>>>>>$ netstat --version # From CentOS 7.1. > >>>>>>net-tools 2.10-alpha > >>>>>> > >>>>>>$ ./ss --version # Built from git. > >>>>>>ss utility, iproute2-ss150626 > >>>>>> > >>>>>> > >>>>>>C source follows. If you store it in "main.c", then compile it with "$ > >>>>>>gcc main.c -o main" and then run it by executing "$ sudo ./main". > >>>>>> > >>>>>>#include <arpa/inet.h> > >>>>>>#include <assert.h> > >>>>>>#include <sys/socket.h> > >>>>>>#include <stdio.h> > >>>>>>#include <unistd.h> > >>>>>> > >>>>>> > >>>>>>int main(void) > >>>>>>{ > >>>>>> // Create a raw socket. > >>>>>> int sock = socket(AF_INET, SOCK_RAW, IPPROTO_TCP); > >>>>>> if (sock == -1) { perror(NULL); goto exc_cleanup; } > >>>>>> > >>>>>> // Bind socket to an address. > >>>>>> struct sockaddr_in addr; > >>>>>> addr.sin_family = AF_INET; > >>>>>> inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr); > >>>>>> addr.sin_port = htons(27183); > >>>>>> > >>>>>> int rc = bind(sock, (struct sockaddr*)&addr, sizeof(addr)); > >>>>>> if (rc != 0) { perror(NULL); goto exc_cleanup; } > >>>>>> > >>>>>> // Wait until user presses <ENTER>. > >>>>>> printf("\nPress <ENTER> to quit the program.\n"); > >>>>>> getchar(); > >>>>>> > >>>>>>exc_cleanup: > >>>>>> assert(!close(sock)); > >>>>>>} > >>>>>> > >>>>>> > >>>>>>Best regards, > >>>>>>Miha > >>>>>Hi, > >>>>>I think this was changed by commit: > >>>>>8250bc9ff4e5 ("ss: Unify inet sockets output") > >>>>>Because dgram_show_line() is used for both UDP and RAW sockets > >>>>>IPPROTO_UDP is used for both now and proto_name() returns "udp". > >>>>>CCed the patch author and attached a possible solution. > >>>>> > >>>>>Cheers, > >>>>> Nik > >>>>>diff --git a/misc/ss.c b/misc/ss.c > >>>>>index 870cad185341..4de77e92c319 100644 > >>>>>--- a/misc/ss.c > >>>>>+++ b/misc/ss.c > >>>>>@@ -1554,6 +1554,8 @@ out: > >>>>> static char *proto_name(int protocol) > >>>>> { > >>>>> switch (protocol) { > >>>>>+ case IPPROTO_RAW: > >>>>>+ return "raw"; > >>>>> case IPPROTO_UDP: > >>>>> return "udp"; > >>>>> case IPPROTO_TCP: > >>>>>@@ -2398,7 +2400,7 @@ static int dgram_show_line(char *line, const > >>>>>struct filter *f, int family) > >>>>> if (n < 9) > >>>>> opt[0] = 0; > >>>>>- inet_stats_print(&s, IPPROTO_UDP); > >>>>>+ inet_stats_print(&s, dg_proto == UDP_PROTO ? IPPROTO_UDP : > >>>>>IPPROTO_RAW); > >>>>> if (show_details && opt[0]) > >>>>> printf(" opt:\"%s\"", opt); > >>>>Yeah, it fixed the issue, just tested the fix. > >>>> > >>>Great, I'll submit it in a minute. > >>>Thanks for testing! > >>Thank you very much for the fast fix! > >> > >>I've found another bug: command "$ ss" doesn't display only tcp sockets as > >>the man page ss(8) says (file man/man8/ss.8 in iproute2 git repo). It also > >>displays e.g. unix sockets. The man page says "When no option is used ss > >>displays a list of open non-listening TCP sockets that have established > >>connection.". > >> > >> > >>Regards, > >>Miha > >That seems OK, I see that unix stream sockets are displayed which are > >connection oriented, and UDP can also have established state. >
> According to the man page, **only** TCP sockets should be listed by "$ ss". > In reality, also Unix and UDP sockets are listed, so there is a discrepancy > between what man page says and what actually happens. Yes, you are right man page says so, but seems such behaviour is for a long time and may be it is better to change man page rather than change the default behaviour. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html