Update to new sinfo resource variants API
[muen/linux/muennet.git] / internal.h
1 /*
2  * Muen virtual network driver.
3  *
4  * Copyright (C) 2015  secunet Security Networks AG
5  *
6  * This program is free software; you can redistribute it and/or modify it
7  * under the terms and conditions of the GNU General Public License,
8  * version 2, as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope it will be useful, but WITHOUT
11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
13  * more details.
14  *
15  * You should have received a copy of the GNU General Public License along with
16  * this program; if not, write to the Free Software Foundation, Inc.,
17  * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
18  */
19
20 #ifndef INTERNAL_H_
21 #define INTERNAL_H_
22
23 #include <linux/netdevice.h>
24 #include <muen/sinfo.h>
25 #include <muen/reader.h>
26
27 /**
28  * @file internal.h
29  * @brief Interface between the modules
30  * @defgroup common Commonly used functions
31  *
32  * This module contains mainly the data structure that is shared between the
33  * other components. The transfer mechanism (muchannel) uses a fixed packet
34  * size. This size is directly used for raw mode transfers. To support IP
35  * traffic, the net_hdr protocol must be used to output a specific header
36  * before the actual data. In this mode the networking interface determines the
37  * length from the transferred IP headers.
38  */
39 /*@{*/
40
41 /**
42  * @brief Networking device private information.
43  *
44  * This is the private information associated with each created networking
45  * device.
46  */
47 struct dev_info {
48         struct list_head list;           /**< list head for chaining into #dev_list                */
49         struct net_device *dev;          /**< reference to networking interface                    */
50         struct net_device_stats stats;   /**< contains receive and transmit information            */
51         char *bus_info;                  /**< text representation for input and output association */
52         int mtu;                         /**< MTU for this interface                               */
53         u32 *pmtu;                       /**< PMTUs for this interface                             */
54         size_t pmtu_elements;            /**< maximum number of PMTUs supported                    */
55         unsigned long flags;             /**< flags given on the command line                      */
56         spinlock_t writer_lock;          /**< lock for accessing the writer part                   */
57         struct muchannel *channel_out;   /**< output channel for write operations                  */
58         size_t writer_element_size;      /**< size of elements for write operations                */
59         size_t writer_region_size;       /**< total size of writer buffer                          */
60         u64 writer_protocol;             /**< protocol id for writer                               */
61         u64 reader_protocol;             /**< protocol id for reader                               */
62         unsigned int poll_interval;      /**< sleep period for reader work                         */
63         struct muchannel_reader reader;  /**< channel reader                                       */
64         size_t reader_element_size;      /**< size of elements for read operations                 */
65         struct muchannel *channel_in;    /**< input channel for read operations                    */
66         struct delayed_work reader_work; /**< delayed reader work queue struct                     */
67         struct dentry *debugfs_dir;      /**< directory entry for debugfs directory                */
68         struct dentry *debugfs_info;     /**< directory entry for information file                 */
69 };
70
71 /**
72  * @brief Flag bit values
73  *
74  * These are the values for the bits that can be stored in #dev_info.flags.
75  */
76 enum muennet_flags {
77         MUENNET_HDR = 1, /**< add network information needed for IPv4/IPv6 */
78         ETH_DEV     = 2, /**< treat interface as ethernet device */
79 };
80
81 /**
82  * @brief Name-value mappings for the flags.
83  *
84  * This data type is used to map symbolic names of the flags to the bit values.
85  */
86 struct flag_name {
87         const char *name;
88         unsigned long value;
89 };
90
91 /**
92  * @brief Mapping of the currently implemented flags.
93  *
94  * This variable stores the currently known flags with their symbolic names
95  * that can be given when loading the module. These symbolic names are also
96  * used when writing information in the debugfs.
97  */
98 static const struct flag_name flag_names[] = {
99         { .name = "net_hdr",
100           .value = MUENNET_HDR },
101         { .name = "eth_dev",
102           .value = ETH_DEV },
103         {},
104 };
105
106 /**
107  * @brief Header format for network header flag.
108  *
109  * This header encodes additional information in the data transferred via
110  * the shared channel to avoid having to guess some of the packet properties.
111  */
112 struct net_hdr {
113         u32 mark;    /**< netfilter mark                          */
114         u16 length;  /**< length of the payload                   */
115         u8 protocol; /**< the IP protocol embedded in the payload */
116 } __packed;
117 /*@}*/
118
119 /**
120  * @brief Header format for ethernet device flag.
121  *
122  * This header encodes additional information in the data transferred via
123  * the shared channel to avoid having to guess some of the packet properties.
124  */
125 struct eth_hdr {
126         u16 length;  /**< length of the ethernet packet (header + payload) */
127 } __packed;
128 /*@}*/
129
130 /**
131  * @defgroup debug Debugging and tracing tools
132  *
133  * This module can be split into two parts. The functions are used to setup the
134  * debugfs entries for the module and for each individual networking device.
135  */
136 /*@{*/
137
138 /**
139  * @brief Initialize debugfs for driver
140  */
141 void debug_initialize(void);
142
143 /**
144  * @brief Removes debugfs for driver
145  */
146 void debug_shutdown(void);
147
148 /**
149  * @brief Initialize directory for single device
150  */
151 int debug_create_device(struct dev_info *dev_info);
152
153 /**
154  * @brief Remove directory for single device
155  */
156 void debug_remove_device(struct dev_info *dev_info);
157 /*@}*/
158
159 /**
160  * @defgroup reader Network reader
161  */
162 /*@{*/
163
164 /**
165  * @brief Initializes the network device reader part
166  */
167 int initialize_reader(struct dev_info *dev_info,
168                       const struct muen_resource_type *const region);
169
170 /**
171  * @brief Shuts down the network device reader part
172  */
173 void cleanup_reader(struct dev_info *dev_info);
174 /*@}*/
175
176 /**
177  * @defgroup writer Network writer
178  */
179 /*@{*/
180
181 /**
182  * @brief Activate specified network writer
183  */
184 void writer_up(struct dev_info *dev_info);
185
186 /**
187  * @brief Deactivate specified network writer
188  */
189 void writer_down(struct dev_info *dev_info);
190
191 /**
192  * @brief Initializes the network device writer part
193  */
194 int initialize_writer(struct dev_info *dev_info,
195                       const struct muen_resource_type *const region,
196                       const struct muen_resource_type *const pmtu_region);
197
198 /**
199  * @brief Shuts down the network device writer part
200  */
201 void cleanup_writer(struct dev_info *dev_info);
202
203 /**
204  * @brief Transmit given sbk using the specified network device
205  */
206 int muennet_xmit(struct sk_buff *skb, struct net_device *dev);
207 /*@}*/
208
209 #endif