2012-09-14 02:17:48 +00:00
/*
2013-12-04 06:26:55 +00:00
Copyright ( C ) 2012 - 2013 Serval Project Inc .
2012-09-14 02:17:48 +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-04 06:44:14 +00:00
# ifndef __SERVAL_DNA__MDP_CLIENT_H
# define __SERVAL_DNA__MDP_CLIENT_H
2012-09-14 02:17:48 +00:00
2013-10-09 05:04:41 +00:00
// define 3rd party mdp API without any structure padding
# pragma pack(push, 1)
struct mdp_sockaddr {
sid_t sid ;
2013-10-09 08:52:51 +00:00
mdp_port_t port ;
2013-10-09 05:04:41 +00:00
} ;
# define MDP_FLAG_NO_CRYPT (1<<0)
# define MDP_FLAG_NO_SIGN (1<<1)
2013-11-25 01:45:20 +00:00
# define MDP_FLAG_BIND (1<<2)
# define MDP_FLAG_CLOSE (1<<3)
2013-10-09 05:04:41 +00:00
# define MDP_FLAG_ERROR (1<<4)
struct mdp_header {
struct mdp_sockaddr local ;
struct mdp_sockaddr remote ;
uint8_t flags ;
uint8_t qos ;
uint8_t ttl ;
} ;
2013-11-25 01:45:20 +00:00
# define BIND_PRIMARY SID_ANY
# define BIND_ALL SID_BROADCAST
2014-04-16 09:49:43 +00:00
/* Port numbers for commands sent to the local daemon: remote.sid = SID_ANY
*/
2013-10-24 02:01:35 +00:00
2014-04-16 09:49:43 +00:00
/* Port zero has no function (acts as a no-op or /dev/null for packets sent to
* it ) . It exists so that side effects like binding can be performed without
* generating any network traffic or other action .
*/
2013-11-25 01:45:20 +00:00
# define MDP_LISTEN 0
2014-04-16 09:49:43 +00:00
/* Lock and unlock identities in the local keyring.
* Requests start with an mdp_identity_request structure followed by a list of PINs or SIDs
2013-10-24 02:01:35 +00:00
*/
# define MDP_IDENTITY 1
2014-04-16 09:49:43 +00:00
struct mdp_identity_request {
uint8_t action ;
# define ACTION_LOCK 1 // lock all the given SIDs or revoke the given PINs
# define ACTION_UNLOCK 2 // unlock all identities with the given PINs or the identities with the given SIDs (must have already sent the relevant unrevoked PINs)
uint8_t type ;
# define TYPE_SID 1 // this struct is followed by a list of SIDs up to end of payload
# define TYPE_PIN 2 // this struct is followed by a list of NULL terminated entry PINs up to end of payload
} ;
2013-10-24 02:01:35 +00:00
/* Search unlocked identities from the running daemon
* If the request is empty , all identities will be returned
* if the request contains a packed tag / value , identities with a matching tag will be returned
* if the value passed in is zero length , all identities with that tag and any value will be returned
*/
# define MDP_SEARCH_IDS 2
2013-10-09 05:04:41 +00:00
2012-12-05 04:43:47 +00:00
struct overlay_route_record {
2013-10-09 08:24:21 +00:00
sid_t sid ;
2013-02-18 01:17:08 +00:00
char interface_name [ 256 ] ;
2012-12-05 04:43:47 +00:00
int reachable ;
2013-10-09 08:24:21 +00:00
sid_t neighbour ;
2012-12-05 04:43:47 +00:00
} ;
struct overlay_mdp_scan {
struct in_addr addr ;
} ;
2014-02-05 04:56:56 +00:00
struct overlay_mdp_data_frame {
struct mdp_sockaddr src ;
struct mdp_sockaddr dst ;
uint16_t payload_length ;
int queue ;
int ttl ;
unsigned char payload [ MDP_MTU - 100 ] ;
} ;
struct overlay_mdp_error {
unsigned int error ;
char message [ 128 ] ;
} ;
struct overlay_mdp_addrlist {
int mode ;
# define OVERLAY_MDP_ADDRLIST_MAX_SID_COUNT (~(unsigned int)0)
unsigned int server_sid_count ;
unsigned int first_sid ;
unsigned int last_sid ;
unsigned int frame_sid_count ; /* how many of the following slots are populated */
sid_t sids [ MDP_MAX_SID_REQUEST ] ;
} ;
typedef struct overlay_mdp_frame {
uint16_t packetTypeAndFlags ;
union {
struct overlay_mdp_data_frame out ;
struct mdp_sockaddr bind ;
struct overlay_mdp_addrlist addrlist ;
struct overlay_mdp_error error ;
char raw [ MDP_MTU ] ;
} ;
} overlay_mdp_frame ;
# pragma pack(pop)
2013-11-25 01:45:20 +00:00
/* low level V2 mdp interface */
2013-10-09 05:04:41 +00:00
int mdp_socket ( void ) ;
int mdp_close ( int socket ) ;
2013-11-25 01:45:20 +00:00
int mdp_send ( int socket , const struct mdp_header * header , const uint8_t * payload , size_t len ) ;
2014-04-16 09:49:43 +00:00
ssize_t mdp_recv ( int socket , struct mdp_header * header , uint8_t * payload , size_t max_len ) ;
2013-10-09 05:04:41 +00:00
int mdp_poll ( int socket , time_ms_t timeout_ms ) ;
2013-11-25 01:45:20 +00:00
2014-02-05 04:56:56 +00:00
2012-09-14 02:17:48 +00:00
/* Client-side MDP function */
2012-11-06 19:48:54 +00:00
int overlay_mdp_client_socket ( void ) ;
int overlay_mdp_client_close ( int mdp_sockfd ) ;
int overlay_mdp_client_poll ( int mdp_sockfd , time_ms_t timeout_ms ) ;
int overlay_mdp_getmyaddr ( int mpd_sockfd , unsigned index , sid_t * sid ) ;
2013-10-09 08:52:51 +00:00
int overlay_mdp_bind ( int mdp_sockfd , const sid_t * localaddr , mdp_port_t port ) ;
int overlay_mdp_recv ( int mdp_sockfd , overlay_mdp_frame * mdp , mdp_port_t port , int * ttl ) ;
int overlay_mdp_send ( int mdp_sockfd , overlay_mdp_frame * mdp , int flags , int timeout_ms ) ;
2013-10-08 05:09:29 +00:00
ssize_t overlay_mdp_relevant_bytes ( overlay_mdp_frame * mdp ) ;
2012-09-14 02:17:48 +00:00
2012-11-16 14:31:28 +00:00
# endif