summaryrefslogtreecommitdiffstats
path: root/hicn-light/src/hicn/api/face.h
diff options
context:
space:
mode:
Diffstat (limited to 'hicn-light/src/hicn/api/face.h')
-rw-r--r--hicn-light/src/hicn/api/face.h213
1 files changed, 213 insertions, 0 deletions
diff --git a/hicn-light/src/hicn/api/face.h b/hicn-light/src/hicn/api/face.h
new file mode 100644
index 000000000..6caf8b9f7
--- /dev/null
+++ b/hicn-light/src/hicn/api/face.h
@@ -0,0 +1,213 @@
+/*
+ * Copyright (c) 2017-2019 Cisco and/or its affiliates.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * \file face.h
+ * \brief Face abstraction
+ */
+#ifndef HICN_FACE_H
+#define HICN_FACE_H
+
+#ifndef SPACES
+#define SPACES(x) x
+#endif
+#ifndef SPACE
+#define SPACE 1
+#endif
+#ifndef NULLTERM
+#define NULLTERM 1
+#endif
+
+#include <hicn/api/ip_address.h>
+#include <hicn/api/types.h>
+
+/* Netdevice type */
+
+#include <net/if.h> // IFNAMSIZ
+
+#define foreach_netdevice_type \
+ _(UNDEFINED) \
+ _(WIRED) \
+ _(WIFI) \
+ _(CELLULAR) \
+ _(VPN) \
+ _(N)
+
+#define MAXSZ_NETDEVICE_TYPE_ 9
+#define MAXSZ_NETDEVICE_TYPE MAXSZ_NETDEVICE_TYPE_ + NULLTERM
+
+typedef enum {
+#define _(x) x,
+ foreach_netdevice_type
+#undef _
+} netdevice_type_t;
+
+extern const char* netdevice_type_str[];
+
+/* Netdevice */
+
+typedef struct {
+ u32 index;
+ char name[IFNAMSIZ];
+} netdevice_t;
+
+#define NETDEVICE_UNDEFINED_INDEX 0
+
+/* Face state */
+
+#define foreach_face_state \
+ _(UNDEFINED) \
+ _(PENDING_UP) \
+ _(UP) \
+ _(PENDING_DOWN) \
+ _(DOWN) \
+ _(ERROR) \
+ _(N)
+
+#define MAXSZ_FACE_STATE_ 12
+#define MAXSZ_FACE_STATE MAXSZ_FACE_STATE_ + 1
+
+typedef enum {
+#define _(x) FACE_STATE_##x,
+ foreach_face_state
+#undef _
+} face_state_t;
+
+extern const char* face_state_str[];
+
+/* Face type */
+
+#define foreach_face_type \
+ _(UNDEFINED) \
+ _(HICN) \
+ _(HICN_LISTENER) \
+ _(TCP) \
+ _(TCP_LISTENER) \
+ _(UDP) \
+ _(UDP_LISTENER) \
+ _(N)
+
+#define MAXSZ_FACE_TYPE_ 13
+#define MAXSZ_FACE_TYPE MAXSZ_FACE_TYPE_ + 1
+
+typedef enum {
+#define _(x) FACE_TYPE_##x,
+ foreach_face_type
+#undef _
+} face_type_t;
+
+extern const char* face_type_str[];
+
+#define MAXSZ_FACE_ MAXSZ_FACE_TYPE_ + 2 * MAXSZ_IP_ADDRESS + 2 * MAXSZ_PORT + 9
+#define MAXSZ_FACE MAXSZ_FACE_ + 1
+
+/* Face tag */
+
+/**
+ * \brief Tags associated to faces, useful to implement policies.
+ *
+ * NOTE
+ * - These tags should be shared with the forwarder, and might in fact be
+ * defined in a common library.
+ * - We start with a very simple implementation where all tags are not
+ * categorized and stored within the same bitfield.
+ */
+#define foreach_face_tag \
+ _(UNDEFINED) \
+ /* Connection type */ \
+ _(WIRED) \
+ _(WIFI) \
+ _(LTE) \
+ _(VPN) \
+ /* Connection security */ \
+ _(TRUSTED_NETWORK) \
+ _(UNTRUSTED_NETWORK) \
+ _(N)
+
+#define MAXSZ_FACE_TAG_ 17
+#define MAXSZ_FACE_TAG MAXSZ_FACE_TAG_ + 1
+
+typedef enum {
+#define _(x) FACE_TAG_##x,
+ foreach_face_tag
+#undef _
+} face_tag_t;
+
+extern const char* face_tag_str[];
+
+typedef int face_tags_t;
+
+static inline void face_tags_add(face_tags_t* tags, face_tag_t tag) {
+ *tags |= tag;
+}
+
+static inline void face_tags_remove(face_tags_t* tags, face_tag_t tag) {
+ *tags &= ~tag;
+}
+
+static inline int face_tags_has(face_tags_t tags, face_tag_t tag) {
+ return tags & tag;
+}
+
+#define FACE_TAGS_EMPTY 0
+
+/* Face */
+
+typedef struct {
+ face_type_t type;
+ union {
+ struct {
+ int family;
+ netdevice_t netdevice;
+ ip_address_t local_addr;
+ ip_address_t remote_addr;
+ } hicn;
+ struct {
+ int family;
+ ip_address_t local_addr;
+ u16 local_port;
+ ip_address_t remote_addr;
+ u16 remote_port;
+ } tunnel;
+ };
+ int tags; /**< \see face_tag_t */
+} face_t;
+
+int face_initialize(face_t* face);
+int face_initialize_udp(face_t* face, const ip_address_t* local_addr,
+ u16 local_port, const ip_address_t* remote_addr,
+ u16 remote_port, int family);
+face_t* face_initialize_udp_sa(face_t* face, const struct sockaddr* local_addr,
+ const struct sockaddr* remote_addr);
+
+face_t* face_create();
+face_t* face_create_udp(const ip_address_t* local_addr, u16 local_port,
+ const ip_address_t* remote_addr, u16 remote_port,
+ int family);
+face_t* face_create_udp_sa(const struct sockaddr* local_addr,
+ const struct sockaddr* remote_addr);
+
+int face_finalize(face_t* face);
+
+void face_free(face_t* face);
+
+typedef bool (*face_cmp_t)(const face_t* f1, const face_t* f2);
+
+bool face_cmp(const face_t* f1, const face_t* f2);
+hash_t face_hash(const face_t* face);
+
+size_t face_snprintf(char* s, size_t size, const face_t* face);
+
+#endif /* HICN_FACE_H */