• source navigation  • diff markup  • identifier search  • freetext search  • 

Sources/libubox/udebug.h

  1 /*
  2  * udebug - debug ring buffer library
  3  *
  4  * Copyright (C) 2023 Felix Fietkau <nbd@nbd.name>
  5  *
  6  * Permission to use, copy, modify, and/or distribute this software for any
  7  * purpose with or without fee is hereby granted, provided that the above
  8  * copyright notice and this permission notice appear in all copies.
  9  *
 10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 14  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 15  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 16  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 17  */
 18 #ifndef __UDEBUG_RINGBUF_H
 19 #define __UDEBUG_RINGBUF_H
 20 
 21 #include <sys/types.h>
 22 #include <stdint.h>
 23 #include <stdarg.h>
 24 
 25 #include "list.h"
 26 #include "uloop.h"
 27 #include "avl.h"
 28 
 29 #define UDEBUG_SOCK_NAME        "/var/run/udebug.sock"
 30 
 31 enum udebug_format {
 32         UDEBUG_FORMAT_PACKET,
 33         UDEBUG_FORMAT_STRING,
 34         UDEBUG_FORMAT_BLOBMSG,
 35 };
 36 
 37 enum {
 38         UDEBUG_DLT_ETHERNET = 1,
 39         UDEBUG_DLT_PPP = 50,
 40         UDEBUG_DLT_RAW_IP = 101,
 41         UDEBUG_DLT_IEEE_802_11 = 105,
 42         UDEBUG_DLT_IEEE_802_11_RADIOTAP = 127,
 43         UDEBUG_DLT_NETLINK = 253,
 44 };
 45 
 46 enum udebug_meta_type {
 47         UDEBUG_META_IFACE_NAME,
 48         UDEBUG_META_IFACE_DESC,
 49         __UDEBUG_META_MAX
 50 };
 51 
 52 #define UDEBUG_TS_MSEC  1000ULL
 53 #define UDEBUG_TS_SEC   (1000ULL * UDEBUG_TS_MSEC)
 54 
 55 struct udebug;
 56 struct udebug_hdr;
 57 
 58 struct udebug_buf_flag {
 59         const char *name;
 60         uint64_t mask;
 61 };
 62 
 63 struct udebug_buf_meta {
 64         const char *name;
 65         enum udebug_format format;
 66         uint32_t sub_format; /* linktype for UDEBUG_FORMAT_PACKET */
 67         const struct udebug_buf_flag *flags;
 68         unsigned int n_flags;
 69 };
 70 
 71 struct udebug_buf {
 72         struct udebug *ctx;
 73         const struct udebug_buf_meta *meta;
 74         uint32_t id;
 75 
 76         struct list_head list;
 77 
 78         struct udebug_hdr *hdr;
 79         void *data;
 80         size_t data_size;
 81         size_t head_size;
 82         size_t ring_size;
 83         int fd;
 84 };
 85 
 86 struct udebug_packet_info {
 87         const char *attr[__UDEBUG_META_MAX];
 88 };
 89 
 90 struct udebug_remote_buf {
 91         struct avl_node node;
 92         struct udebug_buf buf;
 93         bool poll;
 94         uint32_t head;
 95 
 96         /* provided by user */
 97         uint32_t pcap_iface;
 98         void *priv;
 99         const struct udebug_packet_info *meta;
100 };
101 
102 struct udebug {
103         struct list_head local_rings;
104         struct avl_tree remote_rings;
105         uint32_t next_id;
106         struct uloop_fd fd;
107         int poll_handle;
108         char *socket_path;
109         struct uloop_timeout reconnect;
110 
111         /* filled by user */
112         void (*notify_cb)(struct udebug *ctx, struct udebug_remote_buf *rb);
113 };
114 
115 struct udebug_ptr {
116         uint32_t start;
117         uint32_t len;
118         uint64_t timestamp;
119 };
120 
121 struct udebug_snapshot {
122         struct udebug_ptr *entries;
123         unsigned int n_entries;
124         unsigned int dropped;
125         void *data;
126         size_t data_size;
127 
128         uint32_t iter_idx;
129 
130         enum udebug_format format;
131         uint32_t sub_format;
132 
133         uint32_t rbuf_idx;
134 };
135 
136 struct udebug_iter {
137         struct udebug_snapshot **list;
138         size_t n;
139 
140         struct udebug_snapshot *s;
141         unsigned int s_idx;
142 
143         uint64_t timestamp;
144         void *data;
145         size_t len;
146 };
147 
148 uint64_t udebug_timestamp(void);
149 
150 void udebug_entry_init_ts(struct udebug_buf *buf, uint64_t timestamp);
151 static inline void udebug_entry_init(struct udebug_buf *buf)
152 {
153         udebug_entry_init_ts(buf, udebug_timestamp());
154 }
155 void *udebug_entry_append(struct udebug_buf *buf, const void *data, uint32_t len);
156 int udebug_entry_printf(struct udebug_buf *buf, const char *fmt, ...)
157         __attribute__ ((format (printf, 2, 3)));
158 int udebug_entry_vprintf(struct udebug_buf *buf, const char *fmt, va_list ap)
159         __attribute__ ((format (printf, 2, 0)));
160 uint16_t udebug_entry_trim(struct udebug_buf *buf, uint16_t len);
161 void udebug_entry_set_length(struct udebug_buf *buf, uint16_t len);
162 void udebug_entry_add(struct udebug_buf *buf);
163 
164 int udebug_buf_init(struct udebug_buf *buf, size_t entries, size_t size);
165 int udebug_buf_add(struct udebug *ctx, struct udebug_buf *buf,
166                    const struct udebug_buf_meta *meta);
167 uint64_t udebug_buf_flags(struct udebug_buf *buf);
168 void udebug_buf_free(struct udebug_buf *buf);
169 static inline bool udebug_buf_valid(struct udebug_buf *buf)
170 {
171         return buf->hdr;
172 }
173 
174 struct udebug_remote_buf *udebug_remote_buf_get(struct udebug *ctx, uint32_t id);
175 int udebug_remote_buf_map(struct udebug *ctx, struct udebug_remote_buf *rb, uint32_t id);
176 void udebug_remote_buf_unmap(struct udebug *ctx, struct udebug_remote_buf *rb);
177 int udebug_remote_buf_set_poll(struct udebug *ctx, struct udebug_remote_buf *rb, bool val);
178 void udebug_remote_buf_set_flags(struct udebug_remote_buf *rb, uint64_t mask, uint64_t set);
179 struct udebug_snapshot *udebug_remote_buf_snapshot(struct udebug_remote_buf *rb);
180 bool udebug_snapshot_get_entry(struct udebug_snapshot *s, struct udebug_iter *it, unsigned int entry);
181 
182 void udebug_remote_buf_set_start_time(struct udebug_remote_buf *rb, uint64_t ts);
183 void udebug_remote_buf_set_start_offset(struct udebug_remote_buf *rb, uint32_t idx);
184 
185 void udebug_iter_start(struct udebug_iter *it, struct udebug_snapshot **s, size_t n);
186 bool udebug_iter_next(struct udebug_iter *it);
187 
188 void udebug_init(struct udebug *ctx);
189 int udebug_connect(struct udebug *ctx, const char *path);
190 void udebug_auto_connect(struct udebug *ctx, const char *path);
191 void udebug_add_uloop(struct udebug *ctx);
192 void udebug_poll(struct udebug *ctx);
193 void udebug_free(struct udebug *ctx);
194 
195 static inline bool udebug_is_connected(struct udebug *ctx)
196 {
197         return ctx->fd.fd >= 0;
198 }
199 
200 int udebug_id_cmp(const void *k1, const void *k2, void *ptr);
201 
202 #endif
203 

This page was automatically generated by LXR 0.3.1.  •  OpenWrt