From a2d40857a8cef5dcccf64eb681dff12a85a0bbca Mon Sep 17 00:00:00 2001 From: yoe Date: Wed, 17 Oct 2007 09:34:27 +0000 Subject: [PATCH] r289: Add experimental support for the SDP protocol --- configure.ac | 11 +++++++++++ nbd-client.c | 29 +++++++++++++++++++++++------ nbd-server.c | 34 +++++++++++++++++++++++++++++----- 3 files changed, 63 insertions(+), 11 deletions(-) diff --git a/configure.ac b/configure.ac index e02421c..3ebb983 100644 --- a/configure.ac +++ b/configure.ac @@ -59,6 +59,7 @@ AC_ARG_ENABLE( ], [DODBG=0] ) + AC_MSG_CHECKING([whether a debugging version is requested]) if test $DODBG -eq 1; then AC_MSG_RESULT([yes]) @@ -71,6 +72,16 @@ else AC_MSG_RESULT([no]) fi +AC_ARG_ENABLE( + sdp, + AC_HELP_STRING(--enable-sdp,Build a version of nbd-server with support for the Socket Direct Protocol (SDP). Requires you to build and install a kernel with the InfiniBand patches (default disabled)), + [ + if test "x$enableval" = "xyes"; then + AC_DEFINE(WITH_SDP, 1, [Define to 1 if you have and want support for the Socket Direct Protocol]) + fi + ] +) + AC_PROG_CC AC_PROG_CPP AC_PROG_INSTALL diff --git a/nbd-client.c b/nbd-client.c index d03b568..d98f36e 100644 --- a/nbd-client.c +++ b/nbd-client.c @@ -37,20 +37,29 @@ #define MY_NAME "nbd_client" #include "cliserv.h" -int opennet(char *name, int port) { +int opennet(char *name, int port, int sdp) { int sock; struct sockaddr_in xaddrin; int xaddrinlen = sizeof(xaddrin); struct hostent *hostn; + int af; hostn = gethostbyname(name); if (!hostn) err("Gethostname failed: %h\n"); - if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) + af = AF_INET; + if(sdp) { +#ifdef WITH_SDP + af = AF_INET_SDP; +#else + err("Can't do SDP: I was not compiled with SDP support!"); +#endif + } + if ((sock = socket(af, SOCK_STREAM, IPPROTO_TCP)) < 0) err("Socket failed: %m"); - xaddrin.sin_family = AF_INET; + xaddrin.sin_family = af; xaddrin.sin_port = htons(port); xaddrin.sin_addr.s_addr = *((int *) hostn->h_addr); if ((connect(sock, (struct sockaddr *) &xaddrin, xaddrinlen) < 0)) @@ -171,6 +180,7 @@ int main(int argc, char *argv[]) { int swap=0; int cont=0; int timeout=0; + int sdp=0; u64 size64; u32 flags; @@ -238,19 +248,26 @@ int main(int argc, char *argv[]) { err("Can not open NBD: %m"); ++argv; --argc; /* skip device */ - if (argc>2) goto errmsg; - if (argc!=0) { + if (argc>3) goto errmsg; + if (argc) { if(strncmp(argv[0], "-swap", 5)==0) { swap=1; ++argv;--argc; } } - if (argc!=0) { + if (argc) { if(strncmp(argv[0], "-persist", 8)==0) { cont=1; ++argv;--argc; } } + if (argc) { + if(strncmp(argv[0], "-sdp", 4)==0) { + sdp=1; + ++argv;--argc; + } + } + if(argc) goto errmsg; argv=NULL; argc=0; /* don't use it later suddenly */ negotiate(sock, &size64, &flags); diff --git a/nbd-server.c b/nbd-server.c index 3577fc5..37bcf22 100644 --- a/nbd-server.c +++ b/nbd-server.c @@ -147,7 +147,8 @@ gchar* rungroup=NULL; #define F_COPYONWRITE 4 /**< flag to tell us a file is exported using copyonwrite */ #define F_AUTOREADONLY 8 /**< flag to tell us a file is set to autoreadonly */ -#define F_SPARSE 16 +#define F_SPARSE 16 /**< flag to tell us copyronwrite should use a sparse file */ +#define F_SDP /**< flag to tell us the export should be done using the Socket Direct Protocol for RDMA */ GHashTable *children; char pidfname[256]; /**< name of our PID file */ char pidftemplate[256]; /**< template to be used for the filename of the PID file */ @@ -543,8 +544,9 @@ GArray* parse_cfile(gchar* f, GError** e) { { "copyonwrite", FALSE, PARAM_BOOL, NULL, F_COPYONWRITE }, { "autoreadonly", FALSE, PARAM_BOOL, NULL, F_AUTOREADONLY }, { "sparse_cow", FALSE, PARAM_BOOL, NULL, F_SPARSE }, + { "sdp", FALSE, PARAM_BOOL, NULL, F_SDP }, }; - const int lp_size=11; + const int lp_size=14; PARAM gp[] = { { "user", FALSE, PARAM_STRING, &runuser, 0 }, { "group", FALSE, PARAM_STRING, &rungroup, 0 }, @@ -587,8 +589,9 @@ GArray* parse_cfile(gchar* f, GError** e) { lp[6].target=&(s.prerun); lp[7].target=&(s.postrun); lp[8].target=lp[9].target=lp[10].target= - lp[11].target=lp[12].target=&(s.flags); - + lp[11].target=lp[12].target= + lp[13].target=&(s.flags); + /* After the [generic] group, start parsing exports */ if(i==1) { p=lp; @@ -675,6 +678,14 @@ GArray* parse_cfile(gchar* f, GError** e) { if(i>0) { g_array_append_val(retval, s); } +#ifndef WITH_SDP + if(s.flags && F_SDP) { + g_set_error(e, errdomain, CFILE_VALUE_UNSUPPORTED, "This nbd-server was built without support for SDP, yet group %s uses it", groups[i]); + g_array_free(retval, TRUE); + g_key_file_free(cfile); + return NULL; + } +#endif } return retval; } @@ -1400,12 +1411,20 @@ void setup_serve(SERVER *serve) { struct sigaction sa; int addrinlen = sizeof(addrin); int sock_flags; + int af; #ifndef sun int yes=1; #else char yes='1'; #endif /* sun */ - if ((serve->socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) + + af = AF_INET; +#ifdef WITH_SDP + if ((serve->flags) && F_SDP) { + af = AF_INET_SDP; + } +#endif + if ((serve->socket = socket(af, SOCK_STREAM, IPPROTO_TCP)) < 0) err("socket: %m"); /* lose the pesky "Address already in use" error message */ @@ -1426,6 +1445,11 @@ void setup_serve(SERVER *serve) { DEBUG("Waiting for connections... bind, "); addrin.sin_family = AF_INET; +#ifdef WITH_SDP + if(serve->flags && F_SDP) { + addrin.sin_family = AF_INET_SDP; + } +#endif addrin.sin_port = htons(serve->port); addrin.sin_addr.s_addr = 0; if (bind(serve->socket, (struct sockaddr *) &addrin, addrinlen) < 0) -- 1.7.10.4