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