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! -- 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