pstream: Add set_dscp method.
authorIsaku Yamahata <yamahata@valinux.co.jp>
Thu, 27 Sep 2012 02:18:16 +0000 (11:18 +0900)
committerBen Pfaff <blp@nicira.com>
Thu, 27 Sep 2012 04:24:19 +0000 (21:24 -0700)
Introduce set_dscp method to pstream.
This will be used by dynamic dscp change of listening socket.

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
Signed-off-by: Ben Pfaff <blp@nicira.com>
lib/stream-fd.c
lib/stream-fd.h
lib/stream-provider.h
lib/stream-ssl.c
lib/stream-tcp.c
lib/stream-unix.c
lib/stream.c
lib/stream.h

index 6b782ec295c55ffce636721c219d2a299c4b7844..f7e1234a00ceac3ef13edfb3b1bd95e06da1505f 100644 (file)
@@ -169,6 +169,7 @@ struct fd_pstream
     int fd;
     int (*accept_cb)(int fd, const struct sockaddr *, size_t sa_len,
                      struct stream **);
+    int (*set_dscp_cb)(int fd, uint8_t dscp);
     char *unlink_path;
 };
 
@@ -199,12 +200,14 @@ int
 new_fd_pstream(const char *name, int fd,
                int (*accept_cb)(int fd, const struct sockaddr *sa,
                                 size_t sa_len, struct stream **streamp),
+               int (*set_dscp_cb)(int fd, uint8_t dscp),
                char *unlink_path, struct pstream **pstreamp)
 {
     struct fd_pstream *ps = xmalloc(sizeof *ps);
     pstream_init(&ps->pstream, &fd_pstream_class, name);
     ps->fd = fd;
     ps->accept_cb = accept_cb;
+    ps->set_dscp_cb = set_dscp_cb;
     ps->unlink_path = unlink_path;
     *pstreamp = &ps->pstream;
     return 0;
@@ -254,13 +257,24 @@ pfd_wait(struct pstream *pstream)
     poll_fd_wait(ps->fd, POLLIN);
 }
 
+static int
+pfd_set_dscp(struct pstream *pstream, uint8_t dscp)
+{
+    struct fd_pstream *ps = fd_pstream_cast(pstream);
+    if (ps->set_dscp_cb) {
+        return ps->set_dscp_cb(ps->fd, dscp);
+    }
+    return 0;
+}
+
 static struct pstream_class fd_pstream_class = {
     "pstream",
     false,
     NULL,
     pfd_close,
     pfd_accept,
-    pfd_wait
+    pfd_wait,
+    pfd_set_dscp,
 };
 \f
 /* Helper functions. */
index 8026953816b5cfb66eda869b581a96fc019fab90..8b8b48f343b3ef7f2cf6334440038f7edd1d8a0f 100644 (file)
@@ -30,6 +30,7 @@ int new_fd_stream(const char *name, int fd, int connect_status,
 int new_fd_pstream(const char *name, int fd,
                    int (*accept_cb)(int fd, const struct sockaddr *,
                                     size_t sa_len, struct stream **),
+                   int (*set_dscp_cb)(int fd, uint8_t dscp),
                    char *unlink_path,
                    struct pstream **pstreamp);
 
index 9e91d61513223dac194734aa6b92c9e57d14fa6e..b39dcf01788785d7692a72175a3f65d46eeb3a61 100644 (file)
@@ -190,6 +190,9 @@ struct pstream_class {
     /* Arranges for the poll loop to wake up when a connection is ready to be
      * accepted on 'pstream'. */
     void (*wait)(struct pstream *pstream);
+
+    /* Set DSCP value of the listening socket. */
+    int (*set_dscp)(struct pstream *pstream, uint8_t dscp);
 };
 
 /* Active and passive stream classes. */
index 4a9dd4f6a1e489cff74f5ac381d015402118594f..0ca5b18dfb775e3bc12419a7c8b30cc50605f6e8 100644 (file)
@@ -862,6 +862,13 @@ pssl_wait(struct pstream *pstream)
     poll_fd_wait(pssl->fd, POLLIN);
 }
 
+static int
+pssl_set_dscp(struct pstream *pstream, uint8_t dscp)
+{
+    struct pssl_pstream *pssl = pssl_pstream_cast(pstream);
+    return set_dscp(pssl->fd, dscp);
+}
+
 const struct pstream_class pssl_pstream_class = {
     "pssl",
     true,
@@ -869,6 +876,7 @@ const struct pstream_class pssl_pstream_class = {
     pssl_close,
     pssl_accept,
     pssl_wait,
+    pssl_set_dscp,
 };
 \f
 /*
index 97492937bbb163093728255263f09ecdcae54e39..05601e19d7963434ef1e279c04cbd15afdd7cd81 100644 (file)
@@ -117,7 +117,8 @@ ptcp_open(const char *name OVS_UNUSED, char *suffix, struct pstream **pstreamp,
 
     sprintf(bound_name, "ptcp:%"PRIu16":"IP_FMT,
             ntohs(sin.sin_port), IP_ARGS(&sin.sin_addr.s_addr));
-    return new_fd_pstream(bound_name, fd, ptcp_accept, NULL, pstreamp);
+    return new_fd_pstream(bound_name, fd, ptcp_accept, set_dscp, NULL,
+                          pstreamp);
 }
 
 static int
@@ -142,6 +143,7 @@ const struct pstream_class ptcp_pstream_class = {
     ptcp_open,
     NULL,
     NULL,
-    NULL
+    NULL,
+    NULL,
 };
 
index dde599683e2aa4fc0bc37420e87b006de32bc903..4feefdfdfd4e8a6e31950d0697bfa340053ff6c4 100644 (file)
@@ -92,7 +92,7 @@ punix_open(const char *name OVS_UNUSED, char *suffix,
         return error;
     }
 
-    return new_fd_pstream(name, fd, punix_accept,
+    return new_fd_pstream(name, fd, punix_accept, NULL,
                           xstrdup(suffix), pstreamp);
 }
 
@@ -118,6 +118,7 @@ const struct pstream_class punix_pstream_class = {
     punix_open,
     NULL,
     NULL,
-    NULL
+    NULL,
+    NULL,
 };
 
index 2c7bfc3a52ba4303ff0ca83379c50492f44b67d0..2ee5731eb23a79ea1b07d3e349bd0d7b6f435bbc 100644 (file)
@@ -613,6 +613,15 @@ pstream_wait(struct pstream *pstream)
 {
     (pstream->class->wait)(pstream);
 }
+
+int
+pstream_set_dscp(struct pstream *pstream, uint8_t dscp)
+{
+    if (pstream->class->set_dscp) {
+        return pstream->class->set_dscp(pstream, dscp);
+    }
+    return 0;
+}
 \f
 /* Initializes 'stream' as a new stream named 'name', implemented via 'class'.
  * The initial connection status, supplied as 'connect_status', is interpreted
index 8ed0ff589327758e869501d48cedb8a4a8c2f968..d2f2ebb75bba2fb3c34b92c80db1de2b981b7123 100644 (file)
@@ -65,6 +65,7 @@ void pstream_close(struct pstream *);
 int pstream_accept(struct pstream *, struct stream **);
 int pstream_accept_block(struct pstream *, struct stream **);
 void pstream_wait(struct pstream *);
+int pstream_set_dscp(struct pstream *, uint8_t dscp);
 \f
 /* Convenience functions. */