Merge commit '33cb71ac91fb870702dbb71595dba4a554001e3c'
[osmocom-bb.git] / src / shared / libosmocore / include / osmocom / core / gsmtap_util.h
index 785f5e5..f553c17 100644 (file)
@@ -2,24 +2,52 @@
 #define _GSMTAP_UTIL_H
 
 #include <stdint.h>
+#include <osmocom/core/write_queue.h>
+#include <osmocom/core/select.h>
 
 /* convert RSL channel number to GSMTAP channel type */
 uint8_t chantype_rsl2gsmtap(uint8_t rsl_chantype, uint8_t rsl_link_id);
 
-/* receive a message from L1/L2 and put it in GSMTAP */
+/* generate msgb from data + metadata */
 struct msgb *gsmtap_makemsg(uint16_t arfcn, uint8_t ts, uint8_t chan_type,
                            uint8_t ss, uint32_t fn, int8_t signal_dbm,
                            uint8_t snr, const uint8_t *data, unsigned int len);
 
-/* receive a message from L1/L2 and put it in GSMTAP */
-int gsmtap_sendmsg(uint16_t arfcn, uint8_t ts, uint8_t chan_type, uint8_t ss,
-                  uint32_t fn, int8_t signal_dbm, uint8_t snr,
-                  const uint8_t *data, unsigned int len);
+/* one gsmtap instance */
+struct gsmtap_inst {
+       int ofd_wq_mode;
+       struct osmo_wqueue wq;
+       struct osmo_fd sink_ofd;
+};
 
-int gsmtap_init(uint32_t dst_ip);
+static inline int gsmtap_inst_fd(struct gsmtap_inst *gti)
+{
+       return gti->wq.bfd.fd;
+}
 
-/* Create a local 'gsmtap sink' avoiding the UDP packets being rejected
- * with ICMP reject messages */
-int gsmtap_sink_init(uint32_t bind_ip);
+/* Open a GSMTAP source (sending) socket, conncet it to host/port and
+ * return resulting fd */
+int gsmtap_source_init_fd(const char *host, uint16_t port);
+
+/* Add a local sink to an existing GSMTAP source and return fd */
+int gsmtap_source_add_sink_fd(int gsmtap_fd);
+
+/* Open GSMTAP source (sending) socket, connect it to host/port,
+ * allocate 'struct gsmtap_inst' and optionally osmo_fd/osmo_wqueue
+ * registration */
+struct gsmtap_inst *gsmtap_source_init(const char *host, uint16_t port,
+                                       int ofd_wq_mode);
+
+/* Add a local sink to an existing GSMTAP source instance */
+int gsmtap_source_add_sink(struct gsmtap_inst *gti);
+
+/* Send a msgb through a GSMTAP source */
+int gsmtap_sendmsg(struct gsmtap_inst *gti, struct msgb *msg);
+
+/* generate a message and send it via GSMTAP */
+int gsmtap_send(struct gsmtap_inst *gti, uint16_t arfcn, uint8_t ts,
+               uint8_t chan_type, uint8_t ss, uint32_t fn,
+               int8_t signal_dbm, uint8_t snr, const uint8_t *data,
+               unsigned int len);
 
 #endif /* _GSMTAP_UTIL_H */