libpktlab - The PacketLab Utility Library
pktlab.h
Go to the documentation of this file.
1// pktlab.h
2// General utilities for pktlab.
3//
4
10#ifndef _PKTLAB_H_
11#define _PKTLAB_H_
12
13#include <stdbool.h>
14#include <stddef.h>
15#include <stdint.h>
16#include <time.h>
17
18#include <arpa/inet.h>
19#include <sys/time.h>
20#include <sys/uio.h>
21
22//
23// GENERAL CONSTANTS
24//
25
26#define PKTLAB_IP4_ADDR_LEN PKTLAB_IPV4_WO_MSK_ADDR_LEN
27#define PKTLAB_IP4_MASK_LEN \
28 (PKTLAB_IPV4_W_MSK_ADDR_LEN-PKTLAB_IPV4_W_MSK_ADDR_LEN)
29#define PKTLAB_IP6_ADDR_LEN PKTLAB_IPV6_ADDR_LEN
30
31#define PKTLAB_IPV4_W_MSK_ADDR_LEN 8
32#define PKTLAB_IPV4_WO_MSK_ADDR_LEN 4
33#define PKTLAB_IPV6_ADDR_LEN 16
34
35#define PKTLAB_ADDRLEN_MAX PKTLAB_IP6_ADDR_LEN
36#define PKTLAB_PORTLEN_MAX 2
37
38#define PKTLAB_DEFAULT_ADDR_STR "127.0.0.1"
39
44#define PKTLAB_DEFAULT_EXP_PORT_STR "20556"
49#define PKTLAB_DEFAULT_PUB_PORT_STR "20556"
54#define PKTLAB_DEFAULT_SUB_PORT_STR "20557"
55
56#define PKTLAB_DEFAULT_SPEC_STR \
57 PKTLAB_DEFAULT_ADDR_STR ":" PKTLAB_DEFAULT_EXP_PORT_STR
58
63#define PKTLAB_MAX_SKT_CNT 0x100
64
69#define PKTLAB_MAX_LADDR_CNT 0x100
70
75#define PKTLAB_MAX_LDNSADDR_CNT 0x10
76
77#define PKTLAB_SHA256_DIGEST_LEN 32
78#define PKTLAB_ED25519_SIG_LEN 64
79
80//
81// TIME-RELATED DECLARATIONS & DEFINITIONS
82//
83
89typedef uint64_t pktlab_time_t;
90
91#define PKTLAB_TICKS_PER_SECOND UINT64_C(1000000000)
92#define PKTLAB_TIME_MAX UINT64_MAX
93
99
105static inline pktlab_time_t pktlab_time_sec(uint_fast32_t sec);
106
112static inline pktlab_time_t pktlab_timeval_to_time(const struct timeval * tv);
113
119static inline void pktlab_time_to_timeval(pktlab_time_t t, struct timeval * tv);
120
126static inline uint_fast32_t pktlab_time_to_unix_time(pktlab_time_t t);
127
133extern pktlab_time_t pktlab_tm_to_time(const struct tm * tm);
134
135//
136// XDESCR/DATTR-RELATED DECLARATIONS & DEFINITIONS
137//
138
139#define PKTLAB_XDESCR_DATTR_PAIR_SEP '='
140#define PKTLAB_XDESCR_DATTR_PAIR_END ';'
141
146#define PKTLAB_XDESCR_DATTR_NAMELEN_MIN 0x1
147
152#define PKTLAB_XDESCR_DATTR_NAMELEN_MAX 0x20
153
158#define PKTLAB_XDESCR_DATTR_VALUELEN_MIN 0x1
159
164#define PKTLAB_XDESCR_DATTR_VALUELEN_MAX 0x100
165
171 const char * name;
172 const char * value;
173 uint_fast32_t namelen;
174 uint_fast32_t valuelen;
175};
176
189 const char * xdescr, uint_fast32_t xdescrlen,
190 struct pktlab_xdescr_dattr_pair ** pairs, uint_fast32_t * paircnt);
206 const struct pktlab_xdescr_dattr_pair * pairs, uint_fast32_t paircnt,
207 char * buf, uint_fast32_t buflen, uint_fast32_t * used);
208
221 const char * dattr, uint_fast32_t dattrlen,
222 struct pktlab_xdescr_dattr_pair ** pairs, uint_fast32_t * paircnt);
237 const struct pktlab_xdescr_dattr_pair * pairs, uint_fast32_t paircnt,
238 char * buf, uint_fast32_t buflen, uint_fast32_t * used);
239
260 const char * xdescr, uint_fast32_t xdescrlen,
261 const char * dattr, uint_fast32_t dattrlen);
262
263//
264// CHANNEL-RELATED DECLARATIONS & DEFINITIONS
265//
266
267#define PKTLAB_CHANNELID_LEN_MIN 1
268#define PKTLAB_CHANNELID_LEN_MAX PKTLAB_SHA256_DIGEST_LEN
269
275 void * channel;
276 uint_fast32_t channellen;
277 struct pktlab_channel * next;
278};
279
294 const struct pktlab_channel * channels,
295 void ** chlistptr, uint_fast32_t * chlistlen);
310 const void * chlistptr, uint_fast32_t chlistlen,
311 struct pktlab_channel ** channels);
312
318 struct pktlab_channel * channels);
319
320//
321// FILTER-RELATED DECLARATIONS & DEFINITIONS
322//
323
330 PKTLAB_EBPF = 0x1
332
333// TODO: filter support
334//extern int pktlab_encode_filter (
335// int type, const void * filter, uint_fast32_t filterlen,
336// void * buf, uint_fast32_t * buflen);
337//extern int pktlab_decode_filter (
338// int type, const void * filter, uint_fast32_t filterlen,
339// void * buf, uint_fast32_t * buflen);
340
341//
342// URI-RELATED DECLARATIONS & DEFINITIONS
343//
344
353};
354
361 union {
362 struct {
363 const char * ptr;
364 uint_fast32_t len;
367 struct {
368 const char * host;
369 uint_fast32_t hostlen;
370 uint16_t port;
371 } uri;
372 };
373};
374
391 struct pktlab_uri * restrict uri_info,
392 const void * restrict ptr, uint_fast32_t len);
393
394//
395// ENDPOINT-VMEM-RELATED DECLARATIONS & DEFINITIONS
396//
397
398// endpoint vmem field address/len macros
399//
400
401// current pkt
402#define PKTLAB_VMEMADDR_CURPKT (0x0)
403#define PKTLAB_VMEMADDR_CURPKT_DATA (PKTLAB_VMEMADDR_CURPKT)
404#define PKTLAB_VMEMADDR_CURPKT_LEN (PKTLAB_VMEMADDR_CURPKT+0x1000000)
405#define PKTLAB_VMEMADDR_CURPKT_SKTID (PKTLAB_VMEMADDR_CURPKT+0x1000010)
406
407#define PKTLAB_VMEMADDR_CURPKT_SL (0x1000011)
408#define PKTLAB_VMEMADDR_CURPKT_DATA_FL (sizeof(uint8_t)*0x1000000)
409#define PKTLAB_VMEMADDR_CURPKT_LEN_FL (sizeof(uint32_t))
410#define PKTLAB_VMEMADDR_CURPKT_SKTID_FL (sizeof(uint8_t))
411
412// system param
413#define PKTLAB_VMEMADDR_SYSPARAM (0x10000000)
414#define PKTLAB_VMEMADDR_SYSPARAM_IP4NO (PKTLAB_VMEMADDR_SYSPARAM)
415#define PKTLAB_VMEMADDR_SYSPARAM_IP6NO (PKTLAB_VMEMADDR_SYSPARAM+0x1)
416#define PKTLAB_VMEMADDR_SYSPARAM_TRANSSUP (PKTLAB_VMEMADDR_SYSPARAM+0x2)
417#define PKTLAB_VMEMADDR_SYSPARAM_BUFMAXDUP (PKTLAB_VMEMADDR_SYSPARAM+0x6)
418#define PKTLAB_VMEMADDR_SYSPARAM_IP4LS (PKTLAB_VMEMADDR_SYSPARAM+0x100)
419#define PKTLAB_VMEMADDR_SYSPARAM_IP6LS (PKTLAB_VMEMADDR_SYSPARAM+0x1000)
420#define PKTLAB_VMEMADDR_SYSPARAM_TIME (PKTLAB_VMEMADDR_SYSPARAM+0x10000)
421#define PKTLAB_VMEMADDR_SYSPARAM_BUFMAX (PKTLAB_VMEMADDR_SYSPARAM+0x10010)
422#define PKTLAB_VMEMADDR_SYSPARAM_BUFUSED (PKTLAB_VMEMADDR_SYSPARAM+0x10014)
423#define PKTLAB_VMEMADDR_SYSPARAM_IP4DNSNO (PKTLAB_VMEMADDR_SYSPARAM+0x20000)
424#define PKTLAB_VMEMADDR_SYSPARAM_IP6DNSNO (PKTLAB_VMEMADDR_SYSPARAM+0x20001)
425#define PKTLAB_VMEMADDR_SYSPARAM_IP4DNSLS (PKTLAB_VMEMADDR_SYSPARAM+0x20010)
426#define PKTLAB_VMEMADDR_SYSPARAM_IP6DNSLS (PKTLAB_VMEMADDR_SYSPARAM+0x20100)
427#define PKTLAB_VMEMADDR_SYSPARAM_IP4HDRMOD (PKTLAB_VMEMADDR_SYSPARAM+0x20200)
428#define PKTLAB_VMEMADDR_SYSPARAM_IP6HDRMOD (PKTLAB_VMEMADDR_SYSPARAM+0x20210)
429#define PKTLAB_VMEMADDR_SYSPARAM_HOSTID (PKTLAB_VMEMADDR_SYSPARAM+0x30000)
430#define PKTLAB_VMEMADDR_SYSPARAM_LATLONG (PKTLAB_VMEMADDR_SYSPARAM+0x30100)
431#define PKTLAB_VMEMADDR_SYSPARAM_OSINFO (PKTLAB_VMEMADDR_SYSPARAM+0x30200)
432
433#define PKTLAB_VMEMADDR_SYSPARAM_SL (0x30400)
434#define PKTLAB_VMEMADDR_SYSPARAM_IP4NO_FL (sizeof(uint8_t))
435#define PKTLAB_VMEMADDR_SYSPARAM_IP6NO_FL (sizeof(uint8_t))
436#define PKTLAB_VMEMADDR_SYSPARAM_TRANSSUP_FL (sizeof(uint32_t))
437#define PKTLAB_VMEMADDR_SYSPARAM_IP4LS_FL (sizeof(uint8_t)*PKTLAB_IPV4_W_MSK_ADDR_LEN*0x100)
438#define PKTLAB_VMEMADDR_SYSPARAM_IP6LS_FL (sizeof(uint8_t)*PKTLAB_IPV6_ADDR_LEN*0x100)
439#define PKTLAB_VMEMADDR_SYSPARAM_TIME_FL (sizeof(pktlab_time_t))
440#define PKTLAB_VMEMADDR_SYSPARAM_BUFMAX_FL (sizeof(uint32_t))
441#define PKTLAB_VMEMADDR_SYSPARAM_BUFUSED_FL (sizeof(uint32_t))
442#define PKTLAB_VMEMADDR_SYSPARAM_IP4DNSNO_FL (sizeof(uint8_t))
443#define PKTLAB_VMEMADDR_SYSPARAM_IP6DNSNO_FL (sizeof(uint8_t))
444#define PKTLAB_VMEMADDR_SYSPARAM_IP4DNSLS_FL (sizeof(uint8_t)*PKTLAB_IPV4_WO_MSK_ADDR_LEN*0x10)
445#define PKTLAB_VMEMADDR_SYSPARAM_IP6DNSLS_FL (sizeof(uint8_t)*PKTLAB_IPV6_ADDR_LEN*0x10)
446#define PKTLAB_VMEMADDR_SYSPARAM_IP4HDRMOD_FL (sizeof(uint8_t)*0xC)
447#define PKTLAB_VMEMADDR_SYSPARAM_IP6HDRMOD_FL (sizeof(uint8_t)*0x8)
448#define PKTLAB_VMEMADDR_SYSPARAM_HOSTID_FL (sizeof(char)*0x100)
449#define PKTLAB_VMEMADDR_SYSPARAM_LATLONG_FL (sizeof(char)*0x40)
450#define PKTLAB_VMEMADDR_SYSPARAM_OSINFO_FL (sizeof(char)*0x200)
451
452// skt info
453#define PKTLAB_VMEMADDR_SKTINFO (0x20000000)
454#define PKTLAB_VMEMADDR_SKTINFO_BLKLEN (0x400)
455#define PKTLAB_VMEMADDR_SKTINFO_FAMILY (0x0)
456#define PKTLAB_VMEMADDR_SKTINFO_PROTO (0x1)
457#define PKTLAB_VMEMADDR_SKTINFO_STAT (0x2)
458#define PKTLAB_VMEMADDR_SKTINFO_LADDR (0x10)
459#define PKTLAB_VMEMADDR_SKTINFO_RADDR (0x20)
460#define PKTLAB_VMEMADDR_SKTINFO_LPORT (0x30)
461#define PKTLAB_VMEMADDR_SKTINFO_RPORT (0x32)
462#define PKTLAB_VMEMADDR_SKTINFO_RBUFSZ (0x40)
463#define PKTLAB_VMEMADDR_SKTINFO_RBUFUSED (0x44)
464#define PKTLAB_VMEMADDR_SKTINFO_DROPSTAT (0x50)
465#define PKTLAB_VMEMADDR_SKTINFO_NSENDERR (0x60)
466#define PKTLAB_VMEMADDR_SKTINFO_NSENDERRTAG (0x61)
467#define PKTLAB_VMEMADDR_SKTINFO_NOTIFMASK (0x70)
468#define PKTLAB_VMEMADDR_SKTINFO_CTFL (0x100)
469
470#define PKTLAB_VMEMADDR_SKTINFO_SL (PKTLAB_VMEMADDR_SKTINFO_BLKLEN*0x100)
471#define PKTLAB_VMEMADDR_SKTINFO_PROTO_FL (sizeof(uint8_t))
472#define PKTLAB_VMEMADDR_SKTINFO_STAT_FL (sizeof(int8_t))
473#define PKTLAB_VMEMADDR_SKTINFO_LADDR_FL (sizeof(uint8_t)*PKTLAB_ADDRLEN_MAX)
474#define PKTLAB_VMEMADDR_SKTINFO_RADDR_FL (sizeof(uint8_t)*PKTLAB_ADDRLEN_MAX)
475#define PKTLAB_VMEMADDR_SKTINFO_LPORT_FL (sizeof(uint16_t))
476#define PKTLAB_VMEMADDR_SKTINFO_RPORT_FL (sizeof(uint16_t))
477#define PKTLAB_VMEMADDR_SKTINFO_RBUFSZ_FL (sizeof(uint32_t))
478#define PKTLAB_VMEMADDR_SKTINFO_RBUFUSED_FL (sizeof(uint32_t))
479#define PKTLAB_VMEMADDR_SKTINFO_DROPSTAT_FL (sizeof(uint32_t)*2)
480#define PKTLAB_VMEMADDR_SKTINFO_NSENDERR_FL (sizeof(int8_t))
481#define PKTLAB_VMEMADDR_SKTINFO_NSENDERRTAG_FL (sizeof(uint16_t))
482#define PKTLAB_VMEMADDR_SKTINFO_NOTIFMASK_FL (sizeof(uint16_t))
483#define PKTLAB_VMEMADDR_SKTINFO_CTFL_FL (sizeof(uint8_t)*0x80)
484
485// other segments
486#define PKTLAB_VMEMADDR_NSENDTSTP (0x30000000)
487#define PKTLAB_VMEMADDR_MONSCRATCH (0x40000000)
488#define PKTLAB_VMEMADDR_MONPERSIST (0x50000000)
489
490#define PKTLAB_VMEMADDR_NSENDTSTP_SL (sizeof(pktlab_time_t)*0x10000)
491#define PKTLAB_VMEMADDR_MONSCRATCH_SL (sizeof(uint8_t)*0x10000000)
492#define PKTLAB_VMEMADDR_MONPERSIST_SL (sizeof(uint8_t)*0x10000000)
493
494// endpoint supported (trans)proto field (TRANSSUP) proto bit indices
495//
496
497#define PKTLAB_RAW_SUP_BIT_INDX 0
498#define PKTLAB_TCP_SUP_BIT_INDX 1
499#define PKTLAB_UDP_SUP_BIT_INDX 2
500
501// endpoint raw socket pkts OS header field modification behavior (IP4HDRMOD/IP6HDRMOD) values
502//
503
504enum pktlab_rawhdr_info {
505 PKTLAB_RAWHDR_NOCHG = 0,
506 PKTLAB_RAWHDR_CHG = 1,
507 PKTLAB_RAWHDR_0FILL = 2
508};
509
510// endpoint skt info skt state field (STAT) values
511//
512
513enum pktlab_socket_state {
514 PKTLAB_SKTST_FREE = 0,
515 PKTLAB_SKTST_OPENING = 1,
516 PKTLAB_SKTST_OPEN = 2,
517 PKTLAB_SKTST_EOF = 3,
518 PKTLAB_SKTST_WFIN = 4,
519 PKTLAB_SKTST_END = 5,
520 PKTLAB_SKTST_REFUSED = -1,
521 PKTLAB_SKTST_RESET = -2,
522 PKTLAB_SKTST_TIMEDOUT = -3,
523 PKTLAB_SKTST_UNREACH = -4,
524 PKTLAB_SKTST_UNKFAULT = -128
525};
526
527// endpoint skt info skt nsend err field (NSENDERR) values
528//
529
530enum pktlab_nsend_err {
531 PKTLAB_NSEND_SUCCESS = 0,
532 PKTLAB_NSEND_NORES = 1,
533 PKTLAB_NSEND_BADPKT = 2,
534 PKTLAB_NSEND_TIMEDOUT = 3,
535 PKTLAB_NSEND_RESET = 4,
536 PKTLAB_NSEND_UNREACH = 5,
537 PKTLAB_NSEND_WFIN = 6,
538 PKTLAB_NSEND_UNKFAULT = 127
539};
540
541// endpoint skt info skt notification mask (NOTIFMASK) indices
542//
543
544#define PKTLAB_NOTIFMASK_NTAG (0x1 << 1)
545#define PKTLAB_NOTIFMASK_NSTAT (0x1 << 2)
546#define PKTLAB_NOTIFMASK_NDATA (0x1 << 3)
547#define PKTLAB_NOTIFMASK_NDROP (0x1 << 4)
548
549// endpoint vmem impl. utilities
550//
551
552struct pktlab_vmem_region; // forward declaration
553
554typedef void (*pktlab_vmem_reader_t) (
555 const struct pktlab_vmem_region * restrict rgn,
556 uint_fast32_t off, uint_fast32_t len, void * restrict dst);
557
558typedef void (*pktlab_vmem_writer_t) (
559 const struct pktlab_vmem_region * restrict rgn,
560 uint_fast32_t off, uint_fast32_t len, const void * restrict src);
561
563 uint32_t start, end;
564 pktlab_vmem_reader_t read;
565 pktlab_vmem_writer_t write;
566 uintptr_t aux;
567};
568
569extern void pktlab_vmem_read (
570 const struct pktlab_vmem_region * restrict rgn, uint_fast32_t rgncnt,
571 uint_fast32_t addr, uint_fast32_t len, void * restrict dst);
572
573extern void pktlab_vmem_write (
574 const struct pktlab_vmem_region * restrict rgn, uint_fast32_t rgncnt,
575 uint_fast32_t addr, uint_fast32_t len, const void * restrict src);
576
577extern void pktlab_buffer_reader (
578 const struct pktlab_vmem_region * restrict rgn,
579 uint_fast32_t addr, uint_fast32_t len, void * restrict dst);
580
581extern void pktlab_buffer_writer (
582 const struct pktlab_vmem_region * restrict rgn,
583 uint_fast32_t addr, uint_fast32_t len, const void * restrict src);
584
585//
586// MESSAGE-RELATED DECLARATIONS & DEFINITIONS
587//
588
589// message length restriction values
590//
591
592#define PKTLAB_MREAD_MAX UINT32_C(0x10000)
593#define PKTLAB_NDATA_MAX UINT32_C(0x10000)
594
595// message family and proto constants
596//
597
610#define PKTLAB_IP4_PROTO 0x4
611#define PKTLAB_IP6_PROTO 0x6
612
631#define PKTLAB_RAW_PROTO 0x00
632#define PKTLAB_TCP_PROTO 0x06
633#define PKTLAB_UDP_PROTO 0x11
634
635// nctl command type
636//
637
645#define PKTLAB_NCTL_TCP_FIN 0x1
646
647// nstat code values
648//
649
670#define PKTLAB_TCPEV_ESTABLISHED 0x0
671#define PKTLAB_TCPEV_RESET 0x1
672#define PKTLAB_TCPEV_TIMEOUT 0x2
673#define PKTLAB_TCPEV_PEERCLOSED 0x3
674#define PKTLAB_TCPEV_UNKNOWN 0xFF
675
676// message type values
677//
678
686 PKTLAB_UNDEF_MESSAGE = 0x00,
687
688 // Requests 0x20 - 0x3F
689 PKTLAB_CDATA_MESSAGE = 0x20,
690 PKTLAB_START_MESSAGE = 0x21,
691 PKTLAB_END_MESSAGE = 0x22,
692 PKTLAB_YIELD_MESSAGE = 0X23,
693 PKTLAB_CONT_MESSAGE = 0X24,
694
695 PKTLAB_MREAD_MESSAGE = 0x28,
696 PKTLAB_MWRITE_MESSAGE = 0x29,
697 PKTLAB_NOPEN_MESSAGE = 0x2A,
698 PKTLAB_NCLOSE_MESSAGE = 0x2B,
699 PKTLAB_NSEND_MESSAGE = 0x2C,
700 PKTLAB_NCAP_MESSAGE = 0x2D,
701 PKTLAB_NCTL_MESSAGE = 0x2E,
702
703 // publisher to broker request
704 PKTLAB_XCERT_MESSAGE = 0x30,
705 PKTLAB_XPUB_MESSAGE = 0x31,
706
707 // endpoint to broker request
708 PKTLAB_XSUB_MESSAGE = 0x38,
709
710 // Responses 0x40 - 0x5F
711 PKTLAB_RESULT_MESSAGE = 0x40,
712 PKTLAB_MDATA_MESSAGE = 0x41,
713
714 // Notifications 0x60 - 0x7F
715 PKTLAB_NTAG_MESSAGE = 0x60,
716 PKTLAB_NSTAT_MESSAGE = 0x61,
717 PKTLAB_NDATA_MESSAGE = 0x62,
718 PKTLAB_NDROP_MESSAGE = 0x63,
719
720 PKTLAB_SUSPD_MESSAGE = 0x68,
721 PKTLAB_RESUMD_MESSAGE = 0x69,
722
723 PKTLAB_XNOTIFY_MESSAGE = 0x70,
724
725 // Proxy requests 0x80 - 0x8F
726 PKTLAB_XREG_MESSAGE = 0x80,
727
728 // Private Use 0x90 - 0xff
729};
730
731// result message errid values
732//
733
741 PKTLAB_SUCCESS = 0,
742
743 PKTLAB_ECTLBADMSG = 0x10,
744 PKTLAB_ECTLNOTSUP = 0x11,
745
746 PKTLAB_ECRTNOMATCH = 0x20,
747 PKTLAB_ECRTATTACH = 0x21,
748 PKTLAB_ECRTBADFRM = 0x22,
749 PKTLAB_ECRTNOSPACE = 0x23,
750
751 PKTLAB_ESYSNOBUFS = 0x30,
752 PKTLAB_ESYSNOPERM = 0x31,
753 PKTLAB_ESKTINUSE = 0x32,
754 PKTLAB_ESKTNOTOPEN = 0x33,
755 PKTLAB_ESKTNOPRFAM = 0x34,
756 PKTLAB_ESKTNOPROTO = 0x35,
757 PKTLAB_ESKTNOADDR = 0x36,
758 PKTLAB_ESKTNOMATCH = 0x37,
759 PKTLAB_ESKTBADFILT = 0x38,
760
761 PKTLAB_ETCPNOPORT = 0x40,
762 PKTLAB_ETCPNOSEND = 0x41,
763 PKTLAB_EUDPNOPORT = 0x42,
764
765 PKTLAB_EPUBBADCH = 0x50,
766 PKTLAB_EPUBBADADDR = 0x51,
767 PKTLAB_EPUBBADENDT = 0x52,
768 PKTLAB_EPUBBADPR = 0x53,
769 PKTLAB_EPUBBADXD = 0x54,
770
771 PKTLAB_ESUBBADCH = 0x60,
772
773 PKTLAB_EUNKFAULT = 0xFFFF
774};
775
776// message value structure
777//
778
791 enum pktlab_message_type type;
792
793 union {
794 struct {
795 const void * ptr;
796 uint32_t len;
797 bool malformed;
798 } raw;
799
800 struct {
801 uint32_t hint;
802 const void* data;
803 uint32_t len;
804 } cdata;
805
806 struct {
807 } start;
808
809 struct {
810 } end;
811
812 struct {
813 pktlab_time_t rhint;
814 } yield;
815
816 struct {
817 } cont;
818
819 struct {
820 uint16_t errid;
821 } result;
822
823 struct {
824 uint32_t addr, len;
825 const void * ptr;
826 } mdata;
827
828 struct {
829 uint32_t addr, len;
830 } mread;
831
832 struct {
833 uint32_t addr, len;
834 const void * ptr;
835 } mwrite;
836
837 struct {
838 uint8_t sktid;
839 uint8_t family;
840 uint8_t proto;
841 uint32_t rbufsz;
842
843 uint8_t laddrlen;
844 uint8_t lportlen;
845 uint8_t raddrlen;
846 uint8_t rportlen;
847 const void* laddrptr;
848 const void* lportptr;
849 const void* raddrptr;
850 const void* rportptr;
851 } nopen;
852
853 struct {
854 uint8_t sktid;
855 } nclose;
856
857 struct {
858 uint8_t sktid;
859 uint8_t family;
860 uint8_t proto;
861 pktlab_time_t time;
862 uint16_t tag;
863 union {
864 struct {
865 uint8_t raddrlen;
866 const void* raddrptr;
867 uint8_t rportlen;
868 const void* rportptr;
869 } udp;
870 };
871 uint32_t len;
872 const void * ptr;
873 } nsend;
874
875 struct {
876 uint8_t sktid;
877 uint8_t family;
878 uint8_t proto;
879 pktlab_time_t endtime;
880 union {
881 struct {
882 uint8_t ftype;
883 const void* filter;
884 uint32_t filterlen;
885 } raw;
886 };
887 } ncap;
888
889 struct {
890 uint8_t sktid;
891 uint8_t family;
892 uint8_t proto;
893 pktlab_time_t time;
894 union {
895 struct {
896 uint8_t command;
897 } tcp;
898 };
899 } nctl;
900
901 struct {
902 uint8_t sktid;
903 uint16_t tag;
904 pktlab_time_t time;
905 uint16_t errid;
906 } ntag;
907
908 struct {
909 uint8_t sktid;
910 uint8_t family;
911 uint8_t proto;
912 pktlab_time_t time;
913 uint8_t code;
914 union {
915 struct {
916 uint8_t raddrlen;
917 const void* raddrptr;
918 uint8_t rportlen;
919 const void* rportptr;
920 } tcp_established;
921 };
922 } nstat;
923
924 struct {
925 uint8_t sktid;
926 uint8_t family;
927 uint8_t proto;
928 pktlab_time_t time;
929 union {
930 struct {
931 uint8_t raddrlen;
932 const void* raddrptr;
933 uint8_t rportlen;
934 const void* rportptr;
935 } udp;
936 };
937 const void * ptr;
938 uint32_t len;
939 } ndata;
940
941 struct {
942 uint8_t sktid;
943 uint8_t family;
944 uint8_t proto;
945 pktlab_time_t tfirst, tlast;
946 uint32_t unitcnt, bytecnt;
947 } ndrop;
948
949 struct {
950 const void * derptr;
951 uint32_t derlen;
952 } xcert;
953
954 struct {
955 const void * chlistptr;
956 uint32_t chlistlen;
957 const void * eopkey;
958 const void * xdescrptr;
959 uint32_t xdescrlen;
960 } xpub;
961
962 struct {
963 const void * chlistptr;
964 uint32_t chlistlen;
965 const void * eopkey;
966 const void * dattrptr;
967 uint32_t dattrlen;
968 } xsub;
969
970 struct {
971 } suspd;
972
973 struct {
974 } resumd;
975
976 struct {
977 const void * channelptr;
978 uint8_t channellen;
979 const void * xdescrptr;
980 uint32_t xdescrlen;
981 } xnotify;
982
983 struct {
984 const void * snikeyptr;
985 uint32_t snikeylen;
986 } xreg;
987 };
988};
989
990// message encoding/decoding utilities
991//
992
997#define PKTLAB_HLEN 4
998
1013 struct pktlab_message * restrict msg,
1014 const void * restrict ptr, size_t len);
1015
1020#define PKTLAB_ENCODE_IOVCNT 5
1025#define PKTLAB_ENCODE_BUFSZ (PKTLAB_HLEN+32) // note: ndrop msg is 27 bytes long
1026
1040 const struct pktlab_message * restrict msg,
1041 void * restrict buf, struct iovec * restrict iov);
1042
1043// Functions of the form create_XXX_message create a message of the given
1044// type with the given parameters. They combine memory allocation and
1045// pktlab_message structure initialization into one call.
1046
1055
1056//
1057// READER-RELATED DECLARATIONS & DEFINITIONS
1058//
1059
1064struct pktlab_reader; // opaque
1065
1071typedef ssize_t (*pktlab_read_t) (void * aux, void * buf, size_t buflen);
1072
1083extern struct pktlab_reader * pktlab_create_reader(pktlab_read_t read, void * aux);
1090extern void pktlab_close_reader(struct pktlab_reader * r);
1096extern void * pktlab_reader_readaux(const struct pktlab_reader * r);
1097
1116 struct pktlab_reader * restrict r,
1117 struct pktlab_message ** restrict msgptr);
1118
1119//
1120// WRITER-RELATED DECLARATIONS & DEFINITIONS
1121//
1122
1127struct pktlab_writer; // opaque
1128
1134typedef ssize_t (*pktlab_write_t) (void * aux, const void * buf, size_t nbyte);
1135
1146extern struct pktlab_writer * pktlab_create_writer(pktlab_write_t write, void * aux);
1153extern void pktlab_close_writer(struct pktlab_writer * w);
1164extern int pktlab_flush_writer(struct pktlab_writer * w);
1172extern size_t pktlab_writer_unsent(const struct pktlab_writer * w);
1173
1179extern void * pktlab_writer_writeaux(const struct pktlab_writer * w);
1180
1197 struct pktlab_writer * restrict w,
1198 const struct pktlab_message * restrict msg);
1199
1200//
1201// MESSAGE-FORMATING FUNCTION DECLARATIONS
1202//
1203
1204// TODO: formating support
1205// The pktlab_format_message function formats a message as an ASCII string.
1206// On entry, buf must be a pointer to a buffer of size bufsz and msg much
1207// be a valid message. On return, buf will contain up to bufsz bytes of the
1208// textual representation of the message. The string is terminating with a
1209// '\0' character (unless bufsz == 0). The number of characters that would
1210// be necessary to represent the message completely (excluding the
1211// terminaing '\0' character) is returned.
1212
1213// extern int pktlab_format_message (
1214// char * restrict buf, size_t bufsz,
1215// const struct pktlab_message * restrict msg);
1216
1217// extern int pktlab_parse_message (
1218// const char * restrict str,
1219// struct pktlab_message * restrict msg, void ** restrict data);
1220
1221// extern int pktlab_print_message (
1222// FILE * restrict file, const struct pktlab_message * restrict msg);
1223
1224// extern int pktlab_scan_message (
1225// FILE * restrict file,
1226// struct pktlab_message * restrict msg, void ** restrict data);
1227
1228// extern const char * pktlab_status_name(enum pktlab_status status);
1229// extern const char * pktlab_status_descr(enum pktlab_status status);
1230// extern const char * pktlab_msgtype_name(enum pktlab_message_type type);
1231
1237extern const char * pktlab_sktstate_name(enum pktlab_socket_state state);
1238
1239//
1240// KEY-RELATED DECLARATIONS & DEFINITIONS
1241//
1242
1249#define PKTLAB_PUBLICKEY_LEN 32
1256#define PKTLAB_PRIVATEKEY_LEN 32
1263#define PKTLAB_KEYID_LEN PKTLAB_SHA256_DIGEST_LEN
1270#define PKTLAB_SIGNATURE_LEN PKTLAB_ED25519_SIG_LEN
1271
1278struct pktlab_publickey; // opaque
1279
1300 const char * pem, uint_fast32_t pemlen,
1301 struct pktlab_publickey * k);
1315 const uint8_t * der, uint_fast32_t derlen,
1316 struct pktlab_publickey * k);
1330 const uint8_t * bytes, uint_fast32_t len,
1331 struct pktlab_publickey * k);
1348 const struct pktlab_publickey * k,
1349 void * buf, uint_fast32_t buflen);
1350
1359 const struct pktlab_publickey * k,
1360 void * buf, uint_fast32_t buflen);
1361
1368struct pktlab_privatekey; // opaque
1369
1391 const char * pem, uint_fast32_t pemlen,
1392 const char * passphrase, struct pktlab_privatekey * k);
1407 const uint8_t * der, uint_fast32_t derlen,
1408 const char * passphrase, struct pktlab_privatekey * k);
1422 const uint8_t * bytes, uint_fast32_t len,
1423 struct pktlab_privatekey * k);
1440 const struct pktlab_privatekey * k,
1441 void * buf, uint_fast32_t buflen);
1442
1449 const struct pktlab_privatekey * k);
1450
1451//
1452// CERTIFICATE-RELATED DECLARATIONS & DEFINITIONS
1453//
1454
1460 PKTLAB_CERT_SUBCMD = 0,
1461 PKTLAB_CERT_PUBCMD = 1,
1462 PKTLAB_CERT_EXPPRIV = 2,
1463 PKTLAB_CERT_DELPRIV = 3,
1464 PKTLAB_CERT_AGENT = 4,
1465 PKTLAB_CERT_UNKNOWN = 127
1466};
1467
1476#define PKTLAB_DEL_TYPE_EXPPRIV 0x1
1477#define PKTLAB_DEL_TYPE_REPPRIV 0x2
1478
1491#define PKTLAB_FILTER_DIGEST_LEN PKTLAB_SHA256_DIGEST_LEN
1492#define PKTLAB_MONITOR_DIGEST_LEN PKTLAB_SHA256_DIGEST_LEN
1493
1522
1528 enum pktlab_cert_type cert_type;
1529
1530 uint8_t * serialno;
1531 uint32_t serialno_len;
1532
1533 pktlab_time_t valid_not_before;
1534 pktlab_time_t valid_not_after;
1535
1536 uint8_t publickey[PKTLAB_PUBLICKEY_LEN];
1537
1538 uint8_t authority_key_id[PKTLAB_KEYID_LEN];
1539 uint8_t subject_key_id[PKTLAB_KEYID_LEN];
1540
1541 char * cert_desc;
1542
1543 union {
1544 struct {
1545 char * priority;
1546 uint8_t * filter_digests;
1547 uint8_t * monitor_digests;
1548 uint_fast32_t ftcnt;
1549 uint_fast32_t mtcnt;
1550 int_fast32_t pathlen;
1551 } exppriv;
1552
1553 struct {
1554 char * priority;
1555 uint8_t * filter_digests;
1556 uint8_t * monitor_digests;
1557 uint_fast32_t ftcnt;
1558 uint_fast32_t mtcnt;
1559 int_fast32_t pathlen;
1560 uint8_t del_type;
1561 } delpriv;
1562
1563 struct {
1564 char * priority;
1565 } pubcmd;
1566
1567 // no subcmd struct
1568 // no agent struct
1569 };
1570};
1571
1572// TODO: register OID with IANA at https://pen.iana.org/pen/PenApplication.page; also fix this
1573// pktlab extension OIDs
1574#define PKTLAB_EXT_CERT_TYPE "1.2.3.1"
1575#define PKTLAB_EXT_CERT_DESCRIPTION "1.2.3.3"
1576#define PKTLAB_EXT_FILTER_DIGESTS "1.2.3.5"
1577#define PKTLAB_EXT_MONITOR_DIGESTS "1.2.3.6"
1578#define PKTLAB_EXT_PRIORITY "1.2.3.7"
1579#define PKTLAB_EXT_DEL_TYPE "1.2.3.8"
1580
1581// pktlab certificate type string (present in cert)
1582#define PKTLAB_CERTTYPE_STR_SUBCMD "subcmd"
1583#define PKTLAB_CERTTYPE_STR_PUBCMD "pubcmd"
1584#define PKTLAB_CERTTYPE_STR_EXPPRIV "exppriv"
1585#define PKTLAB_CERTTYPE_STR_DELPRIV "delpriv"
1586#define PKTLAB_CERTTYPE_STR_AGENT "agent"
1587#define PKTLAB_CERTTYPE_STR_UNKNOWN "unknown"
1588
1589// utilities for loading and decoding pktlab certificates
1590//
1591
1596struct pktlab_certificate; // opaque
1597
1605
1619 const char * pem, uint_fast32_t pemlen,
1620 struct pktlab_certificate * cert);
1633 const uint8_t * der, uint_fast32_t derlen,
1634 struct pktlab_certificate * cert);
1646 const struct pktlab_certificate * cert,
1647 void ** der, uint_fast32_t * derlen);
1658 const struct pktlab_certificate * cert,
1659 const struct pktlab_publickey * signkey,
1660 struct pktlab_cert_info ** ptr);
1670 const struct pktlab_certificate * cert,
1671 const struct pktlab_publickey * signkey);
1679extern int pktlab_cleanup_cert(struct pktlab_certificate * cert);
1680
1686extern const char * pktlab_cert_type_name(int cert_type);
1692extern int pktlab_cert_type_name_to_id(const char * name);
1693
1701 const struct pktlab_certificate * agent_cert,
1702 uint8_t * agent_pubkey);
1703
1704// utilities for verifying pktlab certificate chains
1705//
1706
1717 PKTLAB_NO_VERIFY = 127
1719
1740
1757 int auth_mode,
1758 struct pktlab_certificate ** cert_ls,
1759 struct pktlab_publickey ** root_ls,
1760 struct pktlab_certificate *** verified_cert_ls,
1761 uint_fast32_t certnum,
1762 uint_fast32_t rootnum,
1763 uint_fast32_t * verified_certnum,
1764 uint_fast32_t * used_root_indx);
1765
1766// utilities for extracting setup info from cert chain
1767//
1768
1776 PKTLAB_PARSE_CHAIN_SUCCESS = 0,
1777 PKTLAB_PARSE_CHAIN_INVAL = 1,
1778 PKTLAB_PARSE_CHAIN_BAD_CHAIN = 2,
1779 PKTLAB_PARSE_CHAIN_BAD_KEY = 3,
1780 PKTLAB_PARSE_CHAIN_UNKNOWN_FAULT = 127,
1781};
1782
1798 struct pktlab_certificate ** cert_ls,
1799 uint_fast32_t certnum, const uint8_t * endpoint_key,
1800 struct pktlab_publickey * root_eop_key,
1801 uint8_t ** subable_channels, uint_fast32_t * channelnum);
1802
1823 struct pktlab_certificate ** cert_ls,
1824 uint_fast32_t certnum,
1825 const uint8_t * controller_key,
1826 struct pktlab_publickey * trusted_eop_key,
1827 uint8_t ** ftdigests, uint_fast32_t * ftcnt,
1828 uint8_t ** mtdigests, uint_fast32_t * mtcnt,
1829 char *** priorities, uint_fast32_t * pcnt,
1830 uint8_t * subable_channel);
1831
1832//
1833// BYTE/ADDRESS INVARIANT MEMORY ACCESS FUNCTION DECLARATIONS
1834//
1835
1843static inline uint_fast8_t pktlab_get8(const void * ptr);
1844static inline uint_fast16_t pktlab_get16b(const void * ptr);
1845static inline uint_fast16_t pktlab_get16l(const void * ptr);
1846static inline uint_fast32_t pktlab_get24b(const void * ptr);
1847static inline uint_fast32_t pktlab_get24l(const void * ptr);
1848static inline uint_fast32_t pktlab_get32b(const void * ptr);
1849static inline uint_fast32_t pktlab_get32l(const void * ptr);
1850static inline uint_fast64_t pktlab_get64b(const void * ptr);
1851static inline uint_fast64_t pktlab_get64l(const void * ptr);
1852
1853#define pktlab_get16n pktlab_get16b
1854#define pktlab_get24n pktlab_get24b
1855#define pktlab_get32n pktlab_get32b
1856#define pktlab_get64n pktlab_get64b
1857
1865static inline void pktlab_set8(void * ptr, uint_fast8_t val);
1866static inline void pktlab_set16b(void * ptr, uint_fast16_t val);
1867static inline void pktlab_set16l(void * ptr, uint_fast16_t val);
1868static inline void pktlab_set24b(void * ptr, uint_fast32_t val);
1869static inline void pktlab_set24l(void * ptr, uint_fast32_t val);
1870static inline void pktlab_set32b(void * ptr, uint_fast32_t val);
1871static inline void pktlab_set32l(void * ptr, uint_fast32_t val);
1872static inline void pktlab_set64b(void * ptr, uint_fast64_t val);
1873static inline void pktlab_set64l(void * ptr, uint_fast64_t val);
1874
1875#define pktlab_set16n pktlab_set16b
1876#define pktlab_set24n pktlab_set24b
1877#define pktlab_set32n pktlab_set32b
1878#define pktlab_set64n pktlab_set64b
1879
1880//
1881// BYTE ORDER CONVERSION FUNCTION DECLARATIONS
1882//
1883
1891static inline uint_fast16_t pktlab_hton16(uint_fast16_t x);
1892static inline uint_fast32_t pktlab_hton32(uint_fast32_t x);
1893static inline uint_fast64_t pktlab_hton64(uint_fast64_t x);
1894static inline uint_fast16_t pktlab_ntoh16(uint_fast16_t x);
1895static inline uint_fast32_t pktlab_ntoh32(uint_fast32_t x);
1896static inline uint_fast64_t pktlab_ntoh64(uint_fast64_t x);
1897
1898//
1899// BIT ACCESS FUNCTION DECLARATIONS
1900//
1901
1911static inline bool pktlab_getbit8(uint_fast8_t bits, uint_fast8_t pos);
1912static inline bool pktlab_getbit16(uint_fast16_t bits, uint_fast8_t pos);
1913static inline bool pktlab_getbit32(uint_fast32_t bits, uint_fast8_t pos);
1914static inline bool pktlab_getbit64(uint_fast64_t bits, uint_fast8_t pos);
1915
1925static inline uint_fast8_t pktlab_setbit8(uint_fast8_t bits, uint_fast8_t pos);
1926static inline uint_fast16_t pktlab_setbit16(uint_fast16_t bits, uint_fast8_t pos);
1927static inline uint_fast32_t pktlab_setbit32(uint_fast32_t bits, uint_fast8_t pos);
1928static inline uint_fast64_t pktlab_setbit64(uint_fast64_t bits, uint_fast8_t pos);
1929
1939static inline uint_fast8_t pktlab_clrbit8(uint_fast8_t bits, uint_fast8_t pos);
1940static inline uint_fast16_t pktlab_clrbit16(uint_fast16_t bits, uint_fast8_t pos);
1941static inline uint_fast32_t pktlab_clrbit32(uint_fast32_t bits, uint_fast8_t pos);
1942static inline uint_fast64_t pktlab_clrbit64(uint_fast64_t bits, uint_fast8_t pos);
1943
1944//
1945// INLINE FUNCTION DEFINITIONS
1946//
1947
1948static inline pktlab_time_t pktlab_time_sec(uint_fast32_t sec) {
1949 return (uint64_t) sec * PKTLAB_TICKS_PER_SECOND;
1950}
1951
1952static inline pktlab_time_t pktlab_timeval_to_time(const struct timeval * tv) {
1953 return (uint64_t) tv->tv_sec * PKTLAB_TICKS_PER_SECOND
1954 + (uint64_t) tv->tv_usec * PKTLAB_TICKS_PER_SECOND / 1000000;
1955}
1956
1957static inline void pktlab_time_to_timeval (
1958 pktlab_time_t t, struct timeval * tv)
1959{
1960 const uint64_t t_us = t / (PKTLAB_TICKS_PER_SECOND / 1000000);
1961 tv->tv_sec = t_us / 1000000;
1962 tv->tv_usec = t_us % 1000000;
1963}
1964
1965static inline uint_fast32_t pktlab_time_to_unix_time(pktlab_time_t t) {
1966 return t / PKTLAB_TICKS_PER_SECOND;
1967}
1968
1969static inline uint_fast8_t pktlab_get8(const void * ptr) {
1970 return *(const uint8_t*)ptr;
1971}
1972
1973static inline uint_fast16_t pktlab_get16b(const void * ptr) {
1974 const uint8_t * u8ptr = ptr;
1975 uint_fast16_t val;
1976
1977 val = (uint_fast16_t) u8ptr[0] << 8;
1978 val |= u8ptr[1];
1979 return val;
1980}
1981
1982static inline uint_fast16_t pktlab_get16l(const void * ptr) {
1983 const uint8_t * u8ptr = ptr;
1984 uint_fast16_t val;
1985
1986 val = (uint_fast16_t) u8ptr[1] << 8;
1987 val |= u8ptr[0];
1988 return val;
1989}
1990
1991static inline uint_fast32_t pktlab_get24b(const void * ptr) {
1992 const uint8_t * u8ptr = ptr;
1993 uint_fast32_t val;
1994
1995 val = (uint_fast32_t) u8ptr[0] << 16;
1996 val |= (uint_fast16_t) u8ptr[1] << 8;
1997 val |= u8ptr[2];
1998 return val;
1999}
2000
2001static inline uint_fast32_t pktlab_get24l(const void * ptr) {
2002 const uint8_t * u8ptr = ptr;
2003 uint_fast32_t val;
2004
2005 val = (uint_fast32_t) u8ptr[2] << 16;
2006 val |= (uint_fast16_t) u8ptr[1] << 8;
2007 val |= u8ptr[0];
2008 return val;
2009}
2010
2011static inline uint_fast32_t pktlab_get32b(const void * ptr) {
2012 uint_fast32_t val;
2013
2014 val = (uint_fast32_t) pktlab_get16b(ptr) << 16;
2015 val |= pktlab_get16b(ptr+2);
2016 return val;
2017}
2018
2019static inline uint_fast32_t pktlab_get32l(const void * ptr) {
2020 uint_fast32_t val;
2021
2022 val = (uint_fast32_t) pktlab_get16l(ptr+2) << 16;
2023 val |= pktlab_get16l(ptr);
2024 return val;
2025}
2026
2027static inline uint_fast64_t pktlab_get64b(const void * ptr) {
2028 uint_fast64_t val;
2029
2030 val = (uint_fast64_t) pktlab_get32b(ptr) << 32;
2031 val |= pktlab_get32b(ptr+4);
2032 return val;
2033}
2034
2035static inline uint_fast64_t pktlab_get64l(const void * ptr) {
2036 uint_fast64_t val;
2037
2038 val = (uint_fast64_t) pktlab_get32l(ptr+4) << 32;
2039 val |= pktlab_get32l(ptr);
2040 return val;
2041}
2042
2043static inline void pktlab_set8(void * ptr, uint_fast8_t val) {
2044 *(uint8_t*)ptr = val;
2045}
2046
2047static inline void pktlab_set16b(void * ptr, uint_fast16_t val) {
2048 uint8_t * u8ptr = ptr;
2049 u8ptr[0] = val >> 8;
2050 u8ptr[1] = val >> 0;
2051}
2052
2053static inline void pktlab_set16l(void * ptr, uint_fast16_t val) {
2054 uint8_t * u8ptr = ptr;
2055 u8ptr[1] = val >> 8;
2056 u8ptr[0] = val >> 0;
2057}
2058
2059static inline void pktlab_set24b(void * ptr, uint_fast32_t val) {
2060 uint8_t * u8ptr = ptr;
2061 u8ptr[0] = val >> 16;
2062 u8ptr[1] = val >> 8;
2063 u8ptr[2] = val >> 0;
2064}
2065
2066static inline void pktlab_set24l(void * ptr, uint_fast32_t val) {
2067 uint8_t * u8ptr = ptr;
2068 u8ptr[2] = val >> 16;
2069 u8ptr[1] = val >> 8;
2070 u8ptr[0] = val >> 0;
2071}
2072
2073static inline void pktlab_set32b(void * ptr, uint_fast32_t val) {
2074 pktlab_set16b(ptr, val >> 16);
2075 pktlab_set16b(ptr+2, val);
2076}
2077
2078static inline void pktlab_set32l(void * ptr, uint_fast32_t val) {
2079 pktlab_set16l(ptr+2, val >> 16);
2080 pktlab_set16l(ptr, val);
2081}
2082
2083static inline void pktlab_set64b(void * ptr, uint_fast64_t val) {
2084 pktlab_set32b(ptr, val >> 32);
2085 pktlab_set32b(ptr+4, val);
2086}
2087
2088static inline void pktlab_set64l(void * ptr, uint_fast64_t val) {
2089 pktlab_set32l(ptr+4, val >> 32);
2090 pktlab_set32l(ptr, val);
2091}
2092
2093static inline uint_fast16_t pktlab_hton16(uint_fast16_t x) {
2094 return htons(x);
2095}
2096
2097static inline uint_fast32_t pktlab_hton32(uint_fast32_t x) {
2098 return htonl(x);
2099}
2100
2101static inline uint_fast64_t pktlab_hton64(uint_fast64_t x) {
2102 uint_fast32_t hi, lo;
2103
2104 hi = x >> 32;
2105 lo = x & UINT32_C(0xffffffff);
2106 return ((uint_fast64_t) pktlab_hton32(lo) << 32) | pktlab_hton32(hi);
2107}
2108
2109static inline uint_fast16_t pktlab_ntoh16(uint_fast16_t x) {
2110 return ntohs(x);
2111}
2112
2113static inline uint_fast32_t pktlab_ntoh32(uint_fast32_t x) {
2114 return ntohl(x);
2115}
2116
2117static inline uint_fast64_t pktlab_ntoh64(uint_fast64_t x) {
2118 uint_fast32_t hi, lo;
2119
2120 lo = pktlab_ntoh32(x >> 32);
2121 hi = pktlab_ntoh32(x & UINT32_C(0xffffffff));
2122 return ((uint_fast64_t) hi << 32) | lo;
2123}
2124
2125static inline bool pktlab_getbit8(uint_fast8_t bits, uint_fast8_t pos) {
2126 return pktlab_getbit64(bits, pos);
2127}
2128
2129static inline bool pktlab_getbit16(uint_fast16_t bits, uint_fast8_t pos) {
2130 return pktlab_getbit64(bits, pos);
2131}
2132
2133static inline bool pktlab_getbit32(uint_fast32_t bits, uint_fast8_t pos) {
2134 return pktlab_getbit64(bits, pos);
2135}
2136
2137static inline bool pktlab_getbit64(uint_fast64_t bits, uint_fast8_t pos) {
2138 return (pos >= 0x40) ? false : (bits & ((uint_fast64_t) 1 << pos));
2139}
2140
2141
2142static inline uint_fast8_t pktlab_setbit8(uint_fast8_t bits, uint_fast8_t pos) {
2143 return pktlab_setbit64(bits, pos);
2144}
2145
2146static inline uint_fast16_t pktlab_setbit16(uint_fast16_t bits, uint_fast8_t pos) {
2147 return pktlab_setbit64(bits, pos);
2148}
2149
2150static inline uint_fast32_t pktlab_setbit32(uint_fast32_t bits, uint_fast8_t pos) {
2151 return pktlab_setbit64(bits, pos);
2152}
2153
2154static inline uint_fast64_t pktlab_setbit64(uint_fast64_t bits, uint_fast8_t pos) {
2155 return (pos >= 0x40) ? bits : (bits | ((uint_fast64_t) 1 << pos));
2156}
2157
2158
2159static inline uint_fast8_t pktlab_clrbit8(uint_fast8_t bits, uint_fast8_t pos) {
2160 return pktlab_clrbit64(bits, pos);
2161}
2162
2163static inline uint_fast16_t pktlab_clrbit16(uint_fast16_t bits, uint_fast8_t pos) {
2164 return pktlab_clrbit64(bits, pos);
2165}
2166
2167static inline uint_fast32_t pktlab_clrbit32(uint_fast32_t bits, uint_fast8_t pos) {
2168 return pktlab_clrbit64(bits, pos);
2169}
2170
2171static inline uint_fast64_t pktlab_clrbit64(uint_fast64_t bits, uint_fast8_t pos) {
2172 return (pos >= 0x40) ? bits : (bits & ~((uint_fast64_t) 1 << pos));
2173}
2174
2175#endif
int pktlab_decode_dattr(const char *dattr, uint_fast32_t dattrlen, struct pktlab_xdescr_dattr_pair **pairs, uint_fast32_t *paircnt)
Decode an encoded endpoint attribute (dattr) string.
struct pktlab_privatekey * pktlab_create_privatekey(void)
Allocate initialized pktlab private key struct.
static void pktlab_time_to_timeval(pktlab_time_t t, struct timeval *tv)
Convert time period in pktlab ticks to struct timeval.
Definition: pktlab.h:1957
pktlab_time_t pktlab_time_now(void)
Get current pktlab time.
int pktlab_decode_chlist(const void *chlistptr, uint_fast32_t chlistlen, struct pktlab_channel **channels)
Decode a channel list.
int pktlab_load_privatekey_der(const uint8_t *der, uint_fast32_t derlen, const char *passphrase, struct pktlab_privatekey *k)
Load pktlab private key struct via raw PKCS8 byte array.
int pktlab_get_key_identifier(const struct pktlab_publickey *k, void *buf, uint_fast32_t buflen)
Get key identifier for a loaded pktlab public key struct.
pktlab_uri_type
pktlab defined URI types.
Definition: pktlab.h:349
@ EXP_URI_TYPE
Definition: pktlab.h:350
@ MALFORMED_URI_TYPE
Definition: pktlab.h:352
@ BROKER_URI_TYPE
Definition: pktlab.h:351
int pktlab_load_publickey_der(const uint8_t *der, uint_fast32_t derlen, struct pktlab_publickey *k)
Load pktlab public key struct via raw SubjectPublicKeyInfo byte array.
size_t pktlab_decode_message(struct pktlab_message *restrict msg, const void *restrict ptr, size_t len)
Decode pktlab message.
pktlab_message_type
pktlab defined message types.
Definition: pktlab.h:685
struct pktlab_reader * pktlab_create_reader(pktlab_read_t read, void *aux)
Get initialized pktlab reader struct.
int pktlab_cleanup_cert(struct pktlab_certificate *cert)
Free an allocated pktlab certificate struct.
static uint_fast16_t pktlab_hton16(uint_fast16_t x)
Convert 16-bit unsigned integer from host byte order to network byte order.
Definition: pktlab.h:2093
static uint_fast8_t pktlab_clrbit8(uint_fast8_t bits, uint_fast8_t pos)
Clear bit in unsigned integer at bit position.
Definition: pktlab.h:2159
static pktlab_time_t pktlab_time_sec(uint_fast32_t sec)
Convert seconds to pktlab ticks.
Definition: pktlab.h:1948
const char * pktlab_sktstate_name(enum pktlab_socket_state state)
Get text description of pktlab endpoint skt state.
int pktlab_encode_dattr(const struct pktlab_xdescr_dattr_pair *pairs, uint_fast32_t paircnt, char *buf, uint_fast32_t buflen, uint_fast32_t *used)
Encode an endpoint attribute (dattr) string.
int pktlab_flush_writer(struct pktlab_writer *w)
Flush pktlab writer internal buffer.
ssize_t(* pktlab_write_t)(void *aux, const void *buf, size_t nbyte)
Function pointer type for writer write function.
Definition: pktlab.h:1134
int pktlab_parse_uri(struct pktlab_uri *restrict uri_info, const void *restrict ptr, uint_fast32_t len)
Decode a pktlab URI.
const char * pktlab_cert_type_name(int cert_type)
Get pktlab certificate type string from pktlab certificate type value.
int pktlab_decode_certificate(const struct pktlab_certificate *cert, const struct pktlab_publickey *signkey, struct pktlab_cert_info **ptr)
Decode pktlab certificate information from loaded pktlab certificate struct.
int pktlab_cleanup_publickey(struct pktlab_publickey *k)
Free an allocated pktlab public key struct.
int pktlab_load_cert_pem(const char *pem, uint_fast32_t pemlen, struct pktlab_certificate *cert)
Load pktlab certificate struct via PEM-encoded pktlab certificate char array.
void pktlab_close_reader(struct pktlab_reader *r)
Close and free pktlab reader struct.
int pktlab_get_publickey_bytes(const struct pktlab_publickey *k, void *buf, uint_fast32_t buflen)
Get raw public key byte array from loaded pktlab public key struct.
struct pktlab_publickey * pktlab_create_publickey(void)
Allocate initialized pktlab public key struct.
void pktlab_close_writer(struct pktlab_writer *w)
Close and free pktlab writer struct.
void * pktlab_reader_readaux(const struct pktlab_reader *r)
Get pktlab reader struct aux information.
int pktlab_encode_message(const struct pktlab_message *restrict msg, void *restrict buf, struct iovec *restrict iov)
Encode pktlab message.
int pktlab_get_agent_key(const struct pktlab_certificate *agent_cert, uint8_t *agent_pubkey)
Get pktlab agent certificate subject (signee) public key.
int pktlab_load_publickey_pem(const char *pem, uint_fast32_t pemlen, struct pktlab_publickey *k)
Load pktlab public key struct via PEM-encoded public key char array.
ssize_t(* pktlab_read_t)(void *aux, void *buf, size_t buflen)
Function pointer type for reader read function.
Definition: pktlab.h:1071
int pktlab_load_cert_der(const uint8_t *der, uint_fast32_t derlen, struct pktlab_certificate *cert)
Load pktlab certificate struct via DER-encode pktlab certificate byte array.
pktlab_parse_cert_chain_rst
pktlab certificate chain parsing result values.
Definition: pktlab.h:1775
struct pktlab_certificate * pktlab_create_cert(void)
Allocate initialized pktlab certificate struct.
int pktlab_load_privatekey_raw(const uint8_t *bytes, uint_fast32_t len, struct pktlab_privatekey *k)
Load pktlab private key struct via raw private key byte array.
int pktlab_get_cert_der(const struct pktlab_certificate *cert, void **der, uint_fast32_t *derlen)
Get DER-encoded pktlab certificate bytes from loaded pktlab certificate struct.
int pktlab_parse_endpoint_rep_cert_chain(struct pktlab_certificate **cert_ls, uint_fast32_t certnum, const uint8_t *endpoint_key, struct pktlab_publickey *root_eop_key, uint8_t **subable_channels, uint_fast32_t *channelnum)
Parse pktlab endpoint representation privilege certificate chain for subscribable channel information...
static uint_fast8_t pktlab_setbit8(uint_fast8_t bits, uint_fast8_t pos)
Set bit in unsigned integer at bit position.
Definition: pktlab.h:2142
void * pktlab_writer_writeaux(const struct pktlab_writer *w)
Get pktlab writer struct aux information.
struct pktlab_message * pktlab_create_result_message(enum pktlab_status status)
Get fields-set pktlab result message.
pktlab_auth_mode
pktlab certificate chain verification mode values.
Definition: pktlab.h:1713
@ PKTLAB_AUTH_AGENT
Definition: pktlab.h:1716
@ PKTLAB_CONTROLLER_AUTH_ENDPOINT
Definition: pktlab.h:1714
@ PKTLAB_ENDPOINT_AUTH_CONTROLLER
Definition: pktlab.h:1715
@ PKTLAB_NO_VERIFY
Definition: pktlab.h:1717
int pktlab_load_privatekey_pem(const char *pem, uint_fast32_t pemlen, const char *passphrase, struct pktlab_privatekey *k)
Load pktlab private key struct via PEM-encoded private key char array.
pktlab_filter_type
pktlab defined filter types.
Definition: pktlab.h:328
@ PKTLAB_CBPF
Definition: pktlab.h:329
@ PKTLAB_EBPF
Definition: pktlab.h:330
bool pktlab_xdescr_dattr_match(const char *xdescr, uint_fast32_t xdescrlen, const char *dattr, uint_fast32_t dattrlen)
Match an experiment descriptor (xdescr) string to an endpoint attribute (dattr) string.
int pktlab_encode_xdescr(const struct pktlab_xdescr_dattr_pair *pairs, uint_fast32_t paircnt, char *buf, uint_fast32_t buflen, uint_fast32_t *used)
Encode an experiment descriptor (xdescr) string.
pktlab_time_t pktlab_tm_to_time(const struct tm *tm)
Convert time in struct tm to pktlab time.
size_t pktlab_writer_unsent(const struct pktlab_writer *w)
Get writer internal buffered content length.
int pktlab_parse_controller_exp_cert_chain(struct pktlab_certificate **cert_ls, uint_fast32_t certnum, const uint8_t *controller_key, struct pktlab_publickey *trusted_eop_key, uint8_t **ftdigests, uint_fast32_t *ftcnt, uint8_t **mtdigests, uint_fast32_t *mtcnt, char ***priorities, uint_fast32_t *pcnt, uint8_t *subable_channel)
Parse pktlab controller experiment privilege certificate chain for subscribable channel and experimen...
#define PKTLAB_KEYID_LEN
Key identifier length for pktlab keys in bytes.
Definition: pktlab.h:1263
void pktlab_free_channels(struct pktlab_channel *channels)
Free an allocated channel linked list.
int pktlab_encode_chlist(const struct pktlab_channel *channels, void **chlistptr, uint_fast32_t *chlistlen)
Encode a channel list.
int pktlab_cleanup_privatekey(struct pktlab_privatekey *k)
Free an allocated pktlab private key struct.
int pktlab_verify_certificate_signature(const struct pktlab_certificate *cert, const struct pktlab_publickey *signkey)
Verify the pktlab certificate signature.
pktlab_status
pktlab defined errid values.
Definition: pktlab.h:740
pktlab_decode_rst
pktlab certificate decoding result values.
Definition: pktlab.h:1500
@ PKTLAB_DECODE_BAD_SIGALG
Definition: pktlab.h:1503
@ PKTLAB_DECODE_BAD_DEL_TYPE
Definition: pktlab.h:1519
@ PKTLAB_DECODE_BAD_VALIDITY
Definition: pktlab.h:1510
@ PKTLAB_DECODE_BAD_X509_VER
Definition: pktlab.h:1505
@ PKTLAB_DECODE_INVAL
Definition: pktlab.h:1502
@ PKTLAB_DECODE_UNKNOWN_FAULT
Definition: pktlab.h:1520
@ PKTLAB_DECODE_BAD_SUBJ_PUBKEY
Definition: pktlab.h:1511
@ PKTLAB_DECODE_BAD_CERT_DESC
Definition: pktlab.h:1515
@ PKTLAB_DECODE_BAD_BC
Definition: pktlab.h:1514
@ PKTLAB_DECODE_BAD_SERIAL
Definition: pktlab.h:1509
@ PKTLAB_DECODE_BAD_FILTER_DIGESTS
Definition: pktlab.h:1517
@ PKTLAB_DECODE_BAD_MONITOR_DIGESTS
Definition: pktlab.h:1518
@ PKTLAB_DECODE_BAD_SIGNATURE
Definition: pktlab.h:1504
@ PKTLAB_DECODE_BAD_SID
Definition: pktlab.h:1513
@ PKTLAB_DECODE_SUCCESS
Definition: pktlab.h:1501
@ PKTLAB_DECODE_BAD_KEYUSAGE
Definition: pktlab.h:1508
@ PKTLAB_DECODE_BAD_AID
Definition: pktlab.h:1512
@ PKTLAB_DECODE_BAD_CERT_TYPE
Definition: pktlab.h:1507
@ PKTLAB_DECODE_USING_UNUSED_FIELD
Definition: pktlab.h:1506
@ PKTLAB_DECODE_BAD_PRIORITY
Definition: pktlab.h:1516
#define PKTLAB_PUBLICKEY_LEN
Raw public key length for pktlab keys in bytes.
Definition: pktlab.h:1249
int pktlab_verify_cert_chain(int auth_mode, struct pktlab_certificate **cert_ls, struct pktlab_publickey **root_ls, struct pktlab_certificate ***verified_cert_ls, uint_fast32_t certnum, uint_fast32_t rootnum, uint_fast32_t *verified_certnum, uint_fast32_t *used_root_indx)
Verify pktlab certificate chain.
int pktlab_cert_type_name_to_id(const char *name)
Get pktlab certificate type value from pktlab certificate type string.
pktlab_cert_type
pktlab defined certificate types.
Definition: pktlab.h:1459
static bool pktlab_getbit8(uint_fast8_t bits, uint_fast8_t pos)
Get bit from unsigned integer at bit position.
Definition: pktlab.h:2125
int pktlab_get_privatekey_bytes(const struct pktlab_privatekey *k, void *buf, uint_fast32_t buflen)
Get raw private key byte array from loaded pktlab private key struct.
int pktlab_read_message(struct pktlab_reader *restrict r, struct pktlab_message **restrict msgptr)
pktlab reader read message.
int pktlab_decode_xdescr(const char *xdescr, uint_fast32_t xdescrlen, struct pktlab_xdescr_dattr_pair **pairs, uint_fast32_t *paircnt)
Decode an encoded experiment descriptor (xdescr) string.
static uint_fast32_t pktlab_time_to_unix_time(pktlab_time_t t)
Convert a pktlab time to Unix time (in second precision).
Definition: pktlab.h:1965
int pktlab_load_publickey_raw(const uint8_t *bytes, uint_fast32_t len, struct pktlab_publickey *k)
Load pktlab public key struct via raw public key byte array.
static uint_fast8_t pktlab_get8(const void *ptr)
Get 8-bit unsigned integer from byte array.
Definition: pktlab.h:1969
static pktlab_time_t pktlab_timeval_to_time(const struct timeval *tv)
Convert time period in struct timeval to pktlab ticks.
Definition: pktlab.h:1952
struct pktlab_writer * pktlab_create_writer(pktlab_write_t write, void *aux)
Get initialized pktlab writer struct.
int pktlab_write_message(struct pktlab_writer *restrict w, const struct pktlab_message *restrict msg)
pktlab writer write message.
uint64_t pktlab_time_t
Variable type for pktlab time.
Definition: pktlab.h:89
pktlab_verify_rst
pktlab certificate chain verification result values.
Definition: pktlab.h:1726
@ PKTLAB_VERIFY_NOT_ENOUGH_CERT
Definition: pktlab.h:1730
@ PKTLAB_VERIFY_BAD_CERT
Definition: pktlab.h:1729
@ PKTLAB_VERIFY_UNKNOWN_FAULT
Definition: pktlab.h:1738
@ PKTLAB_VERIFY_END_OF_PHASES
Definition: pktlab.h:1736
@ PKTLAB_VERIFY_INVAL
Definition: pktlab.h:1728
@ PKTLAB_VERIFY_UNEXPECTED_CERT
Definition: pktlab.h:1732
@ PKTLAB_VERIFY_NO_MATCHING_SIGN_KEY
Definition: pktlab.h:1734
@ PKTLAB_VERIFY_EXPIRED_CERT
Definition: pktlab.h:1733
@ PKTLAB_VERIFY_BAD_DEL_TYPE
Definition: pktlab.h:1737
@ PKTLAB_VERIFY_PATHLEN_EXCEEDED
Definition: pktlab.h:1735
@ PKTLAB_VERIFY_SUCCESS
Definition: pktlab.h:1727
@ PKTLAB_VERIFY_TOO_MANY_CERT
Definition: pktlab.h:1731
struct pktlab_publickey * pktlab_get_publickey_from_privatekey(const struct pktlab_privatekey *k)
Get loaded pktlab public key struct from loaded pktlab private key struct.
static void pktlab_set8(void *ptr, uint_fast8_t val)
Set 8-bit unsigned integer to byte array.
Definition: pktlab.h:2043
Structure for encoding/decoding experiment descriptor (xdescr)/endpoint attribute (dattr) in xpub and...
Definition: pktlab.h:170
Structure for encoding/decoding channel lists in xpub and xsub messages.
Definition: pktlab.h:274
Structure for storing decoded pktlab URI information.
Definition: pktlab.h:359
struct pktlab_uri::@0::@2 malformed
struct pktlab_uri::@0::@3 uri
enum pktlab_uri_type type
Definition: pktlab.h:360
Definition: pktlab.h:562
Structure for storing the decoded form of pktlab messages.
Definition: pktlab.h:790
Structure for storing decoded pktlab certificate information.
Definition: pktlab.h:1527
pktlab reader opaque struct.
pktlab writer opaque struct.
pktlab public key opaque struct.
pktlab private key opaque struct.
pktlab certificate opaque struct.