aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorOle Troan <ot@cisco.com>2019-04-15 11:27:22 +0200
committerFlorin Coras <florin.coras@gmail.com>2019-04-23 18:49:22 +0000
commit4ff09ae3483593f51faa160829fbcad4c77ed5b3 (patch)
treef2fa50765a7deaa081d26841437e9e9f24c00337 /src
parent59e0c8f5dc4b9c2b580c68da5595e4ed750194fe (diff)
API: Python and Unix domain socket improvement
Handle the case where buffer overflows. Then SOCK_SEQPACKET assumption that multiple API messages are not returned by recv() is broken. Use SOCK_STREAM for API exchanges instead. Add support for running tests over sockets. make test SOCKET=1 Change-Id: Ibe5fd69b1bf617de4c7ba6cce0a7c2b3f97a2821 Signed-off-by: Ole Troan <ot@cisco.com>
Diffstat (limited to 'src')
-rw-r--r--src/plugins/igmp/igmp.api2
-rw-r--r--src/plugins/igmp/igmp_api.c8
-rw-r--r--src/vlibmemory/socket_api.c3
-rw-r--r--src/vlibmemory/socket_client.c3
-rw-r--r--src/vpp-api/python/vpp_papi/vpp_transport_socket.py46
5 files changed, 24 insertions, 38 deletions
diff --git a/src/plugins/igmp/igmp.api b/src/plugins/igmp/igmp.api
index db47905ae6f..b061c5e1a35 100644
--- a/src/plugins/igmp/igmp.api
+++ b/src/plugins/igmp/igmp.api
@@ -215,8 +215,6 @@ service {
*/
define igmp_event
{
- u32 context;
-
u32 sw_if_index;
vl_api_filter_mode_t filter;
vl_api_ip4_address_t saddr;
diff --git a/src/plugins/igmp/igmp_api.c b/src/plugins/igmp/igmp_api.c
index d619abdd893..548d828267f 100644
--- a/src/plugins/igmp/igmp_api.c
+++ b/src/plugins/igmp/igmp_api.c
@@ -60,7 +60,7 @@ _(IGMP_CLEAR_INTERFACE, igmp_clear_interface) \
_(IGMP_CLEAR_INTERFACE, igmp_clear_interface) \
_(IGMP_GROUP_PREFIX_SET, igmp_group_prefix_set) \
_(IGMP_GROUP_PREFIX_DUMP, igmp_group_prefix_dump) \
-_(WANT_IGMP_EVENTS, want_igmp_events) \
+_(WANT_IGMP_EVENTS, want_igmp_events)
static void
vl_api_igmp_listen_t_handler (vl_api_igmp_listen_t * mp)
@@ -373,7 +373,7 @@ vl_api_want_igmp_events_t_handler (vl_api_want_igmp_events_t * mp)
}
rv = VNET_API_ERROR_INVALID_REGISTRATION;
-done:;
+done:
REPLY_MACRO (VL_API_WANT_IGMP_EVENTS_REPLY + im->msg_id_base);
}
@@ -399,7 +399,6 @@ VL_MSG_API_REAPER_FUNCTION (want_igmp_events_reaper);
void
send_igmp_event (vl_api_registration_t * rp,
- u32 context,
igmp_filter_mode_t filter,
u32 sw_if_index,
const ip46_address_t * saddr, const ip46_address_t * gaddr)
@@ -408,7 +407,6 @@ send_igmp_event (vl_api_registration_t * rp,
clib_memset (mp, 0, sizeof (*mp));
mp->_vl_msg_id = ntohs ((VL_API_IGMP_EVENT) + igmp_main.msg_id_base);
- mp->context = context;
mp->sw_if_index = htonl (sw_if_index);
mp->filter = htonl (filter);
clib_memcpy (&mp->saddr, &saddr->ip4, sizeof (ip4_address_t));
@@ -440,7 +438,7 @@ igmp_event (igmp_filter_mode_t filter,
({
rp = vl_api_client_index_to_registration (api_client->client_index);
if (rp)
- send_igmp_event (rp, 0, filter, sw_if_index, saddr, gaddr);
+ send_igmp_event (rp, filter, sw_if_index, saddr, gaddr);
}));
/* *INDENT-ON* */
}
diff --git a/src/vlibmemory/socket_api.c b/src/vlibmemory/socket_api.c
index a8423d11ccb..a8a45a7e6bc 100644
--- a/src/vlibmemory/socket_api.c
+++ b/src/vlibmemory/socket_api.c
@@ -722,8 +722,7 @@ vl_sock_api_init (vlib_main_t * vm)
vec_free (tmp);
}
- sock->flags = CLIB_SOCKET_F_IS_SERVER | CLIB_SOCKET_F_SEQPACKET |
- CLIB_SOCKET_F_ALLOW_GROUP_WRITE;
+ sock->flags = CLIB_SOCKET_F_IS_SERVER | CLIB_SOCKET_F_ALLOW_GROUP_WRITE;
error = clib_socket_init (sock);
if (error)
return error;
diff --git a/src/vlibmemory/socket_client.c b/src/vlibmemory/socket_client.c
index ca1e53538ae..96330ce481a 100644
--- a/src/vlibmemory/socket_client.c
+++ b/src/vlibmemory/socket_client.c
@@ -374,8 +374,7 @@ vl_socket_client_connect (char *socket_path, char *client_name,
sock = &scm->client_socket;
sock->config = socket_path;
- sock->flags = CLIB_SOCKET_F_IS_CLIENT
- | CLIB_SOCKET_F_SEQPACKET | CLIB_SOCKET_F_NON_BLOCKING_CONNECT;
+ sock->flags = CLIB_SOCKET_F_IS_CLIENT | CLIB_SOCKET_F_NON_BLOCKING_CONNECT;
if ((error = clib_socket_init (sock)))
{
diff --git a/src/vpp-api/python/vpp_papi/vpp_transport_socket.py b/src/vpp-api/python/vpp_papi/vpp_transport_socket.py
index 4341cad3e90..63cb6a6e9e7 100644
--- a/src/vpp-api/python/vpp_papi/vpp_transport_socket.py
+++ b/src/vpp-api/python/vpp_papi/vpp_transport_socket.py
@@ -70,7 +70,7 @@ class VppTransport(object):
def connect(self, name, pfx, msg_handler, rx_qlen):
# Create a UDS socket
- self.socket = socket.socket(socket.AF_UNIX, socket.SOCK_SEQPACKET)
+ self.socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
self.socket.settimeout(self.read_timeout)
# Connect the socket to the port where the server is listening
@@ -150,36 +150,28 @@ class VppTransport(object):
n = self.socket.send(buf)
def _read(self):
- # Header and message
- try:
- msg = self.socket.recv(4096)
- if len(msg) == 0:
- return None
- except socket.error as message:
- logging.error(message)
- raise
-
- (_, l, _) = self.header.unpack(msg[:16])
+ hdr = self.socket.recv(16)
+ if not hdr:
+ return
+ (_, l, _) = self.header.unpack(hdr) # If at head of message
+ # Read rest of message
+ msg = self.socket.recv(l)
if l > len(msg):
- buf = bytearray(l + 16)
+ nbytes = len(msg)
+ buf = bytearray(l)
view = memoryview(buf)
- view[:4096] = msg
- view = view[4096:]
- # Read rest of message
- remaining_bytes = l - 4096 + 16
- while remaining_bytes > 0:
- bytes_to_read = (remaining_bytes if remaining_bytes
- <= 4096 else 4096)
- nbytes = self.socket.recv_into(view, bytes_to_read)
- if nbytes == 0:
- logging.error('recv failed')
- break
+ view[:nbytes] = msg
+ view = view[nbytes:]
+ left = l - nbytes
+ while left:
+ nbytes = self.socket.recv_into(view, left)
view = view[nbytes:]
- remaining_bytes -= nbytes
- else:
- buf = msg
- return buf[16:]
+ left -= nbytes
+ return buf
+ if l == len(msg):
+ return msg
+ raise VPPTransportSocketIOError(1, 'Unknown socket read error')
def read(self):
if not self.connected: