summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/ouroboros/da.h6
-rw-r--r--include/ouroboros/dev.h12
-rw-r--r--include/ouroboros/ipcp.h2
-rw-r--r--include/ouroboros/rina_name.h14
-rw-r--r--include/ouroboros/sockets.h31
-rw-r--r--src/irmd/main.c6
-rw-r--r--src/lib/da.c6
-rw-r--r--src/lib/dev.c198
-rw-r--r--src/lib/ipcp.c18
-rw-r--r--src/lib/irm.c41
-rw-r--r--src/lib/rina_name.c61
-rw-r--r--src/lib/sockets.c285
-rw-r--r--src/tools/echo/echo_client.c5
-rw-r--r--src/tools/echo/echo_server.c4
-rw-r--r--src/tools/irm/irm_bootstrap_ipcp.c6
-rw-r--r--src/tools/irm/irm_create_ipcp.c4
-rw-r--r--src/tools/irm/irm_destroy_ipcp.c6
-rw-r--r--src/tools/irm/irm_enroll_ipcp.c4
-rw-r--r--src/tools/irm/irm_register_ipcp.c4
-rw-r--r--src/tools/irm/irm_unregister_ipcp.c4
-rw-r--r--src/tools/irm/irm_utils.c4
21 files changed, 490 insertions, 231 deletions
diff --git a/include/ouroboros/da.h b/include/ouroboros/da.h
index 2a046f6b..f678007d 100644
--- a/include/ouroboros/da.h
+++ b/include/ouroboros/da.h
@@ -26,12 +26,12 @@
#include "common.h"
#include "rina_name.h"
-rina_name_t * da_resolve_daf(char * daf_name);
+char * da_resolve_daf(char * daf_name);
/*
* n_1_difs is an out parameter
* The amount of n_1_difs is returned
*/
-ssize_t da_resolve_dap(rina_name_t * name,
- char ** n_1_difs);
+ssize_t da_resolve_dap(char * name,
+ char ** n_1_difs);
#endif
diff --git a/include/ouroboros/dev.h b/include/ouroboros/dev.h
index 39194abd..b2507fbf 100644
--- a/include/ouroboros/dev.h
+++ b/include/ouroboros/dev.h
@@ -26,19 +26,17 @@
#include <ouroboros/common.h>
/* Returns file descriptor */
-int ap_reg(char * ap_name, char * ae_name,
- char ** difs, size_t difs_size);
-int ap_unreg(char * ap_name, char * ae_name,
- char ** difs, size_t difs_size);
+int ap_reg(char * ap_name, char ** difs, size_t difs_size);
+int ap_unreg(char * ap_name, char ** difs, size_t difs_size);
/* Returns file descriptor (> 0) and client name(s) */
int flow_accept(int fd, char * ap_name, char * ae_name);
int flow_alloc_resp(int fd, int result);
/* Returns file descriptor */
-int flow_alloc(char * dst_ap_name, char * dst_ae_name,
- char * src_ap_name, char * src_ae_name,
- struct qos_spec * qos, int oflags);
+int flow_alloc(char * dst_ap_name, char * src_ap_name,
+ char * src_ae_name, struct qos_spec * qos,
+ int oflags);
/* If flow is accepted returns a value > 0 */
int flow_alloc_res(int fd);
diff --git a/include/ouroboros/ipcp.h b/include/ouroboros/ipcp.h
index 5e3e7f8c..b8775fc0 100644
--- a/include/ouroboros/ipcp.h
+++ b/include/ouroboros/ipcp.h
@@ -46,7 +46,7 @@ int ipcp_bootstrap(pid_t pid,
struct dif_config conf);
int ipcp_enroll(pid_t pid,
char * dif_name,
- rina_name_t member,
+ char * member_name,
char ** n_1_difs,
ssize_t n_1_difs_size);
diff --git a/include/ouroboros/rina_name.h b/include/ouroboros/rina_name.h
index d802ae14..f8af00c2 100644
--- a/include/ouroboros/rina_name.h
+++ b/include/ouroboros/rina_name.h
@@ -27,8 +27,6 @@
typedef struct {
char * ap_name;
unsigned int api_id;
- char * ae_name;
- unsigned int aei_id;
} rina_name_t;
/*
@@ -50,16 +48,12 @@ rina_name_t * name_create();
*/
rina_name_t * name_init_from(rina_name_t * dst,
const char * ap_name,
- unsigned int api_id,
- const char * ae_name,
- unsigned int aei_id);
+ unsigned int api_id);
/* Takes ownership of the passed parameters */
rina_name_t * name_init_with(rina_name_t * dst,
char * ap_name,
- unsigned int api_id,
- char * ae_name,
- unsigned int aei_id);
+ unsigned int api_id);
/*
* Finalize a name object, releasing all the embedded resources (without
@@ -85,9 +79,7 @@ bool name_is_ok(const rina_name_t * n);
#define NAME_CMP_APN 0x01
#define NAME_CMP_API 0x02
-#define NAME_CMP_AEN 0x04
-#define NAME_CMP_AEI 0x08
-#define NAME_CMP_ALL (NAME_CMP_APN | NAME_CMP_API | NAME_CMP_AEN | NAME_CMP_AEI)
+#define NAME_CMP_ALL (NAME_CMP_APN | NAME_CMP_API)
bool name_cmp(uint8_t flags,
const rina_name_t * a,
diff --git a/include/ouroboros/sockets.h b/include/ouroboros/sockets.h
index 426e1006..45d7a27d 100644
--- a/include/ouroboros/sockets.h
+++ b/include/ouroboros/sockets.h
@@ -40,7 +40,21 @@ enum irm_msg_code {
IRM_BOOTSTRAP_IPCP,
IRM_ENROLL_IPCP,
IRM_REG_IPCP,
- IRM_UNREG_IPCP
+ IRM_UNREG_IPCP,
+ IRM_AP_REG,
+ IRM_AP_REG_R,
+ IRM_AP_UNREG,
+ IRM_FLOW_ACCEPT,
+ IRM_FLOW_ACCEPT_R,
+ IRM_FLOW_ALLOC_RESP,
+ IRM_FLOW_ALLOC,
+ IRM_FLOW_ALLOC_R,
+ IRM_FLOW_ALLOC_RES,
+ IRM_FLOW_ALLOC_RES_R,
+ IRM_FLOW_DEALLOC,
+ IRM_FLOW_CONTROL,
+ IRM_FLOW_WRITE,
+ IRM_FLOW_READ
};
struct irm_msg {
@@ -51,6 +65,14 @@ struct irm_msg {
char * dif_name;
char ** difs;
size_t difs_size;
+ char * ap_name;
+ char * ae_name;
+ int fd;
+ int result;
+ struct qos_spec * qos;
+ int oflags;
+ char * dst_ap_name;
+ ssize_t count;
};
enum ipcp_msg_code {
@@ -64,7 +86,7 @@ struct ipcp_msg {
enum ipcp_msg_code code;
struct dif_config * conf;
char * dif_name;
- rina_name_t * member;
+ char * ap_name;
char ** difs;
size_t difs_size;
};
@@ -72,8 +94,11 @@ struct ipcp_msg {
/* Returns the full socket path of an IPCP */
char * ipcp_sock_path(pid_t pid);
-int client_socket_open(char * file_name);
int server_socket_open(char * file_name);
+int client_socket_open(char * file_name);
+
+int send_irmd_msg(struct irm_msg * msg);
+struct irm_msg * send_recv_irmd_msg(struct irm_msg * msg);
/* Caller has to free the buffer */
buffer_t * serialize_irm_msg(struct irm_msg * msg);
diff --git a/src/irmd/main.c b/src/irmd/main.c
index 99896999..622b367d 100644
--- a/src/irmd/main.c
+++ b/src/irmd/main.c
@@ -143,7 +143,7 @@ static void enroll_ipcp(struct irm * instance,
char * dif_name)
{
pid_t pid = 0;
- rina_name_t * member;
+ char * member;
char ** n_1_difs = NULL;
ssize_t n_1_difs_size = 0;
@@ -161,7 +161,7 @@ static void enroll_ipcp(struct irm * instance,
n_1_difs_size = da_resolve_dap(member, n_1_difs);
if (n_1_difs_size != 0)
- if (ipcp_enroll(pid, dif_name, *member,
+ if (ipcp_enroll(pid, dif_name, member,
n_1_difs, n_1_difs_size))
LOG_ERR("Could not enroll IPCP");
}
@@ -231,7 +231,7 @@ int main()
}
count = read(cli_sockfd, buf, IRM_MSG_BUF_SIZE);
- if (count) {
+ if (count > 0) {
buffer.size = count;
buffer.data = buf;
msg = deserialize_irm_msg(&buffer);
diff --git a/src/lib/da.c b/src/lib/da.c
index ef59a409..8e7756d1 100644
--- a/src/lib/da.c
+++ b/src/lib/da.c
@@ -22,13 +22,13 @@
#include <ouroboros/da.h>
-rina_name_t * da_resolve_daf(char * daf_name)
+char * da_resolve_daf(char * daf_name)
{
return NULL;
}
-ssize_t da_resolve_dap(rina_name_t * name,
- char ** n_1_difs)
+ssize_t da_resolve_dap(char * name,
+ char ** n_1_difs)
{
return 0;
}
diff --git a/src/lib/dev.c b/src/lib/dev.c
index c072c5ef..7c0c8a15 100644
--- a/src/lib/dev.c
+++ b/src/lib/dev.c
@@ -24,65 +24,205 @@
#include <ouroboros/logs.h>
#include <ouroboros/dev.h>
+#include <ouroboros/sockets.h>
-int ap_reg(char * ap_name, char * ae_name,
- char ** difs, size_t difs_size)
-{
- LOG_MISSING;
+#include <stdlib.h>
- return -1;
+int ap_reg(char * ap_name,
+ char ** difs,
+ size_t difs_size)
+{
+ struct irm_msg msg;
+ struct irm_msg * recv_msg = NULL;
+ int fd = 0;
+
+ if (ap_name == NULL ||
+ difs == NULL ||
+ difs_size == 0) {
+ LOG_ERR("Invalid arguments");
+ return -1;
+ }
+
+ msg.code = IRM_AP_REG;
+ msg.ap_name = ap_name;
+ msg.difs = difs;
+ msg.difs_size = difs_size;
+
+ recv_msg = send_recv_irmd_msg(&msg);
+ if (recv_msg == NULL) {
+ LOG_ERR("Failed to send and receive message");
+ return -1;
+ }
+
+ fd = recv_msg->fd;
+ free(recv_msg);
+
+ return fd;
}
-int ap_unreg(char * ap_name, char * ae_name,
- char ** difs, size_t difs_size)
+int ap_unreg(char * ap_name,
+ char ** difs,
+ size_t difs_size)
{
- LOG_MISSING;
-
- return -1;
+ struct irm_msg msg;
+
+ if (ap_name == NULL ||
+ difs == NULL ||
+ difs_size == 0) {
+ LOG_ERR("Invalid arguments");
+ return -1;
+ }
+
+ msg.code = IRM_AP_UNREG;
+ msg.ap_name = ap_name;
+ msg.difs = difs;
+ msg.difs_size = difs_size;
+
+ if (send_irmd_msg(&msg)) {
+ LOG_ERR("Failed to send message to daemon");
+ return -1;
+ }
+
+ return 0;
}
-int flow_accept(int fd, char * ap_name, char * ae_name)
+int flow_accept(int fd,
+ char * ap_name,
+ char * ae_name)
{
- LOG_MISSING;
-
- return -1;
+ struct irm_msg msg;
+ struct irm_msg * recv_msg = NULL;
+ int cli_fd = 0;
+
+ if (ap_name == NULL) {
+ LOG_ERR("Invalid arguments");
+ return -1;
+ }
+
+ msg.code = IRM_FLOW_ACCEPT;
+ msg.fd = fd;
+
+ recv_msg = send_recv_irmd_msg(&msg);
+ if (recv_msg == NULL) {
+ LOG_ERR("Failed to send and receive message");
+ return -1;
+ }
+
+ cli_fd = recv_msg->fd;
+ ap_name = recv_msg->ap_name;
+ if (ae_name == NULL)
+ ae_name = "";
+ else
+ ae_name = recv_msg->ae_name;
+ free(recv_msg);
+
+ return cli_fd;
}
-int flow_alloc_resp(int fd, int result)
+int flow_alloc_resp(int fd,
+ int result)
{
- LOG_MISSING;
+ struct irm_msg msg;
- return -1;
+ msg.code = IRM_FLOW_ALLOC_RESP;
+ msg.fd = fd;
+ msg.result = result;
+
+ if (send_irmd_msg(&msg)) {
+ LOG_ERR("Failed to send message to daemon");
+ return -1;
+ }
+
+ return 0;
}
-int flow_alloc(char * dst_ap_name, char * dst_ae_name,
- char * src_ap_name, char * src_ae_name,
- struct qos_spec * qos, int oflags)
+int flow_alloc(char * dst_ap_name,
+ char * src_ap_name,
+ char * src_ae_name,
+ struct qos_spec * qos,
+ int oflags)
{
- LOG_MISSING;
-
- return -1;
+ struct irm_msg msg;
+ struct irm_msg * recv_msg = NULL;
+ int fd = 0;
+
+ if (dst_ap_name == NULL ||
+ src_ap_name == NULL) {
+ LOG_ERR("Invalid arguments");
+ return -1;
+ }
+
+ msg.code = IRM_FLOW_ALLOC;
+ msg.dst_ap_name = dst_ap_name;
+ msg.ap_name = src_ap_name;
+ if (src_ae_name == NULL)
+ msg.ae_name = "";
+ else
+ msg.ae_name = src_ae_name;
+ msg.qos = qos;
+ msg.oflags = oflags;
+
+ recv_msg = send_recv_irmd_msg(&msg);
+ if (recv_msg == NULL) {
+ LOG_ERR("Failed to send and receive message");
+ return -1;
+ }
+
+ fd = recv_msg->fd;
+ free(recv_msg);
+
+ return fd;
}
int flow_alloc_res(int fd)
{
- LOG_MISSING;
+ struct irm_msg msg;
+ struct irm_msg * recv_msg = NULL;
+ int result = 0;
- return -1;
+ msg.code = IRM_FLOW_ALLOC_RES;
+ msg.fd = fd;
+
+ recv_msg = send_recv_irmd_msg(&msg);
+ if (recv_msg == NULL) {
+ LOG_ERR("Failed to send and receive message");
+ return -1;
+ }
+
+ result = recv_msg->result;
+ free(recv_msg);
+
+ return result;
}
int flow_dealloc(int fd)
{
- LOG_MISSING;
+ struct irm_msg msg;
- return -1;
+ msg.code = IRM_FLOW_DEALLOC;
+ msg.fd = fd;
+
+ if (send_irmd_msg(&msg)) {
+ LOG_ERR("Failed to send message to daemon");
+ return -1;
+ }
+
+ return 0;
}
int flow_cntl(int fd, int oflags)
{
- LOG_MISSING;
+ struct irm_msg msg;
- return -1;
+ msg.fd = fd;
+ msg.oflags = oflags;
+
+ if (send_irmd_msg(&msg)) {
+ LOG_ERR("Failed to send message to daemon");
+ return -1;
+ }
+
+ return 0;
}
ssize_t flow_write(int fd,
diff --git a/src/lib/ipcp.c b/src/lib/ipcp.c
index 6bc3c75f..53d717ba 100644
--- a/src/lib/ipcp.c
+++ b/src/lib/ipcp.c
@@ -83,7 +83,6 @@ pid_t ipcp_create(rina_name_t name,
{
pid_t pid = 0;
char * api_id = NULL;
- char * aei_id = NULL;
size_t len = 0;
char * ipcp_dir = "bin/ipcpd";
char * full_name = NULL;
@@ -108,22 +107,13 @@ pid_t ipcp_create(rina_name_t name,
}
sprintf(api_id, "%d", name.api_id);
- aei_id = malloc(n_digits(name.aei_id) + 1);
- if (!aei_id) {
- LOG_ERR("Failed to malloc");
- free(api_id);
- exit(EXIT_FAILURE);
- }
- sprintf(aei_id, "%d", name.aei_id);
-
len += strlen(INSTALL_DIR);
len += strlen(ipcp_dir);
len += 2;
full_name = malloc(len);
- if (!full_name) {
+ if (full_name == NULL) {
LOG_ERR("Failed to malloc");
free(api_id);
- free(aei_id);
exit(EXIT_FAILURE);
}
@@ -133,7 +123,6 @@ pid_t ipcp_create(rina_name_t name,
char * argv[] = {full_name,
name.ap_name, api_id,
- name.ae_name, aei_id,
ipcp_type, 0};
char * envp[] = {0};
@@ -144,7 +133,6 @@ pid_t ipcp_create(rina_name_t name,
LOG_ERR("Failed to load IPCP daemon");
LOG_ERR("Make sure to run the installed version");
free(api_id);
- free(aei_id);
free(full_name);
exit(EXIT_FAILURE);
}
@@ -226,7 +214,7 @@ int ipcp_bootstrap(pid_t pid,
int ipcp_enroll(pid_t pid,
char * dif_name,
- rina_name_t member,
+ char * member_name,
char ** n_1_difs,
ssize_t n_1_difs_size)
{
@@ -240,7 +228,7 @@ int ipcp_enroll(pid_t pid,
msg.code = IPCP_ENROLL;
msg.dif_name = dif_name;
- msg.member = &member;
+ msg.ap_name = member_name;
msg.difs = n_1_difs;
msg.difs_size = n_1_difs_size;
diff --git a/src/lib/irm.c b/src/lib/irm.c
index e4804074..9fd13d52 100644
--- a/src/lib/irm.c
+++ b/src/lib/irm.c
@@ -28,35 +28,6 @@
#include <ouroboros/sockets.h>
#include <stdlib.h>
-static int send_irm_msg(struct irm_msg * msg)
-{
- int sockfd;
- buffer_t * buf;
-
- sockfd = client_socket_open(IRM_SOCK_PATH);
- if (sockfd < 0)
- return -1;
-
- buf = serialize_irm_msg(msg);
- if (buf == NULL) {
- close(sockfd);
- return -1;
- }
-
- if (write(sockfd, buf->data, buf->size) == -1) {
- free(buf->data);
- free(buf);
- close(sockfd);
- return -1;
- }
-
- free(buf->data);
- free(buf);
-
- close(sockfd);
- return 0;
-}
-
int irm_create_ipcp(rina_name_t name,
char * ipcp_type)
{
@@ -74,7 +45,7 @@ int irm_create_ipcp(rina_name_t name,
msg.name = &name;
msg.ipcp_type = ipcp_type;
- if (send_irm_msg(&msg)) {
+ if (send_irmd_msg(&msg)) {
LOG_ERR("Failed to send message to daemon");
return -1;
}
@@ -94,7 +65,7 @@ int irm_destroy_ipcp(rina_name_t name)
msg.code = IRM_DESTROY_IPCP;
msg.name = &name;
- if (send_irm_msg(&msg)) {
+ if (send_irmd_msg(&msg)) {
LOG_ERR("Failed to send message to daemon");
return -1;
}
@@ -116,7 +87,7 @@ int irm_bootstrap_ipcp(rina_name_t name,
msg.name = &name;
msg.conf = &conf;
- if (send_irm_msg(&msg)) {
+ if (send_irmd_msg(&msg)) {
LOG_ERR("Failed to send message to daemon");
return -1;
}
@@ -138,7 +109,7 @@ int irm_enroll_ipcp(rina_name_t name,
msg.name = &name;
msg.dif_name = dif_name;
- if (send_irm_msg(&msg)) {
+ if (send_irmd_msg(&msg)) {
LOG_ERR("Failed to send message to daemon");
return -1;
}
@@ -162,7 +133,7 @@ int irm_reg_ipcp(rina_name_t name,
msg.difs = difs;
msg.difs_size = difs_size;
- if (send_irm_msg(&msg)) {
+ if (send_irmd_msg(&msg)) {
LOG_ERR("Failed to send message to daemon");
return -1;
}
@@ -186,7 +157,7 @@ int irm_unreg_ipcp(rina_name_t name,
msg.difs = difs;
msg.difs_size = difs_size;
- if (send_irm_msg(&msg)) {
+ if (send_irmd_msg(&msg)) {
LOG_ERR("Failed to send message to daemon");
return -1;
}
diff --git a/src/lib/rina_name.c b/src/lib/rina_name.c
index 471f6fda..2dcfbb08 100644
--- a/src/lib/rina_name.c
+++ b/src/lib/rina_name.c
@@ -58,17 +58,13 @@ rina_name_t * name_create()
tmp->ap_name = NULL;
tmp->api_id = 0;
- tmp->ae_name = NULL;
- tmp->aei_id = 0;
return tmp;
}
rina_name_t * name_init_from(rina_name_t * dst,
const char * ap_name,
- unsigned int api_id,
- const char * ae_name,
- unsigned int aei_id)
+ unsigned int api_id)
{
if (dst == NULL)
return NULL;
@@ -78,11 +74,8 @@ rina_name_t * name_init_from(rina_name_t * dst,
dst->ap_name = strdup(ap_name);
dst->api_id = api_id;
- dst->ae_name = strdup(ae_name);
- dst->aei_id = aei_id;
- if (dst->ap_name == NULL ||
- dst->ae_name == NULL) {
+ if (dst->ap_name == NULL) {
name_fini(dst);
return NULL;
}
@@ -92,9 +85,7 @@ rina_name_t * name_init_from(rina_name_t * dst,
rina_name_t * name_init_with(rina_name_t * dst,
char * ap_name,
- unsigned int api_id,
- char * ae_name,
- unsigned int aei_id)
+ unsigned int api_id)
{
if (dst == NULL)
return NULL;
@@ -104,8 +95,6 @@ rina_name_t * name_init_with(rina_name_t * dst,
dst->ap_name = ap_name;
dst->api_id = api_id;
- dst->ae_name = ae_name;
- dst->aei_id = aei_id;
return dst;
}
@@ -119,11 +108,6 @@ void name_fini(rina_name_t * n)
free(n->ap_name);
n->ap_name = NULL;
}
-
- if (n->ae_name != NULL) {
- free(n->ae_name);
- n->ae_name = NULL;
- }
}
void name_destroy(rina_name_t * ptr)
@@ -146,9 +130,7 @@ int name_cpy(const rina_name_t * src,
res = name_init_from(dst,
src->ap_name,
- src->api_id,
- src->ae_name,
- src->aei_id);
+ src->api_id);
if (res == NULL)
return -1;
@@ -182,8 +164,7 @@ rina_name_t * name_dup(const rina_name_t * src)
bool name_is_ok(const rina_name_t * n)
{ return (n != NULL &&
n->ap_name != NULL &&
- strlen(n->ap_name) &&
- n->ae_name != NULL); }
+ strlen(n->ap_name)); }
bool name_cmp(uint8_t flags,
const rina_name_t * a,
@@ -206,14 +187,6 @@ bool name_cmp(uint8_t flags,
if (a->api_id != b->api_id)
return false;
- if (flags & NAME_CMP_AEN)
- if (NAME_CMP_FIELD(a, b, ae_name))
- return false;
-
- if (flags & NAME_CMP_AEI)
- if (a->aei_id != b->aei_id)
- return false;
-
return true;
}
@@ -243,23 +216,13 @@ char * name_to_string(const rina_name_t * n)
1 : n_digits(n->api_id));
size += strlen(DELIMITER);
- size += (n->ae_name != NULL ?
- strlen(n->ae_name) : none_len);
- size += strlen(DELIMITER);
-
- size += (n->aei_id == 0 ?
- 1 : n_digits(n->aei_id));
- size += strlen(DELIMITER);
-
tmp = malloc(size);
if (!tmp)
return NULL;
- if (sprintf(tmp, "%s%s%d%s%s%s%d",
+ if (sprintf(tmp, "%s%s%d",
(n->ap_name != NULL ? n->ap_name : none),
- DELIMITER, n->api_id,
- DELIMITER, (n->ae_name != NULL ? n->ae_name : none),
- DELIMITER, n->aei_id)
+ DELIMITER, n->api_id)
!= size - 1) {
free(tmp);
return NULL;
@@ -276,9 +239,6 @@ rina_name_t * string_to_name(const char * s)
char * tmp_ap = NULL;
char * tmp_s_api = NULL;
unsigned int tmp_api = 0;
- char * tmp_ae = NULL;
- char * tmp_s_aei = NULL;
- unsigned int tmp_aei = 0;
char * tmp2;
if (s == NULL)
@@ -293,10 +253,6 @@ rina_name_t * string_to_name(const char * s)
tmp_s_api = strtok(NULL, DELIMITER);
if (tmp_s_api != NULL)
tmp_api = (unsigned int) strtol(tmp_s_api, &tmp2, 10);
- tmp_ae = strtok(NULL, DELIMITER);
- tmp_s_aei = strtok(NULL, DELIMITER);
- if (tmp_s_aei != NULL)
- tmp_aei = (unsigned int) strtol(tmp_s_aei, &tmp2, 10);
name = name_create();
if (name == NULL) {
@@ -305,8 +261,7 @@ rina_name_t * string_to_name(const char * s)
return NULL;
}
- if (!name_init_from(name, tmp_ap, tmp_api,
- tmp_ae, tmp_aei)) {
+ if (!name_init_from(name, tmp_ap, tmp_api)) {
name_destroy(name);
if (tmp1 != NULL)
free(tmp1);
diff --git a/src/lib/sockets.c b/src/lib/sockets.c
index 425d0354..b157b628 100644
--- a/src/lib/sockets.c
+++ b/src/lib/sockets.c
@@ -96,6 +96,76 @@ int server_socket_open(char * file_name)
return sockfd;
}
+int send_irmd_msg(struct irm_msg * msg)
+{
+ int sockfd;
+ buffer_t * buf;
+
+ sockfd = client_socket_open(IRM_SOCK_PATH);
+ if (sockfd < 0)
+ return -1;
+
+ buf = serialize_irm_msg(msg);
+ if (buf == NULL) {
+ close(sockfd);
+ return -1;
+ }
+
+ if (write(sockfd, buf->data, buf->size) == -1) {
+ free(buf->data);
+ free(buf);
+ close(sockfd);
+ return -1;
+ }
+
+ free(buf->data);
+ free(buf);
+
+ close(sockfd);
+ return 0;
+}
+
+struct irm_msg * send_recv_irmd_msg(struct irm_msg * msg)
+{
+ int sockfd;
+ buffer_t * buf;
+ ssize_t count = 0;
+ struct irm_msg * recv_msg = NULL;
+
+ sockfd = client_socket_open(IRM_SOCK_PATH);
+ if (sockfd < 0)
+ return NULL;
+
+ buf = serialize_irm_msg(msg);
+ if (buf == NULL) {
+ close(sockfd);
+ return NULL;
+ }
+
+ if (write(sockfd, buf->data, buf->size) == -1) {
+ free(buf->data);
+ free(buf);
+ close(sockfd);
+ return NULL;
+ }
+
+ count = read(sockfd, buf->data, IRM_MSG_BUF_SIZE);
+ if (count <= 0) {
+ free(buf->data);
+ free(buf);
+ close(sockfd);
+ return NULL;
+ }
+
+ recv_msg = deserialize_irm_msg(buf);
+
+ free(buf->data);
+ free(buf);
+
+ close(sockfd);
+ return recv_msg;
+}
+
char * ipcp_sock_path(pid_t pid)
{
char * full_name = NULL;
@@ -154,10 +224,6 @@ static void ser_copy_name(rina_name_t * name,
data, name->ap_name, offset);
ser_copy_value(sizeof(int), data,
&name->api_id, offset);
- ser_copy_value(strlen(name->ae_name) + 1,
- data, name->ae_name, offset);
- ser_copy_value(sizeof(int), data,
- &name->aei_id, offset);
}
static void deser_copy_value(size_t flen,
@@ -217,13 +283,6 @@ static rina_name_t * deser_copy_name(uint8_t * data,
deser_copy_int(data, &name->api_id, offset);
- if (deser_copy_string(data, &name->ae_name, offset)) {
- name_destroy(name);
- return NULL;
- }
-
- deser_copy_int(data, &name->aei_id, offset);
-
return name;
}
@@ -274,46 +333,82 @@ buffer_t * serialize_irm_msg(struct irm_msg * msg)
ser_copy_value(sizeof(enum irm_msg_code), data, &msg->code, &offset);
- if (!name_is_ok(msg->name)) {
- LOG_ERR("Null pointer passed");
- buffer_destroy(buf);
- return NULL;
- }
ser_copy_name(msg->name, data, &offset);
switch (msg->code) {
case IRM_CREATE_IPCP:
- if (!msg->ipcp_type) {
+ if (msg->ipcp_type == NULL ||
+ !name_is_ok(msg->name)) {
LOG_ERR("Null pointer passed");
buffer_destroy(buf);
return NULL;
}
-
+ ser_copy_name(msg->name, data, &offset);
ser_copy_value(strlen(msg->ipcp_type) + 1, data,
msg->ipcp_type, &offset);
break;
case IRM_DESTROY_IPCP:
+ if (!name_is_ok(msg->name)) {
+ LOG_ERR("Null pointer passed");
+ buffer_destroy(buf);
+ return NULL;
+ }
+ ser_copy_name(msg->name, data, &offset);
break;
case IRM_BOOTSTRAP_IPCP:
+ if (!name_is_ok(msg->name)) {
+ LOG_ERR("Null pointer passed");
+ buffer_destroy(buf);
+ return NULL;
+ }
+ ser_copy_name(msg->name, data, &offset);
/* FIXME: Fields missing, need to define dif_conf properly */
break;
case IRM_ENROLL_IPCP:
- if (msg->dif_name == NULL) {
+ if (msg->dif_name == NULL ||
+ !name_is_ok(msg->name)) {
buffer_destroy(buf);
return NULL;
}
+ ser_copy_name(msg->name, data, &offset);
ser_copy_value(strlen(msg->dif_name) + 1, data,
msg->dif_name, &offset);
break;
case IRM_REG_IPCP:
case IRM_UNREG_IPCP:
- if (msg->difs == NULL || msg->difs[0] == NULL) {
+ if (msg->difs == NULL ||
+ msg->difs[0] == NULL ||
+ !name_is_ok(msg->name)) {
buffer_destroy(buf);
return NULL;
}
+ ser_copy_name(msg->name, data, &offset);
+
+ ser_copy_value(sizeof(size_t), data, &msg->difs_size, &offset);
+
+ pos = msg->difs;
+ for (i = 0; i < msg->difs_size; i++) {
+ ser_copy_value(strlen(*pos) + 1, data, *pos, &offset);
+ pos++;
+ }
+
+ break;
+ case IRM_AP_REG:
+ case IRM_AP_UNREG:
+ if (msg->ap_name == NULL ||
+ msg->difs == NULL ||
+ msg->difs[0] == NULL) {
+ LOG_ERR("Invalid arguments");
+ buffer_destroy(buf);
+ return NULL;
+ }
+
+ ser_copy_value(strlen(msg->ap_name) + 1,
+ data, msg->ap_name, &offset);
+
ser_copy_value(sizeof(size_t), data, &msg->difs_size, &offset);
pos = msg->difs;
@@ -323,6 +418,83 @@ buffer_t * serialize_irm_msg(struct irm_msg * msg)
}
break;
+ case IRM_FLOW_ACCEPT:
+ if (msg->ap_name == NULL ||
+ msg->ae_name == NULL) {
+ LOG_ERR("Invalid arguments");
+ buffer_destroy(buf);
+ return NULL;
+ }
+
+ ser_copy_value(sizeof(int), data, &msg->fd, &offset);
+
+ ser_copy_value(strlen(msg->ap_name) + 1,
+ data, msg->ap_name, &offset);
+
+ ser_copy_value(strlen(msg->ae_name) + 1,
+ data, msg->ae_name, &offset);
+
+ break;
+ case IRM_FLOW_ALLOC_RESP:
+ ser_copy_value(sizeof(int), data, &msg->fd, &offset);
+
+ ser_copy_value(sizeof(int), data, &msg->result, &offset);
+
+ break;
+ case IRM_FLOW_ALLOC:
+ if (msg->ap_name == NULL ||
+ msg->ae_name == NULL ||
+ msg->dst_ap_name == NULL ||
+ msg->qos == NULL) {
+ LOG_ERR("Invalid arguments");
+ buffer_destroy(buf);
+ return NULL;
+ }
+
+ ser_copy_value(strlen(msg->dst_ap_name) + 1,
+ data, msg->dst_ap_name, &offset);
+
+ ser_copy_value(strlen(msg->ap_name) + 1,
+ data, msg->ap_name, &offset);
+
+ ser_copy_value(strlen(msg->ae_name) + 1,
+ data, msg->ae_name, &offset);
+
+ /* FIXME: Serialize qos spec here */
+
+ ser_copy_value(sizeof(int), data, &msg->oflags, &offset);
+
+ break;
+ case IRM_FLOW_ALLOC_RES:
+ case IRM_FLOW_DEALLOC:
+ ser_copy_value(sizeof(int), data, &msg->fd, &offset);
+ break;
+ case IRM_FLOW_CONTROL:
+ ser_copy_value(sizeof(int), data, &msg->fd, &offset);
+ ser_copy_value(sizeof(int), data, &msg->oflags, &offset);
+ break;
+ case IRM_FLOW_WRITE:
+ LOG_MISSING;
+ break;
+ case IRM_FLOW_READ:
+ LOG_MISSING;
+ break;
+ case IRM_AP_REG_R:
+ case IRM_FLOW_ALLOC_R:
+ ser_copy_value(sizeof(int), data, &msg->fd, &offset);
+ break;
+ case IRM_FLOW_ACCEPT_R:
+ ser_copy_value(sizeof(int), data, &msg->fd, &offset);
+
+ ser_copy_value(strlen(msg->ap_name) + 1,
+ data, msg->ap_name, &offset);
+
+ ser_copy_value(strlen(msg->ae_name) + 1,
+ data, msg->ae_name, &offset);
+ break;
+ case IRM_FLOW_ALLOC_RES_R:
+ ser_copy_value(sizeof(int), data, &msg->result, &offset);
+ break;
default:
LOG_ERR("Don't know that code");
buffer_destroy(buf);
@@ -355,15 +527,15 @@ struct irm_msg * deserialize_irm_msg(buffer_t * data)
deser_copy_value(sizeof(enum irm_msg_code),
&msg->code, data->data, &offset);
- msg->name = deser_copy_name(data->data, &offset);
- if (msg->name == NULL) {
- LOG_ERR("Failed to reconstruct name");
- free(msg);
- return NULL;
- }
-
switch (msg->code) {
case IRM_CREATE_IPCP:
+ msg->name = deser_copy_name(data->data, &offset);
+ if (msg->name == NULL) {
+ LOG_ERR("Failed to reconstruct name");
+ free(msg);
+ return NULL;
+ }
+
if (deser_copy_string(data->data,
&msg->ipcp_type,
&offset)) {
@@ -374,10 +546,31 @@ struct irm_msg * deserialize_irm_msg(buffer_t * data)
break;
case IRM_DESTROY_IPCP:
+ msg->name = deser_copy_name(data->data, &offset);
+ if (msg->name == NULL) {
+ LOG_ERR("Failed to reconstruct name");
+ free(msg);
+ return NULL;
+ }
+
break;
case IRM_BOOTSTRAP_IPCP:
+ msg->name = deser_copy_name(data->data, &offset);
+ if (msg->name == NULL) {
+ LOG_ERR("Failed to reconstruct name");
+ free(msg);
+ return NULL;
+ }
+
break;
case IRM_ENROLL_IPCP:
+ msg->name = deser_copy_name(data->data, &offset);
+ if (msg->name == NULL) {
+ LOG_ERR("Failed to reconstruct name");
+ free(msg);
+ return NULL;
+ }
+
if (deser_copy_string(data->data,
&msg->dif_name,
&offset)) {
@@ -389,6 +582,13 @@ struct irm_msg * deserialize_irm_msg(buffer_t * data)
break;
case IRM_REG_IPCP:
case IRM_UNREG_IPCP:
+ msg->name = deser_copy_name(data->data, &offset);
+ if (msg->name == NULL) {
+ LOG_ERR("Failed to reconstruct name");
+ free(msg);
+ return NULL;
+ }
+
deser_copy_size_t(data->data, &difs_size, &offset);
msg->difs_size = difs_size;
@@ -413,6 +613,22 @@ struct irm_msg * deserialize_irm_msg(buffer_t * data)
}
break;
+ case IRM_AP_REG:
+ case IRM_AP_REG_R:
+ case IRM_AP_UNREG:
+ case IRM_FLOW_ACCEPT:
+ case IRM_FLOW_ACCEPT_R:
+ case IRM_FLOW_ALLOC_RESP:
+ case IRM_FLOW_ALLOC:
+ case IRM_FLOW_ALLOC_R:
+ case IRM_FLOW_ALLOC_RES:
+ case IRM_FLOW_ALLOC_RES_R:
+ case IRM_FLOW_DEALLOC:
+ case IRM_FLOW_CONTROL:
+ case IRM_FLOW_WRITE:
+ case IRM_FLOW_READ:
+ LOG_MISSING;
+ break;
default:
LOG_ERR("Don't know that code");
free(msg);
@@ -454,12 +670,13 @@ buffer_t * serialize_ipcp_msg(struct ipcp_msg * msg)
ser_copy_value(strlen(msg->dif_name) + 1, data,
msg->dif_name, &offset);
- if (!name_is_ok(msg->member)) {
+ if (msg->ap_name == NULL) {
LOG_ERR("Null pointer passed");
buffer_destroy(buf);
return NULL;
}
- ser_copy_name(msg->member, data, &offset);
+ ser_copy_value(strlen(msg->ap_name) + 1, data,
+ msg->ap_name, &offset);
/* All these operations end with a list of DIFs */
case IPCP_REG:
@@ -520,8 +737,10 @@ struct ipcp_msg * deserialize_ipcp_msg(buffer_t * data)
return NULL;
}
- msg->member = deser_copy_name(data->data, &offset);
- if (msg->member == NULL) {
+ deser_copy_string(data->data,
+ &msg->ap_name,
+ &offset);
+ if (msg->ap_name == NULL) {
LOG_ERR("Failed to reconstruct name");
free(msg->dif_name);
free(msg);
@@ -533,8 +752,8 @@ struct ipcp_msg * deserialize_ipcp_msg(buffer_t * data)
msg->difs = malloc(sizeof(*(msg->difs)) * difs_size);
if (msg->difs == NULL) {
+ free(msg->ap_name);
free(msg->dif_name);
- name_destroy(msg->member);
free(msg);
return NULL;
}
@@ -547,7 +766,7 @@ struct ipcp_msg * deserialize_ipcp_msg(buffer_t * data)
free(msg->difs[j]);
free(msg->dif_name);
free(msg->difs);
- name_destroy(msg->member);
+ free(msg->ap_name);
free(msg);
return NULL;
}
diff --git a/src/tools/echo/echo_client.c b/src/tools/echo/echo_client.c
index 2f80a52a..196296f2 100644
--- a/src/tools/echo/echo_client.c
+++ b/src/tools/echo/echo_client.c
@@ -33,9 +33,8 @@ int client_main()
char * message = "Client says hi!";
ssize_t count = 0;
- fd = flow_alloc(SERVER_AP_NAME, NULL,
- CLIENT_AP_NAME, NULL,
- NULL, 0);
+ fd = flow_alloc(SERVER_AP_NAME, CLIENT_AP_NAME,
+ NULL, NULL, 0);
if (fd < 0) {
printf("Failed to allocate flow\n");
return -1;
diff --git a/src/tools/echo/echo_server.c b/src/tools/echo/echo_server.c
index f9682ab7..289f537a 100644
--- a/src/tools/echo/echo_server.c
+++ b/src/tools/echo/echo_server.c
@@ -34,7 +34,7 @@ void shutdown_server(int signo)
{
char * dif = DIF_NAME;
- if (ap_unreg(SERVER_AP_NAME, NULL, &dif, 1)) {
+ if (ap_unreg(SERVER_AP_NAME, &dif, 1)) {
printf("Failed to unregister application\n");
exit(EXIT_FAILURE);
}
@@ -59,7 +59,7 @@ int server_main()
return -1;
}
- server_fd = ap_reg(SERVER_AP_NAME, NULL, &dif, 1);
+ server_fd = ap_reg(SERVER_AP_NAME, &dif, 1);
if (server_fd < 0) {
printf("Failed to register application\n");
return -1;
diff --git a/src/tools/irm/irm_bootstrap_ipcp.c b/src/tools/irm/irm_bootstrap_ipcp.c
index 8c64ba8f..89950069 100644
--- a/src/tools/irm/irm_bootstrap_ipcp.c
+++ b/src/tools/irm/irm_bootstrap_ipcp.c
@@ -32,9 +32,7 @@ static void usage()
/* FIXME: Add dif_config stuff */
printf("Usage: irm bootstrap_ipcp\n"
" ap <application process name>\n"
- " [api <application process instance>]\n"
- " [ae <application entity name]\n"
- " [aei <application entity instance>]\n");
+ " [api <application process instance>]\n");
}
@@ -47,8 +45,6 @@ int do_bootstrap_ipcp(int argc, char ** argv)
name.ap_name = NULL;
name.api_id = 0;
- name.ae_name = "";
- name.aei_id = 0;
while (argc > 0) {
if (!parse_name(argv, &name)) {
diff --git a/src/tools/irm/irm_create_ipcp.c b/src/tools/irm/irm_create_ipcp.c
index 5c847988..854a15f9 100644
--- a/src/tools/irm/irm_create_ipcp.c
+++ b/src/tools/irm/irm_create_ipcp.c
@@ -35,8 +35,6 @@ static void usage()
printf("Usage: irm create_ipcp\n"
" ap <application process name>\n"
" [api <application process instance>]\n"
- " [ae <application entity name]\n"
- " [aei <application entity instance>]\n"
" type <ipc process type>\n");
}
@@ -47,8 +45,6 @@ int do_create_ipcp(int argc, char ** argv)
name.ap_name = NULL;
name.api_id = 0;
- name.ae_name = "";
- name.aei_id = 0;
while (argc > 0) {
if (!parse_name(argv, &name)) {
diff --git a/src/tools/irm/irm_destroy_ipcp.c b/src/tools/irm/irm_destroy_ipcp.c
index 467d1b50..4f02f9cb 100644
--- a/src/tools/irm/irm_destroy_ipcp.c
+++ b/src/tools/irm/irm_destroy_ipcp.c
@@ -31,9 +31,7 @@ static void usage()
{
printf("Usage: irm destroy_ipcp\n"
" ap <application process name>\n"
- " [api <application process instance>]\n"
- " [ae <application entity name]\n"
- " [aei <application entity instance>]\n");
+ " [api <application process instance>]\n");
}
int do_destroy_ipcp(int argc, char ** argv)
@@ -42,8 +40,6 @@ int do_destroy_ipcp(int argc, char ** argv)
name.ap_name = NULL;
name.api_id = 0;
- name.ae_name = "";
- name.aei_id = 0;
while (argc > 0) {
if (!parse_name(argv, &name)) {
diff --git a/src/tools/irm/irm_enroll_ipcp.c b/src/tools/irm/irm_enroll_ipcp.c
index 94f28f82..1dcdc919 100644
--- a/src/tools/irm/irm_enroll_ipcp.c
+++ b/src/tools/irm/irm_enroll_ipcp.c
@@ -32,8 +32,6 @@ static void usage()
printf("Usage: irm enroll_ipcp\n"
" ap <application process name>\n"
" [api <application process instance>]\n"
- " [ae <application entity name]\n"
- " [aei <application entity instance>]\n"
" dif <dif to enroll in>\n");
}
@@ -44,8 +42,6 @@ int do_enroll_ipcp(int argc, char ** argv)
name.ap_name = NULL;
name.api_id = 0;
- name.ae_name = "";
- name.aei_id = 0;
while (argc > 0) {
if (!parse_name(argv, &name)) {
diff --git a/src/tools/irm/irm_register_ipcp.c b/src/tools/irm/irm_register_ipcp.c
index c69ad350..468ef28f 100644
--- a/src/tools/irm/irm_register_ipcp.c
+++ b/src/tools/irm/irm_register_ipcp.c
@@ -37,8 +37,6 @@ static void usage()
printf("Usage: irm register_ipcp\n"
" ap <application process name>\n"
" [api <application process instance>]\n"
- " [ae <application entity name]\n"
- " [aei <application entity instance>]\n"
" dif <dif name to register with>\n"
" [dif <dif name to register with>]\n"
" [... (maximum %d difs)]\n", MAX_DIFS);
@@ -53,8 +51,6 @@ int do_register_ipcp(int argc, char ** argv)
name.ap_name = NULL;
name.api_id = 0;
- name.ae_name = "";
- name.aei_id = 0;
while (argc > 0) {
if (!parse_name(argv, &name)) {
diff --git a/src/tools/irm/irm_unregister_ipcp.c b/src/tools/irm/irm_unregister_ipcp.c
index a2dffc6c..0b669503 100644
--- a/src/tools/irm/irm_unregister_ipcp.c
+++ b/src/tools/irm/irm_unregister_ipcp.c
@@ -37,8 +37,6 @@ static void usage()
printf("Usage: irm unregister_ipcp\n"
" ap <application process name>\n"
" [api <application process instance>]\n"
- " [ae <application entity name]\n"
- " [aei <application entity instance>]\n"
" dif <dif name to unregister from>\n"
" [dif <dif name to unregister from>]\n"
" [... (maximum %d difs)]\n", MAX_DIFS);
@@ -53,8 +51,6 @@ int do_unregister_ipcp(int argc, char ** argv)
name.ap_name = NULL;
name.api_id = 0;
- name.ae_name = "";
- name.aei_id = 0;
while (argc > 0) {
if (!parse_name(argv, &name)) {
diff --git a/src/tools/irm/irm_utils.c b/src/tools/irm/irm_utils.c
index 021227fd..04cb7242 100644
--- a/src/tools/irm/irm_utils.c
+++ b/src/tools/irm/irm_utils.c
@@ -47,10 +47,6 @@ bool parse_name(char ** argv,
name->ap_name = *(argv + 1);
else if (matches(*argv, "api") == 0)
name->api_id = atoi(*(argv + 1));
- else if (matches(*argv, "ae") == 0)
- name->ae_name = *(argv + 1);
- else if (matches(*argv, "aei") == 0)
- name->aei_id = atoi(*(argv + 1));
else
found = false;