/[dynamips]/upstream/dynamips-0.2.7-RC2/net_io.h
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /upstream/dynamips-0.2.7-RC2/net_io.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 8 - (hide annotations)
Sat Oct 6 16:24:54 2007 UTC (13 years ago) by dpavlin
File MIME type: text/plain
File size: 7356 byte(s)
dynamips-0.2.7-RC2

1 dpavlin 1 /*
2 dpavlin 7 * Cisco router simulation platform.
3 dpavlin 1 * Copyright (c) 2005,2006 Christophe Fillot (cf@utc.fr)
4     *
5 dpavlin 7 * Network I/O Layer.
6 dpavlin 1 */
7    
8     #ifndef __NET_IO_H__
9     #define __NET_IO_H__
10    
11     #include <sys/types.h>
12     #include <sys/socket.h>
13     #include <sys/un.h>
14     #include <pthread.h>
15     #include "utils.h"
16    
17     #ifdef LINUX_ETH
18     #include "linux_eth.h"
19     #endif
20     #ifdef GEN_ETH
21     #include "gen_eth.h"
22     #endif
23    
24     /* Maximum packet size */
25 dpavlin 8 #define NETIO_MAX_PKT_SIZE 32768
26 dpavlin 1
27     /* Maximum device length */
28     #define NETIO_DEV_MAXLEN 64
29    
30     enum {
31     NETIO_TYPE_UNIX = 0,
32     NETIO_TYPE_VDE,
33     NETIO_TYPE_TAP,
34     NETIO_TYPE_UDP,
35     NETIO_TYPE_TCP_CLI,
36     NETIO_TYPE_TCP_SER,
37     #ifdef LINUX_ETH
38     NETIO_TYPE_LINUX_ETH,
39     #endif
40     #ifdef GEN_ETH
41     NETIO_TYPE_GEN_ETH,
42     #endif
43     NETIO_TYPE_FIFO,
44     NETIO_TYPE_NULL,
45     NETIO_TYPE_MAX,
46     };
47    
48     enum {
49     NETIO_FILTER_ACTION_DROP = 0,
50     NETIO_FILTER_ACTION_PASS,
51     NETIO_FILTER_ACTION_ALTER,
52     NETIO_FILTER_ACTION_DUPLICATE,
53     };
54    
55     typedef struct netio_desc netio_desc_t;
56    
57     /* VDE switch definitions */
58     enum vde_request_type { VDE_REQ_NEW_CONTROL };
59    
60     #define VDE_SWITCH_MAGIC 0xfeedface
61     #define VDE_SWITCH_VERSION 3
62    
63     struct vde_request_v3 {
64     m_uint32_t magic;
65     m_uint32_t version;
66     enum vde_request_type type;
67     struct sockaddr_un sock;
68     };
69    
70     /* netio unix descriptor */
71     typedef struct netio_unix_desc netio_unix_desc_t;
72     struct netio_unix_desc {
73     char *local_filename;
74     struct sockaddr_un remote_sock;
75     int fd;
76     };
77    
78     /* netio vde descriptor */
79     typedef struct netio_vde_desc netio_vde_desc_t;
80     struct netio_vde_desc {
81     char *local_filename;
82     struct sockaddr_un remote_sock;
83     int ctrl_fd,data_fd;
84     };
85    
86     /* netio tap descriptor */
87     typedef struct netio_tap_desc netio_tap_desc_t;
88     struct netio_tap_desc {
89     char filename[NETIO_DEV_MAXLEN];
90     int fd;
91     };
92    
93     /* netio udp/tcp descriptor */
94     typedef struct netio_inet_desc netio_inet_desc_t;
95     struct netio_inet_desc {
96     int local_port,remote_port;
97     char *remote_host;
98     int fd;
99     };
100    
101     #ifdef LINUX_ETH
102     /* netio linux raw ethernet descriptor */
103     typedef struct netio_lnxeth_desc netio_lnxeth_desc_t;
104     struct netio_lnxeth_desc {
105     char dev_name[NETIO_DEV_MAXLEN];
106     int dev_id,fd;
107     };
108     #endif
109    
110     #ifdef GEN_ETH
111     /* netio generic raw ethernet descriptor */
112     typedef struct netio_geneth_desc netio_geneth_desc_t;
113     struct netio_geneth_desc {
114     char dev_name[NETIO_DEV_MAXLEN];
115     pcap_t *pcap_dev;
116     };
117     #endif
118    
119     /* FIFO packet */
120     typedef struct netio_fifo_pkt netio_fifo_pkt_t;
121     struct netio_fifo_pkt {
122     netio_fifo_pkt_t *next;
123     size_t pkt_len;
124     char pkt[0];
125     };
126    
127     /* Netio FIFO */
128     typedef struct netio_fifo_desc netio_fifo_desc_t;
129     struct netio_fifo_desc {
130     pthread_cond_t cond;
131     pthread_mutex_t lock,endpoint_lock;
132     netio_fifo_desc_t *endpoint;
133     netio_fifo_pkt_t *head,*last;
134     u_int pkt_count;
135     };
136    
137     /* Packet filter */
138     typedef struct netio_pktfilter netio_pktfilter_t;
139     struct netio_pktfilter {
140     char *name;
141     int (*setup)(netio_desc_t *nio,void **opt,int argc,char *argv[]);
142     void (*free)(netio_desc_t *nio,void **opt);
143     int (*pkt_handler)(netio_desc_t *nio,void *pkt,size_t len,void *opt);
144     netio_pktfilter_t *next;
145     };
146    
147     /* Generic netio descriptor */
148     struct netio_desc {
149     u_int type;
150     void *dptr;
151     char *name;
152     int debug;
153    
154     /* Frame Relay specific information */
155     m_uint8_t fr_lmi_seq;
156     void *fr_conn_list;
157    
158     /* Ethernet specific information */
159     u_int vlan_port_type;
160     m_uint16_t vlan_id;
161     void *vlan_input_vector;
162    
163     union {
164     netio_unix_desc_t nud;
165     netio_vde_desc_t nvd;
166     netio_tap_desc_t ntd;
167     netio_inet_desc_t nid;
168     #ifdef LINUX_ETH
169     netio_lnxeth_desc_t nled;
170     #endif
171     #ifdef GEN_ETH
172     netio_geneth_desc_t nged;
173     #endif
174     netio_fifo_desc_t nfd;
175     } u;
176    
177     /* Send and receive prototypes */
178     ssize_t (*send)(void *desc,void *pkt,size_t len);
179     ssize_t (*recv)(void *desc,void *pkt,size_t len);
180    
181     /* Configuration saving */
182     void (*save_cfg)(netio_desc_t *nio,FILE *fd);
183    
184     /* Packet filters */
185 dpavlin 7 netio_pktfilter_t *rx_filter,*tx_filter,*both_filter;
186     void *rx_filter_data,*tx_filter_data,*both_filter_data;
187 dpavlin 1
188     /* Next pointer (for RX listener) */
189     netio_desc_t *rxl_next;
190 dpavlin 8
191     /* Packet data */
192     u_char rx_pkt[NETIO_MAX_PKT_SIZE];
193 dpavlin 1 };
194    
195     /* RX listener */
196     typedef int (*netio_rx_handler_t)(netio_desc_t *nio,
197     u_char *pkt,ssize_t pkt_len,
198     void *arg1,void *arg2);
199    
200     struct netio_rx_listener {
201     netio_desc_t *nio;
202     u_int ref_count;
203     volatile int running;
204     netio_rx_handler_t rx_handler;
205     void *arg1,*arg2;
206     pthread_t spec_thread;
207     struct netio_rx_listener *prev,*next;
208     };
209    
210     /* Get NETIO type given a description */
211     int netio_get_type(char *type);
212    
213     /* Show the NETIO types */
214     void netio_show_types(void);
215    
216     /* Create a new NetIO descriptor */
217     netio_desc_t *netio_desc_create_unix(char *nio_name,char *local,char *remote);
218    
219     /* Create a new NetIO descriptor with VDE method */
220     netio_desc_t *netio_desc_create_vde(char *nio_name,char *control,char *local);
221    
222     /* Create a new NetIO descriptor with TAP method */
223     netio_desc_t *netio_desc_create_tap(char *nio_name,char *tap_name);
224    
225     /* Create a new NetIO descriptor with TCP_CLI method */
226     netio_desc_t *netio_desc_create_tcp_cli(char *nio_name,char *addr,char *port);
227    
228     /* Create a new NetIO descriptor with TCP_SER method */
229     netio_desc_t *netio_desc_create_tcp_ser(char *nio_name,char *port);
230    
231     /* Create a new NetIO descriptor with UDP method */
232     netio_desc_t *netio_desc_create_udp(char *nio_name,int local_port,
233     char *remote_host,int remote_port);
234    
235     #ifdef LINUX_ETH
236     /* Create a new NetIO descriptor with raw Ethernet method */
237     netio_desc_t *netio_desc_create_lnxeth(char *nio_name,char *dev_name);
238     #endif
239    
240     #ifdef GEN_ETH
241     /* Create a new NetIO descriptor with generic raw Ethernet method */
242     netio_desc_t *netio_desc_create_geneth(char *nio_name,char *dev_name);
243     #endif
244    
245     /* Establish a cross-connect between two FIFO NetIO */
246     int netio_fifo_crossconnect(netio_desc_t *a,netio_desc_t *b);
247    
248     /* Create a new NetIO descriptor with FIFO method */
249     netio_desc_t *netio_desc_create_fifo(char *nio_name);
250    
251     /* Create a new NetIO descriptor with NULL method */
252     netio_desc_t *netio_desc_create_null(char *nio_name);
253    
254     /* Acquire a reference to NIO from registry (increment reference count) */
255     netio_desc_t *netio_acquire(char *name);
256    
257     /* Release an NIO (decrement reference count) */
258     int netio_release(char *name);
259    
260     /* Delete a NetIO descriptor */
261     int netio_delete(char *name);
262    
263     /* Delete all NetIO descriptors */
264     int netio_delete_all(void);
265    
266     /* Save the configuration of a NetIO descriptor */
267     void netio_save_config(netio_desc_t *nio,FILE *fd);
268    
269     /* Save configurations of all NetIO descriptors */
270     void netio_save_config_all(FILE *fd);
271    
272     /* Send a packet through a NetIO descriptor */
273     ssize_t netio_send(netio_desc_t *nio,void *pkt,size_t len);
274    
275     /* Receive a packet through a NetIO descriptor */
276     ssize_t netio_recv(netio_desc_t *nio,void *pkt,size_t max_len);
277    
278     /* Get a NetIO FD */
279     int netio_get_fd(netio_desc_t *nio);
280    
281     /* Enable a RX listener */
282     int netio_rxl_enable(netio_desc_t *nio);
283    
284     /* Add an RX listener in the listener list */
285     int netio_rxl_add(netio_desc_t *nio,netio_rx_handler_t rx_handler,
286     void *arg1,void *arg2);
287    
288     /* Remove a NIO from the listener list */
289     int netio_rxl_remove(netio_desc_t *nio);
290    
291     /* Initialize the RXL thread */
292     int netio_rxl_init(void);
293    
294     #endif

  ViewVC Help
Powered by ViewVC 1.1.26