1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
|
/*
* Ouroboros - Copyright (C) 2016 - 2017
*
* IPC process structure
*
* Dimitri Staessens <dimitri.staessens@ugent.be>
* Sander Vrijders <sander.vrijders@ugent.be>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* 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., http://www.fsf.org/about/contact/.
*/
#ifndef OUROBOROS_IPCPD_IPCP_H
#define OUROBOROS_IPCPD_IPCP_H
#include <ouroboros/hash.h>
#include <ouroboros/ipcp.h>
#include <ouroboros/qoscube.h>
#include <ouroboros/sockets.h>
#include <pthread.h>
#include <time.h>
#include <signal.h>
enum ipcp_state {
IPCP_NULL = 0,
IPCP_INIT,
IPCP_OPERATIONAL,
IPCP_SHUTDOWN
};
struct ipcp_ops {
int (* ipcp_bootstrap)(const struct ipcp_config * conf);
int (* ipcp_enroll)(const char * dst,
struct dif_info * info);
int (* ipcp_connect)(const char * dst,
const char * component);
int (* ipcp_disconnect)(const char * dst,
const char * component);
int (* ipcp_reg)(const uint8_t * hash);
int (* ipcp_unreg)(const uint8_t * hash);
int (* ipcp_query)(const uint8_t * hash);
int (* ipcp_flow_alloc)(int fd,
const uint8_t * dst,
qoscube_t qos);
int (* ipcp_flow_alloc_resp)(int fd,
int response);
int (* ipcp_flow_dealloc)(int fd);
};
#define ipcp_dir_hash_strlen() (hash_len(ipcpi.dir_hash_algo) * 2)
#define ipcp_dir_hash_len() (hash_len(ipcpi.dir_hash_algo))
struct ipcp {
int irmd_api;
char * name;
enum ipcp_type type;
char * dif_name;
uint64_t dt_addr;
enum hash_algo dir_hash_algo;
struct ipcp_ops * ops;
int irmd_fd;
enum ipcp_state state;
pthread_rwlock_t state_lock;
pthread_mutex_t state_mtx;
pthread_cond_t state_cond;
int sockfd;
char * sock_path;
uint8_t cbuf[IPCP_MSG_BUF_SIZE];
size_t cmd_len;
int csockfd;
pthread_cond_t acc_cond;
pthread_cond_t cmd_cond;
pthread_mutex_t cmd_lock;
int alloc_id;
pthread_cond_t alloc_cond;
pthread_mutex_t alloc_lock;
pthread_t acceptor;
} ipcpi;
int ipcp_init(int argc,
char ** argv,
enum ipcp_type type,
struct ipcp_ops * ops);
int ipcp_boot(void);
void ipcp_shutdown(void);
void ipcp_fini(void);
void ipcp_set_state(enum ipcp_state state);
enum ipcp_state ipcp_get_state(void);
int ipcp_wait_state(enum ipcp_state state,
const struct timespec * timeout);
int ipcp_parse_arg(int argc,
char * argv[]);
/* Handle shutdown of IPCP */
void ipcp_sig_handler(int sig,
siginfo_t * info,
void * c);
/* Helper functions for directory entries, could be moved */
uint8_t * ipcp_hash_dup(const uint8_t * hash);
void ipcp_hash_str(char buf[],
const uint8_t * hash);
#endif /* OUROBOROS_IPCPD_IPCP_H */
|