Switch to feature-driven linking
This introduces a new way of linking Serval executables and dynamic
libraries from static libraries like libservald.a -- called
"feature-driven" linking.
The Makefile now links servald and serval-tests from libservald.a,
rather than from an explicit list of object (.o) files. Thanks to the
section-based method for registering functions such as HTTP handlers,
CLI commands and MDP handlers, these object files had become
"stand-alone" and hence were no longer included in the link because
there was no unresolved reference that required them to be linked in.
The new "feature.h" provides the DECLARE_FEATURE(name) macro that each
stand-alone source file uses to declare the named feature(s) it
provides. Each executable can call the USE_FEATURE(name) macro in any
of its explicitly-linked source files to cause the corresponding
object(s) to be included in the link, eg, servald_features.c.
The DEFINE_BINDING() macro has been extended so that every individual
MDP binding is given a feature name based on its port number macro, eg,
"mdp_binding_MDP_PORT_ECHO".
Some features have been factored into their own separate source files so
they can be omitted or included in a build independently of each other:
- the MDP bindings for MDP_PORT_DNALOOKUP, MDP_PORT_ECHO,
MDP_PORT_TRACE, MDP_PORT_KEYMAPREQUEST, MDP_PORT_RHIZOME_xxx,
MDP_PORT_PROBE, MDP_PORT_STUN, MDP_PORT_STUNREQ
- the CLI "log" and "echo" commands
- the CLI "rhizome direct" command
The JNI source files are only compiled if the <jni.h> header is present,
otherwise they are omitted from libservald.so.
2016-10-13 02:58:23 +00:00
|
|
|
/*
|
2013-10-18 00:04:43 +00:00
|
|
|
Serval DNA header file
|
Switch to feature-driven linking
This introduces a new way of linking Serval executables and dynamic
libraries from static libraries like libservald.a -- called
"feature-driven" linking.
The Makefile now links servald and serval-tests from libservald.a,
rather than from an explicit list of object (.o) files. Thanks to the
section-based method for registering functions such as HTTP handlers,
CLI commands and MDP handlers, these object files had become
"stand-alone" and hence were no longer included in the link because
there was no unresolved reference that required them to be linked in.
The new "feature.h" provides the DECLARE_FEATURE(name) macro that each
stand-alone source file uses to declare the named feature(s) it
provides. Each executable can call the USE_FEATURE(name) macro in any
of its explicitly-linked source files to cause the corresponding
object(s) to be included in the link, eg, servald_features.c.
The DEFINE_BINDING() macro has been extended so that every individual
MDP binding is given a feature name based on its port number macro, eg,
"mdp_binding_MDP_PORT_ECHO".
Some features have been factored into their own separate source files so
they can be omitted or included in a build independently of each other:
- the MDP bindings for MDP_PORT_DNALOOKUP, MDP_PORT_ECHO,
MDP_PORT_TRACE, MDP_PORT_KEYMAPREQUEST, MDP_PORT_RHIZOME_xxx,
MDP_PORT_PROBE, MDP_PORT_STUN, MDP_PORT_STUNREQ
- the CLI "log" and "echo" commands
- the CLI "rhizome direct" command
The JNI source files are only compiled if the <jni.h> header is present,
otherwise they are omitted from libservald.so.
2016-10-13 02:58:23 +00:00
|
|
|
Copyright (C) 2010-2012 Paul Gardner-Stephen
|
2013-12-04 06:26:55 +00:00
|
|
|
Copyright (C) 2012-2013 Serval Project Inc.
|
2010-07-13 12:15:46 +00:00
|
|
|
|
|
|
|
This program is free software; you can redistribute it 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 program 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, write to the Free Software
|
|
|
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
*/
|
|
|
|
|
2013-12-07 17:38:14 +00:00
|
|
|
/*
|
|
|
|
Portions Copyright (C) 2013 Petter Reinholdtsen
|
|
|
|
Some rights reserved
|
|
|
|
|
|
|
|
Redistribution and use in source and binary forms, with or without
|
|
|
|
modification, are permitted provided that the following conditions are met:
|
|
|
|
|
|
|
|
1. Redistributions of source code must retain the above copyright
|
|
|
|
notice, this list of conditions and the following disclaimer.
|
|
|
|
|
|
|
|
2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
notice, this list of conditions and the following disclaimer in
|
|
|
|
the documentation and/or other materials provided with the
|
|
|
|
distribution.
|
|
|
|
|
|
|
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
|
|
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
|
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
|
|
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
|
|
COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
|
|
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
|
|
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
|
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
|
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
|
|
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
|
|
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
|
|
POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
*/
|
|
|
|
|
2013-12-04 06:44:14 +00:00
|
|
|
#ifndef __SERVAL_DNA__SERVAL_H
|
|
|
|
#define __SERVAL_DNA__SERVAL_H
|
2012-07-23 04:17:59 +00:00
|
|
|
|
2016-10-19 05:57:20 +00:00
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
#include "config.h"
|
|
|
|
#endif
|
|
|
|
|
2010-07-13 12:15:46 +00:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <errno.h>
|
|
|
|
#include <stdlib.h>
|
2012-05-10 03:23:57 +00:00
|
|
|
#include <stdarg.h>
|
2012-05-14 09:02:10 +00:00
|
|
|
#include <sys/types.h>
|
2011-03-30 05:04:23 +00:00
|
|
|
|
|
|
|
#ifdef WIN32
|
2013-11-12 01:09:06 +00:00
|
|
|
# include "win32/win32.h"
|
2011-03-30 05:04:23 +00:00
|
|
|
#else
|
2013-11-12 01:09:06 +00:00
|
|
|
# include <unistd.h>
|
|
|
|
# ifdef HAVE_SYS_SOCKET_H
|
|
|
|
# include <sys/socket.h>
|
|
|
|
# endif
|
|
|
|
# ifdef HAVE_NET_ROUTE_H
|
|
|
|
# include <net/route.h>
|
|
|
|
# endif
|
|
|
|
# ifdef HAVE_LINUX_IF_H
|
|
|
|
# include <linux/if.h>
|
|
|
|
# else
|
|
|
|
# ifdef HAVE_NET_IF_H
|
|
|
|
# include <net/if.h>
|
|
|
|
# endif
|
|
|
|
# endif
|
|
|
|
# ifdef HAVE_NETINET_IN_H
|
|
|
|
# include <netinet/in.h>
|
|
|
|
# endif
|
|
|
|
# ifdef HAVE_LINUX_NETLINK_H
|
|
|
|
# include <linux/netlink.h>
|
|
|
|
# endif
|
|
|
|
# ifdef HAVE_LINUX_RTNETLINK_H
|
|
|
|
# include <linux/rtnetlink.h>
|
|
|
|
# endif
|
|
|
|
# ifdef HAVE_IFADDRS_H
|
|
|
|
# include <ifaddrs.h>
|
|
|
|
# endif
|
|
|
|
# ifdef HAVE_SYS_SOCKIO_H
|
|
|
|
# include <sys/sockio.h>
|
|
|
|
# endif
|
|
|
|
# ifdef HAVE_SYS_UCRED_H
|
|
|
|
# include <sys/ucred.h>
|
|
|
|
# endif
|
|
|
|
#endif //!WIN32
|
2011-03-30 05:04:23 +00:00
|
|
|
|
2010-07-13 12:15:46 +00:00
|
|
|
#ifdef HAVE_SYS_SOCKET_H
|
|
|
|
#include <sys/socket.h>
|
|
|
|
#endif
|
|
|
|
#ifdef HAVE_SYS_MMAN_H
|
|
|
|
#include <sys/mman.h>
|
|
|
|
#endif
|
|
|
|
#ifdef HAVE_SYS_TIME_H
|
|
|
|
#include <sys/time.h>
|
|
|
|
#endif
|
|
|
|
#ifdef HAVE_NETDB_H
|
|
|
|
#include <netdb.h>
|
|
|
|
#endif
|
|
|
|
#ifdef HAVE_CTYPE_H
|
|
|
|
#include <ctype.h>
|
|
|
|
#endif
|
2011-03-30 05:04:23 +00:00
|
|
|
|
|
|
|
#ifndef WIN32
|
2010-07-13 12:15:46 +00:00
|
|
|
#include <sys/ioctl.h>
|
|
|
|
#include <sys/un.h>
|
2011-03-30 05:04:23 +00:00
|
|
|
#endif
|
|
|
|
|
2010-07-13 12:15:46 +00:00
|
|
|
#include <fcntl.h>
|
2012-05-10 07:28:25 +00:00
|
|
|
#include <sys/stat.h>
|
2010-07-13 12:15:46 +00:00
|
|
|
|
2015-11-23 02:48:30 +00:00
|
|
|
#include "constants.h"
|
2014-07-23 01:03:41 +00:00
|
|
|
#include "cli.h"
|
2014-05-23 08:19:00 +00:00
|
|
|
#include "serval_types.h"
|
|
|
|
#include "sighandlers.h"
|
2014-03-24 04:57:04 +00:00
|
|
|
#include "instance.h"
|
2013-10-18 00:04:43 +00:00
|
|
|
#include "fdqueue.h"
|
2012-12-03 23:26:24 +00:00
|
|
|
#include "mem.h"
|
2012-08-03 07:14:05 +00:00
|
|
|
#include "xprintf.h"
|
2012-07-29 03:05:53 +00:00
|
|
|
#include "log.h"
|
2012-08-23 03:01:07 +00:00
|
|
|
#include "net.h"
|
2012-12-03 23:42:35 +00:00
|
|
|
#include "os.h"
|
2012-05-14 09:02:10 +00:00
|
|
|
|
2010-07-13 12:15:46 +00:00
|
|
|
#define BATCH 1
|
|
|
|
#define NONBATCH 0
|
|
|
|
|
|
|
|
#define REQ_SERIAL 0
|
|
|
|
#define REQ_PARALLEL -1
|
|
|
|
#define REQ_FIRSTREPLY -2
|
|
|
|
#define REQ_REPLY -101
|
|
|
|
|
|
|
|
|
|
|
|
#define SET_NOREPLACE 1
|
|
|
|
#define SET_REPLACE 2
|
|
|
|
#define SET_NOCREATE 3
|
|
|
|
#define SET_FRAGMENT 0x80
|
|
|
|
|
|
|
|
#define WITHDATA 1
|
|
|
|
#define WITHOUTDATA 0
|
|
|
|
|
|
|
|
/* Limit packet payloads to minimise packet loss of big packets in mesh networks */
|
|
|
|
#define MAX_DATA_BYTES 256
|
|
|
|
|
2012-05-15 03:26:10 +00:00
|
|
|
int rhizome_enabled();
|
2012-07-12 02:40:59 +00:00
|
|
|
int rhizome_http_server_running();
|
2011-12-17 01:41:32 +00:00
|
|
|
|
2010-07-13 12:15:46 +00:00
|
|
|
#define MAX_PEERS 1024
|
|
|
|
extern int peer_count;
|
2011-04-27 11:48:09 +00:00
|
|
|
extern struct in_addr peers[MAX_PEERS];
|
2010-07-13 12:15:46 +00:00
|
|
|
|
2012-10-03 04:29:46 +00:00
|
|
|
struct subscriber;
|
2012-10-09 01:34:02 +00:00
|
|
|
struct decode_context;
|
2013-12-02 06:47:47 +00:00
|
|
|
struct socket_address;
|
2013-12-09 07:15:47 +00:00
|
|
|
struct overlay_interface;
|
|
|
|
struct network_destination;
|
2014-01-23 06:01:56 +00:00
|
|
|
struct internal_mdp_header;
|
2012-10-03 04:29:46 +00:00
|
|
|
|
2012-08-27 00:34:59 +00:00
|
|
|
struct overlay_buffer;
|
2012-11-20 06:11:06 +00:00
|
|
|
struct overlay_frame;
|
2012-11-23 05:55:32 +00:00
|
|
|
struct broadcast;
|
|
|
|
|
2013-12-11 06:11:57 +00:00
|
|
|
void overlay_mdp_clean_socket_files();
|
2015-03-02 05:11:07 +00:00
|
|
|
int mdp_send_external_packet(struct overlay_interface *interface, struct socket_address *address, const uint8_t *payload, size_t len);
|
2012-07-02 03:49:54 +00:00
|
|
|
|
2012-08-27 00:34:59 +00:00
|
|
|
int overlay_forward_payload(struct overlay_frame *f);
|
2012-07-03 06:06:51 +00:00
|
|
|
int packetOkOverlay(struct overlay_interface *interface,unsigned char *packet, size_t len,
|
2013-12-09 07:52:18 +00:00
|
|
|
struct socket_address *recvaddr);
|
2013-02-07 04:46:07 +00:00
|
|
|
int parseMdpPacketHeader(struct decode_context *context, struct overlay_frame *frame,
|
|
|
|
struct overlay_buffer *buffer, struct subscriber **nexthop);
|
|
|
|
int parseEnvelopeHeader(struct decode_context *context, struct overlay_interface *interface,
|
2013-12-09 07:15:47 +00:00
|
|
|
struct socket_address *addr, struct overlay_buffer *buffer);
|
2013-02-07 04:46:07 +00:00
|
|
|
int process_incoming_frame(time_ms_t now, struct overlay_interface *interface,
|
|
|
|
struct overlay_frame *f, struct decode_context *context);
|
2012-07-02 03:49:54 +00:00
|
|
|
|
2012-08-27 00:34:59 +00:00
|
|
|
int overlay_frame_process(struct overlay_interface *interface, struct overlay_frame *f);
|
2012-07-02 03:49:54 +00:00
|
|
|
|
2013-08-08 05:50:31 +00:00
|
|
|
int overlay_frame_append_payload(struct decode_context *context, int encapsulation,
|
2014-09-23 04:17:48 +00:00
|
|
|
struct overlay_frame *p, struct subscriber *next_hop,
|
|
|
|
struct overlay_buffer *b, char will_retransmit);
|
2013-05-24 04:22:31 +00:00
|
|
|
int overlay_packet_init_header(int packet_version, int encapsulation,
|
2013-02-14 03:48:56 +00:00
|
|
|
struct decode_context *context, struct overlay_buffer *buff,
|
2013-05-15 02:03:43 +00:00
|
|
|
char unicast, char interface, int seq);
|
2013-09-24 02:31:00 +00:00
|
|
|
void rhizome_sync_status_html(struct strbuf *b, struct subscriber *subscriber);
|
2013-09-24 04:53:40 +00:00
|
|
|
int rhizome_cache_count();
|
2011-08-15 07:27:29 +00:00
|
|
|
|
2014-04-07 06:41:11 +00:00
|
|
|
int overlayServerMode(void);
|
2014-06-26 07:17:23 +00:00
|
|
|
int _overlay_payload_enqueue(struct __sourceloc whence, struct overlay_frame *p);
|
|
|
|
#define overlay_payload_enqueue(P) _overlay_payload_enqueue(__WHENCE__,P)
|
2013-01-28 02:35:24 +00:00
|
|
|
int overlay_queue_remaining(int queue);
|
2013-02-06 06:40:43 +00:00
|
|
|
int overlay_queue_schedule_next(time_ms_t next_allowed_packet);
|
2013-08-08 05:50:31 +00:00
|
|
|
int overlay_send_tick_packet(struct network_destination *destination);
|
|
|
|
int overlay_queue_ack(struct subscriber *neighbour, struct network_destination *destination, uint32_t ack_mask, int ack_seq);
|
2013-05-13 02:53:44 +00:00
|
|
|
|
2013-12-09 07:52:18 +00:00
|
|
|
int overlay_rhizome_saw_advertisements(struct decode_context *context, struct overlay_frame *f);
|
2012-05-22 03:35:29 +00:00
|
|
|
int rhizome_saw_voice_traffic();
|
2013-12-09 07:52:18 +00:00
|
|
|
int overlay_saw_mdp_containing_frame(struct overlay_frame *f);
|
2011-10-16 21:41:05 +00:00
|
|
|
|
2013-09-02 05:24:33 +00:00
|
|
|
int serval_packetvisualise(const char *message, const unsigned char *packet, size_t len);
|
|
|
|
int serval_packetvisualise_xpf(XPRINTF xpf, const char *message, const unsigned char *packet, size_t len);
|
2013-09-18 04:14:18 +00:00
|
|
|
void logServalPacket(int level, struct __sourceloc __whence, const char *message, const unsigned char *packet, size_t len);
|
|
|
|
#define DEBUG_packet_visualise(M,P,N) logServalPacket(LOG_LEVEL_DEBUG, __WHENCE__, (M), (P), (N))
|
2012-01-10 11:26:07 +00:00
|
|
|
|
2012-03-04 22:57:31 +00:00
|
|
|
int rhizome_opendb();
|
2012-01-10 11:26:07 +00:00
|
|
|
|
2014-05-05 05:04:34 +00:00
|
|
|
int allow_inbound_packet(const struct internal_mdp_header *header);
|
|
|
|
int allow_outbound_packet(const struct internal_mdp_header *header);
|
2014-02-07 05:25:40 +00:00
|
|
|
void load_mdp_packet_rules(const char *filename);
|
2013-11-18 02:42:52 +00:00
|
|
|
|
2012-08-06 05:16:46 +00:00
|
|
|
struct vomp_call_state;
|
2012-09-27 06:57:37 +00:00
|
|
|
|
|
|
|
void set_codec_flag(int codec, unsigned char *flags);
|
|
|
|
|
2016-04-13 06:26:57 +00:00
|
|
|
struct vomp_call_state *vomp_find_call_by_session(uint16_t session_token);
|
2012-05-03 18:14:41 +00:00
|
|
|
int vomp_parse_dtmf_digit(char c);
|
2012-12-07 05:32:58 +00:00
|
|
|
int vomp_dial(struct subscriber *local, struct subscriber *remote, const char *local_did, const char *remote_did);
|
2012-08-06 05:16:46 +00:00
|
|
|
int vomp_pickup(struct vomp_call_state *call);
|
|
|
|
int vomp_hangup(struct vomp_call_state *call);
|
|
|
|
int vomp_ringing(struct vomp_call_state *call);
|
2012-11-14 05:20:22 +00:00
|
|
|
int vomp_received_audio(struct vomp_call_state *call, int audio_codec, int time, int sequence,
|
|
|
|
const unsigned char *audio, int audio_length);
|
2012-09-27 06:57:37 +00:00
|
|
|
void monitor_get_all_supported_codecs(unsigned char *codecs);
|
2012-07-05 06:22:21 +00:00
|
|
|
|
2012-09-18 02:56:30 +00:00
|
|
|
int directory_registration();
|
|
|
|
int directory_service_init();
|
2012-04-20 06:11:13 +00:00
|
|
|
|
2012-05-02 16:58:39 +00:00
|
|
|
int monitor_get_fds(struct pollfd *fds,int *fdcount,int fdmax);
|
|
|
|
|
|
|
|
int monitor_setup_sockets();
|
|
|
|
int monitor_get_fds(struct pollfd *fds,int *fdcount,int fdmax);
|
2012-06-25 05:30:07 +00:00
|
|
|
int monitor_tell_clients(char *msg, int msglen, int mask);
|
2012-08-08 01:26:05 +00:00
|
|
|
int monitor_tell_formatted(int mask, char *fmt, ...);
|
2012-08-06 05:16:46 +00:00
|
|
|
int monitor_client_interested(int mask);
|
2012-05-09 18:16:27 +00:00
|
|
|
|
2012-05-10 04:37:11 +00:00
|
|
|
int scrapeProcNetRoute();
|
2012-05-28 05:24:33 +00:00
|
|
|
int lsif();
|
2012-06-08 07:01:59 +00:00
|
|
|
int doifaddrs();
|
2012-05-21 11:15:07 +00:00
|
|
|
|
2012-09-18 02:54:33 +00:00
|
|
|
int dna_helper_start();
|
2012-07-20 08:47:43 +00:00
|
|
|
int dna_helper_shutdown();
|
2014-01-31 00:08:52 +00:00
|
|
|
int dna_helper_enqueue(struct subscriber *source, mdp_port_t source_port, const char *did);
|
2012-07-23 08:59:57 +00:00
|
|
|
int parseDnaReply(const char *buf, size_t len, char *token, char *did, char *name, char *uri, const char **bufp);
|
2012-06-21 05:05:05 +00:00
|
|
|
|
2015-05-25 02:16:37 +00:00
|
|
|
extern uint16_t mdp_loopback_port;
|
2012-06-25 23:52:51 +00:00
|
|
|
int overlay_mdp_setup_sockets();
|
|
|
|
|
2013-12-09 07:15:47 +00:00
|
|
|
int overlay_packetradio_setup_port(struct overlay_interface *interface);
|
2013-08-08 05:50:31 +00:00
|
|
|
int overlay_send_probe(struct subscriber *peer, struct network_destination *destination, int queue);
|
2012-12-07 05:34:40 +00:00
|
|
|
int overlay_send_stun_request(struct subscriber *server, struct subscriber *request);
|
2012-07-02 03:49:54 +00:00
|
|
|
void rhizome_check_connections(struct sched_ent *alarm);
|
|
|
|
|
2012-11-20 06:11:06 +00:00
|
|
|
int overlay_queue_init();
|
|
|
|
|
2012-07-02 03:49:54 +00:00
|
|
|
void monitor_client_poll(struct sched_ent *alarm);
|
|
|
|
void monitor_poll(struct sched_ent *alarm);
|
|
|
|
void rhizome_fetch_poll(struct sched_ent *alarm);
|
|
|
|
void rhizome_server_poll(struct sched_ent *alarm);
|
|
|
|
|
2012-08-31 05:28:40 +00:00
|
|
|
int olsr_init_socket(void);
|
|
|
|
int olsr_send(struct overlay_frame *frame);
|
|
|
|
|
2013-07-23 04:51:46 +00:00
|
|
|
int pack_uint(unsigned char *buffer, uint64_t v);
|
|
|
|
int measure_packed_uint(uint64_t v);
|
|
|
|
int unpack_uint(unsigned char *buffer, int buff_size, uint64_t *v);
|
|
|
|
|
2013-11-04 03:45:08 +00:00
|
|
|
void rhizome_fetch_log_short_status();
|
2013-02-15 22:39:36 +00:00
|
|
|
extern char crash_handler_clue[1024];
|
2013-02-15 05:07:39 +00:00
|
|
|
|
2013-12-04 06:44:14 +00:00
|
|
|
#endif // __SERVAL_DNA__SERVAL_H
|