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"
45 
49 #define PKTLAB_DEFAULT_PUB_PORT_STR "20556"
50 
54 #define PKTLAB_DEFAULT_SUB_PORT_STR "20557"
55 
59 #define PKTLAB_DEFAULT_PROXY_SETUP_PORT_STR "20557"
60 
61 #define PKTLAB_DEFAULT_SPEC_STR \
62  PKTLAB_DEFAULT_ADDR_STR ":" PKTLAB_DEFAULT_EXP_PORT_STR
63 
68 #define PKTLAB_MAX_SKT_CNT 0x100
69 
74 #define PKTLAB_MAX_LADDR_CNT 0x100
75 
80 #define PKTLAB_MAX_LDNSADDR_CNT 0x10
81 
82 #define PKTLAB_SHA256_DIGEST_LEN 32
83 #define PKTLAB_ED25519_SIG_LEN 64
84 
85 //
86 // TIME-RELATED DECLARATIONS & DEFINITIONS
87 //
88 
94 typedef uint64_t pktlab_time_t;
95 
96 #define PKTLAB_TICKS_PER_SECOND UINT64_C(1000000000)
97 #define PKTLAB_TIME_MAX UINT64_MAX
98 
103 extern pktlab_time_t pktlab_time_now(void);
104 
110 static inline pktlab_time_t pktlab_time_sec(uint_fast32_t sec);
111 
117 static inline pktlab_time_t pktlab_timeval_to_time(const struct timeval * tv);
118 
124 static inline pktlab_time_t pktlab_timespec_to_time(const struct timespec * tp);
125 
131 static inline void pktlab_time_to_timeval(pktlab_time_t t, struct timeval * tv);
132 
138 static inline void pktlab_time_to_timespec(pktlab_time_t t, struct timespec * tp);
139 
145 static inline uint_fast32_t pktlab_time_to_unix_time(pktlab_time_t t);
146 
152 extern pktlab_time_t pktlab_tm_to_time(const struct tm * tm);
153 
154 //
155 // XDESCR/DATTR-RELATED DECLARATIONS & DEFINITIONS
156 //
157 
158 #define PKTLAB_NAMEVALUE_PAIR_SEP '='
159 #define PKTLAB_NAMEVALUE_PAIR_END ';'
160 
165 #define PKTLAB_NAMEVALUE_NAMELEN_MIN 0x1
166 
171 #define PKTLAB_NAMEVALUE_NAMELEN_MAX 0x20
172 
177 #define PKTLAB_NAMEVALUE_VALUELEN_MIN 0x1
178 
183 #define PKTLAB_NAMEVALUE_VALUELEN_MAX 0x100
184 
190  const char * name;
191  const char * value;
192  uint_fast32_t namelen;
193  uint_fast32_t valuelen;
194 };
195 
201  struct pktlab_namevalue_pair pair;
202  bool optional;
203 };
204 
216 extern int pktlab_decode_xdescr (
217  const char * xdescr, uint_fast32_t xdescrlen,
218  struct pktlab_namevalue_pair ** pairs, uint_fast32_t * paircnt);
233 extern int pktlab_encode_xdescr (
234  const struct pktlab_namevalue_pair * pairs, uint_fast32_t paircnt,
235  char * buf, uint_fast32_t buflen, uint_fast32_t * used);
236 
248 extern int pktlab_decode_dattr (
249  const char * dattr, uint_fast32_t dattrlen,
250  struct pktlab_namevalue_pair ** pairs, uint_fast32_t * paircnt);
264 extern int pktlab_encode_dattr (
265  const struct pktlab_namevalue_pair * pairs, uint_fast32_t paircnt,
266  char * buf, uint_fast32_t buflen, uint_fast32_t * used);
267 
287 extern bool pktlab_xdescr_dattr_match (
288  const char * xdescr, uint_fast32_t xdescrlen,
289  const char * dattr, uint_fast32_t dattrlen);
290 
291 //
292 // CHANNEL-RELATED DECLARATIONS & DEFINITIONS
293 //
294 
295 #define PKTLAB_CHANNELID_LEN_MIN 1
296 #define PKTLAB_CHANNELID_LEN_MAX PKTLAB_SHA256_DIGEST_LEN
297 
303  void * channel;
304  uint_fast32_t channellen;
305  struct pktlab_channel * next;
306 };
307 
321 extern int pktlab_encode_chlist (
322  const struct pktlab_channel * channels,
323  void ** chlistptr, uint_fast32_t * chlistlen);
337 extern int pktlab_decode_chlist (
338  const void * chlistptr, uint_fast32_t chlistlen,
339  struct pktlab_channel ** channels);
340 
345 extern void pktlab_free_channels (
346  struct pktlab_channel * channels);
347 
348 //
349 // PROGRAM-RELATED DECLARATIONS & DEFINITIONS
350 //
351 
357  PKTLAB_EBPF = 0x0,
358  PKTLAB_WASM = 0x1,
359 };
360 
366  uint8_t opcode;
367  uint8_t dstreg:4;
368  uint8_t srcreg:4;
369  uint16_t offset;
370  uint32_t imm;
371 };
372 
377 #define PKTLAB_EBPF_INSTR_LEN sizeof(struct pktlab_ebpf_instr)
378 
383 #define PKTLAB_ENC_EBPF_INSTR_LEN 8
384 
396 extern int pktlab_encode_program (
397  enum pktlab_prog_type type,
398  const void * prog, uint_fast32_t proglen,
399  void ** buf, uint_fast32_t * buflen);
400 
413 extern int pktlab_decode_program (
414  const void * buf, uint_fast32_t buflen,
415  enum pktlab_prog_type * type,
416  void ** prog, uint_fast32_t * proglen);
417 
426 extern int pktlab_get_program_digest (
427  const void * data, uint_fast32_t datalen, uint8_t * digest);
428 
448 extern int pktlab_load_program (
449  const char * data, uint_fast32_t datalen,
450  enum pktlab_prog_type type,
451  void ** prog, uint_fast32_t * proglen,
452  uint_fast32_t * errlineno);
453 
454 //
455 // URI-RELATED DECLARATIONS & DEFINITIONS
456 //
457 
466 };
467 
472 struct pktlab_uri {
474  union {
475  struct {
476  const char * ptr;
477  uint_fast32_t len;
478  } malformed;
480  struct {
481  const char * host;
482  uint_fast32_t hostlen;
483  uint16_t port;
484  } uri;
485  };
486 };
487 
503 extern int pktlab_parse_uri (
504  struct pktlab_uri * restrict uri_info,
505  const void * restrict ptr, uint_fast32_t len);
506 
507 //
508 // ENDPOINT-VMEM-RELATED DECLARATIONS & DEFINITIONS
509 //
510 
511 // endpoint vmem field address/len macros
512 //
513 
514 // current pkt
515 #define PKTLAB_VMEMADDR_CURPKT (0x0)
516 #define PKTLAB_VMEMADDR_CURPKT_DATA (PKTLAB_VMEMADDR_CURPKT)
517 #define PKTLAB_VMEMADDR_CURPKT_LEN (PKTLAB_VMEMADDR_CURPKT+0x1000000)
518 #define PKTLAB_VMEMADDR_CURPKT_SKTID (PKTLAB_VMEMADDR_CURPKT+0x1000010)
519 
520 #define PKTLAB_VMEMADDR_CURPKT_SL (0x1000011)
521 #define PKTLAB_VMEMADDR_CURPKT_DATA_FL (sizeof(uint8_t)*0x1000000)
522 #define PKTLAB_VMEMADDR_CURPKT_LEN_FL (sizeof(uint32_t))
523 #define PKTLAB_VMEMADDR_CURPKT_SKTID_FL (sizeof(uint8_t))
524 
525 // system param
526 #define PKTLAB_VMEMADDR_SYSPARAM (0x10000000)
527 #define PKTLAB_VMEMADDR_SYSPARAM_IP4NO (PKTLAB_VMEMADDR_SYSPARAM)
528 #define PKTLAB_VMEMADDR_SYSPARAM_IP6NO (PKTLAB_VMEMADDR_SYSPARAM+0x1)
529 #define PKTLAB_VMEMADDR_SYSPARAM_TRANSSUP (PKTLAB_VMEMADDR_SYSPARAM+0x2)
530 #define PKTLAB_VMEMADDR_SYSPARAM_BUFMAXDUP (PKTLAB_VMEMADDR_SYSPARAM+0x6)
531 #define PKTLAB_VMEMADDR_SYSPARAM_IP4LS (PKTLAB_VMEMADDR_SYSPARAM+0x100)
532 #define PKTLAB_VMEMADDR_SYSPARAM_IP6LS (PKTLAB_VMEMADDR_SYSPARAM+0x1000)
533 #define PKTLAB_VMEMADDR_SYSPARAM_TIME (PKTLAB_VMEMADDR_SYSPARAM+0x10000)
534 #define PKTLAB_VMEMADDR_SYSPARAM_BUFMAX (PKTLAB_VMEMADDR_SYSPARAM+0x10010)
535 #define PKTLAB_VMEMADDR_SYSPARAM_BUFUSED (PKTLAB_VMEMADDR_SYSPARAM+0x10014)
536 #define PKTLAB_VMEMADDR_SYSPARAM_IP4DNSNO (PKTLAB_VMEMADDR_SYSPARAM+0x20000)
537 #define PKTLAB_VMEMADDR_SYSPARAM_IP6DNSNO (PKTLAB_VMEMADDR_SYSPARAM+0x20001)
538 #define PKTLAB_VMEMADDR_SYSPARAM_IP4DNSLS (PKTLAB_VMEMADDR_SYSPARAM+0x20010)
539 #define PKTLAB_VMEMADDR_SYSPARAM_IP6DNSLS (PKTLAB_VMEMADDR_SYSPARAM+0x20100)
540 #define PKTLAB_VMEMADDR_SYSPARAM_IP4HDRMOD (PKTLAB_VMEMADDR_SYSPARAM+0x20200)
541 #define PKTLAB_VMEMADDR_SYSPARAM_IP6HDRMOD (PKTLAB_VMEMADDR_SYSPARAM+0x20210)
542 #define PKTLAB_VMEMADDR_SYSPARAM_HOSTID (PKTLAB_VMEMADDR_SYSPARAM+0x30000)
543 #define PKTLAB_VMEMADDR_SYSPARAM_LATLONG (PKTLAB_VMEMADDR_SYSPARAM+0x30100)
544 #define PKTLAB_VMEMADDR_SYSPARAM_OSINFO (PKTLAB_VMEMADDR_SYSPARAM+0x30200)
545 
546 #define PKTLAB_VMEMADDR_SYSPARAM_SL (0x30400)
547 #define PKTLAB_VMEMADDR_SYSPARAM_IP4NO_FL (sizeof(uint8_t))
548 #define PKTLAB_VMEMADDR_SYSPARAM_IP6NO_FL (sizeof(uint8_t))
549 #define PKTLAB_VMEMADDR_SYSPARAM_TRANSSUP_FL (sizeof(uint32_t))
550 #define PKTLAB_VMEMADDR_SYSPARAM_IP4LS_FL (sizeof(uint8_t)*PKTLAB_IPV4_W_MSK_ADDR_LEN*0x100)
551 #define PKTLAB_VMEMADDR_SYSPARAM_IP6LS_FL (sizeof(uint8_t)*PKTLAB_IPV6_ADDR_LEN*0x100)
552 #define PKTLAB_VMEMADDR_SYSPARAM_TIME_FL (sizeof(pktlab_time_t))
553 #define PKTLAB_VMEMADDR_SYSPARAM_BUFMAX_FL (sizeof(uint32_t))
554 #define PKTLAB_VMEMADDR_SYSPARAM_BUFUSED_FL (sizeof(uint32_t))
555 #define PKTLAB_VMEMADDR_SYSPARAM_IP4DNSNO_FL (sizeof(uint8_t))
556 #define PKTLAB_VMEMADDR_SYSPARAM_IP6DNSNO_FL (sizeof(uint8_t))
557 #define PKTLAB_VMEMADDR_SYSPARAM_IP4DNSLS_FL (sizeof(uint8_t)*PKTLAB_IPV4_WO_MSK_ADDR_LEN*0x10)
558 #define PKTLAB_VMEMADDR_SYSPARAM_IP6DNSLS_FL (sizeof(uint8_t)*PKTLAB_IPV6_ADDR_LEN*0x10)
559 #define PKTLAB_VMEMADDR_SYSPARAM_IP4HDRMOD_FL (sizeof(uint8_t)*0xC)
560 #define PKTLAB_VMEMADDR_SYSPARAM_IP6HDRMOD_FL (sizeof(uint8_t)*0x8)
561 #define PKTLAB_VMEMADDR_SYSPARAM_HOSTID_FL (sizeof(char)*0x100)
562 #define PKTLAB_VMEMADDR_SYSPARAM_LATLONG_FL (sizeof(char)*0x40)
563 #define PKTLAB_VMEMADDR_SYSPARAM_OSINFO_FL (sizeof(char)*0x200)
564 
565 // skt info
566 #define PKTLAB_VMEMADDR_SKTINFO (0x20000000)
567 #define PKTLAB_VMEMADDR_SKTINFO_BLKLEN (0x400)
568 #define PKTLAB_VMEMADDR_SKTINFO_FAMILY (0x0)
569 #define PKTLAB_VMEMADDR_SKTINFO_PROTO (0x1)
570 #define PKTLAB_VMEMADDR_SKTINFO_STAT (0x2)
571 #define PKTLAB_VMEMADDR_SKTINFO_LADDR (0x10)
572 #define PKTLAB_VMEMADDR_SKTINFO_RADDR (0x20)
573 #define PKTLAB_VMEMADDR_SKTINFO_LPORT (0x30)
574 #define PKTLAB_VMEMADDR_SKTINFO_RPORT (0x32)
575 #define PKTLAB_VMEMADDR_SKTINFO_RBUFSZ (0x40)
576 #define PKTLAB_VMEMADDR_SKTINFO_RBUFUSED (0x44)
577 #define PKTLAB_VMEMADDR_SKTINFO_DROPSTAT (0x50)
578 #define PKTLAB_VMEMADDR_SKTINFO_NSENDERR (0x60)
579 #define PKTLAB_VMEMADDR_SKTINFO_NSENDERRTAG (0x61)
580 #define PKTLAB_VMEMADDR_SKTINFO_NOTIFMASK (0x70)
581 #define PKTLAB_VMEMADDR_SKTINFO_CTFL (0x100)
582 
583 #define PKTLAB_VMEMADDR_SKTINFO_SL (PKTLAB_VMEMADDR_SKTINFO_BLKLEN*0x100)
584 #define PKTLAB_VMEMADDR_SKTINFO_PROTO_FL (sizeof(uint8_t))
585 #define PKTLAB_VMEMADDR_SKTINFO_STAT_FL (sizeof(int8_t))
586 #define PKTLAB_VMEMADDR_SKTINFO_LADDR_FL (sizeof(uint8_t)*PKTLAB_ADDRLEN_MAX)
587 #define PKTLAB_VMEMADDR_SKTINFO_RADDR_FL (sizeof(uint8_t)*PKTLAB_ADDRLEN_MAX)
588 #define PKTLAB_VMEMADDR_SKTINFO_LPORT_FL (sizeof(uint16_t))
589 #define PKTLAB_VMEMADDR_SKTINFO_RPORT_FL (sizeof(uint16_t))
590 #define PKTLAB_VMEMADDR_SKTINFO_RBUFSZ_FL (sizeof(uint32_t))
591 #define PKTLAB_VMEMADDR_SKTINFO_RBUFUSED_FL (sizeof(uint32_t))
592 #define PKTLAB_VMEMADDR_SKTINFO_DROPSTAT_FL (sizeof(uint32_t)*2)
593 #define PKTLAB_VMEMADDR_SKTINFO_NSENDERR_FL (sizeof(int8_t))
594 #define PKTLAB_VMEMADDR_SKTINFO_NSENDERRTAG_FL (sizeof(uint16_t))
595 #define PKTLAB_VMEMADDR_SKTINFO_NOTIFMASK_FL (sizeof(uint16_t))
596 #define PKTLAB_VMEMADDR_SKTINFO_CTFL_FL (sizeof(uint8_t)*0x80)
597 
598 // other segments
599 #define PKTLAB_VMEMADDR_NSENDTSTP (0x30000000)
600 #define PKTLAB_VMEMADDR_MONSCRATCH (0x40000000)
601 #define PKTLAB_VMEMADDR_MONPERSIST (0x50000000)
602 
603 #define PKTLAB_VMEMADDR_NSENDTSTP_SL (sizeof(pktlab_time_t)*0x10000)
604 #define PKTLAB_VMEMADDR_MONSCRATCH_SL (sizeof(uint8_t)*0x10000000)
605 #define PKTLAB_VMEMADDR_MONPERSIST_SL (sizeof(uint8_t)*0x10000000)
606 
607 // endpoint supported (trans)proto field (TRANSSUP) proto bit indices
608 //
609 
610 #define PKTLAB_RAW_SUP_BIT_INDX 0
611 #define PKTLAB_TCP_SUP_BIT_INDX 1
612 #define PKTLAB_UDP_SUP_BIT_INDX 2
613 
614 // endpoint raw socket pkts OS header field modification behavior (IP4HDRMOD/IP6HDRMOD) values
615 //
616 
617 enum pktlab_rawhdr_info {
618  PKTLAB_RAWHDR_NOCHG = 0,
619  PKTLAB_RAWHDR_CHG = 1,
620  PKTLAB_RAWHDR_0FILL = 2
621 };
622 
623 // endpoint skt info skt state field (STAT) values
624 //
625 
626 enum pktlab_socket_state {
627  PKTLAB_SKTST_FREE = 0,
628  PKTLAB_SKTST_OPENING = 1,
629  PKTLAB_SKTST_OPEN = 2,
630  PKTLAB_SKTST_EOF = 3,
631  PKTLAB_SKTST_WFIN = 4,
632  PKTLAB_SKTST_END = 5,
633  PKTLAB_SKTST_REFUSED = -1,
634  PKTLAB_SKTST_RESET = -2,
635  PKTLAB_SKTST_TIMEDOUT = -3,
636  PKTLAB_SKTST_UNREACH = -4,
637  PKTLAB_SKTST_UNKFAULT = -128
638 };
639 
640 // endpoint skt info skt nsend err field (NSENDERR) values
641 //
642 
643 enum pktlab_nsend_err {
644  PKTLAB_NSEND_SUCCESS = 0,
645  PKTLAB_NSEND_NORES = 1,
646  PKTLAB_NSEND_BADPKT = 2,
647  PKTLAB_NSEND_TIMEDOUT = 3,
648  PKTLAB_NSEND_RESET = 4,
649  PKTLAB_NSEND_UNREACH = 5,
650  PKTLAB_NSEND_WFIN = 6,
651  PKTLAB_NSEND_UNKFAULT = 127
652 };
653 
654 // endpoint skt info skt notification mask (NOTIFMASK) indices
655 //
656 
657 #define PKTLAB_NOTIFMASK_NTAG (0x1 << 1)
658 #define PKTLAB_NOTIFMASK_NSTAT (0x1 << 2)
659 #define PKTLAB_NOTIFMASK_NDATA (0x1 << 3)
660 #define PKTLAB_NOTIFMASK_NDROP (0x1 << 4)
661 #define PKTLAB_NOTIFMASK_NBLOCK (0x1 << 5)
662 
663 // endpoint vmem impl. utilities
664 //
665 
666 struct pktlab_vmem_region; // forward declaration
667 
668 typedef void (*pktlab_vmem_reader_t) (
669  const struct pktlab_vmem_region * restrict rgn,
670  uint_fast32_t off, uint_fast32_t len, void * restrict dst);
671 
672 typedef void (*pktlab_vmem_writer_t) (
673  const struct pktlab_vmem_region * restrict rgn,
674  uint_fast32_t off, uint_fast32_t len, const void * restrict src);
675 
677  uint32_t start, end;
678  pktlab_vmem_reader_t read;
679  pktlab_vmem_writer_t write;
680  uintptr_t aux;
681 };
682 
683 extern void pktlab_vmem_read (
684  const struct pktlab_vmem_region * restrict rgn, uint_fast32_t rgncnt,
685  uint_fast32_t addr, uint_fast32_t len, void * restrict dst);
686 
687 extern void pktlab_vmem_write (
688  const struct pktlab_vmem_region * restrict rgn, uint_fast32_t rgncnt,
689  uint_fast32_t addr, uint_fast32_t len, const void * restrict src);
690 
691 extern void pktlab_buffer_reader (
692  const struct pktlab_vmem_region * restrict rgn,
693  uint_fast32_t addr, uint_fast32_t len, void * restrict dst);
694 
695 extern void pktlab_buffer_writer (
696  const struct pktlab_vmem_region * restrict rgn,
697  uint_fast32_t addr, uint_fast32_t len, const void * restrict src);
698 
699 //
700 // MESSAGE-RELATED DECLARATIONS & DEFINITIONS
701 //
702 
703 // message length restriction values
704 //
705 
706 #define PKTLAB_MREAD_MAX UINT32_C(0x10000)
707 #define PKTLAB_NDATA_MAX UINT32_C(0x10000)
708 
709 // message family and proto constants
710 //
711 
724 #define PKTLAB_IP4_PROTO 0x4
725 #define PKTLAB_IP6_PROTO 0x6
726 
745 #define PKTLAB_RAW_PROTO 0x00
746 #define PKTLAB_TCP_PROTO 0x06
747 #define PKTLAB_UDP_PROTO 0x11
748 
749 // nctl command type
750 //
751 
759 #define PKTLAB_NCTL_TCP_FIN 0x1
760 
761 // nstat code values
762 //
763 
784 #define PKTLAB_TCPEV_ESTABLISHED 0x0
785 #define PKTLAB_TCPEV_RESET 0x1
786 #define PKTLAB_TCPEV_TIMEOUT 0x2
787 #define PKTLAB_TCPEV_PEERCLOSED 0x3
788 #define PKTLAB_TCPEV_UNKNOWN 0xFF
789 
790 // message type values
791 //
792 
800  PKTLAB_UNDEF_MESSAGE = 0x00,
801 
802  // Requests 0x20 - 0x3F
803  PKTLAB_CDATA_MESSAGE = 0x20,
804  PKTLAB_START_MESSAGE = 0x21,
805  PKTLAB_END_MESSAGE = 0x22,
806  PKTLAB_YIELD_MESSAGE = 0X23,
807  PKTLAB_CONT_MESSAGE = 0X24,
808 
809  PKTLAB_MREAD_MESSAGE = 0x28,
810  PKTLAB_MWRITE_MESSAGE = 0x29,
811  PKTLAB_NOPEN_MESSAGE = 0x2A,
812  PKTLAB_NCLOSE_MESSAGE = 0x2B,
813  PKTLAB_NSEND_MESSAGE = 0x2C,
814  PKTLAB_NCAP_MESSAGE = 0x2D,
815  PKTLAB_NCTL_MESSAGE = 0x2E,
816 
817  // publisher to broker request
818  PKTLAB_XCERT_MESSAGE = 0x30,
819  PKTLAB_XPUB_MESSAGE = 0x31,
820 
821  // endpoint to broker request
822  PKTLAB_XSUB_MESSAGE = 0x38,
823 
824  // Responses 0x40 - 0x5F
825  PKTLAB_RESULT_MESSAGE = 0x40,
826  PKTLAB_MDATA_MESSAGE = 0x41,
827 
828  // Notifications 0x60 - 0x7F
829  PKTLAB_NTAG_MESSAGE = 0x60,
830  PKTLAB_NSTAT_MESSAGE = 0x61,
831  PKTLAB_NDATA_MESSAGE = 0x62,
832  PKTLAB_NDROP_MESSAGE = 0x63,
833  PKTLAB_NBLOCK_MESSAGE = 0x64,
834 
835  PKTLAB_SUSPD_MESSAGE = 0x68,
836  PKTLAB_RESUMD_MESSAGE = 0x69,
837 
838  PKTLAB_XNOTIFY_MESSAGE = 0x70,
839 
840  // Proxy requests 0x80 - 0x8F
841  PKTLAB_XREG_MESSAGE = 0x80,
842 
843  // Private Use 0x90 - 0xff
844 };
845 
846 // result message errid values
847 //
848 
856  PKTLAB_SUCCESS = 0,
857 
858  PKTLAB_ECTLBADMSG = 0x10,
859  PKTLAB_ECTLNOTSUP = 0x11,
860  PKTLAB_ECTLMONREJ = 0x12,
861  PKTLAB_ECTLMONUKN = 0x13,
862 
863  PKTLAB_ECRTBADHDAT = 0x20,
864  PKTLAB_ECRTNOHDAT = 0x21,
865  PKTLAB_ECRTBADFRM = 0x22,
866  PKTLAB_ECRTNOSPACE = 0x23,
867  PKTLAB_ECRTBADHINT = 0x24,
868 
869  PKTLAB_ESYSNOBUFS = 0x30,
870  PKTLAB_ESYSNOPERM = 0x31,
871  PKTLAB_ESKTINUSE = 0x32,
872  PKTLAB_ESKTNOTOPEN = 0x33,
873  PKTLAB_ESKTNOPRFAM = 0x34,
874  PKTLAB_ESKTNOPROTO = 0x35,
875  PKTLAB_ESKTNOADDR = 0x36,
876  PKTLAB_ESKTNOMATCH = 0x37,
877  PKTLAB_ESKTBADFILT = 0x38,
878  PKTLAB_ESKTPKTDENY = 0x39,
879  PKTLAB_ESKTOPNDENY = 0x3A,
880 
881  PKTLAB_ETCPNOPORT = 0x40,
882  PKTLAB_EPKTNOTSENT = 0x41,
883  PKTLAB_EUDPNOPORT = 0x42,
884  PKTLAB_EPKTTRUNC = 0x43,
885  PKTLAB_ENORES = 0x44,
886 
887  PKTLAB_EMEMBADADR = 0x48,
888 
889  PKTLAB_EPUBBADCHL = 0x50,
890  PKTLAB_EPUBBADCHN = 0x51,
891  PKTLAB_EPUBBADADDR = 0x52,
892  PKTLAB_EPUBBADPR = 0x53,
893  PKTLAB_EPUBBADXD = 0x54,
894 
895  PKTLAB_ESUBBADCHL = 0x60,
896  PKTLAB_ESUBBADCHN = 0x61,
897  PKTLAB_ESUBBADDA = 0x62,
898 
899  PKTLAB_EUNKFAULT = 0xFFFF
900 };
901 
902 // cdata message hint values
903 //
904 
913 #define PKTLAB_CDATA_HINT_FILTER "filter"
914 #define PKTLAB_CDATA_HINT_MONITOR "monitor"
915 
916 // message value structure
917 //
918 
931  enum pktlab_message_type type;
932 
933  union {
934  struct {
935  const void * ptr;
936  uint32_t len;
937  bool malformed;
938  } raw;
939 
940  struct {
941  const void * hintptr;
942  const void * dataptr;
943  uint8_t hintlen;
944  uint32_t datalen;
945  } cdata;
946 
947  struct {
948  } start;
949 
950  struct {
951  } end;
952 
953  struct {
954  pktlab_time_t rhint;
955  } yield;
956 
957  struct {
958  } cont;
959 
960  struct {
961  uint16_t errid;
962  union {
963  struct {
964  uint16_t indx;
965  uint16_t errid;
966  } monrej;
967  struct {
968  uint16_t indx;
969  } monukn;
970  };
971  } result;
972 
973  struct {
974  uint32_t addr, len;
975  const void * ptr;
976  } mdata;
977 
978  struct {
979  uint32_t addr, len;
980  } mread;
981 
982  struct {
983  uint32_t addr, len;
984  const void * ptr;
985  } mwrite;
986 
987  struct {
988  uint8_t sktid;
989  uint8_t family;
990  uint8_t proto;
991  uint32_t rbufsz;
992 
993  uint8_t laddrlen;
994  uint8_t lportlen;
995  uint8_t raddrlen;
996  uint8_t rportlen;
997  const void* laddrptr;
998  const void* lportptr;
999  const void* raddrptr;
1000  const void* rportptr;
1001  } nopen;
1002 
1003  struct {
1004  uint8_t sktid;
1005  } nclose;
1006 
1007  struct {
1008  uint8_t sktid;
1009  uint8_t family;
1010  uint8_t proto;
1011  pktlab_time_t time;
1012  uint16_t tag;
1013  union {
1014  struct {
1015  uint8_t raddrlen;
1016  const void* raddrptr;
1017  uint8_t rportlen;
1018  const void* rportptr;
1019  } udp;
1020  };
1021  uint32_t len;
1022  const void * ptr;
1023  } nsend;
1024 
1025  struct {
1026  uint8_t sktid;
1027  uint8_t family;
1028  uint8_t proto;
1029  pktlab_time_t endtime;
1030  const void * filter;
1031  uint32_t filterlen;
1032  } ncap;
1033 
1034  struct {
1035  uint8_t sktid;
1036  uint8_t family;
1037  uint8_t proto;
1038  pktlab_time_t time;
1039  union {
1040  struct {
1041  uint8_t command;
1042  } tcp;
1043  };
1044  } nctl;
1045 
1046  struct {
1047  uint8_t sktid;
1048  uint16_t tag;
1049  pktlab_time_t time;
1050  uint16_t errid;
1051  } ntag;
1052 
1053  struct {
1054  uint8_t sktid;
1055  uint8_t family;
1056  uint8_t proto;
1057  pktlab_time_t time;
1058  uint8_t code;
1059  union {
1060  struct {
1061  uint8_t raddrlen;
1062  const void* raddrptr;
1063  uint8_t rportlen;
1064  const void* rportptr;
1065  } tcp_established;
1066  };
1067  } nstat;
1068 
1069  struct {
1070  uint8_t sktid;
1071  uint8_t family;
1072  uint8_t proto;
1073  pktlab_time_t time;
1074  union {
1075  struct {
1076  uint8_t raddrlen;
1077  const void* raddrptr;
1078  uint8_t rportlen;
1079  const void* rportptr;
1080  } udp;
1081  };
1082  const void * ptr;
1083  uint32_t len;
1084  } ndata;
1085 
1086  struct {
1087  uint8_t sktid;
1088  uint8_t family;
1089  uint8_t proto;
1090  pktlab_time_t tfirst, tlast;
1091  uint32_t unitcnt, bytecnt;
1092  } ndrop;
1093 
1094  struct {
1095  uint8_t sktid;
1096  uint8_t family;
1097  uint8_t proto;
1098  uint16_t monindx;
1099  uint16_t monerrid;
1100  pktlab_time_t time;
1101  } nblock;
1102 
1103  struct {
1104  const void * derptr;
1105  uint32_t derlen;
1106  } xcert;
1107 
1108  struct {
1109  const void * chlistptr;
1110  uint32_t chlistlen;
1111  const void * eopkey;
1112  const void * xdescrptr;
1113  uint32_t xdescrlen;
1114  } xpub;
1115 
1116  struct {
1117  const void * chlistptr;
1118  uint32_t chlistlen;
1119  const void * eopkey;
1120  const void * dattrptr;
1121  uint32_t dattrlen;
1122  } xsub;
1123 
1124  struct {
1125  } suspd;
1126 
1127  struct {
1128  } resumd;
1129 
1130  struct {
1131  const void * channelptr;
1132  uint8_t channellen;
1133  const void * xdescrptr;
1134  uint32_t xdescrlen;
1135  } xnotify;
1136 
1137  struct {
1138  const void * snikeyptr;
1139  uint32_t snikeylen;
1140  } xreg;
1141  };
1142 };
1143 
1144 // message encoding/decoding utilities
1145 //
1146 
1151 #define PKTLAB_HLEN 4
1152 
1166 extern size_t pktlab_decode_message (
1167  struct pktlab_message * restrict msg,
1168  const void * restrict ptr, size_t len);
1169 
1174 #define PKTLAB_ENCODE_IOVCNT 5
1175 
1179 #define PKTLAB_ENCODE_BUFSZ (PKTLAB_HLEN+32) // note: ndrop msg is 27 bytes long
1180 
1193 extern int pktlab_encode_message (
1194  const struct pktlab_message * restrict msg,
1195  void * restrict buf, struct iovec * restrict iov);
1196 
1197 // Functions of the form create_XXX_message create a message of the given
1198 // type with the given parameters. They combine memory allocation and
1199 // pktlab_message structure initialization into one call.
1200 
1208 extern struct pktlab_message * pktlab_create_result_message(enum pktlab_status status);
1209 
1219 extern struct pktlab_message * pktlab_create_monrej_result_message(uint16_t monindx, uint16_t monerrid);
1220 
1229 extern struct pktlab_message * pktlab_create_monukn_result_message(uint16_t monindx);
1230 
1231 //
1232 // READER-RELATED DECLARATIONS & DEFINITIONS
1233 //
1234 
1239 struct pktlab_reader; // opaque
1240 
1246 typedef ssize_t (*pktlab_read_t) (void * aux, void * buf, size_t buflen);
1247 
1258 extern struct pktlab_reader * pktlab_create_reader(pktlab_read_t read, void * aux);
1265 extern void pktlab_close_reader(struct pktlab_reader * r);
1271 extern void * pktlab_reader_readaux(const struct pktlab_reader * r);
1272 
1290 extern int pktlab_read_message (
1291  struct pktlab_reader * restrict r,
1292  struct pktlab_message ** restrict msgptr);
1293 
1294 //
1295 // WRITER-RELATED DECLARATIONS & DEFINITIONS
1296 //
1297 
1302 struct pktlab_writer; // opaque
1303 
1309 typedef ssize_t (*pktlab_write_t) (void * aux, const void * buf, size_t nbyte);
1310 
1321 extern struct pktlab_writer * pktlab_create_writer(pktlab_write_t write, void * aux);
1328 extern void pktlab_close_writer(struct pktlab_writer * w);
1339 extern int pktlab_flush_writer(struct pktlab_writer * w);
1347 extern size_t pktlab_writer_unsent(const struct pktlab_writer * w);
1348 
1354 extern void * pktlab_writer_writeaux(const struct pktlab_writer * w);
1355 
1371 extern int pktlab_write_message (
1372  struct pktlab_writer * restrict w,
1373  const struct pktlab_message * restrict msg);
1374 
1375 //
1376 // MESSAGE-FORMATING FUNCTION DECLARATIONS
1377 //
1378 
1379 // TODO: formating support
1380 // The pktlab_format_message function formats a message as an ASCII string.
1381 // On entry, buf must be a pointer to a buffer of size bufsz and msg much
1382 // be a valid message. On return, buf will contain up to bufsz bytes of the
1383 // textual representation of the message. The string is terminating with a
1384 // '\0' character (unless bufsz == 0). The number of characters that would
1385 // be necessary to represent the message completely (excluding the
1386 // terminaing '\0' character) is returned.
1387 
1388 // extern int pktlab_format_message (
1389 // char * restrict buf, size_t bufsz,
1390 // const struct pktlab_message * restrict msg);
1391 
1392 // extern int pktlab_parse_message (
1393 // const char * restrict str,
1394 // struct pktlab_message * restrict msg, void ** restrict data);
1395 
1396 // extern int pktlab_print_message (
1397 // FILE * restrict file, const struct pktlab_message * restrict msg);
1398 
1399 // extern int pktlab_scan_message (
1400 // FILE * restrict file,
1401 // struct pktlab_message * restrict msg, void ** restrict data);
1402 
1403 // extern const char * pktlab_status_name(enum pktlab_status status);
1404 // extern const char * pktlab_status_descr(enum pktlab_status status);
1405 // extern const char * pktlab_msgtype_name(enum pktlab_message_type type);
1406 
1412 extern const char * pktlab_sktstate_name(enum pktlab_socket_state state);
1413 
1414 //
1415 // KEY-RELATED DECLARATIONS & DEFINITIONS
1416 //
1417 
1424 #define PKTLAB_PUBLICKEY_LEN 32
1425 
1431 #define PKTLAB_PRIVATEKEY_LEN 32
1432 
1438 #define PKTLAB_KEYID_LEN PKTLAB_SHA256_DIGEST_LEN
1439 
1445 #define PKTLAB_SIGNATURE_LEN PKTLAB_ED25519_SIG_LEN
1446 
1453 struct pktlab_publickey; // opaque
1454 
1461 extern struct pktlab_publickey * pktlab_create_publickey(void);
1474 extern int pktlab_load_publickey_pem (
1475  const char * pem, uint_fast32_t pemlen,
1476  struct pktlab_publickey * k);
1489 extern int pktlab_load_publickey_der (
1490  const uint8_t * der, uint_fast32_t derlen,
1491  struct pktlab_publickey * k);
1504 extern int pktlab_load_publickey_raw (
1505  const uint8_t * bytes, uint_fast32_t len,
1506  struct pktlab_publickey * k);
1514 extern int pktlab_cleanup_publickey(struct pktlab_publickey * k);
1522 extern int pktlab_get_publickey_bytes (
1523  const struct pktlab_publickey * k,
1524  void * buf, uint_fast32_t buflen);
1525 
1533 extern int pktlab_get_key_identifier (
1534  const struct pktlab_publickey * k,
1535  void * buf, uint_fast32_t buflen);
1536 
1543 struct pktlab_privatekey; // opaque
1544 
1551 extern struct pktlab_privatekey * pktlab_create_privatekey(void);
1565 extern int pktlab_load_privatekey_pem (
1566  const char * pem, uint_fast32_t pemlen,
1567  const char * passphrase, struct pktlab_privatekey * k);
1581 extern int pktlab_load_privatekey_der (
1582  const uint8_t * der, uint_fast32_t derlen,
1583  const char * passphrase, struct pktlab_privatekey * k);
1596 extern int pktlab_load_privatekey_raw (
1597  const uint8_t * bytes, uint_fast32_t len,
1598  struct pktlab_privatekey * k);
1606 extern int pktlab_cleanup_privatekey(struct pktlab_privatekey * k);
1614 extern int pktlab_get_privatekey_bytes (
1615  const struct pktlab_privatekey * k,
1616  void * buf, uint_fast32_t buflen);
1617 
1624  const struct pktlab_privatekey * k);
1625 
1626 //
1627 // CERTIFICATE-RELATED DECLARATIONS & DEFINITIONS
1628 //
1629 
1635  PKTLAB_CERT_SUBCMD = 0,
1636  PKTLAB_CERT_PUBCMD = 1,
1637  PKTLAB_CERT_EXPPRIV = 2,
1638  PKTLAB_CERT_DELPRIV = 3,
1639  PKTLAB_CERT_AGENT = 4,
1640  PKTLAB_CERT_UNKNOWN = 127
1641 };
1642 
1651 enum pktlab_del_type {
1652  PKTLAB_DEL_TYPE_EXPPRIV = 0x1,
1653  PKTLAB_DEL_TYPE_REPPRIV = 0x2,
1654  PKTLAB_DEL_TYPE_NOT_PRSENT = 0x0,
1655 };
1656 
1669 #define PKTLAB_FILTER_DIGEST_LEN PKTLAB_SHA256_DIGEST_LEN
1670 #define PKTLAB_MONITOR_DIGEST_LEN PKTLAB_SHA256_DIGEST_LEN
1671 
1704 };
1705 
1711  int prfam;
1712  uint8_t ip_address[PKTLAB_ADDRLEN_MAX];
1713  uint8_t network_mask[PKTLAB_ADDRLEN_MAX];
1714  struct pktlab_valid_dest * next;
1715 };
1716 
1722  pktlab_time_t win; // sliding time window (duration)
1723  uint64_t cnt; // maximum count in the time window
1724  struct pktlab_burst_rate * next; // next record in linked list
1725 };
1726 
1732  uint8_t * serialno;
1733  uint32_t serialno_len;
1734 
1735  pktlab_time_t valid_not_before;
1736  pktlab_time_t valid_not_after;
1737 
1738  uint8_t publickey[PKTLAB_PUBLICKEY_LEN];
1739 
1740  uint8_t authority_key_id[PKTLAB_KEYID_LEN];
1741  uint8_t subject_key_id[PKTLAB_KEYID_LEN];
1742 
1743  int_fast32_t pathlen; // -1 for no restriction
1744 
1745  char * cert_info;
1746  char * cert_limit;
1747 };
1748 
1756  uint8_t * serialno;
1757  uint32_t serialno_len;
1758 
1759  uint8_t authority_key_id[PKTLAB_KEYID_LEN];
1760 
1761  struct {
1762  enum pktlab_cert_type cert_type;
1763  enum pktlab_del_type del_type;
1764  char * cert_desc;
1765  struct pktlab_aux_field * aux_info;
1766  uint_fast32_t aux_info_count;
1767  } info;
1768  struct {
1769  uint8_t * monitor_digests;
1770  uint_fast32_t monitor_digests_count;
1771  uint64_t max_num_priority;
1772  bool max_num_priority_present;
1773  uint64_t max_socket_count;
1774  bool max_socket_count_present;
1775  uint64_t max_exp_period;
1776  bool max_exp_period_present;
1777  uint64_t max_send_byte;
1778  bool max_send_byte_present;
1779  uint64_t max_send_pkt;
1780  bool max_send_pkt_present;
1781  uint64_t max_recv_byte;
1782  bool max_recv_byte_present;
1783  uint64_t max_recv_pkt;
1784  bool max_recv_pkt_present;
1785  bool src_ip_spoofing;
1786  bool src_ip_spoofing_present;
1787  struct pktlab_burst_rate * max_burst_rate_byte;
1788  struct pktlab_burst_rate * max_burst_rate_pkt;
1789  struct pktlab_valid_dest * valid_dest;
1790  struct pktlab_aux_field * aux_limit;
1791  uint_fast32_t aux_limit_count;
1792  } limit;
1793  struct pktlab_cert_detail * next; // NULL if no more
1794 };
1795 
1796 // TODO: register OID with IANA at https://pen.iana.org/pen/PenApplication.page; also fix this
1797 // pktlab extension OIDs
1798 #define PKTLAB_EXT_CERT_INFO "1.2.3.1"
1799 #define PKTLAB_EXT_CERT_LIMIT "1.2.3.3"
1800 
1801 // pktlab certificate type string (present in cert)
1802 #define PKTLAB_CERTTYPE_STR_SUBCMD "subcmd"
1803 #define PKTLAB_CERTTYPE_STR_PUBCMD "pubcmd"
1804 #define PKTLAB_CERTTYPE_STR_EXPPRIV "exppriv"
1805 #define PKTLAB_CERTTYPE_STR_DELPRIV "delpriv"
1806 #define PKTLAB_CERTTYPE_STR_AGENT "agent"
1807 #define PKTLAB_CERTTYPE_STR_UNKNOWN "unknown"
1808 
1809 // utilities for loading and decoding pktlab certificates
1810 //
1811 
1816 struct pktlab_certificate; // opaque
1817 
1824 extern struct pktlab_certificate * pktlab_create_cert(void);
1825 
1838 extern int pktlab_load_cert_pem (
1839  const char * pem, uint_fast32_t pemlen,
1840  struct pktlab_certificate * cert);
1852 extern int pktlab_load_cert_der (
1853  const uint8_t * der, uint_fast32_t derlen,
1854  struct pktlab_certificate * cert);
1865 extern int pktlab_get_cert_der (
1866  const struct pktlab_certificate * cert,
1867  void ** der, uint_fast32_t * derlen);
1878 extern int pktlab_decode_certificate (
1879  const struct pktlab_certificate * cert,
1880  const struct pktlab_publickey * signkey,
1881  struct pktlab_decoded_certificate ** decoded_cert);
1882 
1894 extern int pktlab_decode_cert_detail (
1895  const struct pktlab_certificate * cert,
1896  const struct pktlab_publickey * signkey,
1897  struct pktlab_cert_detail ** ptr);
1898 
1906  const struct pktlab_decoded_certificate * decoded_cert,
1907  enum pktlab_cert_type * cert_type);
1908 
1918  const struct pktlab_certificate * cert,
1919  const struct pktlab_publickey * signkey);
1927 extern int pktlab_cleanup_cert(struct pktlab_certificate * cert);
1928 
1934 extern int pktlab_cleanup_detail_ls(struct pktlab_cert_detail * head);
1935 
1941 extern const char * pktlab_cert_type_name(int cert_type);
1947 extern int pktlab_cert_type_name_to_id(const char * name);
1948 
1955 extern int pktlab_get_agent_key (
1956  const struct pktlab_certificate * agent_cert,
1957  uint8_t * agent_pubkey);
1958 
1959 // utilities for verifying pktlab certificate chains
1960 //
1961 
1973 };
1974 
1994 };
1995 
2011 extern int pktlab_verify_cert_chain (
2012  int auth_mode,
2013  struct pktlab_certificate ** cert_ls,
2014  struct pktlab_publickey ** root_ls,
2015  struct pktlab_certificate *** verified_cert_ls,
2016  uint_fast32_t certnum,
2017  uint_fast32_t rootnum,
2018  uint_fast32_t * verified_certnum,
2019  uint_fast32_t * used_root_indx);
2020 
2021 // utilities for extracting setup info from cert chain
2022 //
2023 
2031  PKTLAB_PARSE_CHAIN_SUCCESS = 0,
2032  PKTLAB_PARSE_CHAIN_INVAL = 1,
2033  PKTLAB_PARSE_CHAIN_BAD_CHAIN = 2,
2034  PKTLAB_PARSE_CHAIN_BAD_KEY = 3,
2035  PKTLAB_PARSE_CHAIN_UNKNOWN_FAULT = 127,
2036 };
2037 
2053  struct pktlab_certificate ** cert_ls,
2054  uint_fast32_t certnum, const uint8_t * endpoint_key,
2055  struct pktlab_publickey * root_eop_key,
2056  uint8_t ** subable_channels, uint_fast32_t * channelnum);
2057 
2073  struct pktlab_certificate ** cert_ls,
2074  uint_fast32_t certnum,
2075  const uint8_t * controller_key,
2076  struct pktlab_publickey * trusted_eop_key,
2077  struct pktlab_cert_detail ** cert_details,
2078  uint8_t * subable_channel);
2079 
2080 //
2081 // BYTE/ADDRESS INVARIANT MEMORY ACCESS FUNCTION DECLARATIONS
2082 //
2083 
2091 static inline uint_fast8_t pktlab_get8(const void * ptr);
2092 static inline uint_fast16_t pktlab_get16b(const void * ptr);
2093 static inline uint_fast16_t pktlab_get16l(const void * ptr);
2094 static inline uint_fast32_t pktlab_get24b(const void * ptr);
2095 static inline uint_fast32_t pktlab_get24l(const void * ptr);
2096 static inline uint_fast32_t pktlab_get32b(const void * ptr);
2097 static inline uint_fast32_t pktlab_get32l(const void * ptr);
2098 static inline uint_fast64_t pktlab_get64b(const void * ptr);
2099 static inline uint_fast64_t pktlab_get64l(const void * ptr);
2100 
2101 #define pktlab_get16n pktlab_get16b
2102 #define pktlab_get24n pktlab_get24b
2103 #define pktlab_get32n pktlab_get32b
2104 #define pktlab_get64n pktlab_get64b
2105 
2113 static inline void pktlab_set8(void * ptr, uint_fast8_t val);
2114 static inline void pktlab_set16b(void * ptr, uint_fast16_t val);
2115 static inline void pktlab_set16l(void * ptr, uint_fast16_t val);
2116 static inline void pktlab_set24b(void * ptr, uint_fast32_t val);
2117 static inline void pktlab_set24l(void * ptr, uint_fast32_t val);
2118 static inline void pktlab_set32b(void * ptr, uint_fast32_t val);
2119 static inline void pktlab_set32l(void * ptr, uint_fast32_t val);
2120 static inline void pktlab_set64b(void * ptr, uint_fast64_t val);
2121 static inline void pktlab_set64l(void * ptr, uint_fast64_t val);
2122 
2123 #define pktlab_set16n pktlab_set16b
2124 #define pktlab_set24n pktlab_set24b
2125 #define pktlab_set32n pktlab_set32b
2126 #define pktlab_set64n pktlab_set64b
2127 
2128 //
2129 // BYTE ORDER CONVERSION FUNCTION DECLARATIONS
2130 //
2131 
2139 static inline uint_fast16_t pktlab_hton16(uint_fast16_t x);
2140 static inline uint_fast32_t pktlab_hton32(uint_fast32_t x);
2141 static inline uint_fast64_t pktlab_hton64(uint_fast64_t x);
2142 static inline uint_fast16_t pktlab_ntoh16(uint_fast16_t x);
2143 static inline uint_fast32_t pktlab_ntoh32(uint_fast32_t x);
2144 static inline uint_fast64_t pktlab_ntoh64(uint_fast64_t x);
2145 
2146 //
2147 // BIT ACCESS FUNCTION DECLARATIONS
2148 //
2149 
2159 static inline bool pktlab_getbit8(uint_fast8_t bits, uint_fast8_t pos);
2160 static inline bool pktlab_getbit16(uint_fast16_t bits, uint_fast8_t pos);
2161 static inline bool pktlab_getbit32(uint_fast32_t bits, uint_fast8_t pos);
2162 static inline bool pktlab_getbit64(uint_fast64_t bits, uint_fast8_t pos);
2163 
2173 static inline uint_fast8_t pktlab_setbit8(uint_fast8_t bits, uint_fast8_t pos);
2174 static inline uint_fast16_t pktlab_setbit16(uint_fast16_t bits, uint_fast8_t pos);
2175 static inline uint_fast32_t pktlab_setbit32(uint_fast32_t bits, uint_fast8_t pos);
2176 static inline uint_fast64_t pktlab_setbit64(uint_fast64_t bits, uint_fast8_t pos);
2177 
2187 static inline uint_fast8_t pktlab_clrbit8(uint_fast8_t bits, uint_fast8_t pos);
2188 static inline uint_fast16_t pktlab_clrbit16(uint_fast16_t bits, uint_fast8_t pos);
2189 static inline uint_fast32_t pktlab_clrbit32(uint_fast32_t bits, uint_fast8_t pos);
2190 static inline uint_fast64_t pktlab_clrbit64(uint_fast64_t bits, uint_fast8_t pos);
2191 
2192 //
2193 // INLINE FUNCTION DEFINITIONS
2194 //
2195 
2196 static inline pktlab_time_t pktlab_time_sec(uint_fast32_t sec) {
2197  return (uint64_t) sec * PKTLAB_TICKS_PER_SECOND;
2198 }
2199 
2200 static inline pktlab_time_t pktlab_timeval_to_time(const struct timeval * tv) {
2201  return (uint64_t) tv->tv_sec * PKTLAB_TICKS_PER_SECOND
2202  + (uint64_t) tv->tv_usec * PKTLAB_TICKS_PER_SECOND / 1000000;
2203 }
2204 
2205 static inline pktlab_time_t pktlab_timespec_to_time(const struct timespec * tp) {
2206  return (uint64_t) tp->tv_sec * PKTLAB_TICKS_PER_SECOND + (uint64_t) tp->tv_nsec;
2207 }
2208 
2209 static inline void pktlab_time_to_timeval (
2210  pktlab_time_t t, struct timeval * tv)
2211 {
2212  const uint64_t t_us = t / (PKTLAB_TICKS_PER_SECOND / 1000000);
2213  tv->tv_sec = t_us / 1000000;
2214  tv->tv_usec = t_us % 1000000;
2215 }
2216 
2217 static inline void pktlab_time_to_timespec (
2218  pktlab_time_t t, struct timespec * tp)
2219 {
2220  tp->tv_sec = t / PKTLAB_TICKS_PER_SECOND;
2221  tp->tv_nsec = t % PKTLAB_TICKS_PER_SECOND;
2222 }
2223 
2224 static inline uint_fast32_t pktlab_time_to_unix_time(pktlab_time_t t) {
2225  return t / PKTLAB_TICKS_PER_SECOND;
2226 }
2227 
2228 static inline uint_fast8_t pktlab_get8(const void * ptr) {
2229  return *(const uint8_t*)ptr;
2230 }
2231 
2232 static inline uint_fast16_t pktlab_get16b(const void * ptr) {
2233  const uint8_t * u8ptr = ptr;
2234  uint_fast16_t val;
2235 
2236  val = (uint_fast16_t) u8ptr[0] << 8;
2237  val |= u8ptr[1];
2238  return val;
2239 }
2240 
2241 static inline uint_fast16_t pktlab_get16l(const void * ptr) {
2242  const uint8_t * u8ptr = ptr;
2243  uint_fast16_t val;
2244 
2245  val = (uint_fast16_t) u8ptr[1] << 8;
2246  val |= u8ptr[0];
2247  return val;
2248 }
2249 
2250 static inline uint_fast32_t pktlab_get24b(const void * ptr) {
2251  const uint8_t * u8ptr = ptr;
2252  uint_fast32_t val;
2253 
2254  val = (uint_fast32_t) u8ptr[0] << 16;
2255  val |= (uint_fast16_t) u8ptr[1] << 8;
2256  val |= u8ptr[2];
2257  return val;
2258 }
2259 
2260 static inline uint_fast32_t pktlab_get24l(const void * ptr) {
2261  const uint8_t * u8ptr = ptr;
2262  uint_fast32_t val;
2263 
2264  val = (uint_fast32_t) u8ptr[2] << 16;
2265  val |= (uint_fast16_t) u8ptr[1] << 8;
2266  val |= u8ptr[0];
2267  return val;
2268 }
2269 
2270 static inline uint_fast32_t pktlab_get32b(const void * ptr) {
2271  uint_fast32_t val;
2272 
2273  val = (uint_fast32_t) pktlab_get16b(ptr) << 16;
2274  val |= pktlab_get16b(ptr+2);
2275  return val;
2276 }
2277 
2278 static inline uint_fast32_t pktlab_get32l(const void * ptr) {
2279  uint_fast32_t val;
2280 
2281  val = (uint_fast32_t) pktlab_get16l(ptr+2) << 16;
2282  val |= pktlab_get16l(ptr);
2283  return val;
2284 }
2285 
2286 static inline uint_fast64_t pktlab_get64b(const void * ptr) {
2287  uint_fast64_t val;
2288 
2289  val = (uint_fast64_t) pktlab_get32b(ptr) << 32;
2290  val |= pktlab_get32b(ptr+4);
2291  return val;
2292 }
2293 
2294 static inline uint_fast64_t pktlab_get64l(const void * ptr) {
2295  uint_fast64_t val;
2296 
2297  val = (uint_fast64_t) pktlab_get32l(ptr+4) << 32;
2298  val |= pktlab_get32l(ptr);
2299  return val;
2300 }
2301 
2302 static inline void pktlab_set8(void * ptr, uint_fast8_t val) {
2303  *(uint8_t*)ptr = val;
2304 }
2305 
2306 static inline void pktlab_set16b(void * ptr, uint_fast16_t val) {
2307  uint8_t * u8ptr = ptr;
2308  u8ptr[0] = val >> 8;
2309  u8ptr[1] = val >> 0;
2310 }
2311 
2312 static inline void pktlab_set16l(void * ptr, uint_fast16_t val) {
2313  uint8_t * u8ptr = ptr;
2314  u8ptr[1] = val >> 8;
2315  u8ptr[0] = val >> 0;
2316 }
2317 
2318 static inline void pktlab_set24b(void * ptr, uint_fast32_t val) {
2319  uint8_t * u8ptr = ptr;
2320  u8ptr[0] = val >> 16;
2321  u8ptr[1] = val >> 8;
2322  u8ptr[2] = val >> 0;
2323 }
2324 
2325 static inline void pktlab_set24l(void * ptr, uint_fast32_t val) {
2326  uint8_t * u8ptr = ptr;
2327  u8ptr[2] = val >> 16;
2328  u8ptr[1] = val >> 8;
2329  u8ptr[0] = val >> 0;
2330 }
2331 
2332 static inline void pktlab_set32b(void * ptr, uint_fast32_t val) {
2333  pktlab_set16b(ptr, val >> 16);
2334  pktlab_set16b(ptr+2, val);
2335 }
2336 
2337 static inline void pktlab_set32l(void * ptr, uint_fast32_t val) {
2338  pktlab_set16l(ptr+2, val >> 16);
2339  pktlab_set16l(ptr, val);
2340 }
2341 
2342 static inline void pktlab_set64b(void * ptr, uint_fast64_t val) {
2343  pktlab_set32b(ptr, val >> 32);
2344  pktlab_set32b(ptr+4, val);
2345 }
2346 
2347 static inline void pktlab_set64l(void * ptr, uint_fast64_t val) {
2348  pktlab_set32l(ptr+4, val >> 32);
2349  pktlab_set32l(ptr, val);
2350 }
2351 
2352 static inline uint_fast16_t pktlab_hton16(uint_fast16_t x) {
2353  return htons(x);
2354 }
2355 
2356 static inline uint_fast32_t pktlab_hton32(uint_fast32_t x) {
2357  return htonl(x);
2358 }
2359 
2360 static inline uint_fast64_t pktlab_hton64(uint_fast64_t x) {
2361  uint_fast32_t hi, lo;
2362 
2363  hi = x >> 32;
2364  lo = x & UINT32_C(0xffffffff);
2365  return ((uint_fast64_t) pktlab_hton32(lo) << 32) | pktlab_hton32(hi);
2366 }
2367 
2368 static inline uint_fast16_t pktlab_ntoh16(uint_fast16_t x) {
2369  return ntohs(x);
2370 }
2371 
2372 static inline uint_fast32_t pktlab_ntoh32(uint_fast32_t x) {
2373  return ntohl(x);
2374 }
2375 
2376 static inline uint_fast64_t pktlab_ntoh64(uint_fast64_t x) {
2377  uint_fast32_t hi, lo;
2378 
2379  lo = pktlab_ntoh32(x >> 32);
2380  hi = pktlab_ntoh32(x & UINT32_C(0xffffffff));
2381  return ((uint_fast64_t) hi << 32) | lo;
2382 }
2383 
2384 static inline bool pktlab_getbit8(uint_fast8_t bits, uint_fast8_t pos) {
2385  return pktlab_getbit64(bits, pos);
2386 }
2387 
2388 static inline bool pktlab_getbit16(uint_fast16_t bits, uint_fast8_t pos) {
2389  return pktlab_getbit64(bits, pos);
2390 }
2391 
2392 static inline bool pktlab_getbit32(uint_fast32_t bits, uint_fast8_t pos) {
2393  return pktlab_getbit64(bits, pos);
2394 }
2395 
2396 static inline bool pktlab_getbit64(uint_fast64_t bits, uint_fast8_t pos) {
2397  return (pos >= 0x40) ? false : (bits & ((uint_fast64_t) 1 << pos));
2398 }
2399 
2400 
2401 static inline uint_fast8_t pktlab_setbit8(uint_fast8_t bits, uint_fast8_t pos) {
2402  return pktlab_setbit64(bits, pos);
2403 }
2404 
2405 static inline uint_fast16_t pktlab_setbit16(uint_fast16_t bits, uint_fast8_t pos) {
2406  return pktlab_setbit64(bits, pos);
2407 }
2408 
2409 static inline uint_fast32_t pktlab_setbit32(uint_fast32_t bits, uint_fast8_t pos) {
2410  return pktlab_setbit64(bits, pos);
2411 }
2412 
2413 static inline uint_fast64_t pktlab_setbit64(uint_fast64_t bits, uint_fast8_t pos) {
2414  return (pos >= 0x40) ? bits : (bits | ((uint_fast64_t) 1 << pos));
2415 }
2416 
2417 
2418 static inline uint_fast8_t pktlab_clrbit8(uint_fast8_t bits, uint_fast8_t pos) {
2419  return pktlab_clrbit64(bits, pos);
2420 }
2421 
2422 static inline uint_fast16_t pktlab_clrbit16(uint_fast16_t bits, uint_fast8_t pos) {
2423  return pktlab_clrbit64(bits, pos);
2424 }
2425 
2426 static inline uint_fast32_t pktlab_clrbit32(uint_fast32_t bits, uint_fast8_t pos) {
2427  return pktlab_clrbit64(bits, pos);
2428 }
2429 
2430 static inline uint_fast64_t pktlab_clrbit64(uint_fast64_t bits, uint_fast8_t pos) {
2431  return (pos >= 0x40) ? bits : (bits & ~((uint_fast64_t) 1 << pos));
2432 }
2433 
2434 #endif
PKTLAB_DECODE_BAD_VALID_DEST
@ PKTLAB_DECODE_BAD_VALID_DEST
Definition: pktlab.h:1700
PKTLAB_EBPF
@ PKTLAB_EBPF
Definition: pktlab.h:357
PKTLAB_WASM
@ PKTLAB_WASM
Definition: pktlab.h:358
pktlab_load_privatekey_raw
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.
pktlab_publickey
pktlab public key opaque struct.
pktlab_ebpf_instr::imm
uint32_t imm
Definition: pktlab.h:370
pktlab_load_cert_der
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_verify_rst
pktlab_verify_rst
pktlab certificate chain verification result values.
Definition: pktlab.h:1981
pktlab_uri
Structure for storing decoded pktlab URI information.
Definition: pktlab.h:472
pktlab_create_writer
struct pktlab_writer * pktlab_create_writer(pktlab_write_t write, void *aux)
Get initialized pktlab writer struct.
PKTLAB_DECODE_BAD_CERT_INFO
@ PKTLAB_DECODE_BAD_CERT_INFO
Definition: pktlab.h:1693
pktlab_load_privatekey_pem
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_decode_cert_detail
int pktlab_decode_cert_detail(const struct pktlab_certificate *cert, const struct pktlab_publickey *signkey, struct pktlab_cert_detail **ptr)
Decode pktlab certificate detail information from loaded pktlab certificate struct.
pktlab_get_privatekey_bytes
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.
PKTLAB_DECODE_BAD_KEYUSAGE
@ PKTLAB_DECODE_BAD_KEYUSAGE
Definition: pktlab.h:1686
PKTLAB_DECODE_BAD_MAX_BURST_RATE
@ PKTLAB_DECODE_BAD_MAX_BURST_RATE
Definition: pktlab.h:1702
pktlab_uri::type
enum pktlab_uri_type type
Definition: pktlab.h:473
pktlab_get_program_digest
int pktlab_get_program_digest(const void *data, uint_fast32_t datalen, uint8_t *digest)
Compute encoded pktlab program digest.
pktlab_message_type
pktlab_message_type
pktlab defined message types.
Definition: pktlab.h:799
MALFORMED_URI_TYPE
@ MALFORMED_URI_TYPE
Definition: pktlab.h:465
pktlab_uri_type
pktlab_uri_type
pktlab defined URI types.
Definition: pktlab.h:462
PKTLAB_DECODE_BAD_SUBJ_PUBKEY
@ PKTLAB_DECODE_BAD_SUBJ_PUBKEY
Definition: pktlab.h:1689
pktlab_channel
Structure for encoding/decoding channel lists in xpub and xsub messages.
Definition: pktlab.h:302
pktlab_create_publickey
struct pktlab_publickey * pktlab_create_publickey(void)
Allocate initialized pktlab public key struct.
pktlab_close_reader
void pktlab_close_reader(struct pktlab_reader *r)
Close and free pktlab reader struct.
pktlab_cert_detail
Structure for storing pktlab certificate detail information, including cert_info and cert_limit.
Definition: pktlab.h:1755
pktlab_decode_program
int pktlab_decode_program(const void *buf, uint_fast32_t buflen, enum pktlab_prog_type *type, void **prog, uint_fast32_t *proglen)
Decode pktlab program.
pktlab_load_publickey_der
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.
PKTLAB_PUBLICKEY_LEN
#define PKTLAB_PUBLICKEY_LEN
Raw public key length for pktlab keys in bytes.
Definition: pktlab.h:1424
pktlab_encode_program
int pktlab_encode_program(enum pktlab_prog_type type, const void *prog, uint_fast32_t proglen, void **buf, uint_fast32_t *buflen)
Encode pktlab program.
pktlab_timeval_to_time
static pktlab_time_t pktlab_timeval_to_time(const struct timeval *tv)
Convert time period in struct timeval to pktlab ticks.
Definition: pktlab.h:2200
pktlab_valid_dest
Structure for storing pktlab valid destination information.
Definition: pktlab.h:1710
PKTLAB_VERIFY_SUCCESS
@ PKTLAB_VERIFY_SUCCESS
Definition: pktlab.h:1982
pktlab_get_cert_der
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.
PKTLAB_DECODE_BAD_CERT_TYPE
@ PKTLAB_DECODE_BAD_CERT_TYPE
Definition: pktlab.h:1685
pktlab_read_t
ssize_t(* pktlab_read_t)(void *aux, void *buf, size_t buflen)
Function pointer type for reader read function.
Definition: pktlab.h:1246
PKTLAB_DECODE_BAD_PRIORITY
@ PKTLAB_DECODE_BAD_PRIORITY
Definition: pktlab.h:1695
PKTLAB_KEYID_LEN
#define PKTLAB_KEYID_LEN
Key identifier length for pktlab keys in bytes.
Definition: pktlab.h:1438
PKTLAB_VERIFY_INVAL
@ PKTLAB_VERIFY_INVAL
Definition: pktlab.h:1983
pktlab_clrbit8
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:2418
PKTLAB_VERIFY_NOT_ENOUGH_CERT
@ PKTLAB_VERIFY_NOT_ENOUGH_CERT
Definition: pktlab.h:1985
PKTLAB_DECODE_BAD_SIGNATURE
@ PKTLAB_DECODE_BAD_SIGNATURE
Definition: pktlab.h:1682
pktlab_auth_mode
pktlab_auth_mode
pktlab certificate chain verification mode values.
Definition: pktlab.h:1968
PKTLAB_DECODE_BAD_SID
@ PKTLAB_DECODE_BAD_SID
Definition: pktlab.h:1691
PKTLAB_ENDPOINT_AUTH_CONTROLLER
@ PKTLAB_ENDPOINT_AUTH_CONTROLLER
Definition: pktlab.h:1970
pktlab_set8
static void pktlab_set8(void *ptr, uint_fast8_t val)
Set 8-bit unsigned integer to byte array.
Definition: pktlab.h:2302
pktlab_xdescr_dattr_match
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.
pktlab_status
pktlab_status
pktlab defined errid values.
Definition: pktlab.h:855
pktlab_verify_certificate_signature
int pktlab_verify_certificate_signature(const struct pktlab_certificate *cert, const struct pktlab_publickey *signkey)
Verify the pktlab certificate signature.
pktlab_load_publickey_raw
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.
PKTLAB_DECODE_BAD_DEL_TYPE
@ PKTLAB_DECODE_BAD_DEL_TYPE
Definition: pktlab.h:1697
pktlab_tm_to_time
pktlab_time_t pktlab_tm_to_time(const struct tm *tm)
Convert time in struct tm to pktlab time.
pktlab_write_message
int pktlab_write_message(struct pktlab_writer *restrict w, const struct pktlab_message *restrict msg)
pktlab writer write message.
pktlab_time_now
pktlab_time_t pktlab_time_now(void)
Get current pktlab time.
pktlab_ebpf_instr::offset
uint16_t offset
Definition: pktlab.h:369
pktlab_writer_writeaux
void * pktlab_writer_writeaux(const struct pktlab_writer *w)
Get pktlab writer struct aux information.
pktlab_decode_xdescr
int pktlab_decode_xdescr(const char *xdescr, uint_fast32_t xdescrlen, struct pktlab_namevalue_pair **pairs, uint_fast32_t *paircnt)
Decode an encoded experiment descriptor (xdescr) string.
pktlab_writer
pktlab writer opaque struct.
pktlab_decode_dattr
int pktlab_decode_dattr(const char *dattr, uint_fast32_t dattrlen, struct pktlab_namevalue_pair **pairs, uint_fast32_t *paircnt)
Decode an encoded endpoint attribute (dattr) string.
pktlab_encode_chlist
int pktlab_encode_chlist(const struct pktlab_channel *channels, void **chlistptr, uint_fast32_t *chlistlen)
Encode a channel list.
pktlab_load_program
int pktlab_load_program(const char *data, uint_fast32_t datalen, enum pktlab_prog_type type, void **prog, uint_fast32_t *proglen, uint_fast32_t *errlineno)
Load pktlab program from file content.
PKTLAB_DECODE_BAD_BC
@ PKTLAB_DECODE_BAD_BC
Definition: pktlab.h:1692
pktlab_parse_cert_chain_rst
pktlab_parse_cert_chain_rst
pktlab certificate chain parsing result values.
Definition: pktlab.h:2030
pktlab_verify_cert_chain
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.
PKTLAB_VERIFY_NO_MATCHING_SIGN_KEY
@ PKTLAB_VERIFY_NO_MATCHING_SIGN_KEY
Definition: pktlab.h:1989
PKTLAB_DECODE_UNKNOWN_FAULT
@ PKTLAB_DECODE_UNKNOWN_FAULT
Definition: pktlab.h:1703
pktlab_time_to_unix_time
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:2224
pktlab_create_privatekey
struct pktlab_privatekey * pktlab_create_privatekey(void)
Allocate initialized pktlab private key struct.
pktlab_uri::uri
struct pktlab_uri::@0::@3 uri
pktlab_decode_rst
pktlab_decode_rst
pktlab certificate decoding result values.
Definition: pktlab.h:1678
pktlab_load_privatekey_der
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.
pktlab_encode_dattr
int pktlab_encode_dattr(const struct pktlab_namevalue_pair *pairs, uint_fast32_t paircnt, char *buf, uint_fast32_t buflen, uint_fast32_t *used)
Encode an endpoint attribute (dattr) string.
pktlab_aux_field
Structure of auxiliary field in pktlab_cert_detail.
Definition: pktlab.h:200
pktlab_uri::malformed
struct pktlab_uri::@0::@2 malformed
pktlab_decoded_certificate
Structure for storing decoded pktlab certificate information.
Definition: pktlab.h:1731
pktlab_vmem_region
Definition: pktlab.h:676
pktlab_cert_type
pktlab_cert_type
pktlab defined certificate types.
Definition: pktlab.h:1634
PKTLAB_AUTH_AGENT
@ PKTLAB_AUTH_AGENT
Definition: pktlab.h:1971
pktlab_create_reader
struct pktlab_reader * pktlab_create_reader(pktlab_read_t read, void *aux)
Get initialized pktlab reader struct.
pktlab_privatekey
pktlab private key opaque struct.
BROKER_URI_TYPE
@ BROKER_URI_TYPE
Definition: pktlab.h:464
pktlab_parse_uri
int pktlab_parse_uri(struct pktlab_uri *restrict uri_info, const void *restrict ptr, uint_fast32_t len)
Decode a pktlab URI.
PKTLAB_DECODE_BAD_SIGALG
@ PKTLAB_DECODE_BAD_SIGALG
Definition: pktlab.h:1681
PKTLAB_VERIFY_TOO_MANY_CERT
@ PKTLAB_VERIFY_TOO_MANY_CERT
Definition: pktlab.h:1986
pktlab_reader
pktlab reader opaque struct.
pktlab_ebpf_instr::dstreg
uint8_t dstreg
Definition: pktlab.h:367
pktlab_encode_message
int pktlab_encode_message(const struct pktlab_message *restrict msg, void *restrict buf, struct iovec *restrict iov)
Encode pktlab message.
pktlab_cert_type_name
const char * pktlab_cert_type_name(int cert_type)
Get pktlab certificate type string from pktlab certificate type value.
pktlab_flush_writer
int pktlab_flush_writer(struct pktlab_writer *w)
Flush pktlab writer internal buffer.
pktlab_parse_controller_exp_cert_chain
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, struct pktlab_cert_detail **cert_details, uint8_t *subable_channel)
Parse pktlab controller experiment privilege certificate chain for subscribable channel and experimen...
PKTLAB_DECODE_BAD_SERIAL
@ PKTLAB_DECODE_BAD_SERIAL
Definition: pktlab.h:1687
PKTLAB_VERIFY_BAD_CERT
@ PKTLAB_VERIFY_BAD_CERT
Definition: pktlab.h:1984
PKTLAB_DECODE_BAD_CERT_DESC
@ PKTLAB_DECODE_BAD_CERT_DESC
Definition: pktlab.h:1699
PKTLAB_DECODE_BAD_VALIDITY
@ PKTLAB_DECODE_BAD_VALIDITY
Definition: pktlab.h:1688
PKTLAB_CONTROLLER_AUTH_ENDPOINT
@ PKTLAB_CONTROLLER_AUTH_ENDPOINT
Definition: pktlab.h:1969
pktlab_ebpf_instr::srcreg
uint8_t srcreg
Definition: pktlab.h:368
pktlab_ebpf_instr
Structure for encoding/decoding pktlab eBPF programs in cdata & ncap msg. Represents one eBPF instruc...
Definition: pktlab.h:365
pktlab_get_publickey_from_privatekey
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.
pktlab_load_publickey_pem
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.
PKTLAB_DECODE_BAD_X509_VER
@ PKTLAB_DECODE_BAD_X509_VER
Definition: pktlab.h:1683
PKTLAB_VERIFY_PATHLEN_EXCEEDED
@ PKTLAB_VERIFY_PATHLEN_EXCEEDED
Definition: pktlab.h:1990
pktlab_namevalue_pair
Structure for encoding/decoding experiment descriptor (xdescr)/endpoint attribute (dattr) in xpub and...
Definition: pktlab.h:189
pktlab_time_t
uint64_t pktlab_time_t
Variable type for pktlab time.
Definition: pktlab.h:94
pktlab_burst_rate
Structure for storing pktlab burst rate information.
Definition: pktlab.h:1721
pktlab_cert_type_name_to_id
int pktlab_cert_type_name_to_id(const char *name)
Get pktlab certificate type value from pktlab certificate type string.
pktlab_create_monrej_result_message
struct pktlab_message * pktlab_create_monrej_result_message(uint16_t monindx, uint16_t monerrid)
Get fields-set pktlab result message with status PKTLAB_ECTLMONREJ.
pktlab_writer_unsent
size_t pktlab_writer_unsent(const struct pktlab_writer *w)
Get writer internal buffered content length.
EXP_URI_TYPE
@ EXP_URI_TYPE
Definition: pktlab.h:463
pktlab_free_channels
void pktlab_free_channels(struct pktlab_channel *channels)
Free an allocated channel linked list.
PKTLAB_DECODE_SUCCESS
@ PKTLAB_DECODE_SUCCESS
Definition: pktlab.h:1679
pktlab_timespec_to_time
static pktlab_time_t pktlab_timespec_to_time(const struct timespec *tp)
Convert time period in struct timespec to pktlab ticks.
Definition: pktlab.h:2205
pktlab_parse_endpoint_rep_cert_chain
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...
pktlab_get8
static uint_fast8_t pktlab_get8(const void *ptr)
Get 8-bit unsigned integer from byte array.
Definition: pktlab.h:2228
PKTLAB_DECODE_USING_UNUSED_FIELD
@ PKTLAB_DECODE_USING_UNUSED_FIELD
Definition: pktlab.h:1684
pktlab_hton16
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:2352
pktlab_create_monukn_result_message
struct pktlab_message * pktlab_create_monukn_result_message(uint16_t monindx)
Get fields-set pktlab result message with status PKTLAB_ECTLMONUKN.
pktlab_get_key_identifier
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_prog_type
pktlab_prog_type
pktlab defined program types.
Definition: pktlab.h:356
pktlab_time_to_timespec
static void pktlab_time_to_timespec(pktlab_time_t t, struct timespec *tp)
Convert time period in pktlab ticks to struct timespec.
Definition: pktlab.h:2217
pktlab_close_writer
void pktlab_close_writer(struct pktlab_writer *w)
Close and free pktlab writer struct.
pktlab_create_cert
struct pktlab_certificate * pktlab_create_cert(void)
Allocate initialized pktlab certificate struct.
pktlab_cleanup_detail_ls
int pktlab_cleanup_detail_ls(struct pktlab_cert_detail *head)
Free the chain of allocated pktlab certificate detail structs.
PKTLAB_DECODE_BAD_AID
@ PKTLAB_DECODE_BAD_AID
Definition: pktlab.h:1690
pktlab_ebpf_instr::opcode
uint8_t opcode
Definition: pktlab.h:366
pktlab_create_result_message
struct pktlab_message * pktlab_create_result_message(enum pktlab_status status)
Get fields-set pktlab result message.
PKTLAB_VERIFY_END_OF_PHASES
@ PKTLAB_VERIFY_END_OF_PHASES
Definition: pktlab.h:1991
pktlab_cleanup_cert
int pktlab_cleanup_cert(struct pktlab_certificate *cert)
Free an allocated pktlab certificate struct.
PKTLAB_DECODE_BAD_MONITOR_DIGESTS
@ PKTLAB_DECODE_BAD_MONITOR_DIGESTS
Definition: pktlab.h:1696
pktlab_message
Structure for storing the decoded form of pktlab messages.
Definition: pktlab.h:930
pktlab_certificate
pktlab certificate opaque struct.
PKTLAB_DECODE_BAD_CERT_LIMIT
@ PKTLAB_DECODE_BAD_CERT_LIMIT
Definition: pktlab.h:1694
pktlab_read_message
int pktlab_read_message(struct pktlab_reader *restrict r, struct pktlab_message **restrict msgptr)
pktlab reader read message.
pktlab_encode_xdescr
int pktlab_encode_xdescr(const struct pktlab_namevalue_pair *pairs, uint_fast32_t paircnt, char *buf, uint_fast32_t buflen, uint_fast32_t *used)
Encode an experiment descriptor (xdescr) string.
PKTLAB_DECODE_BAD_SRC_IP_SPOOFING
@ PKTLAB_DECODE_BAD_SRC_IP_SPOOFING
Definition: pktlab.h:1701
pktlab_decode_message
size_t pktlab_decode_message(struct pktlab_message *restrict msg, const void *restrict ptr, size_t len)
Decode pktlab message.
PKTLAB_DECODE_BAD_AUX_INFO
@ PKTLAB_DECODE_BAD_AUX_INFO
Definition: pktlab.h:1698
pktlab_time_to_timeval
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:2209
pktlab_load_cert_pem
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.
pktlab_getbit8
static bool pktlab_getbit8(uint_fast8_t bits, uint_fast8_t pos)
Get bit from unsigned integer at bit position.
Definition: pktlab.h:2384
pktlab_setbit8
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:2401
PKTLAB_VERIFY_BAD_DEL_TYPE
@ PKTLAB_VERIFY_BAD_DEL_TYPE
Definition: pktlab.h:1992
pktlab_write_t
ssize_t(* pktlab_write_t)(void *aux, const void *buf, size_t nbyte)
Function pointer type for writer write function.
Definition: pktlab.h:1309
PKTLAB_VERIFY_UNEXPECTED_CERT
@ PKTLAB_VERIFY_UNEXPECTED_CERT
Definition: pktlab.h:1987
pktlab_get_agent_key
int pktlab_get_agent_key(const struct pktlab_certificate *agent_cert, uint8_t *agent_pubkey)
Get pktlab agent certificate subject (signee) public key.
pktlab_sktstate_name
const char * pktlab_sktstate_name(enum pktlab_socket_state state)
Get text description of pktlab endpoint skt state.
pktlab_cleanup_privatekey
int pktlab_cleanup_privatekey(struct pktlab_privatekey *k)
Free an allocated pktlab private key struct.
pktlab_decode_chlist
int pktlab_decode_chlist(const void *chlistptr, uint_fast32_t chlistlen, struct pktlab_channel **channels)
Decode a channel list.
pktlab_decoded_cert_get_cert_type
int pktlab_decoded_cert_get_cert_type(const struct pktlab_decoded_certificate *decoded_cert, enum pktlab_cert_type *cert_type)
Get pktlab certificate type from decoded pktlab certificate information.
PKTLAB_NO_VERIFY
@ PKTLAB_NO_VERIFY
Definition: pktlab.h:1972
pktlab_time_sec
static pktlab_time_t pktlab_time_sec(uint_fast32_t sec)
Convert seconds to pktlab ticks.
Definition: pktlab.h:2196
PKTLAB_DECODE_INVAL
@ PKTLAB_DECODE_INVAL
Definition: pktlab.h:1680
pktlab_reader_readaux
void * pktlab_reader_readaux(const struct pktlab_reader *r)
Get pktlab reader struct aux information.
pktlab_get_publickey_bytes
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.
PKTLAB_VERIFY_EXPIRED_CERT
@ PKTLAB_VERIFY_EXPIRED_CERT
Definition: pktlab.h:1988
pktlab_decode_certificate
int pktlab_decode_certificate(const struct pktlab_certificate *cert, const struct pktlab_publickey *signkey, struct pktlab_decoded_certificate **decoded_cert)
Decode pktlab certificate information from loaded pktlab certificate struct.
pktlab_cleanup_publickey
int pktlab_cleanup_publickey(struct pktlab_publickey *k)
Free an allocated pktlab public key struct.
PKTLAB_VERIFY_UNKNOWN_FAULT
@ PKTLAB_VERIFY_UNKNOWN_FAULT
Definition: pktlab.h:1993