summaryrefslogtreecommitdiff
path: root/src/ipcpd/local
diff options
context:
space:
mode:
authorSander Vrijders <[email protected]>2016-10-25 13:22:51 +0200
committerSander Vrijders <[email protected]>2016-10-26 11:52:53 +0200
commitf0646875d0bc941e339d305d0c68b13543cd6f2a (patch)
tree0a3dde0e4f6284ece935d6eff99f26234126f1ab /src/ipcpd/local
parent1c06b9ff80a2bf7ee6042534fee6098f7e452b59 (diff)
downloadouroboros-f0646875d0bc941e339d305d0c68b13543cd6f2a.tar.gz
ouroboros-f0646875d0bc941e339d305d0c68b13543cd6f2a.zip
lib, irmd, ipcpd: Add name querying to IPCPs
This adds the ability to query IPCPs if a name can be reached through them, e.g. if a name is available in a DIF. This means that in the shim-udp a DNS query is performed, in the shim-eth-llc an ARP-like query has been added, in the local a check is done to see if the name is registered, and in the normal currently no application is reachable through it.
Diffstat (limited to 'src/ipcpd/local')
-rw-r--r--src/ipcpd/local/main.c25
1 files changed, 20 insertions, 5 deletions
diff --git a/src/ipcpd/local/main.c b/src/ipcpd/local/main.c
index 192607c1..b8783d9d 100644
--- a/src/ipcpd/local/main.c
+++ b/src/ipcpd/local/main.c
@@ -20,17 +20,18 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
+#define OUROBOROS_PREFIX "ipcpd/local"
+
#include <ouroboros/config.h>
-#include "ipcp.h"
+#include <ouroboros/logs.h>
#include <ouroboros/errno.h>
#include <ouroboros/dev.h>
#include <ouroboros/fcntl.h>
#include <ouroboros/fqueue.h>
#include <ouroboros/ipcp-dev.h>
#include <ouroboros/local-dev.h>
-#define OUROBOROS_PREFIX "ipcpd/local"
-#include <ouroboros/logs.h>
+#include "ipcp.h"
#include <string.h>
#include <signal.h>
@@ -176,7 +177,7 @@ static int ipcp_local_name_reg(char * name)
{
pthread_rwlock_rdlock(&ipcpi.state_lock);
- if (ipcp_data_add_reg_entry(ipcpi.data, name)) {
+ if (ipcp_data_reg_add_entry(ipcpi.data, name)) {
pthread_rwlock_unlock(&ipcpi.state_lock);
LOG_DBG("Failed to add %s to local registry.", name);
return -1;
@@ -193,7 +194,7 @@ static int ipcp_local_name_unreg(char * name)
{
pthread_rwlock_rdlock(&ipcpi.state_lock);
- ipcp_data_del_reg_entry(ipcpi.data, name);
+ ipcp_data_reg_del_entry(ipcpi.data, name);
pthread_rwlock_unlock(&ipcpi.state_lock);
@@ -202,6 +203,19 @@ static int ipcp_local_name_unreg(char * name)
return 0;
}
+static int ipcp_local_name_query(char * name)
+{
+ int ret;
+
+ pthread_rwlock_rdlock(&ipcpi.state_lock);
+
+ ret = (ipcp_data_reg_has(ipcpi.data, name) ? 0 : -1);
+
+ pthread_rwlock_unlock(&ipcpi.state_lock);
+
+ return ret;
+}
+
static int ipcp_local_flow_alloc(int fd,
char * dst_name,
char * src_ae_name,
@@ -302,6 +316,7 @@ static struct ipcp_ops local_ops = {
.ipcp_enroll = NULL, /* shim */
.ipcp_name_reg = ipcp_local_name_reg,
.ipcp_name_unreg = ipcp_local_name_unreg,
+ .ipcp_name_query = ipcp_local_name_query,
.ipcp_flow_alloc = ipcp_local_flow_alloc,
.ipcp_flow_alloc_resp = ipcp_local_flow_alloc_resp,
.ipcp_flow_dealloc = ipcp_local_flow_dealloc