/*
- * Copyright (c) 2008, 2009, 2010, 2011, 2012 Nicira Networks.
+ * Copyright (c) 2008, 2009, 2010, 2011, 2012 Nicira, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
#include <config.h>
#include "socket-util.h"
#include <arpa/inet.h>
+#include <assert.h>
#include <errno.h>
#include <fcntl.h>
#include <net/if.h>
}
}
+void
+xset_nonblocking(int fd)
+{
+ if (set_nonblocking(fd)) {
+ exit(EXIT_FAILURE);
+ }
+}
+
+static int
+set_dscp(int fd, uint8_t dscp)
+{
+ if (dscp > 63) {
+ return EINVAL;
+ }
+
+ dscp = dscp << 2;
+ if (setsockopt(fd, IPPROTO_IP, IP_TOS, &dscp, sizeof dscp)) {
+ return errno;
+ }
+
+ return 0;
+}
+
static bool
rlim_is_finite(rlim_t limit)
{
/* Creates a Unix domain socket in the given 'style' (either SOCK_DGRAM or
* SOCK_STREAM) that is bound to '*bind_path' (if 'bind_path' is non-null) and
* connected to '*connect_path' (if 'connect_path' is non-null). If 'nonblock'
- * is true, the socket is made non-blocking. If 'passcred' is true, the socket
- * is configured to receive SCM_CREDENTIALS control messages.
+ * is true, the socket is made non-blocking.
*
* Returns the socket's fd if successful, otherwise a negative errno value. */
int
-make_unix_socket(int style, bool nonblock, bool passcred OVS_UNUSED,
+make_unix_socket(int style, bool nonblock,
const char *bind_path, const char *connect_path)
{
int error;
}
}
-#ifdef SCM_CREDENTIALS
- if (passcred) {
- int enable = 1;
- if (setsockopt(fd, SOL_SOCKET, SO_PASSCRED, &enable, sizeof(enable))) {
- error = errno;
- goto error;
- }
- }
-#endif
-
return fd;
error:
* If 'sinp' is non-null, then on success the target address is stored into
* '*sinp'.
*
- * 'dscp' becomes the DSCP bits in the IP headers for the new connection. */
+ * 'dscp' becomes the DSCP bits in the IP headers for the new connection. It
+ * should be in the range [0, 63] and will automatically be shifted to the
+ * appropriately place in the IP tos field. */
int
inet_open_active(int style, const char *target, uint16_t default_port,
struct sockaddr_in *sinp, int *fdp, uint8_t dscp)
goto exit;
}
- /* The socket options set here ensure that the TOS bits are set during
- * the connection establishment. If set after connect(), the handshake
- * SYN frames will be sent with a TOS of 0. */
- if (setsockopt(fd, IPPROTO_IP, IP_TOS, &dscp, sizeof dscp)) {
- VLOG_ERR("%s: socket: %s", target, strerror(errno));
- error = errno;
+ /* The dscp bits must be configured before connect() to ensure that the TOS
+ * field is set during the connection establishment. If set after
+ * connect(), the handshake SYN frames will be sent with a TOS of 0. */
+ error = set_dscp(fd, dscp);
+ if (error) {
+ VLOG_ERR("%s: socket: %s", target, strerror(error));
goto exit;
}
* If 'sinp' is non-null, then on success the bound address is stored into
* '*sinp'.
*
- * 'dscp' becomes the DSCP bits in the IP headers for the new connection. */
+ * 'dscp' becomes the DSCP bits in the IP headers for the new connection. It
+ * should be in the range [0, 63] and will automatically be shifted to the
+ * appropriately place in the IP tos field. */
int
inet_open_passive(int style, const char *target, int default_port,
struct sockaddr_in *sinp, uint8_t dscp)
goto error;
}
- /* The socket options set here ensure that the TOS bits are set during
- * the connection establishment. If set after connect(), the handshake
- * SYN frames will be sent with a TOS of 0. */
- if (setsockopt(fd, IPPROTO_IP, IP_TOS, &dscp, sizeof dscp)) {
- VLOG_ERR("%s: socket: %s", target, strerror(errno));
- error = errno;
+ /* The dscp bits must be configured before connect() to ensure that the TOS
+ * field is set during the connection establishment. If set after
+ * connect(), the handshake SYN frames will be sent with a TOS of 0. */
+ error = set_dscp(fd, dscp);
+ if (error) {
+ VLOG_ERR("%s: socket: %s", target, strerror(error));
goto error;
}