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.
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html