1c22d69bfSAxel Dörfler /* 26f58064fSAxel 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 256f58064fSAxel Dörfler // net_protocol_module_info::flags field 266f58064fSAxel Dörfler #define NET_PROTOCOL_ATOMIC_MESSAGES 0x01 276f58064fSAxel Dörfler 28c22d69bfSAxel Dörfler struct net_protocol_module_info { 29c22d69bfSAxel Dörfler module_info info; 306f58064fSAxel 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); 71*97cdbb54SIngo Weinhold 72*97cdbb54SIngo Weinhold status_t (*attach_ancillary_data)(net_protocol *self, net_buffer *buffer, 73*97cdbb54SIngo Weinhold const cmsghdr *header); 74*97cdbb54SIngo Weinhold ssize_t (*process_ancillary_data)(net_protocol *self, 75*97cdbb54SIngo Weinhold const ancillary_data_header *header, const void *data, 76*97cdbb54SIngo Weinhold void *buffer, size_t bufferSize); 77c22d69bfSAxel Dörfler }; 78c22d69bfSAxel Dörfler 79c22d69bfSAxel Dörfler #endif // NET_PROTOCOL_H 80