summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authordimitri staessens <[email protected]>2017-08-28 18:54:22 +0200
committerdimitri staessens <[email protected]>2017-08-28 20:49:34 +0200
commit9de8dc4948cf7ce239232aae0889c39ffa39ede2 (patch)
tree396295b2d36f69ee55e5080e556891f11210aed8 /src/lib
parent176698e8c2fd7ab8007b8074515d6144e7177d8e (diff)
downloadouroboros-9de8dc4948cf7ce239232aae0889c39ffa39ede2.tar.gz
ouroboros-9de8dc4948cf7ce239232aae0889c39ffa39ede2.zip
tools: Add tool to connect IPCP components
This enables user-written tools to instruct IPCPs to establish and tear down connections (a.k.a. adjacencies) between its internal components (Management and Data Transfer). For more info, do "irm ipcp connect" or "irm ipcp disconnect" on the command line. This commit exposes a deletion bug in the RIB where FSO's fail to unpack/parse. This will be fixed when the RIB is deprecated.
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/ipcpd_messages.proto7
-rw-r--r--src/lib/irm.c66
-rw-r--r--src/lib/irmd_messages.proto31
3 files changed, 84 insertions, 20 deletions
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 eec89338..ce17bf18 100644
--- a/src/lib/irm.c
+++ b/src/lib/irm.c
@@ -146,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;
@@ -158,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;
};