summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/dev.c3
-rw-r--r--src/lib/ipcp_config.proto10
-rw-r--r--src/lib/ipcpd_messages.proto7
-rw-r--r--src/lib/irm.c70
-rw-r--r--src/lib/irmd_messages.proto31
-rw-r--r--src/lib/rib.c3
6 files changed, 91 insertions, 33 deletions
diff --git a/src/lib/dev.c b/src/lib/dev.c
index 9b41e5d4..cfcfdf81 100644
--- a/src/lib/dev.c
+++ b/src/lib/dev.c
@@ -857,8 +857,7 @@ int flow_dealloc(int fd)
if (!recv_msg->has_result) {
irm_msg__free_unpacked(recv_msg, NULL);
- assert(false);
- return -1;
+ return -EIRMD;
}
irm_msg__free_unpacked(recv_msg, NULL);
diff --git a/src/lib/ipcp_config.proto b/src/lib/ipcp_config.proto
index f0d5f6eb..4ede5060 100644
--- a/src/lib/ipcp_config.proto
+++ b/src/lib/ipcp_config.proto
@@ -35,12 +35,10 @@ message ipcp_config_msg {
optional uint32 fd_size = 4;
optional bool has_ttl = 5;
optional uint32 addr_auth_type = 6;
- optional uint32 dt_gam_type = 7;
- optional uint32 rm_gam_type = 8;
- optional uint32 routing_type = 9;
+ optional uint32 routing_type = 7;
// Config for shim UDP
- optional uint32 ip_addr = 10;
- optional uint32 dns_addr = 11;
+ optional uint32 ip_addr = 8;
+ optional uint32 dns_addr = 9;
// Config for the shim Ethernet LLC
- optional string if_name = 12;
+ optional string if_name = 10;
}
diff --git a/src/lib/ipcpd_messages.proto b/src/lib/ipcpd_messages.proto
index 2e6c0497..691b76ad 100644
--- a/src/lib/ipcpd_messages.proto
+++ b/src/lib/ipcpd_messages.proto
@@ -33,7 +33,9 @@ enum ipcp_msg_code {
IPCP_FLOW_ALLOC = 6;
IPCP_FLOW_ALLOC_RESP = 7;
IPCP_FLOW_DEALLOC = 8;
- IPCP_REPLY = 9;
+ IPCP_CONNECT = 9;
+ IPCP_DISCONNECT = 10;
+ IPCP_REPLY = 11;
};
message ipcp_msg {
@@ -47,5 +49,6 @@ message ipcp_msg {
optional int32 api = 8;
optional dif_info_msg dif_info = 9;
optional int32 response = 10;
- optional int32 result = 11;
+ optional string comp_name = 11;
+ optional int32 result = 12;
};
diff --git a/src/lib/irm.c b/src/lib/irm.c
index 4232cec1..ce17bf18 100644
--- a/src/lib/irm.c
+++ b/src/lib/irm.c
@@ -121,10 +121,6 @@ int irm_bootstrap_ipcp(pid_t api,
config.has_ttl = conf->has_ttl;
config.has_addr_auth_type = true;
config.addr_auth_type = conf->addr_auth_type;
- config.has_dt_gam_type = true;
- config.dt_gam_type = conf->dt_gam_type;
- config.has_rm_gam_type = true;
- config.rm_gam_type = conf->rm_gam_type;
config.has_routing_type = true;
config.routing_type = conf->routing_type;
dif_info.dir_hash_algo = conf->dif_info.dir_hash_algo;
@@ -150,7 +146,65 @@ int irm_bootstrap_ipcp(pid_t api,
if (recv_msg->has_result == false) {
irm_msg__free_unpacked(recv_msg, NULL);
- return -1;
+ return -EIRMD;
+ }
+
+ ret = recv_msg->result;
+ irm_msg__free_unpacked(recv_msg, NULL);
+
+ return ret;
+}
+
+int irm_connect_ipcp(pid_t api,
+ const char * dst,
+ const char * component)
+{
+ irm_msg_t msg = IRM_MSG__INIT;
+ irm_msg_t * recv_msg = NULL;
+ int ret;
+
+ msg.code = IRM_MSG_CODE__IRM_CONNECT_IPCP;
+ msg.dst_name = (char *) dst;
+ msg.comp_name = (char *) component;
+ msg.has_api = true;
+ msg.api = api;
+
+ recv_msg = send_recv_irm_msg(&msg);
+ if (recv_msg == NULL)
+ return -EIRMD;
+
+ if (recv_msg->has_result == false) {
+ irm_msg__free_unpacked(recv_msg, NULL);
+ return -EIRMD;
+ }
+
+ ret = recv_msg->result;
+ irm_msg__free_unpacked(recv_msg, NULL);
+
+ return ret;
+}
+
+int irm_disconnect_ipcp(pid_t api,
+ const char * dst,
+ const char * component)
+{
+ irm_msg_t msg = IRM_MSG__INIT;
+ irm_msg_t * recv_msg = NULL;
+ int ret;
+
+ msg.code = IRM_MSG_CODE__IRM_DISCONNECT_IPCP;
+ msg.dst_name = (char *) dst;
+ msg.comp_name = (char *) component;
+ msg.has_api = true;
+ msg.api = api;
+
+ recv_msg = send_recv_irm_msg(&msg);
+ if (recv_msg == NULL)
+ return -EIRMD;
+
+ if (recv_msg->has_result == false) {
+ irm_msg__free_unpacked(recv_msg, NULL);
+ return -EIRMD;
}
ret = recv_msg->result;
@@ -162,15 +216,15 @@ int irm_bootstrap_ipcp(pid_t api,
ssize_t irm_list_ipcps(const char * name,
pid_t ** apis)
{
- irm_msg_t msg = IRM_MSG__INIT;
+ irm_msg_t msg = IRM_MSG__INIT;
irm_msg_t * recv_msg = NULL;
- size_t nr = 0;
+ size_t nr = 0;
size_t i;
if (apis == NULL)
return -EINVAL;
- msg.code = IRM_MSG_CODE__IRM_LIST_IPCPS;
+ msg.code = IRM_MSG_CODE__IRM_LIST_IPCPS;
msg.dst_name = (char *) name;
recv_msg = send_recv_irm_msg(&msg);
diff --git a/src/lib/irmd_messages.proto b/src/lib/irmd_messages.proto
index 117752c8..723f6fb3 100644
--- a/src/lib/irmd_messages.proto
+++ b/src/lib/irmd_messages.proto
@@ -31,19 +31,21 @@ enum irm_msg_code {
IRM_LIST_IPCPS = 4;
IRM_BOOTSTRAP_IPCP = 5;
IRM_ENROLL_IPCP = 6;
- IRM_BIND_AP = 7;
- IRM_UNBIND_AP = 8;
- IRM_API_ANNOUNCE = 9;
- IRM_BIND_API = 10;
- IRM_UNBIND_API = 11;
- IRM_REG = 12;
- IRM_UNREG = 13;
- IRM_FLOW_ALLOC = 14;
- IRM_FLOW_ACCEPT = 15;
- IRM_FLOW_DEALLOC = 16;
- IPCP_FLOW_REQ_ARR = 17;
- IPCP_FLOW_ALLOC_REPLY = 18;
- IRM_REPLY = 19;
+ IRM_CONNECT_IPCP = 7;
+ IRM_DISCONNECT_IPCP = 8;
+ IRM_BIND_AP = 9;
+ IRM_UNBIND_AP = 10;
+ IRM_API_ANNOUNCE = 11;
+ IRM_BIND_API = 12;
+ IRM_UNBIND_API = 13;
+ IRM_REG = 14;
+ IRM_UNREG = 15;
+ IRM_FLOW_ALLOC = 16;
+ IRM_FLOW_ACCEPT = 17;
+ IRM_FLOW_DEALLOC = 18;
+ IPCP_FLOW_REQ_ARR = 19;
+ IPCP_FLOW_ALLOC_REPLY = 20;
+ IRM_REPLY = 21;
};
message irm_msg {
@@ -63,5 +65,6 @@ message irm_msg {
repeated sint32 apis = 14;
optional uint32 timeo_sec = 15;
optional uint32 timeo_nsec = 16;
- optional sint32 result = 17;
+ optional string comp_name = 17;
+ optional sint32 result = 18;
};
diff --git a/src/lib/rib.c b/src/lib/rib.c
index 104dc0cc..bbe996e7 100644
--- a/src/lib/rib.c
+++ b/src/lib/rib.c
@@ -373,7 +373,8 @@ static void destroy_rnode(struct rnode * node)
branch_hash(node->parent);
}
- rnode_throw_event(node, RO_DELETE);
+ if (node->parent != NULL)
+ rnode_throw_event(node->parent, RO_DELETE);
list_for_each_safe(p, h, &node->subs) {
struct rn_sub * s = list_entry(p, struct rn_sub, next);