aboutsummaryrefslogtreecommitdiffstats
path: root/hicn-plugin/src/faces/udp/iface_udp_node.h
blob: 957d19217079a0368e7715d82b4806fe764d37da (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/*
 * 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.
 */

#ifndef __HICN_IFACE_UDP_H__
#define __HICN_IFACE_UDP_H__

#include <vlib/vlib.h>

extern vlib_node_registration_t hicn_iface_udp4_input_node;
extern vlib_node_registration_t hicn_iface_udp6_input_node;
extern vlib_node_registration_t hicn_iface_udp4_output_node;
extern vlib_node_registration_t hicn_iface_udp6_output_node;

void hicn_iface_udp_init (vlib_main_t * vm);

#endif // __HICN_FACE_UDP_H__

/*
 * fd.io coding-style-patch-verification: ON
 *
 * Local Variables:
 * eval: (c-set-style "gnu")
 * End:
 */
Comment.Preproc */ .highlight .cpf { color: #888888 } /* Comment.PreprocFile */ .highlight .c1 { color: #888888 } /* Comment.Single */ .highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */ .highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ .highlight .ge { font-style: italic } /* Generic.Emph */ .highlight .gr { color: #aa0000 } /* Generic.Error */ .highlight .gh { color: #333333 } /* Generic.Heading */ .highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ .highlight .go { color: #888888 } /* Generic.Output */ .highlight .gp { color: #555555 } /* Generic.Prompt */ .highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #666666 } /* Generic.Subheading */ .highlight .gt { color: #aa0000 } /* Generic.Traceback */ .highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */ .highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */ .highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */ .highlight .kp { color: #008800 } /* Keyword.Pseudo */ .highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */ .highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */ .highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */ .highlight .na { color: #336699 } /* Name.Attribute */ .highlight .nb { color: #003388 } /* Name.Builtin */ .highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */ .highlight .no { color: #003366; font-weight: bold } /* Name.Constant */ .highlight .nd { color: #555555 } /* Name.Decorator */ .highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */ .highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */ .highlight .nl { color: #336699; font-style: italic } /* Name.Label */ .highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */ .highlight .py { color: #336699; font-weight: bold } /* Name.Property */ .highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #336699 } /* Name.Variable */ .highlight .ow { color: #008800 } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */ .highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */ .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */ }
/*
 * 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.
 */

#ifndef __HICN_DPO_IP_H__
#define __HICN_DPO_IP_H__

#include <vnet/vnet.h>
#include <vnet/ip/ip4_packet.h>

#include "face_ip.h"
#include "../face.h"

/**
 * @brief Initialize the internal structures of the dpo ip face module.
 */
void hicn_dpo_ip_module_init (void);


/**
 * @brief Retrieve a face from the ip4 local address and returns its dpo. This
 * method adds a lock on the face state.
 *
 * @param dpo: Result of the lookup. If the face doesn't exist dpo = NULL
 * @param hicnb_flags: Flags that indicate whether the face is an application
 * face or not
 * @param local_addr: Ip v4 local address of the face
 * @param sw_if: software interface id of the face
 *
 * @result HICN_ERROR_FACE_NOT_FOUND if the face does not exist, otherwise HICN_ERROR_NONE.
 */
always_inline int
hicn_dpo_ip4_lock_from_local (dpo_id_t * dpo,
			      u8 * hicnb_flags,
			      const ip4_address_t * local_addr, u32 sw_if)
{
  hicn_face_t *face =
    hicn_face_ip4_get (local_addr, sw_if, &hicn_face_ip_local_hashtb);

  if (PREDICT_FALSE (face == NULL))
    return HICN_ERROR_FACE_NOT_FOUND;

  *hicnb_flags = HICN_BUFFER_FLAGS_DEFAULT;
  *hicnb_flags |=
    (face->shared.flags & HICN_FACE_FLAGS_APPFACE_PROD) >>
    HICN_FACE_FLAGS_APPFACE_PROD_BIT;

  hicn_face_id_t dpoi_index = hicn_dpoi_get_index (face);
  dpo_set (dpo, hicn_face_ip_type, DPO_PROTO_IP4, dpoi_index);
  dpo->dpoi_next_node = ~0;
  dpo_lock (dpo);

  return HICN_ERROR_NONE;
}

/**
 * @brief Retrieve a face from the ip6 local address and returns its dpo. This
 * method adds a lock on the face state.
 *
 * @param dpo: Result of the lookup. If the face doesn't exist dpo = NULL
 * @param hicnb_flags: Flags that indicate whether the face is an application
 * face or not
 * @param local_addr: Ip v6 local address of the face
 * @param sw_if: software interface id of the face
 *
 * @result HICN_ERROR_FACE_NOT_FOUND if the face does not exist, otherwise HICN_ERROR_NONE.
 */
always_inline int
hicn_dpo_ip6_lock_from_local (dpo_id_t * dpo,
			      u8 * hicnb_flags,
			      const ip6_address_t * local_addr, u32 sw_if)
{
  hicn_face_t *face =
    hicn_face_ip6_get (local_addr, sw_if, &hicn_face_ip_local_hashtb);

  if (PREDICT_FALSE (face == NULL))
    return HICN_ERROR_FACE_NOT_FOUND;

  *hicnb_flags = HICN_BUFFER_FLAGS_DEFAULT;
  *hicnb_flags |=
    (face->shared.flags & HICN_FACE_FLAGS_APPFACE_PROD) >>
    HICN_FACE_FLAGS_APPFACE_PROD_BIT;

  hicn_face_id_t dpoi_index = hicn_dpoi_get_index (face);
  dpo_set (dpo, hicn_face_ip_type, DPO_PROTO_IP6, dpoi_index);
  dpo->dpoi_next_node = ~0;
  dpo_lock (dpo);

  return HICN_ERROR_NONE;
}


/**
 * @brief Retrieve, or create if it doesn't exist, a face from the ip6 local
 * address and returns its dpo. This method adds a lock on the face state.
 *
 * @param dpo: Result of the lookup
 * @param hicnb_flags: Flags that indicate whether the face is an application
 * face or not
 * @param local_addr: Ip v4 local address of the face
 * @param remote_addr: Ip v4 remote address of the face
 * @param sw_if: software interface id of the face
 * @param node_index: vlib edge index to use in the packet processing
 */
always_inline void
hicn_dpo_ip4_add_and_lock_from_remote (dpo_id_t * dpo,
				       u8 * hicnb_flags,
				       const ip4_address_t * local_addr,
				       const ip4_address_t * remote_addr,
				       u32 sw_if, u32 node_index)
{
  /*All (complete) faces are indexed by remote addess as well */
  hicn_face_t *face =
    hicn_face_ip4_get (remote_addr, sw_if, &hicn_face_ip_remote_hashtb);

  if (face == NULL)
    {
      hicn_face_id_t dpoi_index;
      ip46_address_t local_addr46 = to_ip46 (0, (u8 *) local_addr);
      ip46_address_t remote_addr46 = to_ip46 (0, (u8 *) remote_addr);
      hicn_iface_ip_add (&local_addr46, &remote_addr46, sw_if, &dpoi_index);

      *hicnb_flags = HICN_BUFFER_FLAGS_DEFAULT;

      dpo_set (dpo, hicn_face_ip_type, DPO_PROTO_IP4, dpoi_index);
      dpo->dpoi_next_node = node_index;
      dpo_lock (dpo);

      return;
    }

  /* Code replicated on purpose */
  *hicnb_flags = HICN_BUFFER_FLAGS_DEFAULT;
  *hicnb_flags |=
    (face->shared.flags & HICN_FACE_FLAGS_APPFACE_PROD) >>
    HICN_FACE_FLAGS_APPFACE_PROD_BIT;

  hicn_face_id_t dpoi_index = hicn_dpoi_get_index (face);
  dpo_set (dpo, hicn_face_ip_type, DPO_PROTO_IP4, dpoi_index);
  dpo->dpoi_next_node = node_index;
  dpo_lock (dpo);
}

/**
 * @brief Retrieve, or create if it doesn't exist, a face from the ip6 local
 * address and returns its dpo. This method adds a lock on the face state.
 *
 * @param dpo: Result of the lookup
 * @param hicnb_flags: Flags that indicate whether the face is an application
 * face or not
 * @param local_addr: Ip v6 local address of the face
 * @param remote_addr: Ip v6 remote address of the face
 * @param sw_if: software interface id of the face
 * @param node_index: vlib edge index to use in the packet processing
 */
always_inline void
hicn_dpo_ip6_add_and_lock_from_remote (dpo_id_t * dpo,
				       u8 * hicnb_flags,
				       const ip6_address_t * local_addr,
				       const ip6_address_t * remote_addr,
				       u32 sw_if, u32 node_index)
{
  dpo->dpoi_type = DPO_FIRST;
  dpo->dpoi_proto = DPO_PROTO_NONE;
  dpo->dpoi_index = INDEX_INVALID;
  dpo->dpoi_next_node = 0;
  /*All (complete) faces are indexed by remote addess as well */
  hicn_face_t *face =
    hicn_face_ip6_get (remote_addr, sw_if, &hicn_face_ip_remote_hashtb);

  if (face == NULL)
    {
      hicn_face_id_t dpoi_index;
      hicn_iface_ip_add ((ip46_address_t *) local_addr,
			 (ip46_address_t *) remote_addr, sw_if, &dpoi_index);

      *hicnb_flags = HICN_BUFFER_FLAGS_DEFAULT;

      dpo_set (dpo, hicn_face_ip_type, DPO_PROTO_IP4, dpoi_index);
      dpo->dpoi_next_node = node_index;
      dpo_lock (dpo);

      return;
    }
  /* Code replicated on purpose */
  *hicnb_flags = HICN_BUFFER_FLAGS_DEFAULT;
  *hicnb_flags |=
    (face->shared.flags & HICN_FACE_FLAGS_APPFACE_PROD) >>
    HICN_FACE_FLAGS_APPFACE_PROD_BIT;

  index_t dpoi_index = hicn_dpoi_get_index (face);
  dpo_set (dpo, hicn_face_ip_type, DPO_PROTO_IP6, dpoi_index);
  dpo->dpoi_next_node = node_index;
  dpo_lock (dpo);
}


/**
 * @brief Create an ip face and its corresponding dpo. Meant to be used for the
 * control plane.
 *
 * @param dpo: Data plane object that point to the face created.
 * @param local_addr: Ip v4 local address of the face
 * @param remote_addr: Ip v4 remote address of the face
 * @param sw_if: software interface id of the face
 * @param adj: Ip adjacency corresponding to the remote address in the face
 * @param node_index: vlib edge index to use in the packet processing
 * @param flags: Flags of the face
 * @param face_id: Identifier for the face (dpoi_index)
 * @return HICN_ERROR_FACE_ALREADY_CREATED if the face exists, otherwise HICN_ERROR_NONE
 */
int hicn_dpo_ip4_create (dpo_id_t * dpo,
			 const ip4_address_t * local_addr,
			 const ip4_address_t * remote_addr,
			 u32 sw_if,
			 adj_index_t adj,
			 u32 node_index,
			 hicn_face_flags_t flags, hicn_face_id_t * face_id);

/**
 * @brief Create an ip face and its corresponding dpo. Meant to be used for the
 * control plane.
 *
 * @param dpo: Data plane object that point to the face created.
 * @param local_addr: Ip v6 local address of the face
 * @param remote_addr: Ip v6 remote address of the face
 * @param sw_if: software interface id of the face
 * @param adj: Ip adjacency corresponding to the remote address in the face
 * @param node_index: vlib edge index to use in the packet processing
 * @param flags: Flags of the face
 * @param face_id: Identifier for the face (dpoi_index)
 * @return HICN_ERROR_FACE_ALREADY_CREATED if the face exists, otherwise HICN_ERROR_NONE
 */
int hicn_dpo_ip6_create (dpo_id_t * dpo,
			 const ip6_address_t * local_addr,
			 const ip6_address_t * remote_addr,
			 u32 sw_if,
			 adj_index_t adj,
			 u32 node_index,
			 hicn_face_flags_t flags, hicn_face_id_t * face_id);

/**
 * @brief Create a dpo from an ip face
 *
 * @param face Face from which to create the dpo
 * @param dpoi_next_node Edge index that connects a node to the iface or face nodes
 * @return the dpo
 */
void hicn_dpo_ip_create_from_face (hicn_face_t * face, dpo_id_t * dpo,
				   u16 dpoi_next_node);

#endif // __HICN_DPO_IP_H__

/*
 * fd.io coding-style-patch-verification: ON
 *
 * Local Variables:
 * eval: (c-set-style "gnu")
 * End:
 */