From fc85d676b5ca3de92264dfcb41c98d7c9b0d1398 Mon Sep 17 00:00:00 2001 From: Laurent Bercot Date: Thu, 25 Jul 2024 00:20:30 +0000 Subject: More shibari-cache stuff Signed-off-by: Laurent Bercot --- src/cache/access.c | 47 ----------- src/cache/clientaccess.c | 51 ++++++++++++ src/cache/conf.c | 9 +++ src/cache/deps-exe/shibari-cache | 4 + src/cache/query.c | 16 ++++ src/cache/shibari-cache-internal.h | 75 ++++++++++------- src/cache/shibari-cache.c | 161 +++++++++++++++++++++++++------------ src/cache/tcpconnection.c | 12 +++ src/config/defaults.c | 11 +-- src/config/lexparse.c | 16 +++- src/include/shibari/cache.h | 8 -- src/include/shibari/client.h | 6 -- src/include/shibari/shibari.h | 2 - 13 files changed, 266 insertions(+), 152 deletions(-) delete mode 100644 src/cache/access.c create mode 100644 src/cache/clientaccess.c create mode 100644 src/cache/query.c create mode 100644 src/cache/tcpconnection.c delete mode 100644 src/include/shibari/cache.h delete mode 100644 src/include/shibari/client.h diff --git a/src/cache/access.c b/src/cache/access.c deleted file mode 100644 index 8f87125..0000000 --- a/src/cache/access.c +++ /dev/null @@ -1,47 +0,0 @@ -/* ISC license. */ - -#include - -#include - -#include "shibari-cache-internal.h" - -static inline int check (char const *key, size_t keylen) -{ - cdb_data data ; - return cdb_find(&confdb, &data, key, keylen) ; -} - -int ip4_access (char const *ip) -{ - int r ; - char key[9] = "A4:" ; - uint8_t i = 33 ; - memcpy(key+4, ip, 4) ; - key[8] = 0 ; - while (i--) - { - key[3] = i ; - key[4 + (i>>3)] &= ~(1U << (7 - (i & 7))) ; - r = check(key, 8) ; - if (r) return r ; - } - return 0 ; -} - -int ip6_access (char const *ip) -{ - int r ; - char key[21] = "A6:" ; - uint8_t i = 129 ; - memcpy(key+4, ip, 16) ; - key[20] = 0 ; - while (i--) - { - key[3] = i ; - key[4 + (i>>3)] &= ~(1U << (7 - (i & 7))) ; - r = check(key, 20) ; - if (r) return r ; - } - return 0 ; -} diff --git a/src/cache/clientaccess.c b/src/cache/clientaccess.c new file mode 100644 index 0000000..0dc5270 --- /dev/null +++ b/src/cache/clientaccess.c @@ -0,0 +1,51 @@ +/* ISC license. */ + +#include +#include + +#include +#include + +#include "shibari-cache-internal.h" + +static inline int check (char const *key, size_t keylen) +{ + cdb_data data ; + return cdb_find(&confdb, &data, key, keylen) ; +} + +int clientaccess_ip4 (char const *ip) +{ + int r ; + char key[9] = "A4:" ; + uint8_t i = 33 ; + memcpy(key+4, ip, 4) ; + key[8] = 0 ; + while (i--) + { + key[3] = i ; + key[4 + (i>>3)] &= ~(1U << (7 - (i & 7))) ; + r = check(key, 8) ; + if (r) return r ; + } + return 0 ; +} + +#ifdef SKALIBS_IPV6_ENABLED +int clientaccess_ip6 (char const *ip) +{ + int r ; + char key[21] = "A6:" ; + uint8_t i = 129 ; + memcpy(key+4, ip, 16) ; + key[20] = 0 ; + while (i--) + { + key[3] = i ; + key[4 + (i>>3)] &= ~(1U << (7 - (i & 7))) ; + r = check(key, 20) ; + if (r) return r ; + } + return 0 ; +} +#endif diff --git a/src/cache/conf.c b/src/cache/conf.c index 209fdc3..c2f3d6b 100644 --- a/src/cache/conf.c +++ b/src/cache/conf.c @@ -27,6 +27,15 @@ int conf_get (cdb const *c, char const *key, cdb_data *data) return conf_getb(c, key, strlen(key), data) ; } +int conf_get_uint16 (cdb const *c, char const *key, uint16_t *value) +{ + cdb_data data ; + if (!conf_get(conf, key, &data)) return 0 ; + if (data.len != 2) return (errno = EPROTO, 0) ; + uint16_unpack_big(data.s, value) ; + return 1 ; +} + int conf_get_uint32 (cdb const *c, char const *key, uint32_t *value) { cdb_data data ; diff --git a/src/cache/deps-exe/shibari-cache b/src/cache/deps-exe/shibari-cache index 841cf80..19a22c6 100644 --- a/src/cache/deps-exe/shibari-cache +++ b/src/cache/deps-exe/shibari-cache @@ -1,5 +1,9 @@ cache.o +clientaccess.o conf.o +query.o +tcpconnection.o +udpqueue.o ${LIBDCACHE} ${LIBSHIBARI_COMMON} -ls6dns diff --git a/src/cache/query.c b/src/cache/query.c new file mode 100644 index 0000000..ad606e6 --- /dev/null +++ b/src/cache/query.c @@ -0,0 +1,16 @@ +/* ISC license. */ + +#include "shibari-cache-internal.h" + +void query_fail (query *q) +{ +} + +void query_success (query *q) +{ +} + +int query_new (uint8_t source, uint16_t i, char const *ip, uint16_t port, char const *s, uint16_t len) +{ + return 1 ; +} diff --git a/src/cache/shibari-cache-internal.h b/src/cache/shibari-cache-internal.h index 606d245..4f6476d 100644 --- a/src/cache/shibari-cache-internal.h +++ b/src/cache/shibari-cache-internal.h @@ -3,6 +3,7 @@ #ifndef SHIBARI_CACHE_INTERNAL_H #define SHIBARI_CACHE_INTERNAL_H +#include #include #include @@ -24,15 +25,47 @@ extern void cache_dump (void) ; extern void cache_load (void) ; + /* clientaccess */ + +extern int clientaccess_ip4 (char const *) ; +#if SKALIBS_IPV6_ENABLED +extern int clientaccess_ip6 (char const *) ; +#endif + /* conf */ extern int conf_getb (cdb const *, char const *, size_t, cdb_data *) ; extern int conf_get (cdb const *, char const *, cdb_data *) ; +extern int conf_get_uint16 (cdb const *, char const *, uint16_t *) ; extern int conf_get_uint32 (cdb const *, char const *, uint32_t *) ; extern int conf_get_uint64 (cdb const *, char const *, uint64_t *) ; extern char const *conf_get_string (cdb const *, char const *) ; + /* query */ + +typedef struct query_s query, *query_ref ; +struct query_s +{ + s6dns_engine_t dt ; + uint16_t prev ; + uint16_t next ; + uint16_t xindex ; + uint16_t source ; + uint16_t i ; + uint16_t port ; + char ip[SKALIBS_IP_SIZE] ; +} ; +#define QUERY_ZERO { .dt = S6DNS_ENGINE_ZERO, .prev = 0, .next = 0, .xindex = UINT16_MAX, .source = 0, .i = 0, .port = 0, .ip = { 0 } } +#define nq (genset_n(&g->queries) - 1) +#define QUERY(i) genset_p(query, &g->queries, (i)) +#define qstart (QUERY(g->qsentinel)->next) + +extern void query_fail (query *) ; +extern void query_success (query *) ; +extern void query_new (uint8_t, uint16_t, char const *, uint16_t, char const *, uint16_t) ; + + /* tcpconnection */ typedef struct tcpconnection_s tcpconnection, *tcpconnection_ref ; @@ -43,9 +76,9 @@ struct tcpconnection_s uint32_t instate ; tain rdeadline ; tain wdeadline ; - uint32_t prev ; - uint32_t next ; - uint32_t xindex ; + uint16_t prev ; + uint16_t next ; + uint16_t xindex ; } ; #define TCPCONNECTION_ZERO { .out = BUFALLOC_ZERO, .in = STRALLOC_ZERO, .instate = 0, .rdeadline = TAIN_INFINITE, .wdeadline = TAIN_INFINITE, .prev = 0, .next = 0. .xindex = UINT32_MAX } #define ntcp (genset_n(&g->tcpconnections) - 1) @@ -53,6 +86,7 @@ struct tcpconnection_s #define tcpstart (TCPCONNECTION(g->tcpsentinel)->next) extern void tcpconnection_drop (tcpconnection *) ; +extern int tcpconnection_new (uint8_t, uint16_t, int, char const *, uint16_t) ; /* udpqueue */ @@ -66,6 +100,7 @@ struct udp4msg_s } ; #define UDP4MSG_ZERO { .ip = { 0 }, .port = 0, .len = 0 } +#ifdef SKALIBS_IPV6_ENABLED typedef struct udp6msg_s udp6msg, *udp6msg_ref ; struct udp4msg_s { @@ -74,6 +109,7 @@ struct udp4msg_s uint16_t len ; } ; #define UDP6MSG_ZERO { .ip = { 0 }, .port = 0, .len = 0 } +#endif typedef struct udpqueue_s udpqueue, *udpqueue_ref ; struct udpqueue_s @@ -82,7 +118,7 @@ struct udpqueue_s stralloc storage ; genalloc messages ; /* udp[46]msg */ tain deadline ; - uint32_t xindex ; + uint16_t xindex ; } ; #define UDPQUEUE_ZERO { .fd = -1, .storage = STRALLOC_ZERO, .messages = GENALLOC_ZERO, .deadline = TAIN_INFINITE, .xindex = UINT32_MAX } @@ -97,29 +133,6 @@ extern int udpqueue_flush6 (udpqueue *) ; #endif - /* query */ - -typedef struct query_s query, *query_ref ; -struct query_s -{ - s6dns_engine_t dt ; - uint32_t origin ; - uint32_t prev ; - uint32_t next ; - uint32_t xindex ; - char ip[16] ; - uint16_t port ; -} ; -#define QUERY_ZERO { .dt = S6DNS_ENGINE_ZERO, .origin = 0, .prev = 0, .next = 0, .xindex = UINT32_MAX, .ip = { 0 }, .port = 0 } -#define nq (genset_n(&g->queries) - 1) -#define QUERY(i) genset_p(query, &g->queries, (i)) -#define qstart (QUERY(g->qsentinel)->next) - -extern void query_fail (query *) ; -extern void query_success (query *) ; -extern void query_new (uint32_t, char const *, uint8_t, uint16_t, char const *, uint16_t) ; - - /* main */ typedef struct global_s global, *global_ref ; @@ -127,13 +140,13 @@ struct global_s { cdb confdb ; char const *dumpfile ; - uint32_t verbosity ; + uint16_t verbosity ; tain rtto ; tain wtto ; genset tcpconnections ; /* tcpconnection */ - uint32_t tcpsentinel ; genset queries ; /* query */ - uint32_t qsentinel ; + uint16_t tcpsentinel ; + uint16_t qsentinel ; } ; #define GLOBAL_ZERO { \ .confdb = CDB_ZERO, \ @@ -142,8 +155,8 @@ struct global_s .rtto = TAIN_INFINITE, \ .wtto = TAIN_INFINITE, \ .tcpconnections = GENSET_ZERO, \ - .tcpsentinel = 0, \ .queries = GENSET_ZERO, \ + .tcpsentinel = 0, \ .qsentinel = 0, \ } diff --git a/src/cache/shibari-cache.c b/src/cache/shibari-cache.c index 99d52b8..85f74bc 100644 --- a/src/cache/shibari-cache.c +++ b/src/cache/shibari-cache.c @@ -42,11 +42,11 @@ static int flagwantfinaldump = 1 ; static tain lameduckt = TAIN_INFINITE_RELATIVE ; -static inline void conf_init (char const *conffile, uint32_t *n4, uint32_t *n6, char const **ip4, char const **ip6, uint32_t *maxtcp, uint32_t *maxqueries) +static inline void conf_init (char const *conffile, uint16_t *n4, uint16_t *n6, char const **ip4, char const **ip6, uint16_t *maxtcp, uint16_t *maxqueries) { cdb_data data ; uint32_t u ; - if (!conf_get_uint32(&g->confdb, "G:logv", &g->verbosity)) + if (!conf_get_uint16(&g->confdb, "G:logv", &g->verbosity)) strerr_diefu4sys(102, "read ", "G:logv", " configuration key from ", conffile) ; { uint64_t cachesize ; @@ -56,11 +56,11 @@ static inline void conf_init (char const *conffile, uint32_t *n4, uint32_t *n6, strerr_dief2x(102, "invalid G:cachesize in ", conffile) ; cache_init(cachesize) ; } - if (!conf_get_uint32(&g->confdb, "G:maxtcp", maxtcp)) + if (!conf_get_uint16(&g->confdb, "G:maxtcp", maxtcp)) strerr_diefu4sys(102, "read ", "G:maxtcp", " configuration key from ", conffile) ; if (*maxtcp > 4096 || *maxtcp < 1) strerr_dief2x(102, "invalid G:maxtcp in ", conffile) ; - if (!conf_get_uint32(&g->confdb, "G:maxqueries", maxqueries)) + if (!conf_get_uint16(&g->confdb, "G:maxqueries", maxqueries)) strerr_diefu4sys(102, "read ", "G:maxqueries", " configuration key from ", conffile) ; if (*maxqueries > 8192 || *maxqueries < 1) strerr_dief2x(102, "invalid G:maxqueries in ", conffile) ; @@ -78,6 +78,8 @@ static inline void conf_init (char const *conffile, uint32_t *n4, uint32_t *n6, strerr_diefu4sys(102, "read ", "G:listen4", " configuration key from ", conffile) ; if (data.len & 3) strerr_diefu4sys(102, "invalid ", "G:listen4", " key in ", conffile) ; + if (data.len > 4 * 1024) + strerr_diefu3sys(102, "G:listen4", " key too long in ", conffile) ; *n4 = data.len >> 2 ; *ip4 = data.s ; #ifdef SKALIBS_IPV6_ENABLED @@ -85,6 +87,8 @@ static inline void conf_init (char const *conffile, uint32_t *n4, uint32_t *n6, strerr_diefu4sys(102, "read ", "G:listen6", " configuration key from ", conffile) ; if (data.len & 15) strerr_diefu4sys(102, "invalid ", "G:listen6", " key in ", conffile) ; + if (data.len > 16 * 1024) + strerr_diefu3sys(102, "G:listen6", " key too long in ", conffile) ; *n6 = data.len >> 4 ; *ip6 = data.s ; #endif @@ -115,7 +119,7 @@ int main (int argc, char const *const *argv) { global globals = GLOBAL_ZERO ; char const *conffile = SHIBARI_SYSCONFDIR "/shibari-cache.conf.cdb" ; - uint32_t n4 = 0, n6 = 0, maxtcp, maxqueries ; + uint16_t n4 = 0, n6 = 0, maxtcp, maxqueries ; char const *ip4 = 0, *ip6 = 0 ; unsigned int cont = 2 ; int sfd = -1 ; @@ -181,8 +185,8 @@ int main (int argc, char const *const *argv) udpqueue udpq6[n6 ? n6 : 1] ; int tcp4fd[n4 ? n4 : 1] ; int tcp6fd[n6 ? n6 : 1] ; - uint32_t tcp4xindex[n4 ? n4 : 1] ; - uint32_t tcp6xindex[n4 ? n4 : 1] ; + uint16_t tcp4xindex[n4 ? n4 : 1] ; + uint16_t tcp6xindex[n4 ? n4 : 1] ; tcpconnection tcpconnection_storage[maxtcp + 1] ; uint32_t tcpconnection_freelist[maxtcp + 1] ; query query_storage[maxqueries + 1] ; @@ -205,7 +209,7 @@ int main (int argc, char const *const *argv) q->prev = q->next = g->qsentinel ; } - for (size_t i = 0 ; i < n4 ; i++) + for (uint16_t i = 0 ; i < n4 ; i++) { udpq4[i].fd = socket_udp4_nbcoe() ; if (udpq4[i].fd == -1) strerr_diefu1sys(111, "create udp4 socket") ; @@ -225,7 +229,7 @@ int main (int argc, char const *const *argv) } } #ifdef SKALIBS_IPV6_ENABLED - for (size_t i = 0 ; i < n6 ; i++) + for (uint16_t i = 0 ; i < n6 ; i++) { udpq6[i].fd = socket_udp6_nbcoe() ; if (udpq6[i].fd == -1) strerr_diefu1sys(111, "create udp6 socket") ; @@ -275,7 +279,7 @@ int main (int argc, char const *const *argv) x[0].events = IOPAUSE_READ ; if (cont == 1 && tain_less(&lameduckt, &deadline)) deadline = lameduckt ; - for (uint32_t i = 0 ; i < n4 ; i++) + for (uint16_t i = 0 ; i < n4 ; i++) { x[j].fd = udpq4[i].fd ; x[j].events = nq < maxqueries && cont >= 2 ? IOPAUSE_READ : 0 ; @@ -285,7 +289,7 @@ int main (int argc, char const *const *argv) if (tain_less(&udpq4[i].deadline, &deadline)) deadline = udpq4[i].deadline ; r = 1 ; } - if (x[j].events) udpq4[i].xindex = j++ ; else udpq4[i].xindex = UINT32_MAX ; + if (x[j].events) udpq4[i].xindex = j++ ; else udpq4[i].xindex = UINT16_MAX ; if (ntcp < maxtcp && cont >= 2) { @@ -293,11 +297,11 @@ int main (int argc, char const *const *argv) x[j].events = IOPAUSE_READ ; tcp4xindex[i] = j++ ; } - else tcp4xindex[i] = UINT32_MAX ; + else tcp4xindex[i] = UINT16_MAX ; } #ifdef SKALIBS_IPV6_ENABLED - for (uint32_t i = 0 ; i < n6 ; i++) + for (uint16_t i = 0 ; i < n6 ; i++) { x[j].fd = udpq6[i].fd ; x[j].events = nq < maxqueries && cont >= 2 ? IOPAUSE_READ : 0 ; @@ -307,7 +311,7 @@ int main (int argc, char const *const *argv) if (tain_less(&udpq6[i].deadline, &deadline)) deadline = udpq6[i].deadline ; r = 1 ; } - if (x[j].events) udpq6[i].xindex = j++ ; else udpq6[i].xindex = UINT32_MAX ; + if (x[j].events) udpq6[i].xindex = j++ ; else udpq6[i].xindex = UINT16_MAX ; if (ntcp < maxtcp && cont >= 2) { @@ -315,11 +319,11 @@ int main (int argc, char const *const *argv) x[j].events = IOPAUSE_READ ; tcp6xindex[i] = j++ ; } - else tcp6xindex[i] = UINT32_MAX ; + else tcp6xindex[i] = UINT16_MAX ; } #endif - for (uint32_t i = tcpstart ; i != g->tcpsentinel ; i = TCPCONNECTION(i)->next) + for (uint16_t i = tcpstart ; i != g->tcpsentinel ; i = TCPCONNECTION(i)->next) { tcpconnection *p = TCPCONNECTION(i) ; x[j].fd = bufalloc_fd(&p->out) ; @@ -335,16 +339,16 @@ int main (int argc, char const *const *argv) if (tain_less(&p->wdeadline, &deadline)) deadline = p->wdeadline ; r = 1 ; } - if (x[j].events) p->xindex = j++ ; else p->xindex = UINT32_MAX ; + if (x[j].events) p->xindex = j++ ; else p->xindex = UINT16_MAX ; } - for (uint32_t i = qstart ; i != g->qsentinel ; i = QUERY(i)->next) + for (uint16_t i = qstart ; i != g->qsentinel ; i = QUERY(i)->next) { query *p = QUERY(i) ; x[j].fd = p->dt.fd ; s6dns_engine_nextdeadline(&p->dt, &deadline) ; x[j].events = (s6dns_engine_isreadable(&p->dt) ? IOPAUSE_READ : 0) | (s6dns_engine_iswritable(&p->dt) ? IOPAUSE_WRITE : 0) ; - if (x[j].events) p->xindex = j++ ; else p->xindex = UINT32_MAX ; + if (x[j].events) p->xindex = j++ ; else p->xindex = UINT16_MAX ; } @@ -364,20 +368,20 @@ int main (int argc, char const *const *argv) if (!r) { if (cont == 1 && !tain_future(&lameduckt)) break ; - for (uint32_t i = qstart ; i != g->qsentinel ; i = QUERY(i)->next) + for (uint16_t i = qstart ; i != g->qsentinel ; i = QUERY(i)->next) { query *p = QUERY(i) ; if (s6dns_engine_timeout_g(&p->dt)) { i = p->prev ; query_fail(p) ; } } - for (uint32_t i = tcpstart ; i != g->tcpsentinel ; i = TCPCONNECTION(i)->next) + for (uint16_t i = tcpstart ; i != g->tcpsentinel ; i = TCPCONNECTION(i)->next) { tcpconnection *p = TCPCONNECTION(i) ; if (!tain_future(&p->rdeadline) || !tain_future(&p->wdeadline)) tcpconnection_drop(p) ; } - for (uint32_t i = 0 ; i < n4 ; i++) + for (uint16_t i = 0 ; i < n4 ; i++) if (!tain_future(&udp4q[i].deadline)) udpqueue_drop(udp4q + i) ; - for (uint32_t i = 0 ; i < n6 ; i++) + for (uint16_t i = 0 ; i < n6 ; i++) if (!tain_future(&udp6q[i].deadline)) udpqueue_drop(udp6q + i) ; } @@ -386,11 +390,11 @@ int main (int argc, char const *const *argv) else { - for (uint32_t i = 0 ; i < j ; i++) if (x[i].revents & IOPAUSE_EXCEPT) x[i].revents |= x[i].events ; + for (uint16_t i = 0 ; i < j ; i++) if (x[i].revents & IOPAUSE_EXCEPT) x[i].revents |= x[i].events ; if (x[0].revents & IOPAUSE_READ) { handle_signals() ; continue ; } - for (uint32_t i = 0 ; i < n4 ; i++) if (udpq4[i].xindex < UINT32_MAX) + for (uint16_t i = 0 ; i < n4 ; i++) if (udpq4[i].xindex < UINT16_MAX) { if (x[udpq4[i].xindex].revents & IOPAUSE_WRITE) { @@ -404,7 +408,7 @@ int main (int argc, char const *const *argv) } #ifdef SKALIBS_IPV6_ENABLED - for (uint32_t i = 0 ; i < n6 ; i++) if (udpq6[i].xindex < UINT32_MAX) + for (uint16_t i = 0 ; i < n6 ; i++) if (udpq6[i].xindex < UINT16_MAX) { if (x[udpq6[i].xindex].revents & IOPAUSE_WRITE) { @@ -418,10 +422,10 @@ int main (int argc, char const *const *argv) } #endif - for (uint32_t i = tcpstart ; i != g->tcpsentinel ; i = TCPCONNECTION(i)->next) + for (uint16_t i = tcpstart ; i != g->tcpsentinel ; i = TCPCONNECTION(i)->next) { tcpconnection *p = TCPCONNECTION(i) ; - if (p->xindex < UINT32_MAX && x[p->xindex].revents & IOPAUSE_WRITE) + if (p->xindex < UINT16_MAX && x[p->xindex].revents & IOPAUSE_WRITE) { if (tcpconnection_flush(p) == -1) { @@ -431,20 +435,20 @@ int main (int argc, char const *const *argv) } } - for (uint32_t i = qstart ; i != g->qsentinel ; i = QUERY(i)->next) + for (uint16_t i = qstart ; i != g->qsentinel ; i = QUERY(i)->next) { query *p = QUERY(i) ; - if (p->xindex == UINT32_MAX) continue ; + if (p->xindex == UINT16_MAX) continue ; r = s6dns_engine_event_g(&p->dt) ; if (r) i = p->prev ; if (r == -1) query_fail(p) ; else query_success(p) ; } - for (uint32_t i = 0 ; i < n4 ; i++) + for (uint16_t i = 0 ; i < n4 ; i++) { - if (udpq4[i].xindex < UINT32_MAX && x[udpq4[i].xindex].revents & IOPAUSE_READ) + if (udpq4[i].xindex < UINT16_MAX && x[udpq4[i].xindex].revents & IOPAUSE_READ) { - uint32_t n = MAXSAME ; + uint16_t n = MAXSAME ; char buf[513] ; char ip[4] ; uint16_t port ; @@ -459,18 +463,28 @@ int main (int argc, char const *const *argv) } if (!len) break ; if (len < 12 || len > 512) continue ; - if (!ip4_access(ip)) continue ; - query_new(i, ip, 4, port, buf, len) ; + if (!clientaccess_ip4(ip)) continue ; + if (!query_new(0, i, ip, port, buf, len)) + { + if (g->verbosity) + { + char fmtip[IP4_FMT] ; + char fmtport[UINT16_FMT] ; + fmtip[ip4_fmt(fmtip, ip] = 0 ; + fmtport[uint16_fmt(fmtport, port] = 0 ; + strerr_warnwu4sys("process new UDP query from ip ", fmtip, " port ", fmtport) ; + } + } } } } #ifdef SKALIBS_IPV6_ENABLED - for (uint32_t i = 0 ; i < n6 ; i++) + for (uint16_t i = 0 ; i < n6 ; i++) { - if (udpq6[i].xindex < UINT32_MAX && x[udpq6[i].xindex].revents & IOPAUSE_READ) + if (udpq6[i].xindex < UINT16_MAX && x[udpq6[i].xindex].revents & IOPAUSE_READ) { - uint32_t n = MAXSAME ; + uint16_t n = MAXSAME ; char buf[513] ; char ip[16] ; uint16_t port ; @@ -485,39 +499,86 @@ int main (int argc, char const *const *argv) } if (!len) break ; if (len < 12 || len > 512) continue ; - if (!ip6_access(ip)) continue ; - query_new(n4 + i, ip, 16, port, buf, len) ; + if (!clientaccess_ip6(ip)) continue ; + if (!query_new(1, i, ip, port, buf, len)) + { + if (g->verbosity) + { + char fmtip[IP4_FMT] ; + char fmtport[UINT16_FMT] ; + fmtip[ip4_fmt(fmtip, ip] = 0 ; + fmtport[uint16_fmt(fmtport, port] = 0 ; + strerr_warnwu4sys("process new UDP query from ip ", fmtip, " port ", fmtport) ; + } + } } } } #endif - for (uint32_t i = tcpstart ; i != g->tcpsentinel ; i = TCPCONNECTION(i)->next) + for (uint16_t i = tcpstart ; i != g->tcpsentinel ; i = TCPCONNECTION(i)->next) { tcpconnection *p = TCPCONNECTION(i) ; - if (p->xindex < UINT32_MAX && x[p->xindex].revents & IOPAUSE_READ) + if (p->xindex < UINT16_MAX && x[p->xindex].revents & IOPAUSE_READ) { int l = sanitize_read(mininetstring_read(bufalloc_fd(&p->out), &p->in, &p->instate)) ; if (l == -1) { i = p->prev ; tcpconnection_drop(p) ; } if (l <= 0) continue ; if (sa.len < 12 || sa.len > 65536) { i = p->prev ; tcpconnection_drop(p) ; continue ; } - query_new(n4 + n6 + i, 0, 0, 0, sa.s, sa.len) ; + query_new(2, i, 0, 0, sa.s, sa.len) ; sa.len = 0 ; } } - for (uint32_t i = 0 ; i < n4 ; i++) if (tcp4xindex[i] < UINT32_MAX) - { - if (x[tcp4index[i]].revents & IOPAUSE_READ) - { - } - } + for (uint16_t i = 0 ; i < n4 ; i++) if (tcp4xindex[i] < UINT16_MAX) + { + if (x[tcp4index[i]].revents & IOPAUSE_READ) + { + uint16_t n = MAXSAME ; + while (n-- && ntcp < maxtcp) + { + char ip[4] ; + uint16_t port ; + int fd = socket_accept4_nbcoe(tcp4fd[i], ip, &port) ; + if (fd == -1) + { + if (error_isagain(errno)) break ; + strerr_diefu4sys("create new TCP connection") ; + } + if (!clientaccess_ip4(ip)) { fd_close(fd) ; continue ; } + tcpconnection_new(0, i, fd, ip, port) ; + } + } + } + +#ifdef SKALIBS_IPV6_ENABLED + for (uint16_t i = 0 ; i < n6 ; i++) if (tcp6xindex[i] < UINT16_MAX) + { + if (x[tcp6index[i]].revents & IOPAUSE_READ) + { + uint16_t n = MAXSAME ; + while (n-- && ntcp < maxtcp) + { + char ip[16] ; + uint16_t port ; + int fd = socket_accept6_nbcoe(tcp6fd[i], ip, &port) ; + if (fd == -1) + { + if (error_isagain(errno)) break ; + strerr_diefu4sys("create new TCP connection") ; + } + if (!clientaccess_ip6(ip)) { fd_close(fd) ; continue ; } + tcpconnection_new(1, i, fd, ip, port) ; + } + } + } +#endif } } } if (flagwantfinaldump) cache_dump() ; - shibari_log_exit(verbosity, 0) ; +// shibari_log_exit(g->verbosity, 0) ; return 0 ; } diff --git a/src/cache/tcpconnection.c b/src/cache/tcpconnection.c new file mode 100644 index 0000000..d42060f --- /dev/null +++ b/src/cache/tcpconnection.c @@ -0,0 +1,12 @@ +/* ISC license. */ + +#include "shibari-cache-internal.h" + +void tcpconnection_drop (tcpconnection *tc) +{ +} + +int tcpconnection_new (uint8_t source, uint16_t i, int fd, char const *ip, uint16_t port) +{ + return 1 ; +} diff --git a/src/config/defaults.c b/src/config/defaults.c index 9222aa4..9a30c98 100644 --- a/src/config/defaults.c +++ b/src/config/defaults.c @@ -13,19 +13,20 @@ struct defaults_s #define REC(k, v, n) { .key = (k), .value = (v), .vlen = (n) } #define RECS(k, v) REC(k, (v), sizeof(v)) +#define RECU16(k, u) { .key = (k), .value = (char const [2]){ (u) >> 8 & 0xffu, (u) & 0xffu }, .vlen = 2 } #define RECU32(k, u) { .key = (k), .value = (char const [4]){ (u) >> 24 & 0xffu, (u) >> 16 & 0xffu, (u) >> 8 & 0xffu, (u) & 0xffu }, .vlen = 4 } #define RECU64(k, u) { .key = (k), .value = (char const [8]){ (u) >> 56 & 0xffu, (u) >> 48 & 0xffu, (u) >> 40 & 0xffu, (u) >> 32 & 0xffu, (u) >> 24 & 0xffu, (u) >> 16 & 0xffu, (u) >> 8 & 0xffu, (u) & 0xffu }, .vlen = 8 } static struct defaults_s const defaults[] = { - RECU32("G:logv", 1), - REC("G:listen4", "\177\0\0\1", 4), - REC("G:listen6", "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1", 16), - RECU32("G:maxtcp", 256), - RECU32("G:maxqueries", 1024), + RECU16("G:logv", 1), RECU64("G:cachesize", 1048576), + RECU16("G:maxtcp", 64), + RECU16("G:maxqueries", 256), RECU32("G:rtimeout", 0), RECU32("G:wtimeout", 0), + REC("G:listen4", "\177\0\0\1", 4), + REC("G:listen6", "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1", 16), REC("R4:", "\0\306\51\0\4" diff --git a/src/config/lexparse.c b/src/config/lexparse.c index 093acf7..7884fee 100644 --- a/src/config/lexparse.c +++ b/src/config/lexparse.c @@ -106,6 +106,16 @@ static int ipcmp (void const *a, void const *b, size_t n) } +static void parse_u16 (char const *s, size_t const *word, size_t n, char const *ifile, uint32_t line, char const *directive, char const *key) +{ + uint16_t u ; + char pack[2] ; + if (n != 1) dieparse(ifile, line, directive, n ? "too many arguments" : "too few arguments", 0, 0, 0) ; + if (!uint160_scan(s + word[0], &u)) dieparse(ifile, line, directive, "argument must be an integer", 0, 0, 0) ; + uint16_pack_big(pack, u) ; + adds_unique(ifile, line, directive, key, pack, 2) ; +} + static void parse_u32 (char const *s, size_t const *word, size_t n, char const *ifile, uint32_t line, char const *directive, char const *key) { uint32_t u ; @@ -225,16 +235,16 @@ static inline void process_line (char const *s, size_t const *word, size_t n, ch switch (directive->value) { case T_VERBOSITY : - parse_u32(s, word, n, ifile, line, "verbosity", "G:logv") ; + parse_u16(s, word, n, ifile, line, "verbosity", "G:logv") ; break ; case T_CACHESIZE : parse_u64(s, word, n, ifile, line, "cache_size", "G:cachesize") ; break ; case T_MAXTCP : - parse_u32(s, word, n, ifile, line, "maxtcp", "G:maxtcp") ; + parse_u16(s, word, n, ifile, line, "maxtcp", "G:maxtcp") ; break ; case T_MAXQUERIES : - parse_u32(s, word, n, ifile, line, "maxqueries", "G:maxqueries") ; + parse_u16(s, word, n, ifile, line, "maxqueries", "G:maxqueries") ; break ; case T_RTIMEOUT : parse_u32(s, word, n, ifile, line, "read_timeout", "G:rtimeout") ; diff --git a/src/include/shibari/cache.h b/src/include/shibari/cache.h deleted file mode 100644 index d0c6004..0000000 --- a/src/include/shibari/cache.h +++ /dev/null @@ -1,8 +0,0 @@ -/* ISC license. */ - -#ifndef SHIBARI_CACHE_H -#define SHIBARI_CACHE_H - -#include - -#endif diff --git a/src/include/shibari/client.h b/src/include/shibari/client.h deleted file mode 100644 index 03f8b1b..0000000 --- a/src/include/shibari/client.h +++ /dev/null @@ -1,6 +0,0 @@ -/* ISC license. */ - -#ifndef SHIBARI_CLIENT_H -#define SHIBARI_CLIENT_H - -#endif diff --git a/src/include/shibari/shibari.h b/src/include/shibari/shibari.h index a9242d3..123c13f 100644 --- a/src/include/shibari/shibari.h +++ b/src/include/shibari/shibari.h @@ -4,8 +4,6 @@ #define SHIBARI_H #include -#include -#include #include #endif -- cgit v1.2.3