// Part of dump1090, a Mode S message decoder for RTLSDR devices. // // net_io.h: network handling. // // Copyright (c) 2014,2015 Oliver Jowett // // This file is free software: you may copy, redistribute and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation, either version 2 of the License, or (at your // option) any later version. // // This file is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . #ifndef DUMP1090_NETIO_H #define DUMP1090_NETIO_H // Describes a networking service (group of connections) struct aircraft; struct modesMessage; struct client; struct net_service; typedef int (*read_fn)(struct client *, char *); typedef void (*heartbeat_fn)(struct net_service *); typedef enum { READ_MODE_IGNORE, READ_MODE_BEAST, READ_MODE_BEAST_COMMAND, READ_MODE_ASCII } read_mode_t; // Describes one network service (a group of clients with common behaviour) struct net_service { struct net_service* next; const char *descr; int listener_count; // number of listeners int *listener_fds; // listening FDs int connections; // number of active clients struct net_writer *writer; // shared writer state const char *read_sep; // hander details for input data read_mode_t read_mode; read_fn read_handler; }; // Structure used to describe a networking client struct client { struct client* next; // Pointer to next client int fd; // File descriptor struct net_service *service; // Service this client is part of int buflen; // Amount of data on buffer char buf[MODES_CLIENT_BUF_SIZE+1]; // Read buffer int modeac_requested; // 1 if this Beast output connection has asked for A/C }; // Common writer state for all output sockets of one type struct net_writer { struct net_service *service; // owning service void *data; // shared write buffer, sized MODES_OUT_BUF_SIZE int dataUsed; // number of bytes of write buffer currently used uint64_t lastWrite; // time of last write to clients heartbeat_fn send_heartbeat; // function that queues a heartbeat if needed }; struct net_service *serviceInit(const char *descr, struct net_writer *writer, heartbeat_fn hb_handler, read_mode_t mode, const char *sep, read_fn read_handler); struct client *serviceConnect(struct net_service *service, char *addr, int port); void serviceListen(struct net_service *service, char *bind_addr, char *bind_ports); struct client *createSocketClient(struct net_service *service, int fd); struct client *createGenericClient(struct net_service *service, int fd); // view1090 / faup1090 want to create these themselves: struct net_service *makeBeastInputService(void); struct net_service *makeFatsvOutputService(void); void sendBeastSettings(struct client *c, const char *settings); void modesInitNet(void); void modesQueueOutput(struct modesMessage *mm, struct aircraft *a); void modesNetPeriodicWork(void); // TODO: move these somewhere else char *generateAircraftJson(const char *url_path, int *len); char *generateStatsJson(const char *url_path, int *len); char *generateReceiverJson(const char *url_path, int *len); char *generateHistoryJson(const char *url_path, int *len); void writeJsonToFile(const char *file, char * (*generator) (const char *,int*)); #endif