summaryrefslogtreecommitdiff
path: root/cesar/interface/interface.h
blob: 787cee3396ee18fe91b623daa36b844cafffdf80 (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
#ifndef interface_interface_h
#define interface_interface_h
/* Cesar project {{{
 *
 * Copyright (C) 2008 Spidcom
 *
 * <<<Licence>>>
 *
 * }}} */
/**
 * \file    interface/interface.h
 * \brief   Interface module public functions.
 * \ingroup interface
 *
 * The interface module allows the communication between Actors and
 * the Data plane.
 */

#include "hle/hle.h"
#include "cl/cl.h"
#include "mac/sar/sar.h"
#include "bsu/bsu.h"

#include "interface/interface_module.h"
#include "interface/forward.h"

/**
 * Function to call when the interface receives a new MME.
 * \param  ctx the interface context
 * \param  tei  the station's source TEI.
 * \param  buffer the buffer containing the MME.
 * \param  length the MME length
 * \param  mme_data data use by the CL.
 * \param  encrypted  inform if the packet comes from the PWL if it has been
 * crypted.
 */
typedef void
(*interface_mme_recv_cb_t) (void *user_data, uint tei, u8 *buffer,
                            uint length, bool mme_recv, bool encryption);

/**
 * Function to call when the interface receives a empty buffer.
 * \param  user_data  the data registered by the actor in the init function.
 * \param  buffer  the buffer to add.
 */
typedef void
(*interface_mme_buffer_add_cb_t) (void *user_data, u8 *buffer);

BEGIN_DECLS

/**
 * Initialise the interface module.
 * \param  hle  the hle context.
 * \param  cl  the cl context.
 * \param  sar  the sar context.
 * \param  mac_config  the mac config context.
 * \return  the interface module context.
 */
interface_t*
interface_init (hle_t *hle, cl_t *cl, sar_t *sar, mac_config_t
                *mac_config);

/**
 * Interface uninit.
 * \param  ctx  the interface context.
 */
void
interface_uninit (interface_t *ctx);

/**
 * Initialise the callbacks functions.
 * \param  ctx the interface context.
 * \param  mme_recv_cb the function to call on reception of a MME.
 * \param  buffer_add_cb the function to call on buffer reception.
 * \param  beacon_add_cb the function to call on beacon reception
 * \param  user_data the data to provide on each callback function.
 */
void
interface_callback_init (interface_t *ctx, interface_mme_recv_cb_t mme_recv_cb,
           interface_mme_buffer_add_cb_t buffer_add_cb, void *user_data);

/** Receives an MME from the PWL or the HLE.
 * \param  ctx the interface context
 * \param  tei  the station's source TEI.
 * \param  buffer the buffer containing the MME.
 * \param  length the MME length
 * \param  mme_data data use by the CL.
 * \param  encrypted  inform if the packet comes from the PWL if it has been
 * crypted.
 */
void
interface_mme_recv (interface_t *ctx, uint tei, u8 *buffer, uint length,
                    bool mme_data, bool encrypted);


/**
 * Inform the Data plane when the MME as been processed by the CP.
 * \param  ctx the interface context
 * \param  buffer  the buffer to give back.
 * \param  mme_recv the cl data (as a void pointer).
 */
void
interface_mme_recv_done (interface_t *ctx, u8 *buffer, bool mme_recv);

/** Provides a MME to send to the CL. This MME can be send as a MME or a data.
 * \param  ctx the interface context.
 * \param  buffer the buffer containing the MME.
 * \param  length the length of the MME.
 * \param  tei  the destination TEI.
 */
void
interface_mme_send (interface_t *ctx, u8* buffer, uint length, uint tei);

/**
 * Sends a beacon, the interface will provide it to the SAR.
 * \param  ctx the interface context.
 * \param  beacon the beacon to send.
 * \param  params  the bsu parameters.
 */
void
interface_beacon (interface_t *ctx, pb_beacon_t *beacon,
                  bsu_params_t *params);

/**
 * Sends a message to the IPMbox
 * \param  ctx the interface context
 * \param  data the message to post in the ipmbox.
 * \param  length  the length of the data in bytes.
 */
void
interface_hle_send (interface_t *ctx, uint *data, uint length);

END_DECLS

#endif /* interface_interface_h */