Initial commit of vpp code.

Change-Id: Ib246f1fbfce93274020ee93ce461e3d8bd8b9f17
Signed-off-by: Ed Warnicke <eaw@cisco.com>
diff --git a/vlib-api/vlibsocket/sock_test.c b/vlib-api/vlibsocket/sock_test.c
new file mode 100644
index 0000000..cfae32f
--- /dev/null
+++ b/vlib-api/vlibsocket/sock_test.c
@@ -0,0 +1,144 @@
+/*
+ * Copyright (c) 2015 Cisco and/or its affiliates.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netdb.h> 
+
+#define SOCKCLNT_SERVER_PORT 32741 /* whatever */
+
+typedef signed char i8;
+typedef signed short i16;
+typedef signed int i32;
+typedef signed long long i64;
+typedef unsigned char u8;
+typedef unsigned short u16;
+typedef unsigned int u32;
+typedef unsigned long long u64;
+typedef unsigned long uword;
+
+#define VL_API_PACKED(x) x __attribute__ ((packed))
+
+typedef VL_API_PACKED(struct _vl_api_sockclnt_create {
+    u16 _vl_msg_id;
+    u8 name[64];
+    u32 context;
+}) vl_api_sockclnt_create_t;
+
+typedef VL_API_PACKED(struct _vl_api_sockclnt_create_reply {
+    u16 _vl_msg_id;
+    i32 response;
+    u64 handle;
+    u32 index;
+    u32 context;
+}) vl_api_sockclnt_create_reply_t;
+
+typedef VL_API_PACKED(struct _vl_api_sockclnt_delete {
+    u16 _vl_msg_id;
+    u32 index;
+    u64 handle;
+}) vl_api_sockclnt_delete_t;
+
+typedef VL_API_PACKED(struct _vl_api_sockclnt_delete_reply {
+    u16 _vl_msg_id;
+    i32 response;
+    u64 handle;
+}) vl_api_sockclnt_delete_reply_t;
+
+void error(char *msg)
+{
+    perror(msg);
+    exit(0);
+}
+
+int main(int argc, char *argv[])
+{
+    int sockfd, portno, n;
+    struct sockaddr_in serv_addr;
+    struct hostent *server;
+    char buffer[256];
+    int i;
+    u32 nbytes;
+    vl_api_sockclnt_create_t *mp;
+    vl_api_sockclnt_create_reply_t *rp;
+    char *rdptr;
+    int total_bytes;
+
+    for (i = 0; i < 1; i++) {
+        portno = SOCKCLNT_SERVER_PORT;
+        sockfd = socket(AF_INET, SOCK_STREAM, 0);
+        if (sockfd < 0) 
+            error("ERROR opening socket");
+        server = gethostbyname("localhost");
+        if (server == NULL) {
+            fprintf(stderr,"ERROR, no such host\n");
+            exit(0);
+        }
+        bzero((char *) &serv_addr, sizeof(serv_addr));
+        serv_addr.sin_family = AF_INET;
+        bcopy((char *)server->h_addr, 
+              (char *)&serv_addr.sin_addr.s_addr,
+              server->h_length);
+        serv_addr.sin_port = htons(portno);
+        if (connect(sockfd,(const void *)&serv_addr,sizeof(serv_addr)) < 0) 
+            error("ERROR connecting");
+
+        memset(buffer, 0, sizeof(buffer));
+
+        mp = (vl_api_sockclnt_create_t *)buffer;
+        mp->_vl_msg_id = ntohs(8); /* VL_API_SOCKCLNT_CREATE */
+        strncpy ((char *) mp->name, "socket-test", sizeof(mp->name)-1);
+        mp->name[sizeof(mp->name)-1]=0;
+        mp->context = 0xfeedface;
+        /* length of the message, including the length itself */
+        nbytes = sizeof (*mp) + sizeof (nbytes);
+        nbytes = ntohl(nbytes);
+        n = write(sockfd, &nbytes, sizeof(nbytes));
+        if (n < 0) 
+            error("ERROR writing len to socket");
+        n = write(sockfd, mp, sizeof (*mp));
+        if (n < 0) 
+            error("ERROR writing msg to socket");
+
+        memset(buffer, 0, sizeof (buffer));
+
+        total_bytes = 0;
+        rdptr = buffer;
+        do {
+            n = read(sockfd,rdptr,sizeof(buffer) - (rdptr - buffer));
+            if (n < 0) 
+                error("ERROR reading from socket");
+            printf ("read %d bytes\n", n);
+            total_bytes += n;
+            rdptr += n;
+        } while (total_bytes < sizeof (vl_api_sockclnt_create_reply_t) + 4);
+
+        rp = (vl_api_sockclnt_create_reply_t *)(buffer + 4);
+        /* VL_API_SOCKCLNT_CREATE_REPLY */
+        if (ntohs(rp->_vl_msg_id) != 9) {
+            printf ("WARNING: msg id %d\n", ntohs(rp->_vl_msg_id));
+        }
+
+        printf ("response %d, handle 0x%llx, index %d, context 0x%x\n",
+                ntohl(rp->response), rp->handle, rp->index, rp->context);
+        close(sockfd);
+    }
+    return 0;
+}