diff options
Diffstat (limited to 'src/vlibsocket/sock_test.c')
-rw-r--r-- | src/vlibsocket/sock_test.c | 155 |
1 files changed, 155 insertions, 0 deletions
diff --git a/src/vlibsocket/sock_test.c b/src/vlibsocket/sock_test.c new file mode 100644 index 00000000000..3bded08fd99 --- /dev/null +++ b/src/vlibsocket/sock_test.c @@ -0,0 +1,155 @@ +/* + * 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; +} + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ |