aboutsummaryrefslogtreecommitdiffstats
path: root/hicn-light/src/hicn/core/mapme.h
blob: 9ece8a090aa5ebc9c69f2910d74d43ebf5531781 (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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
/*
 * Copyright (c) 2021-2023 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 mapme.h
 * @brief MAP-Me : AnchorLess Producer Mobility Management
 */

#ifndef mapme_h
#define mapme_h

#ifdef WITH_MAPME

#include <stdbool.h>
#include <stdint.h>

#include <hicn/ctrl/hicn-light.h>
#include <hicn/hicn.h>

#include "connection.h"
#include "fib_entry.h"
#include "msgbuf.h"

// Allow processing of MAP-Me requests when no FIB entry is present.
// An alternative would be to perform a LPM
#define HICN_MAPME_ALLOW_NONEXISTING_FIB_ENTRY

typedef struct mapme_s mapme_t;

/**
 * @function mapme_create
 * @abstract Initializes MAP-Me state in the forwarder.
 * @return bool - Boolean informing about the success of MAP-Me initialization.
 */
mapme_t *mapme_create(void *Forwarder);

/**
 * @function mapme_free
 * @abstract Free MAP-Me state in the forwarder.
 */
void mapme_free(mapme_t *mapme);

/**
 * @function messageHandler_is_mapme
 * @abstract Identifies MAP-Me messages
 * @discussion This function can be used by the forwarder to dispatch MAP-Me
 * 	message to the appropriate processing function. Ideally this would be
 *      done through hooks defined in the Init function.
 * @param [in] msgBuffer - The buffer to match
 * @return A boolean indicating whether message is a MAP-Me control message.
 */
bool mapme_match_packet(const uint8_t *msgBuffer);

/**
 * @function mapme_handlemapme_tMessage
 * @abstract Process a MAP-Me message.
 * @param [in] mapme - Pointer to the MAP-Me data structure.
 * @param [in] message - MAP-Me buffer
 * @param [in] conn_id - Ingress connection id
 */
void mapme_process(mapme_t *mapme, msgbuf_t *msgbuf);

/* mapme API */
/**
 * @function mapme_send_updates
 * @abstract sends an update to all adjacencies. Used for face
 * add/delete/changes (priority.tag) and policy
 * @param [in] mapme - Pointer to the MAP-Me data structure.
 * @param [in] fib_entry - The FIB entry to consider
 */
int mapme_set_all_adjacencies(const mapme_t *mapme, fib_entry_t *entry);

/**
 * @function mapme_set_adjacencies
 * @abstract sends an update to the specified adjacencies. Used by forwarding
 * strategies
 * @param [in] mapme - Pointer to the MAP-Me data structure.
 * @param [in] fib_entry - The FIB entry to consider
 * @param [in] nexthops - next hops on which to send the update.
 * @param [in] prefix - A more specific prefix (special use with no retx), or
 * NULL
 */
int mapme_set_adjacencies(const mapme_t *mapme, fib_entry_t *entry,
                          nexthops_t *nexthops, const hicn_prefix_t *prefix);

/**
 * @function mapme_set_adjacencies
 * @abstract sends an update to the specified adjacency. Used by control plane
 * commands.
 * @param [in] mapme - Pointer to the MAP-Me data structure.
 * @param [in] fib_entry - The FIB entry to consider
 * @param [in] nexthop - nexthop on which to send the update.
 * @param [in] prefix - A more specific prefix (special use with no retx), or
 * NULL
 */
int mapme_set_adjacency(const mapme_t *mapme, fib_entry_t *entry,
                        nexthop_t nexthop, const hicn_prefix_t *prefix);

/**
 * @function mapme_update_adjacencies
 * @abstract sends an update on previuos adjacencies. Used for IU forwarding,
 * NAT and timeouts
 * strategies
 * @param [in] mapme - Pointer to the MAP-Me data structure.
 * @param [in] fib_entry - The FIB entry to consider
 * @param [in] inc_iu_seq - if true, the seq number of the tfib/mapme iu will be
 * increased by one
 */
int mapme_update_adjacencies(const mapme_t *mapme, fib_entry_t *entry,
                             bool inc_iu_seq);

/**
 * @function mapme_on_connection_event
 * @abstract Callback following the addition of the face though the control
 * protocol.
 * @discussion This callback triggers the sending of control packets by MAP-Me.
 * @param [in] mapme - Pointer to the MAP-Me data structure.
 * @param [in] conn - The newly added connection.
 * @param [in] event - Connection event
 */
void mapme_on_connection_event(const mapme_t *mapme, const connection_t *conn,
                               connection_event_t event);

/**
 * @function mapme_get_nexthops
 * @abstract return the nexthops to forward interests defined by mapme, it
 *   covers also the case where local discovery mechanisms are trriggered.
 */
// nexthops_t * mapme_get_nexthops(const mapme_t *mapme, fib_entry_t *fib_entry,
//                              const msgbuf_t *interest);

#ifdef HICN_MAPME_ALLOW_NONEXISTING_FIB_ENTRY
fib_entry_t *mapme_create_fib_entry(const mapme_t *mapme,
                                    const hicn_prefix_t *prefix,
                                    unsigned ingress_id);
#endif /* HICN_MAPME_ALLOW_NONEXISTING_FIB_ENTRY */

void mapme_set_enable(mapme_t *mapme, bool enable);
void mapme_set_discovery(mapme_t *mapme, bool enable);
void mapme_set_timescale(mapme_t *mapme, uint32_t time);
void mapme_set_retransmision(mapme_t *mapme, uint32_t time);

#endif /* WITH_MAPME */

#endif  // mapme_h