From 4230103ff633904c69cc18d861bf42781f57bb64 Mon Sep 17 00:00:00 2001 From: Dimitri Staessens Date: Sat, 17 Mar 2018 14:55:46 +0100 Subject: lib: Allow disabling partial read This allows disabling partial reads. It adds a flag FLOWFRNOPART that disables partial reads. Partial read is different from partial delivery (FRCTFPARTIAL), which allows delivery of fragments of an incomplete packet and thus potentially corrupted data. FLOWFRNOPART will never deliver corrupted data (unless FRCTFPARTIAL is also set). If FLOWFRNOPART is set and the buffer provided to flow_read is too small for the SDU, that SDU will be discarded and -EMSGSIZE is returned; Signed-off-by: Dimitri Staessens Signed-off-by: Sander Vrijders --- src/ipcpd/normal/pol/link_state.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'src/ipcpd/normal') diff --git a/src/ipcpd/normal/pol/link_state.c b/src/ipcpd/normal/pol/link_state.c index 7aa7faf7..cfe4faff 100644 --- a/src/ipcpd/normal/pol/link_state.c +++ b/src/ipcpd/normal/pol/link_state.c @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -655,7 +656,7 @@ static void * lsreader(void * o) { fqueue_t * fq; int ret; - uint8_t buf[sizeof(struct lsa) + 1]; + uint8_t buf[sizeof(struct lsa)]; int fd; qosspec_t qs; struct lsa * msg; @@ -680,7 +681,7 @@ static void * lsreader(void * o) } while ((fd = fqueue_next(fq)) >= 0) { - len = flow_read(fd, buf, sizeof(*msg) + 1); + len = flow_read(fd, buf, sizeof(*msg)); if (len <= 0 || len != sizeof(*msg)) continue; @@ -724,6 +725,7 @@ static void handle_event(void * self, /* FIXME: Apply correct QoS on graph */ struct conn * c; qosspec_t qs; + int flags; (void) self; @@ -759,6 +761,8 @@ static void handle_event(void * self, flow_event(c->flow_info.fd, false); break; case NOTIFY_MGMT_CONN_ADD: + fccntl(c->flow_info.fd, FLOWGFLAGS, &flags); + fccntl(c->flow_info.fd, FLOWSFLAGS, flags | FLOWFRNOPART); fset_add(ls.mgmt_set, c->flow_info.fd); if (lsdb_add_nb(c->conn_info.addr, c->flow_info.fd, NB_MGMT)) log_warn("Failed to add mgmt neighbor to LSDB."); -- cgit v1.2.3