diff options
Diffstat (limited to 'lib/includes/hicn/face.h')
-rw-r--r-- | lib/includes/hicn/face.h | 245 |
1 files changed, 245 insertions, 0 deletions
diff --git a/lib/includes/hicn/face.h b/lib/includes/hicn/face.h new file mode 100644 index 000000000..fbdacec5f --- /dev/null +++ b/lib/includes/hicn/face.h @@ -0,0 +1,245 @@ +/* + * Copyright (c) 2021 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/policy.h> + +#include <hicn/util/ip_address.h> + +/* Netdevice type */ + +#include <net/if.h> // IFNAMSIZ +#include "base.h" + +#define foreach_netdevice_type \ + _ (UNDEFINED) \ + _ (LOOPBACK) \ + _ (WIRED) \ + _ (WIFI) \ + _ (CELLULAR) \ + _ (VPN) \ + _ (MEMIF) \ + _ (N) + +#define MAXSZ_NETDEVICE_TYPE_ 9 +#define MAXSZ_NETDEVICE_TYPE MAXSZ_NETDEVICE_TYPE_ + NULLTERM + +typedef enum +{ +#define _(x) NETDEVICE_TYPE_##x, + foreach_netdevice_type +#undef _ +} netdevice_type_t; + +typedef uint32_t netdevice_flags_t; +#define NETDEVICE_FLAGS_EMPTY 0 +#define netdevice_flags_clear(F) (F = 0) +#define netdevice_flags_add(F, T) ((F) |= 1 << (T)) +#define netdevice_flags_remove(F, T) ((F) &= ~(1 << (T))) +#define netdevice_flags_has(F, T) ((F) & (1 << (T))) + +extern const char *_netdevice_type_str[]; +#define netdevice_type_str(x) _netdevice_type_str[x] + +#define INVALID_NETDEVICE_ID ~0 + +/* Netdevice */ + +/** + * \brief Netdevice type + * + * NOTE + * - This struct cannot be made opaque as it is currently part of face_t + * - We recommand using the API as to keep redundant attributes consistent + */ + +typedef struct +{ + u32 index; + char name[IFNAMSIZ]; +} netdevice_t; + +#define NETDEVICE_EMPTY \ + (netdevice_t) \ + { \ + .index = 0, .name = { 0 } \ + } + +netdevice_t *netdevice_create_from_index (u32 index); +netdevice_t *netdevice_create_from_name (const char *name); +#define netdevice_initialize_from_index netdevice_set_index +#define netdevice_initialize_from_name netdevice_set_name +void netdevice_free (netdevice_t *netdevice); +int netdevice_get_index (const netdevice_t *netdevice, u32 *index); +int netdevice_set_index (netdevice_t *netdevice, u32 index); +int netdevice_get_name (const netdevice_t *netdevice, const char **name); +int netdevice_set_name (netdevice_t *netdevice, const char *name); +int netdevice_update_index (netdevice_t *netdevice); +int netdevice_update_name (netdevice_t *netdevice); +int netdevice_cmp (const netdevice_t *nd1, const netdevice_t *nd2); +bool netdevice_is_empty (const netdevice_t *netdevice); + +#define NETDEVICE_UNDEFINED_INDEX 0 + +/* Face state */ + +#define foreach_face_state \ + _ (UNDEFINED) \ + _ (DOWN) \ + _ (UP) \ + _ (N) + +#define MAXSZ_FACE_STATE_ 9 +#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[]; + +#define face_state_str(x) _face_state_str[x] + +/* 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; + +typedef enum +{ + FACE_PROTOCOL_HICN, + FACE_PROTOCOL_UDP, + FACE_PROTOCOL_TCP, + FACE_PROTOCOL_UNKNOWN, +} face_protocol_t; + +#define face_type_is_valid(face_type) \ + (((face_type) >= FACE_TYPE_UNDEFINED) && (face_type < FACE_TYPE_N)) +#define face_type_is_defined(face_type) \ + (((face_type) > FACE_TYPE_UNDEFINED) && (face_type < FACE_TYPE_N)) + +extern const char *_face_type_str[]; +#define face_type_str(x) _face_type_str[x] + +face_type_t face_type_from_str (const char *str); + +#ifdef WITH_POLICY +#define MAXSZ_FACE_ \ + MAXSZ_FACE_TYPE_ + 2 * MAXSZ_URL_ + 2 * MAXSZ_FACE_STATE_ + \ + MAXSZ_POLICY_TAGS_ + 7 +#else +#define MAXSZ_FACE_ \ + MAXSZ_FACE_TYPE_ + 2 * MAXSZ_URL_ + 2 * MAXSZ_FACE_STATE_ + 4 +#endif /* WITH_POLICY */ +#define MAXSZ_FACE MAXSZ_FACE_ + 1 + +/* Face */ + +typedef u32 face_id_t; +#define INVALID_FACE_ID ~0 + +typedef struct +{ + face_id_t id; + char name[SYMBOLIC_NAME_LEN]; + face_type_t type; + face_state_t admin_state; + face_state_t state; +#ifdef WITH_POLICY + uint32_t priority; + policy_tags_t tags; /**< \see policy_tag_t */ +#endif /* WITH_POLICY */ + + /* + * Depending on the face type, some of the following fields will be unused + */ + netdevice_t netdevice; + int family; /* To access family independently of face type */ + hicn_ip_address_t local_addr; + hicn_ip_address_t remote_addr; + u16 local_port; + u16 remote_port; +} face_t; + +int face_initialize (face_t *face); +int face_initialize_udp (face_t *face, const char *interface_name, + const hicn_ip_address_t *local_addr, u16 local_port, + const hicn_ip_address_t *remote_addr, u16 remote_port, + int family); +int face_initialize_udp_sa (face_t *face, const char *interface_name, + const struct sockaddr *local_addr, + const struct sockaddr *remote_addr); + +face_t *face_create (); +face_t *face_create_udp (const char *interface_name, + const hicn_ip_address_t *local_addr, u16 local_port, + const hicn_ip_address_t *remote_addr, u16 remote_port, + int family); +face_t *face_create_udp_sa (const char *interface_name, + const struct sockaddr *local_addr, + const struct sockaddr *remote_addr); + +int face_finalize (face_t *face); + +void face_free (face_t *face); + +typedef int (*face_cmp_t) (const face_t *f1, const face_t *f2); + +int face_cmp (const face_t *f1, const face_t *f2); + +size_t face_snprintf (char *s, size_t size, const face_t *face); + +policy_tags_t face_get_tags (const face_t *face); +int face_set_tags (face_t *face, policy_tags_t tags); + +face_protocol_t get_protocol (face_type_t face_type); + +#endif /* HICN_FACE_H */ |