xref: /haiku/headers/private/net/net_protocol.h (revision c22d69bf1f5f60f7ebddd79108a53c8f97f300fe)
1*c22d69bfSAxel Dörfler /*
2*c22d69bfSAxel Dörfler  * Copyright 2006, Haiku, Inc. All Rights Reserved.
3*c22d69bfSAxel Dörfler  * Distributed under the terms of the MIT License.
4*c22d69bfSAxel Dörfler  */
5*c22d69bfSAxel Dörfler #ifndef NET_PROTOCOL_H
6*c22d69bfSAxel Dörfler #define NET_PROTOCOL_H
7*c22d69bfSAxel Dörfler 
8*c22d69bfSAxel Dörfler 
9*c22d69bfSAxel Dörfler #include <net_buffer.h>
10*c22d69bfSAxel Dörfler #include <net_socket.h>
11*c22d69bfSAxel Dörfler 
12*c22d69bfSAxel Dörfler 
13*c22d69bfSAxel Dörfler // level flags to pass to control()
14*c22d69bfSAxel Dörfler #define LEVEL_SET_OPTION	0x10000000
15*c22d69bfSAxel Dörfler #define LEVEL_GET_OPTION	0x20000000
16*c22d69bfSAxel Dörfler #define LEVEL_DRIVER_IOCTL	0x0f000000
17*c22d69bfSAxel Dörfler #define LEVEL_MASK			0x0fffffff
18*c22d69bfSAxel Dörfler 
19*c22d69bfSAxel Dörfler typedef struct net_protocol {
20*c22d69bfSAxel Dörfler 	struct net_protocol				*next;
21*c22d69bfSAxel Dörfler 	struct net_protocol_module_info	*module;
22*c22d69bfSAxel Dörfler 	net_socket						*socket;
23*c22d69bfSAxel Dörfler } net_protocol;
24*c22d69bfSAxel Dörfler 
25*c22d69bfSAxel Dörfler struct net_protocol_module_info {
26*c22d69bfSAxel Dörfler 	module_info info;
27*c22d69bfSAxel Dörfler 
28*c22d69bfSAxel Dörfler 	net_protocol *(*init_protocol)(net_socket *socket);
29*c22d69bfSAxel Dörfler 	status_t	(*uninit_protocol)(net_protocol *self);
30*c22d69bfSAxel Dörfler 
31*c22d69bfSAxel Dörfler 	status_t	(*open)(net_protocol *self);
32*c22d69bfSAxel Dörfler 	status_t	(*close)(net_protocol *self);
33*c22d69bfSAxel Dörfler 	status_t	(*free)(net_protocol *self);
34*c22d69bfSAxel Dörfler 
35*c22d69bfSAxel Dörfler 	status_t	(*connect)(net_protocol *self, const struct sockaddr *address);
36*c22d69bfSAxel Dörfler 	status_t	(*accept)(net_protocol *self, struct net_socket **_acceptedSocket);
37*c22d69bfSAxel Dörfler 	status_t	(*control)(net_protocol *self, int level, int option, void *value,
38*c22d69bfSAxel Dörfler 					size_t *_length);
39*c22d69bfSAxel Dörfler 
40*c22d69bfSAxel Dörfler 	status_t	(*bind)(net_protocol *self, struct sockaddr *address);
41*c22d69bfSAxel Dörfler 	status_t	(*unbind)(net_protocol *self, struct sockaddr *address);
42*c22d69bfSAxel Dörfler 	status_t	(*listen)(net_protocol *self, int count);
43*c22d69bfSAxel Dörfler 	status_t	(*shutdown)(net_protocol *self, int direction);
44*c22d69bfSAxel Dörfler 
45*c22d69bfSAxel Dörfler 	status_t	(*send_data)(net_protocol *self, net_buffer *buffer);
46*c22d69bfSAxel Dörfler 	status_t	(*send_routed_data)(net_protocol *self,
47*c22d69bfSAxel Dörfler 					struct net_route *route, net_buffer *buffer);
48*c22d69bfSAxel Dörfler 	ssize_t		(*send_avail)(net_protocol *self);
49*c22d69bfSAxel Dörfler 
50*c22d69bfSAxel Dörfler 	status_t	(*read_data)(net_protocol *self, size_t numBytes, uint32 flags,
51*c22d69bfSAxel Dörfler 					net_buffer **_buffer);
52*c22d69bfSAxel Dörfler 	ssize_t		(*read_avail)(net_protocol *self);
53*c22d69bfSAxel Dörfler 
54*c22d69bfSAxel Dörfler 	struct net_domain *(*get_domain)(net_protocol *self);
55*c22d69bfSAxel Dörfler 	size_t		(*get_mtu)(net_protocol *self, const struct sockaddr *address);
56*c22d69bfSAxel Dörfler 
57*c22d69bfSAxel Dörfler 	status_t	(*receive_data)(net_buffer *data);
58*c22d69bfSAxel Dörfler 	status_t	(*error)(uint32 code, net_buffer *data);
59*c22d69bfSAxel Dörfler 
60*c22d69bfSAxel Dörfler 	status_t	(*error_reply)(net_protocol *self, net_buffer *causedError,
61*c22d69bfSAxel Dörfler 					uint32 code, void *errorData);
62*c22d69bfSAxel Dörfler };
63*c22d69bfSAxel Dörfler 
64*c22d69bfSAxel Dörfler #endif	// NET_PROTOCOL_H
65