summaryrefslogtreecommitdiffstats
path: root/ctrl/facemgr/src/interface.h
blob: 331312bde707b17fd5b30ac3cb097d4043cecaf6 (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
/*
 * 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 interface.h
 * \brief Interface base class
 *
 * Interfaces are the priviledged way to extend the functionalities of the face
 * manager. They both provide input and/or output functionality to allow for
 * several components to interoperate, respectively by raising/receiving events
 * about changes in the underlying network.
 *
 * All communication happens through base operations (create, delete, etc.) over
 * a generic face abstraction.
 */
#ifndef FACEMGR_INTERFACE_H
#define FACEMGR_INTERFACE_H

#include <stdbool.h>

struct facelet_s;
typedef int (*callback_t)(struct facelet_s * facelet, void * callback_data);

struct interface_s;

/**
 * \brief Interface operations
 */
typedef struct {
    /** The type given to the interfaces */
    char * type;
    /* Constructor */
    int (*initialize)(struct interface_s * interface, void * cfg);
    /* Destructor */
    int (*finalize)(struct interface_s * interface);
    /* Callback upon file descriptor event (iif previously registered) */
    int (*callback)(struct interface_s * interface);
    /* Callback upon face events coming from the face manager */
    int (*on_event)(struct interface_s * interface, const struct facelet_s * facelet);
} interface_ops_t;

typedef struct interface_s {
    char * name;
    const interface_ops_t * ops;
    callback_t callback;
    void * callback_data;
    void * data;
} interface_t;

/**
 * \brief Registers a new interface type
 * \param [in] ops - Virtual function table representing the interface
 *     operations.
 * \return Flag indicating the success (FACEMGR_SUCCESS=0), or failure (any
 *     other value) of the operation.
 */
int interface_register(const interface_ops_t * ops);

/**
 * \brief Create a new instance of an interface of a given type.
 * \param [in] name - Name of the newly create interface instance.
 * \param [in] type - Name of the interface type to create.
 * \return A a pointer to the newly created instance of the requested type, or
 *     NULL in case of failure.
 */
interface_t * interface_create(const char * name, const char * type);

/**
 * \brief Free an interface instance.
 * \param [in] interface - Pointer to the instance to free.
 */
void interface_free(interface_t * interface);

/**
 * This function is equivalent to interface_set_callback, which should be
 * preferred. The difference is the lack of explicit type casts which should
 * simplify the calling syntax.
 */

void _interface_set_callback(interface_t * interface, callback_t callback, void * callback_data);
#define interface_set_callback(interface, callback, callback_data) \
    _interface_set_callback(interface, (callback_t)callback, (void*)callback_data)

int interface_initialize(interface_t * interface, void * cfg);
int interface_finalize(interface_t * interface);

int interface_on_event(interface_t * interface, const struct facelet_s * facelet);

#endif /* FACEMGR_INTERFACE_H */