X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fstream-tcp.c;h=55e581878ab81f3e87f665520fff174e6ffbf5d4;hb=e731d71bf47b8370e4bfa87827113eedd20b7398;hp=b3237d6183c56fb56a390dd5a3b8b833b9c013db;hpb=978188b242c8900f2a598f8d5bb233d9155ebf36;p=sliver-openvswitch.git diff --git a/lib/stream-tcp.c b/lib/stream-tcp.c index b3237d618..55e581878 100644 --- a/lib/stream-tcp.c +++ b/lib/stream-tcp.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, 2010, 2012, 2013 Nicira, Inc. + * Copyright (c) 2008, 2009, 2010, 2012, 2013, 2014 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,10 +21,12 @@ #include #include #include +#include #include #include #include #include +#include "dynamic-string.h" #include "packets.h" #include "socket-util.h" #include "util.h" @@ -40,13 +42,13 @@ static int new_tcp_stream(const char *name, int fd, int connect_status, struct stream **streamp) { - struct sockaddr_in local; + struct sockaddr_storage local; socklen_t local_len = sizeof local; int on = 1; int retval; /* Get the local IP and port information */ - retval = getsockname(fd, (struct sockaddr *)&local, &local_len); + retval = getsockname(fd, (struct sockaddr *) &local, &local_len); if (retval) { memset(&local, 0, sizeof local); } @@ -90,47 +92,47 @@ const struct stream_class tcp_stream_class = { /* Passive TCP. */ -static int ptcp_accept(int fd, const struct sockaddr *sa, size_t sa_len, - struct stream **streamp); +static int ptcp_accept(int fd, const struct sockaddr_storage *, + size_t, struct stream **streamp); static int ptcp_open(const char *name OVS_UNUSED, char *suffix, struct pstream **pstreamp, uint8_t dscp) { - struct sockaddr_in sin; - char bound_name[128]; + char bound_name[SS_NTOP_BUFSIZE + 16]; + char addrbuf[SS_NTOP_BUFSIZE]; + struct sockaddr_storage ss; + uint16_t port; int error; int fd; - fd = inet_open_passive(SOCK_STREAM, suffix, -1, &sin, dscp); + fd = inet_open_passive(SOCK_STREAM, suffix, -1, &ss, dscp); if (fd < 0) { return -fd; } - sprintf(bound_name, "ptcp:%"PRIu16":"IP_FMT, - ntohs(sin.sin_port), IP_ARGS(sin.sin_addr.s_addr)); + port = ss_get_port(&ss); + snprintf(bound_name, sizeof bound_name, "ptcp:%"PRIu16":%s", + port, ss_format_address(&ss, addrbuf, sizeof addrbuf)); + error = new_fd_pstream(bound_name, fd, ptcp_accept, set_dscp, NULL, pstreamp); if (!error) { - pstream_set_bound_port(*pstreamp, sin.sin_port); + pstream_set_bound_port(*pstreamp, htons(port)); } return error; } static int -ptcp_accept(int fd, const struct sockaddr *sa, size_t sa_len, - struct stream **streamp) +ptcp_accept(int fd, const struct sockaddr_storage *ss, + size_t ss_len OVS_UNUSED, struct stream **streamp) { - const struct sockaddr_in *sin = ALIGNED_CAST(const struct sockaddr_in *, - sa); - char name[128]; + char name[SS_NTOP_BUFSIZE + 16]; + char addrbuf[SS_NTOP_BUFSIZE]; - if (sa_len == sizeof(struct sockaddr_in) && sin->sin_family == AF_INET) { - sprintf(name, "tcp:"IP_FMT, IP_ARGS(sin->sin_addr.s_addr)); - sprintf(strchr(name, '\0'), ":%"PRIu16, ntohs(sin->sin_port)); - } else { - strcpy(name, "tcp"); - } + snprintf(name, sizeof name, "tcp:%s:%"PRIu16, + ss_format_address(ss, addrbuf, sizeof addrbuf), + ss_get_port(ss)); return new_tcp_stream(name, fd, 0, streamp); }