On Thu, 2015-07-09 at 16:13 +0200, 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)); > }
It is indeed a raw socket on proto TCP. Note sure if commit 8250bc9ff4e55a3ef397ed8c7612f1392d164295 was really good... diff --git a/misc/ss.c b/misc/ss.c index 03f92fa69270..dc61aaa79bca 100644 --- a/misc/ss.c +++ b/misc/ss.c @@ -2416,7 +2416,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, atoi(line)); if (show_details && opt[0]) printf(" opt:\"%s\"", opt); -> # ./ss -an | grep 127.0.0.1 tcp UNCONN 213486 0 127.0.0.1:6 *:* If I checkout iproute2 tree to db08bdb816d337102c5486744008db9c9faa43bf (before buggy commit) we indeed had this result : # ./ss -an | grep 127.0.0.1 raw UNCONN 213486 0 127.0.0.1:6 *:* -- 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