Changes in / [58b833c:1b11576d] in mainline
- Location:
- uspace
- Files:
-
- 1 added
- 3 deleted
- 24 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/include/net/icmp_codes.h
r58b833c r1b11576d 42 42 #define LIBC_ICMP_CODES_H_ 43 43 44 #include <sys/types.h> 45 44 46 /** ICMP type type definition. */ 45 47 typedef uint8_t icmp_type_t; -
uspace/lib/net/Makefile
r58b833c r1b11576d 38 38 generic/packet_client.c \ 39 39 generic/packet_remote.c \ 40 generic/socket_core.c \41 40 adt/module_map.c \ 42 41 netif/netif_local.c \ … … 48 47 tl/icmp_remote.c \ 49 48 tl/icmp_client.c \ 49 tl/socket_core.c \ 50 50 tl/tl_common.c 51 51 -
uspace/lib/net/il/ip_remote.c
r58b833c r1b11576d 27 27 */ 28 28 29 /** @addtogroup ip29 /** @addtogroup libnet 30 30 * @{ 31 31 */ … … 72 72 } 73 73 74 /** Creates bidirectional connection with the ip module service and registers 75 * the message receiver. 76 * 77 * @param[in] service The IP module service. 78 * @param[in] protocol The transport layer protocol. 79 * @param[in] me The requesting module service. 80 * @param[in] receiver The message receiver. Used for remote connection. 81 * @returns The phone of the needed service. 82 * @returns EOK on success. 83 * @returns Other error codes as defined for the bind_service() 84 * function. 85 */ 74 86 int ip_bind_service(services_t service, int protocol, services_t me, 75 87 async_client_conn_t receiver) … … 79 91 } 80 92 93 /** Connects to the IP module. 94 * 95 * @param service The IP module service. Ignored parameter. 96 * @returns The IP module phone on success. 97 */ 81 98 int ip_connect_module(services_t service) 82 99 { … … 110 127 } 111 128 112 /** Return the device identifier and the IP pseudo header based on the destination address. 129 /** Return the device identifier and the IP pseudo header based on the 130 * destination address. 113 131 * 114 132 * @param[in] ip_phone The IP module phone used for (semi)remote calls. … … 137 155 (ipcarg_t) protocol, &answer); 138 156 139 if ((async_data_write_start(ip_phone, destination, addrlen) == EOK) 140 && (async_data_read_start(ip_phone, headerlen, sizeof(*headerlen)) == EOK)141 && (*headerlen > 0)) {157 if ((async_data_write_start(ip_phone, destination, addrlen) == EOK) && 158 (async_data_read_start(ip_phone, headerlen, 159 sizeof(*headerlen)) == EOK) && (*headerlen > 0)) { 142 160 *header = malloc(*headerlen); 143 161 if (*header) { 144 if (async_data_read_start(ip_phone, *header, *headerlen) != EOK) 162 if (async_data_read_start(ip_phone, *header, 163 *headerlen) != EOK) 145 164 free(*header); 146 165 } … … 173 192 packet_dimension_ref packet_dimension) 174 193 { 175 return generic_packet_size_req_remote(ip_phone, NET_IL_PACKET_SPACE, device_id,176 packet_dimension);194 return generic_packet_size_req_remote(ip_phone, NET_IL_PACKET_SPACE, 195 device_id, packet_dimension); 177 196 } 178 197 -
uspace/lib/net/include/icmp_client.h
r58b833c r1b11576d 27 27 */ 28 28 29 /** @addtogroup icmp30 * 29 /** @addtogroup libnet 30 * @{ 31 31 */ 32 32 33 33 /** @file 34 * 34 * ICMP client interface. 35 35 */ 36 36 37 #ifndef __NET_ICMP_CLIENT_H__38 #define __NET_ICMP_CLIENT_H__37 #ifndef LIBNET_ICMP_CLIENT_H_ 38 #define LIBNET_ICMP_CLIENT_H_ 39 39 40 40 #include <net/icmp_codes.h> 41 41 #include <net/packet.h> 42 42 43 /** Processes the received packet prefixed with an ICMP header. 44 * @param[in] packet The received packet. 45 * @param[out] type The ICMP header type. 46 * @param[out] code The ICMP header code. 47 * @param[out] pointer The ICMP header pointer. 48 * @param[out] mtu The ICMP header MTU. 49 * @returns The ICMP header length. 50 * @returns Zero (0) if the packet contains no data. 51 */ 52 extern int icmp_client_process_packet(packet_t packet, icmp_type_t * type, icmp_code_t * code, icmp_param_t * pointer, icmp_param_t * mtu); 53 54 /** Returns the ICMP header length. 55 * @param[in] packet The packet. 56 * @returns The ICMP header length in bytes. 57 */ 58 extern size_t icmp_client_header_length(packet_t packet); 43 extern int icmp_client_process_packet(packet_t, icmp_type_t *, icmp_code_t *, 44 icmp_param_t *, icmp_param_t *); 45 extern size_t icmp_client_header_length(packet_t); 59 46 60 47 #endif -
uspace/lib/net/include/il_local.h
r58b833c r1b11576d 27 27 */ 28 28 29 /** @addtogroup il_local30 * 29 /** @addtogroup libnet 30 * @{ 31 31 */ 32 32 33 #ifndef __IL_LOCAL_H__34 #define __IL_LOCAL_H__33 #ifndef LIBNET_IL_LOCAL_H_ 34 #define LIBNET_IL_LOCAL_H_ 35 35 36 36 #include <ipc/ipc.h> 37 37 #include <async.h> 38 38 39 /** Processes the Internet layer module message. 40 * 41 * @param[in] callid The message identifier. 42 * @param[in] call The message parameters. 43 * @param[out] answer The message answer parameters. 44 * @param[out] answer_count The last parameter for the actual answer in 45 * the answer parameter. 46 * @returns EOK on success. 47 * @returns Other error codes as defined for the arp_message() 48 * function. 49 */ 39 50 extern int il_module_message_standalone(ipc_callid_t callid, ipc_call_t *call, 40 51 ipc_call_t *answer, int *answer_count); 52 53 /** Starts the Internet layer module. 54 * 55 * Initializes the client connection servicing function, initializes the module, 56 * registers the module service and starts the async manager, processing IPC 57 * messages in an infinite loop. 58 * 59 * @param[in] client_connection The client connection processing function. The 60 * module skeleton propagates its own one. 61 * @returns EOK on successful module termination. 62 * @returns Other error codes as defined for the arp_initialize() 63 * function. 64 * @returns Other error codes as defined for the REGISTER_ME() macro 65 * function. 66 */ 41 67 extern int il_module_start_standalone(async_client_conn_t client_connection); 42 68 -
uspace/lib/net/include/ip_header.h
r58b833c r1b11576d 27 27 */ 28 28 29 /** @addtogroup ip30 * 29 /** @addtogroup libnet 30 * @{ 31 31 */ 32 32 33 33 /** @file 34 * 35 * Based on the RFC~791.36 */ 37 38 #ifndef __NET_IP_HEADER_H__39 #define __NET_IP_HEADER_H__34 * IP header and options definitions. 35 * Based on the RFC 791. 36 */ 37 38 #ifndef LIBNET_IP_HEADER_H_ 39 #define LIBNET_IP_HEADER_H_ 40 40 41 41 #include <byteorder.h> … … 43 43 44 44 /** Returns the fragment offest high bits. 45 * @param[in] length The prefixed data total length. 46 */ 47 #define IP_COMPUTE_FRAGMENT_OFFSET_HIGH(length) ((((length) / 8u) &0x1F00) >> 8) 45 * @param[in] length The prefixed data total length. 46 */ 47 #define IP_COMPUTE_FRAGMENT_OFFSET_HIGH(length) \ 48 ((((length) / 8U) & 0x1f00) >> 8) 48 49 49 50 /** Returns the fragment offest low bits. 50 * @param[in] length The prefixed data total length. 51 */ 52 #define IP_COMPUTE_FRAGMENT_OFFSET_LOW(length) (((length) / 8u) &0xFF) 51 * @param[in] length The prefixed data total length. 52 */ 53 #define IP_COMPUTE_FRAGMENT_OFFSET_LOW(length) \ 54 (((length) / 8U) & 0xff) 53 55 54 56 /** Returns the IP header length. 55 * @param[in] length The IP header length in bytes. 56 */ 57 #define IP_COMPUTE_HEADER_LENGTH(length) ((uint8_t) ((length) / 4u)) 57 * @param[in] length The IP header length in bytes. 58 */ 59 #define IP_COMPUTE_HEADER_LENGTH(length) \ 60 ((uint8_t) ((length) / 4U)) 58 61 59 62 /** Returns the fragment offest. 60 * @param[in] header The IP packet header. 61 */ 62 #define IP_FRAGMENT_OFFSET(header) ((((header)->fragment_offset_high << 8) + (header)->fragment_offset_low) * 8u) 63 * @param[in] header The IP packet header. 64 */ 65 #define IP_FRAGMENT_OFFSET(header) \ 66 ((((header)->fragment_offset_high << 8) + \ 67 (header)->fragment_offset_low) * 8U) 63 68 64 69 /** Returns the IP packet header checksum. 65 70 * @param[in] header The IP packet header. 66 71 */ 67 #define IP_HEADER_CHECKSUM(header) (htons(ip_checksum((uint8_t *)(header), IP_HEADER_LENGTH(header)))) 72 #define IP_HEADER_CHECKSUM(header) \ 73 (htons(ip_checksum((uint8_t *) (header), IP_HEADER_LENGTH(header)))) 68 74 69 75 /** Returns the actual IP packet data length. 70 * @param[in] header The IP packet header. 71 */ 72 #define IP_HEADER_DATA_LENGTH(header) (IP_TOTAL_LENGTH(header) - IP_HEADER_LENGTH(header)) 76 * @param[in] header The IP packet header. 77 */ 78 #define IP_HEADER_DATA_LENGTH(header) \ 79 (IP_TOTAL_LENGTH(header) - IP_HEADER_LENGTH(header)) 73 80 74 81 /** Returns the actual IP header length in bytes. 75 * @param[in] header The IP packet header. 76 */ 77 #define IP_HEADER_LENGTH(header) ((header)->header_length * 4u) 82 * @param[in] header The IP packet header. 83 */ 84 #define IP_HEADER_LENGTH(header) \ 85 ((header)->header_length * 4U) 78 86 79 87 /** Returns the actual IP packet total length. 80 * 81 */ 82 #define IP_TOTAL_LENGTH(header) ntohs((header)->total_length)83 84 /** @name IP flags definitions 85 */88 * @param[in] header The IP packet header. 89 */ 90 #define IP_TOTAL_LENGTH(header) \ 91 ntohs((header)->total_length) 92 93 /** @name IP flags definitions */ 86 94 /*@{*/ 87 95 88 /** Fragment flag field shift. 89 */ 90 #define IPFLAG_FRAGMENT_SHIFT 1 91 92 /** Fragmented flag field shift. 93 */ 94 #define IPFLAG_FRAGMENTED_SHIFT 0 96 /** Fragment flag field shift. */ 97 #define IPFLAG_FRAGMENT_SHIFT 1 98 99 /** Fragmented flag field shift. */ 100 #define IPFLAG_FRAGMENTED_SHIFT 0 95 101 96 102 /** Don't fragment flag value. 97 * 98 */ 99 #define IPFLAG_DONT_FRAGMENT 103 * Permits the packet fragmentation. 104 */ 105 #define IPFLAG_DONT_FRAGMENT (0x1 << IPFLAG_FRAGMENT_SHIFT) 100 106 101 107 /** Last fragment flag value. 102 * 103 */ 104 #define IPFLAG_LAST_FRAGMENT 108 * Indicates the last packet fragment. 109 */ 110 #define IPFLAG_LAST_FRAGMENT (0x0 << IPFLAG_FRAGMENTED_SHIFT) 105 111 106 112 /** May fragment flag value. 107 * 108 */ 109 #define IPFLAG_MAY_FRAGMENT 113 * Allows the packet fragmentation. 114 */ 115 #define IPFLAG_MAY_FRAGMENT (0x0 << IPFLAG_FRAGMENT_SHIFT) 110 116 111 117 /** More fragments flag value. 112 * 113 */ 114 #define IPFLAG_MORE_FRAGMENTS 118 * Indicates that more packet fragments follow. 119 */ 120 #define IPFLAG_MORE_FRAGMENTS (0x1 << IPFLAG_FRAGMENTED_SHIFT) 115 121 116 122 /*@}*/ 117 123 118 124 /** Type definition of the internet header. 119 * 120 */ 121 typedef struct ip_header 125 * @see ip_header 126 */ 127 typedef struct ip_header ip_header_t; 122 128 123 129 /** Type definition of the internet header pointer. 124 * 125 */ 126 typedef ip_header_t * 130 * @see ip_header 131 */ 132 typedef ip_header_t *ip_header_ref; 127 133 128 134 /** Type definition of the internet option header. 129 * 130 */ 131 typedef struct ip_option 135 * @see ip_header 136 */ 137 typedef struct ip_option ip_option_t; 132 138 133 139 /** Type definition of the internet option header pointer. 134 * 135 */ 136 typedef ip_option_t * 140 * @see ip_header 141 */ 142 typedef ip_option_t *ip_option_ref; 137 143 138 144 /** Type definition of the internet version 4 pseudo header. 139 * 140 */ 141 typedef struct ipv4_pseudo_header 145 * @see ipv4_pseudo_header 146 */ 147 typedef struct ipv4_pseudo_header ipv4_pseudo_header_t; 142 148 143 149 /** Type definition of the internet version 4 pseudo header pointer. 144 * 145 */ 146 typedef ipv4_pseudo_header_t * 150 * @see ipv4_pseudo_header 151 */ 152 typedef ipv4_pseudo_header_t *ipv4_pseudo_header_ref; 147 153 148 154 /** Internet header. 149 * The variable options should be included after the header itself and indicated by the increased header length value. 150 */ 151 struct ip_header{ 155 * 156 * The variable options should be included after the header itself and 157 * indicated by the increased header length value. 158 */ 159 struct ip_header { 152 160 #ifdef ARCH_IS_BIG_ENDIAN 153 /** The Version field indicates the format of the internet header. 154 */ 155 uint8_t version:4; 156 /** Internet Header Length is the length of the internet header in 32~bit words, and thus points to the beginning of the data. 157 * Note that the minimum value for a~correct header is~5. 158 */ 159 uint8_t header_length:4; 161 uint8_t version : 4; 162 uint8_t header_length : 4; 160 163 #else 161 /** Internet Header Length is the length of the internet header in 32~bit words, and thus points to the beginning of the data. 162 * Note that the minimum value for a~correct header is~5. 163 */ 164 uint8_t header_length:4; 165 /** The Version field indicates the format of the internet header. 166 */ 167 uint8_t version:4; 168 #endif 169 /** The Type of Service provides an indication of the abstract parameters of the quality of service desired. 170 * These parameters are to be used to guide the selection of the actual service parameters when transmitting a~datagram through a~particular network. 171 * Several networks offer service precedence, which somehow treats high precedence traffic as more important than other traffic (generally by accepting only traffic above a~certain precedence at time of high load). 172 * The major choice is a~three way tradeoff between low-delay, high-reliability, and high-throughput. 173 */ 164 uint8_t header_length : 4; 165 uint8_t version : 4; 166 #endif 167 174 168 uint8_t tos; 175 /** Total Length is the length of the datagram, measured in octets, including internet header and data.176 * This field allows the length of a~datagram to be up to 65,535~octets.177 */178 169 uint16_t total_length; 179 /** An identifying value assigned by the sender to aid in assembling the fragments of a~datagram.180 */181 170 uint16_t identification; 171 182 172 #ifdef ARCH_IS_BIG_ENDIAN 183 /** Various control flags. 184 */ 185 uint8_t flags:3; 186 /** This field indicates where in the datagram this fragment belongs. 187 * High bits. 188 */ 189 uint8_t fragment_offset_high:5; 173 uint8_t flags : 3; 174 uint8_t fragment_offset_high : 5; 190 175 #else 191 /** This field indicates where in the datagram this fragment belongs. 192 * High bits. 193 */ 194 uint8_t fragment_offset_high:5; 195 /** Various control flags. 196 */ 197 uint8_t flags:3; 198 #endif 199 /** This field indicates where in the datagram this fragment belongs. 200 * Low bits. 201 */ 176 uint8_t fragment_offset_high : 5; 177 uint8_t flags : 3; 178 #endif 179 202 180 uint8_t fragment_offset_low; 203 /** This field indicates the maximum time the datagram is allowed to remain in the internet system.204 * If this field contains the value zero, then the datagram must be destroyed.205 * This field is modified in internet header processing.206 * The time is measured in units of seconds, but since every module that processes a~datagram must decrease the TTL by at least one even if it process the datagram in less than a~second, the TTL must be thought of only as an upper bound on the time a~datagram may exist.207 * The intention is to cause undeliverable datagrams to be discarded, and to bound the maximum datagram lifetime.208 */209 181 uint8_t ttl; 210 /** This field indicates the next level protocol used in the data portion of the internet datagram.211 */212 182 uint8_t protocol; 213 /** A checksum of the header only.214 * Since some header fields change (e.g., time to live), this is recomputed and verified at each point that the internet header is processed.215 * The checksum algorithm is: The checksum field is the 16~bit one's complement of the one's complement sum of all 16~bit words in the header.216 * For purposes of computing the checksum, the value of the checksum field is zero.217 */218 183 uint16_t header_checksum; 219 /** The source address.220 */221 184 uint32_t source_address; 222 /** The destination address.223 */224 185 uint32_t destination_address; 225 186 } __attribute__ ((packed)); 226 187 227 188 /** Internet option header. 228 * Only type field is always valid. 229 * Other fields' validity depends on the option type. 230 */ 231 struct ip_option{ 232 /** A single octet of option-type. 233 */ 189 * 190 * Only type field is always valid. 191 * Other fields' validity depends on the option type. 192 */ 193 struct ip_option { 234 194 uint8_t type; 235 /** An option length octet.236 */237 195 uint8_t length; 238 /** A~pointer.239 */240 196 uint8_t pointer; 197 241 198 #ifdef ARCH_IS_BIG_ENDIAN 242 /** The number of IP modules that cannot register timestamps due to lack of space. 243 */ 244 uint8_t overflow:4; 245 /** Various internet timestamp control flags. 246 */ 247 uint8_t flags:4; 199 uint8_t overflow : 4; 200 uint8_t flags : 4; 248 201 #else 249 /** Various internet timestamp control flags. 250 */ 251 uint8_t flags:4; 252 /** The number of IP modules that cannot register timestamps due to lack of space. 253 */ 254 uint8_t overflow:4; 202 uint8_t flags : 4; 203 uint8_t overflow : 4; 255 204 #endif 256 205 } __attribute__ ((packed)); 257 206 258 /** Internet version 4 pseudo header. 259 */ 260 struct ipv4_pseudo_header{ 261 /** The source address. 262 */ 207 /** Internet version 4 pseudo header. */ 208 struct ipv4_pseudo_header { 263 209 uint32_t source_address; 264 /** The destination address.265 */266 210 uint32_t destination_address; 267 /** Reserved byte.268 * Must be zero.269 */270 211 uint8_t reserved; 271 /** This field indicates the next level protocol used in the data portion of the internet datagram.272 */273 212 uint8_t protocol; 274 /** Data length is the length of the datagram, measured in octets.275 */276 213 uint16_t data_length; 277 214 } __attribute__ ((packed)); -
uspace/lib/net/include/ip_interface.h
r58b833c r1b11576d 27 27 */ 28 28 29 /** @addtogroup ip30 * 29 /** @addtogroup libnet 30 * @{ 31 31 */ 32 32 33 #ifndef __NET_IP_INTERFACE_H__34 #define __NET_IP_INTERFACE_H__33 #ifndef LIBNET_IP_INTERFACE_H_ 34 #define LIBNET_IP_INTERFACE_H_ 35 35 36 36 #include <net/socket_codes.h> … … 55 55 56 56 /** @name IP module interface 57 * 57 * This interface is used by other modules. 58 58 */ 59 59 /*@{*/ 60 60 61 61 /** The transport layer notification function type definition. 62 * Notifies the transport layer modules about the received packet/s. 63 * @param[in] device_id The device identifier. 64 * @param[in] packet The received packet or the received packet queue. 65 * @param[in] receiver The receiving module service. 66 * @param[in] error The packet error reporting service. Prefixes the received packet. 67 * @returns EOK on success. 62 * 63 * Notifies the transport layer modules about the received packet/s. 64 * 65 * @param[in] device_id The device identifier. 66 * @param[in] packet The received packet or the received packet queue. 67 * @param[in] receiver The receiving module service. 68 * @param[in] error The packet error reporting service. Prefixes the 69 * received packet. 70 * @returns EOK on success. 68 71 */ 69 typedef int (*tl_received_msg_t)(device_id_t device_id, packet_t packet, services_t receiver, services_t error); 72 typedef int (*tl_received_msg_t)(device_id_t device_id, packet_t packet, 73 services_t receiver, services_t error); 70 74 71 /** Creates bidirectional connection with the ip module service and registers the message receiver. 72 * @param[in] service The IP module service. 73 * @param[in] protocol The transport layer protocol. 74 * @param[in] me The requesting module service. 75 * @param[in] receiver The message receiver. Used for remote connection. 76 * @returns The phone of the needed service. 77 * @returns EOK on success. 78 * @returns Other error codes as defined for the bind_service() function. 79 */ 80 extern int ip_bind_service(services_t service, int protocol, services_t me, async_client_conn_t receiver); 81 82 /** Connects to the IP module. 83 * @param service The IP module service. Ignored parameter. 84 * @returns The IP module phone on success. 85 */ 86 extern int ip_connect_module(services_t service); 75 extern int ip_bind_service(services_t, int, services_t, async_client_conn_t); 76 extern int ip_connect_module(services_t); 87 77 88 78 /*@}*/ -
uspace/lib/net/include/ip_remote.h
r58b833c r1b11576d 27 27 */ 28 28 29 /** @addtogroup ip29 /** @addtogroup libnet 30 30 * @{ 31 31 */ 32 32 33 #ifndef __NET_IP_REMOTE_H__34 #define __NET_IP_REMOTE_H__33 #ifndef LIBNET_IP_REMOTE_H_ 34 #define LIBNET_IP_REMOTE_H_ 35 35 36 36 #include <ipc/services.h> -
uspace/lib/net/include/netif_interface.h
r58b833c r1b11576d 27 27 */ 28 28 29 /** @addtogroup netif29 /** @addtogroup libnet 30 30 * @{ 31 31 */ 32 32 33 #ifndef __NET_NETIF_INTERFACE_H__34 #define __NET_NETIF_INTERFACE_H__33 #ifndef LIBNET_NETIF_INTERFACE_H_ 34 #define LIBNET_NETIF_INTERFACE_H_ 35 35 36 36 #include <netif_remote.h> -
uspace/lib/net/include/netif_local.h
r58b833c r1b11576d 27 27 */ 28 28 29 /** @addtogroup netif29 /** @addtogroup libnet 30 30 * @{ 31 31 */ … … 36 36 */ 37 37 38 #ifndef __NET_NETIF_LOCAL_H__39 #define __NET_NETIF_LOCAL_H__38 #ifndef NET_NETIF_LOCAL_H_ 39 #define NET_NETIF_LOCAL_H_ 40 40 41 41 #include <async.h> … … 43 43 #include <ipc/ipc.h> 44 44 #include <ipc/services.h> 45 #include <err.h>46 45 47 46 #include <adt/measured_strings.h> … … 49 48 #include <net/packet.h> 50 49 51 /** Network interface device specific data. 52 * 53 */ 50 /** Network interface device specific data. */ 54 51 typedef struct { 55 52 device_id_t device_id; /**< Device identifier. */ … … 67 64 DEVICE_MAP_DECLARE(netif_device_map, netif_device_t); 68 65 69 /** Network interface module skeleton global data. 70 * 71 */ 66 /** Network interface module skeleton global data. */ 72 67 typedef struct { 73 68 int net_phone; /**< Networking module phone. */ … … 81 76 * 82 77 * This function has to be implemented in user code. 83 *84 78 */ 85 79 extern int netif_initialize(void); … … 89 83 * This has to be implemented in user code. 90 84 * 91 * @param[in] device_id 92 * @param[in] irq 93 * @param[in] io 94 * 95 * @return 96 * @return Other error codes as defined for the find_device() function.97 * @return Other error codes as defined for the specific module message98 * implementation.99 * 85 * @param[in] device_id The device identifier. 86 * @param[in] irq The device interrupt number. 87 * @param[in] io The device input/output address. 88 * 89 * @return EOK on success. 90 * @return Other error codes as defined for the find_device() 91 * function. 92 * @return Other error codes as defined for the specific module 93 * message implementation. 100 94 */ 101 95 extern int netif_probe_message(device_id_t device_id, int irq, uintptr_t io); … … 105 99 * This has to be implemented in user code. 106 100 * 107 * @param[in] device_id The device identifier. 108 * @param[in] packet The packet queue. 109 * @param[in] sender The sending module service. 110 * 111 * @return EOK on success. 112 * @return EFORWARD if the device is not active (in the NETIF_ACTIVE state). 113 * @return Other error codes as defined for the find_device() function. 114 * @return Other error codes as defined for the specific module message 115 * implementation. 116 * 101 * @param[in] device_id The device identifier. 102 * @param[in] packet The packet queue. 103 * @param[in] sender The sending module service. 104 * 105 * @return EOK on success. 106 * @return EFORWARD if the device is not active (in the 107 * NETIF_ACTIVE state). 108 * @return Other error codes as defined for the find_device() 109 * function. 110 * @return Other error codes as defined for the specific module 111 * message implementation. 117 112 */ 118 113 extern int netif_send_message(device_id_t device_id, packet_t packet, … … 123 118 * This has to be implemented in user code. 124 119 * 125 * @param[in] device 126 * 127 * @return 128 * @return Other error codes as defined for the find_device() function.129 * @return Other error codes as defined for the specific module message130 * implementation.131 * 120 * @param[in] device The device structure. 121 * 122 * @return EOK on success. 123 * @return Other error codes as defined for the find_device() 124 * function. 125 * @return Other error codes as defined for the specific module 126 * message implementation. 132 127 */ 133 128 extern int netif_start_message(netif_device_t *device); … … 137 132 * This has to be implemented in user code. 138 133 * 139 * @param[in] device 140 * 141 * @return 142 * @return Other error codes as defined for the find_device() function.143 * @return Other error codes as defined for the specific module message144 * implementation.145 * 134 * @param[in] device The device structure. 135 * 136 * @return EOK on success. 137 * @return Other error codes as defined for the find_device() 138 * function. 139 * @return Other error codes as defined for the specific module 140 * message implementation. 146 141 */ 147 142 extern int netif_stop_message(netif_device_t *device); … … 151 146 * This has to be implemented in user code. 152 147 * 153 * @param[in] device_idThe device identifier.154 * @param[out] address 155 * 156 * @return 157 * @return 158 * @return 159 * @return Other error codes as defined for the find_device() function.160 * @return Other error codes as defined for the specific module message161 * implementation.162 * 148 * @param[in] device_id The device identifier. 149 * @param[out] address The device local hardware address. 150 * 151 * @return EOK on success. 152 * @return EBADMEM if the address parameter is NULL. 153 * @return ENOENT if there no such device. 154 * @return Other error codes as defined for the find_device() 155 * function. 156 * @return Other error codes as defined for the specific module 157 * message implementation. 163 158 */ 164 159 extern int netif_get_addr_message(device_id_t device_id, … … 170 165 * skeleton. This has to be implemented in user code. 171 166 * 172 * @param[in] callidThe message identifier.173 * @param[in] callThe message parameters.174 * @param[out] answer 167 * @param[in] callid The message identifier. 168 * @param[in] call The message parameters. 169 * @param[out] answer The message answer parameters. 175 170 * @param[out] answer_count The last parameter for the actual answer in 176 * the answer parameter. 177 * 178 * @return EOK on success. 179 * @return ENOTSUP if the message is not known. 180 * @return Other error codes as defined for the specific module message 181 * implementation. 182 * 171 * the answer parameter. 172 * 173 * @return EOK on success. 174 * @return ENOTSUP if the message is not known. 175 * @return Other error codes as defined for the specific module 176 * message implementation. 183 177 */ 184 178 extern int netif_specific_message(ipc_callid_t callid, ipc_call_t *call, … … 189 183 * This has to be implemented in user code. 190 184 * 191 * @param[in] device_idThe device identifier.192 * @param[out] stats 193 * 194 * @return 195 * @return Other error codes as defined for the find_device() function.196 * @return Other error codes as defined for the specific module message197 * implementation.198 * 185 * @param[in] device_id The device identifier. 186 * @param[out] stats The device usage statistics. 187 * 188 * @return EOK on success. 189 * @return Other error codes as defined for the find_device() 190 * function. 191 * @return Other error codes as defined for the specific module 192 * message implementation. 199 193 */ 200 194 extern int netif_get_device_stats(device_id_t device_id, -
uspace/lib/net/include/netif_remote.h
r58b833c r1b11576d 27 27 */ 28 28 29 /** @addtogroup netif29 /** @addtogroup libnet 30 30 * @{ 31 31 */ 32 32 33 #ifndef __NET_NETIF_REMOTE_H__34 #define __NET_NETIF_REMOTE_H__33 #ifndef LIBNET_NETIF_REMOTE_H_ 34 #define LIBNET_NETIF_REMOTE_H_ 35 35 36 #include <async.h> 36 37 #include <ipc/services.h> 37 38 #include <adt/measured_strings.h> 39 38 40 #include <net/device.h> 41 #include <net/packet.h> 39 42 40 43 extern int netif_get_addr_req_remote(int, device_id_t, measured_string_ref *, -
uspace/lib/net/include/nil_interface.h
r58b833c r1b11576d 27 27 */ 28 28 29 /** @addtogroup net_nil30 * 29 /** @addtogroup libnet 30 * @{ 31 31 */ 32 32 33 #ifndef __NET_NIL_INTERFACE_H__34 #define __NET_NIL_INTERFACE_H__33 #ifndef LIBNET_NIL_INTERFACE_H_ 34 #define LIBNET_NIL_INTERFACE_H_ 35 35 36 36 #include <async.h> … … 47 47 48 48 #define nil_packet_size_req(nil_phone, device_id, packet_dimension) \ 49 generic_packet_size_req_remote(nil_phone, NET_NIL_PACKET_SPACE, device_id,\50 packet_dimension)49 generic_packet_size_req_remote(nil_phone, NET_NIL_PACKET_SPACE, \ 50 device_id, packet_dimension) 51 51 52 52 #define nil_get_addr_req(nil_phone, device_id, address, data) \ -
uspace/lib/net/include/nil_local.h
r58b833c r1b11576d 27 27 */ 28 28 29 /** @addtogroup net_nil30 * 29 /** @addtogroup libnet 30 * @{ 31 31 */ 32 32 … … 36 36 */ 37 37 38 #ifndef __NET_NIL_LOCAL_H__39 #define __NET_NIL_LOCAL_H__38 #ifndef LIBNET_NIL_LOCAL_H_ 39 #define LIBNET_NIL_LOCAL_H_ 40 40 41 41 #include <ipc/ipc.h> … … 45 45 * Is called by the module_start() function. 46 46 * 47 * @param[in] net_phone The networking moduel phone. 48 * 49 * @return EOK on success. 50 * @return Other error codes as defined for each specific module initialize function. 51 * 47 * @param[in] net_phone The networking moduel phone. 48 * @return EOK on success. 49 * @return Other error codes as defined for each specific module 50 * initialize function. 52 51 */ 53 52 extern int nil_initialize(int); 54 53 54 /** Notify the network interface layer about the device state change. 55 * 56 * @param[in] nil_phone The network interface layer phone. 57 * @param[in] device_id The device identifier. 58 * @param[in] state The new device state. 59 * @return EOK on success. 60 * @return Other error codes as defined for each specific module 61 * device state function. 62 */ 55 63 extern int nil_device_state_msg_local(int, device_id_t, int); 64 65 66 /** Pass the packet queue to the network interface layer. 67 * 68 * Process and redistribute the received packet queue to the registered 69 * upper layers. 70 * 71 * @param[in] nil_phone The network interface layer phone. 72 * @param[in] device_id The source device identifier. 73 * @param[in] packet The received packet or the received packet queue. 74 * @param target The target service. Ignored parameter. 75 * @return EOK on success. 76 * @return Other error codes as defined for each specific module 77 * received function. 78 */ 56 79 extern int nil_received_msg_local(int, device_id_t, packet_t, services_t); 57 80 58 81 /** Message processing function. 59 82 * 60 * @param[in] name Module name. 61 * @param[in] callid The message identifier. 62 * @param[in] call The message parameters. 63 * @param[out] answer The message answer parameters. 64 * @param[out] answer_count The last parameter for the actual answer 65 * in the answer parameter. 66 * 67 * @return EOK on success. 68 * @return ENOTSUP if the message is not known. 69 * @return Other error codes as defined for each specific 70 * module message function. 83 * @param[in] name Module name. 84 * @param[in] callid The message identifier. 85 * @param[in] call The message parameters. 86 * @param[out] answer The message answer parameters. 87 * @param[out] answer_count The last parameter for the actual answer in the 88 * answer parameter. 89 * @return EOK on success. 90 * @return ENOTSUP if the message is not known. 91 * @return Other error codes as defined for each specific module 92 * message function. 71 93 * 72 94 * @see nil_interface.h 73 95 * @see IS_NET_NIL_MESSAGE() 96 */ 97 extern int nil_message_standalone(const char *, ipc_callid_t, ipc_call_t *, 98 ipc_call_t *, int *); 99 100 /** Pass the parameters to the module specific nil_message() function. 74 101 * 102 * @param[in] name Module name. 103 * @param[in] callid The message identifier. 104 * @param[in] call The message parameters. 105 * @param[out] answer The message answer parameters. 106 * @param[out] answer_count The last parameter for the actual answer in the 107 * answer parameter. 108 * @return EOK on success. 109 * @return ENOTSUP if the message is not known. 110 * @return Other error codes as defined for each specific module 111 * message function. 75 112 */ 76 extern int nil_message_standalone(const char *, ipc_callid_t, ipc_call_t *, ipc_call_t *,77 int *);78 79 113 extern int nil_module_message_standalone(const char *, ipc_callid_t, 80 114 ipc_call_t *, ipc_call_t *, int *); 115 116 /** Start the standalone nil layer module. 117 * 118 * Initialize the client connection serving function, initialize 119 * the module, register the module service and start the async 120 * manager, processing IPC messages in an infinite loop. 121 * 122 * @param[in] client_connection The client connection processing function. 123 * The module skeleton propagates its own one. 124 * @return EOK on success. 125 * @return Other error codes as defined for the pm_init() function. 126 * @return Other error codes as defined for the nil_initialize() 127 * function. 128 * @return Other error codes as defined for the REGISTER_ME() macro 129 * function. 130 */ 81 131 extern int nil_module_start_standalone(async_client_conn_t); 82 132 -
uspace/lib/net/include/tl_common.h
r58b833c r1b11576d 27 27 */ 28 28 29 /** @addtogroup net_tl30 * 29 /** @addtogroup libnet 30 * @{ 31 31 */ 32 32 33 33 /** @file 34 * 34 * Transport layer common functions. 35 35 */ 36 36 37 #ifndef __NET_TL_COMMON_H__ 38 #define __NET_TL_COMMON_H__ 37 #ifndef LIBNET_TL_COMMON_H_ 38 #define LIBNET_TL_COMMON_H_ 39 40 #include <ipc/services.h> 39 41 40 42 #include <net/socket_codes.h> … … 44 46 45 47 /** Device packet dimensions. 46 * 47 * 48 * Maps devices to the packet dimensions. 49 * @see device.h 48 50 */ 49 51 DEVICE_MAP_DECLARE(packet_dimensions, packet_dimension_t); … … 51 53 extern int tl_get_ip_packet_dimension(int, packet_dimensions_ref, 52 54 device_id_t, packet_dimension_ref *); 53 54 /** Gets the address port. 55 * Supports AF_INET and AF_INET6 address families. 56 * @param[in,out] addr The address to be updated. 57 * @param[in] addrlen The address length. 58 * @param[out] port The set port. 59 * @returns EOK on success. 60 * @returns EINVAL if the address length does not match the address family. 61 * @returns EAFNOSUPPORT if the address family is not supported. 62 */ 63 extern int tl_get_address_port(const struct sockaddr * addr, int addrlen, uint16_t * port); 64 65 /** Updates IP device packet dimensions cache. 66 * @param[in,out] packet_dimensions The packet dimensions cache. 67 * @param[in] device_id The device identifier. 68 * @param[in] content The new maximum content size. 69 * @returns EOK on success. 70 * @returns ENOENT if the packet dimension is not cached. 71 */ 72 extern int tl_update_ip_packet_dimension(packet_dimensions_ref packet_dimensions, device_id_t device_id, size_t content); 73 74 /** Sets the address port. 75 * Supports AF_INET and AF_INET6 address families. 76 * @param[in,out] addr The address to be updated. 77 * @param[in] addrlen The address length. 78 * @param[in] port The port to be set. 79 * @returns EOK on success. 80 * @returns EINVAL if the address length does not match the address family. 81 * @returns EAFNOSUPPORT if the address family is not supported. 82 */ 83 extern int tl_set_address_port(struct sockaddr * addr, int addrlen, uint16_t port); 84 85 /** Prepares the packet for ICMP error notification. 86 * Keeps the first packet and releases all the others. 87 * Releases all the packets on error. 88 * @param[in] packet_phone The packet server module phone. 89 * @param[in] icmp_phone The ICMP module phone. 90 * @param[in] packet The packet to be send. 91 * @param[in] error The packet error reporting service. Prefixes the received packet. 92 * @returns EOK on success. 93 * @returns ENOENT if no packet may be sent. 94 */ 95 extern int tl_prepare_icmp_packet(int packet_phone, int icmp_phone, packet_t packet, services_t error); 96 97 /** Receives data from the socket into a packet. 98 * @param[in] packet_phone The packet server module phone. 99 * @param[out] packet The new created packet. 100 * @param[in] prefix Reserved packet data prefix length. 101 * @param[in] dimension The packet dimension. 102 * @param[in] addr The destination address. 103 * @param[in] addrlen The address length. 104 * @returns Number of bytes received. 105 * @returns EINVAL if the client does not send data. 106 * @returns ENOMEM if there is not enough memory left. 107 * @returns Other error codes as defined for the async_data_read_finalize() function. 108 */ 109 extern int tl_socket_read_packet_data(int packet_phone, packet_ref packet, size_t prefix, const packet_dimension_ref dimension, const struct sockaddr * addr, socklen_t addrlen); 55 extern int tl_get_address_port(const struct sockaddr *, int, uint16_t *); 56 extern int tl_update_ip_packet_dimension(packet_dimensions_ref, device_id_t, 57 size_t); 58 extern int tl_set_address_port(struct sockaddr *, int, uint16_t); 59 extern int tl_prepare_icmp_packet(int, int, packet_t, services_t); 60 extern int tl_socket_read_packet_data(int, packet_ref, size_t, 61 const packet_dimension_ref, const struct sockaddr *, socklen_t); 110 62 111 63 #endif -
uspace/lib/net/netif/netif_local.c
r58b833c r1b11576d 27 27 */ 28 28 29 /** @addtogroup netif29 /** @addtogroup libnet 30 30 * @{ 31 31 */ … … 58 58 DEVICE_MAP_IMPLEMENT(netif_device_map, netif_device_t); 59 59 60 /** Network interface global data. 61 */ 60 /** Network interface global data. */ 62 61 netif_globals_t netif_globals; 63 62 … … 65 64 * 66 65 * @param[in] netif_phone The network interface phone. 67 * @param[in] device_id 68 * @param[in] irq 69 * @param[in] io 70 * 71 * @return EOK on success.72 * @return Other errro codes as defined for thenetif_probe_message().73 * 74 */ 75 intnetif_probe_req_local(int netif_phone, device_id_t device_id, int irq, int io)66 * @param[in] device_id The device identifier. 67 * @param[in] irq The device interrupt number. 68 * @param[in] io The device input/output address. 69 * @return EOK on success. 70 * @return Other error codes as defined for the 71 * netif_probe_message(). 72 */ 73 int 74 netif_probe_req_local(int netif_phone, device_id_t device_id, int irq, int io) 76 75 { 77 76 fibril_rwlock_write_lock(&netif_globals.lock); … … 85 84 * 86 85 * @param[in] netif_phone The network interface phone. 87 * @param[in] device_id The device identifier. 88 * @param[in] packet The packet queue. 89 * @param[in] sender The sending module service. 90 * 91 * @return EOK on success. 92 * @return Other error codes as defined for the generic_send_msg() function. 93 * 86 * @param[in] device_id The device identifier. 87 * @param[in] packet The packet queue. 88 * @param[in] sender The sending module service. 89 * @return EOK on success. 90 * @return Other error codes as defined for the generic_send_msg() 91 * function. 94 92 */ 95 93 int netif_send_msg_local(int netif_phone, device_id_t device_id, … … 106 104 * 107 105 * @param[in] netif_phone The network interface phone. 108 * @param[in] device_id 109 * 110 * @return EOK on success.111 * @return Other error codes as defined for the find_device()function.112 * @return Other error codes as defined for the netif_start_message() function.113 * 106 * @param[in] device_id The device identifier. 107 * @return EOK on success. 108 * @return Other error codes as defined for the find_device() 109 * function. 110 * @return Other error codes as defined for the 111 * netif_start_message() function. 114 112 */ 115 113 int netif_start_req_local(int netif_phone, device_id_t device_id) … … 141 139 * 142 140 * @param[in] netif_phone The network interface phone. 143 * @param[in] device_id 144 * 145 * @return EOK on success.146 * @return Other error codes as defined for the find_device()function.147 * @return Other error codes as defined for the netif_stop_message() function.148 * 141 * @param[in] device_id The device identifier. 142 * @return EOK on success. 143 * @return Other error codes as defined for the find_device() 144 * function. 145 * @return Other error codes as defined for the 146 * netif_stop_message() function. 149 147 */ 150 148 int netif_stop_req_local(int netif_phone, device_id_t device_id) … … 175 173 /** Return the device usage statistics. 176 174 * 177 * @param[in] netif_phone The network interface phone. 178 * @param[in] device_id The device identifier. 179 * @param[out] stats The device usage statistics. 180 * 175 * @param[in] netif_phone The network interface phone. 176 * @param[in] device_id The device identifier. 177 * @param[out] stats The device usage statistics. 181 178 * @return EOK on success. 182 *183 179 */ 184 180 int netif_stats_req_local(int netif_phone, device_id_t device_id, … … 194 190 /** Return the device local hardware address. 195 191 * 196 * @param[in] netif_phone The network interface phone. 197 * @param[in] device_id The device identifier. 198 * @param[out] address The device local hardware address. 199 * @param[out] data The address data. 200 * 201 * @return EOK on success. 202 * @return EBADMEM if the address parameter is NULL. 203 * @return ENOENT if there no such device. 204 * @return Other error codes as defined for the netif_get_addr_message() 205 * function. 206 * 192 * @param[in] netif_phone The network interface phone. 193 * @param[in] device_id The device identifier. 194 * @param[out] address The device local hardware address. 195 * @param[out] data The address data. 196 * @return EOK on success. 197 * @return EBADMEM if the address parameter is NULL. 198 * @return ENOENT if there no such device. 199 * @return Other error codes as defined for the 200 * netif_get_addr_message() function. 207 201 */ 208 202 int netif_get_addr_req_local(int netif_phone, device_id_t device_id, … … 211 205 ERROR_DECLARE; 212 206 213 if ( (!address) || (!data))207 if (!address || !data) 214 208 return EBADMEM; 215 209 … … 231 225 /** Find the device specific data. 232 226 * 233 * @param[in] device_id The device identifier. 234 * @param[out] device The device specific data. 235 * 236 * @return EOK on success. 237 * @return ENOENT if device is not found. 238 * @return EPERM if the device is not initialized. 239 * 227 * @param[in] device_id The device identifier. 228 * @param[out] device The device specific data. 229 * @return EOK on success. 230 * @return ENOENT if device is not found. 231 * @return EPERM if the device is not initialized. 240 232 */ 241 233 int find_device(device_id_t device_id, netif_device_t **device) … … 256 248 /** Clear the usage statistics. 257 249 * 258 * @param[in] stats The usage statistics. 259 * 250 * @param[in] stats The usage statistics. 260 251 */ 261 252 void null_device_stats(device_stats_ref stats) … … 266 257 /** Initialize the netif module. 267 258 * 268 * @param[in] client_connection The client connection functio to be 269 * registered. 270 * 271 * @return EOK on success. 272 * @return Other error codes as defined for each specific module 273 * message function. 274 * 259 * @param[in] client_connection The client connection functio to be registered. 260 * @return EOK on success. 261 * @return Other error codes as defined for each specific module 262 * message function. 275 263 */ 276 264 int netif_init_module(async_client_conn_t client_connection) … … 298 286 * Prepared for future optimization. 299 287 * 300 * @param[in] packet_id The packet identifier. 301 * 288 * @param[in] packet_id The packet identifier. 302 289 */ 303 290 void netif_pq_release(packet_id_t packet_id) … … 308 295 /** Allocate new packet to handle the given content size. 309 296 * 310 * @param[in] content The minimum content size. 311 * 312 * @return The allocated packet. 313 * @return NULL if there is an error. 297 * @param[in] content The minimum content size. 298 * @return The allocated packet. 299 * @return NULL if there is an error. 314 300 * 315 301 */ … … 319 305 } 320 306 321 /** Register the device notification receiver, the network interface layer module. 322 * 323 * @param[in] name Module name. 324 * @param[in] device_id The device identifier. 325 * @param[in] phone The network interface layer module phone. 326 * 327 * @return EOK on success. 328 * @return ENOENT if there is no such device. 329 * @return ELIMIT if there is another module registered. 330 * 307 /** Register the device notification receiver, the network interface layer 308 * module. 309 * 310 * @param[in] name Module name. 311 * @param[in] device_id The device identifier. 312 * @param[in] phone The network interface layer module phone. 313 * @return EOK on success. 314 * @return ENOENT if there is no such device. 315 * @return ELIMIT if there is another module registered. 331 316 */ 332 317 static int register_message(const char *name, device_id_t device_id, int phone) … … 347 332 /** Process the netif module messages. 348 333 * 349 * @param[in] nameModule name.350 * @param[in] callidThe message identifier.351 * @param[in] callThe message parameters.352 * @param[out] answer 353 * @param[out] answer_count The last parameter for the actual answer 354 * in theanswer parameter.355 * 356 * @return EOK on success.357 * @return ENOTSUP if the message is not known.358 * @return Other error codes as defined for each specific modulemessage function.334 * @param[in] name Module name. 335 * @param[in] callid The message identifier. 336 * @param[in] call The message parameters. 337 * @param[out] answer The message answer parameters. 338 * @param[out] answer_count The last parameter for the actual answer in the 339 * answer parameter. 340 * @return EOK on success. 341 * @return ENOTSUP if the message is not known. 342 * @return Other error codes as defined for each specific module 343 * message function. 359 344 * 360 345 * @see IS_NET_NETIF_MESSAGE() … … 373 358 *answer_count = 0; 374 359 switch (IPC_GET_METHOD(*call)) { 375 case IPC_M_PHONE_HUNGUP: 376 return EOK; 377 case NET_NETIF_PROBE: 378 return netif_probe_req_local(0, IPC_GET_DEVICE(call), 379 NETIF_GET_IRQ(call), NETIF_GET_IO(call)); 380 case IPC_M_CONNECT_TO_ME: 381 fibril_rwlock_write_lock(&netif_globals.lock); 382 ERROR_CODE = register_message(name, IPC_GET_DEVICE(call), 383 IPC_GET_PHONE(call)); 384 fibril_rwlock_write_unlock(&netif_globals.lock); 385 return ERROR_CODE; 386 case NET_NETIF_SEND: 387 ERROR_PROPAGATE(packet_translate_remote(netif_globals.net_phone, 388 &packet, IPC_GET_PACKET(call))); 389 return netif_send_msg_local(0, IPC_GET_DEVICE(call), packet, 390 IPC_GET_SENDER(call)); 391 case NET_NETIF_START: 392 return netif_start_req_local(0, IPC_GET_DEVICE(call)); 393 case NET_NETIF_STATS: 394 fibril_rwlock_read_lock(&netif_globals.lock); 395 if (!ERROR_OCCURRED(async_data_read_receive(&callid, &length))) { 396 if (length < sizeof(device_stats_t)) 397 ERROR_CODE = EOVERFLOW; 398 else { 399 if (!ERROR_OCCURRED(netif_get_device_stats( 400 IPC_GET_DEVICE(call), &stats))) 401 ERROR_CODE = async_data_read_finalize(callid, &stats, 402 sizeof(device_stats_t)); 403 } 404 } 360 case IPC_M_PHONE_HUNGUP: 361 return EOK; 362 363 case NET_NETIF_PROBE: 364 return netif_probe_req_local(0, IPC_GET_DEVICE(call), 365 NETIF_GET_IRQ(call), NETIF_GET_IO(call)); 366 367 case IPC_M_CONNECT_TO_ME: 368 fibril_rwlock_write_lock(&netif_globals.lock); 369 ERROR_CODE = register_message(name, IPC_GET_DEVICE(call), 370 IPC_GET_PHONE(call)); 371 fibril_rwlock_write_unlock(&netif_globals.lock); 372 return ERROR_CODE; 373 374 case NET_NETIF_SEND: 375 ERROR_PROPAGATE(packet_translate_remote(netif_globals.net_phone, 376 &packet, IPC_GET_PACKET(call))); 377 return netif_send_msg_local(0, IPC_GET_DEVICE(call), packet, 378 IPC_GET_SENDER(call)); 379 380 case NET_NETIF_START: 381 return netif_start_req_local(0, IPC_GET_DEVICE(call)); 382 383 case NET_NETIF_STATS: 384 fibril_rwlock_read_lock(&netif_globals.lock); 385 386 if (ERROR_OCCURRED(async_data_read_receive(&callid, &length))) { 405 387 fibril_rwlock_read_unlock(&netif_globals.lock); 406 388 return ERROR_CODE; 407 case NET_NETIF_STOP: 408 return netif_stop_req_local(0, IPC_GET_DEVICE(call)); 409 case NET_NETIF_GET_ADDR: 410 fibril_rwlock_read_lock(&netif_globals.lock); 411 if (!ERROR_OCCURRED(netif_get_addr_message(IPC_GET_DEVICE(call), 412 &address))) 413 ERROR_CODE = measured_strings_reply(&address, 1); 389 } 390 if (length < sizeof(device_stats_t)) { 414 391 fibril_rwlock_read_unlock(&netif_globals.lock); 415 return ERROR_CODE; 392 return EOVERFLOW; 393 } 394 395 if (ERROR_NONE(netif_get_device_stats(IPC_GET_DEVICE(call), 396 &stats))) { 397 ERROR_CODE = async_data_read_finalize(callid, &stats, 398 sizeof(device_stats_t)); 399 } 400 401 fibril_rwlock_read_unlock(&netif_globals.lock); 402 return ERROR_CODE; 403 404 case NET_NETIF_STOP: 405 return netif_stop_req_local(0, IPC_GET_DEVICE(call)); 406 407 case NET_NETIF_GET_ADDR: 408 fibril_rwlock_read_lock(&netif_globals.lock); 409 if (ERROR_NONE(netif_get_addr_message(IPC_GET_DEVICE(call), 410 &address))) 411 ERROR_CODE = measured_strings_reply(&address, 1); 412 fibril_rwlock_read_unlock(&netif_globals.lock); 413 return ERROR_CODE; 416 414 } 417 415 … … 421 419 /** Start the network interface module. 422 420 * 423 * Initialize the client connection serving function, initialize 424 * the module, registers the module service and start the async 425 * manager, processing IPC messages in an infinite loop. 426 * 427 * @param[in] client_connection The client connection processing 428 * function. The module skeleton propagates 429 * its own one. 430 * 431 * @return EOK on success. 432 * @return Other error codes as defined for each specific module message 433 * function. 434 * 421 * Initialize the client connection serving function, initialize the module, 422 * registers the module service and start the async manager, processing IPC 423 * messages in an infinite loop. 424 * 425 * @param[in] client_connection The client connection processing function. 426 * The module skeleton propagates its own one. 427 * @return EOK on success. 428 * @return Other error codes as defined for each specific module 429 * message function. 435 430 */ 436 431 int netif_module_start_standalone(async_client_conn_t client_connection) -
uspace/lib/net/netif/netif_remote.c
r58b833c r1b11576d 27 27 */ 28 28 29 /** @addtogroup netif29 /** @addtogroup libnet 30 30 * @{ 31 31 */ … … 35 35 */ 36 36 37 #include <netif_remote.h> 38 #include <packet_client.h> 39 #include <generic.h> 40 37 41 #include <ipc/services.h> 38 42 #include <ipc/netif.h> … … 41 45 #include <adt/measured_strings.h> 42 46 #include <net/packet.h> 43 #include <packet_client.h>44 47 #include <net/device.h> 45 #include <netif_remote.h>46 #include <generic.h>47 48 49 /** Return the device local hardware address. 50 * 51 * @param[in] netif_phone The network interface phone. 52 * @param[in] device_id The device identifier. 53 * @param[out] address The device local hardware address. 54 * @param[out] data The address data. 55 * @return EOK on success. 56 * @return EBADMEM if the address parameter is NULL. 57 * @return ENOENT if there no such device. 58 * @return Other error codes as defined for the 59 * netif_get_addr_message() function. 60 */ 48 61 int netif_get_addr_req_remote(int netif_phone, device_id_t device_id, 49 62 measured_string_ref *address, char **data) … … 53 66 } 54 67 55 int netif_probe_req_remote(int netif_phone, device_id_t device_id, int irq, int io) 68 /** Probe the existence of the device. 69 * 70 * @param[in] netif_phone The network interface phone. 71 * @param[in] device_id The device identifier. 72 * @param[in] irq The device interrupt number. 73 * @param[in] io The device input/output address. 74 * @return EOK on success. 75 * @return Other error codes as defined for the 76 * netif_probe_message(). 77 */ 78 int 79 netif_probe_req_remote(int netif_phone, device_id_t device_id, int irq, int io) 56 80 { 57 81 return async_req_3_0(netif_phone, NET_NETIF_PROBE, device_id, irq, io); 58 82 } 59 83 60 int netif_send_msg_remote(int netif_phone, device_id_t device_id, packet_t packet, 84 /** Send the packet queue. 85 * 86 * @param[in] netif_phone The network interface phone. 87 * @param[in] device_id The device identifier. 88 * @param[in] packet The packet queue. 89 * @param[in] sender The sending module service. 90 * @return EOK on success. 91 * @return Other error codes as defined for the generic_send_msg() 92 * function. 93 */ 94 int 95 netif_send_msg_remote(int netif_phone, device_id_t device_id, packet_t packet, 61 96 services_t sender) 62 97 { … … 65 100 } 66 101 102 /** Start the device. 103 * 104 * @param[in] netif_phone The network interface phone. 105 * @param[in] device_id The device identifier. 106 * @return EOK on success. 107 * @return Other error codes as defined for the find_device() 108 * function. 109 * @return Other error codes as defined for the 110 * netif_start_message() function. 111 */ 67 112 int netif_start_req_remote(int netif_phone, device_id_t device_id) 68 113 { … … 70 115 } 71 116 117 /** Stop the device. 118 * 119 * @param[in] netif_phone The network interface phone. 120 * @param[in] device_id The device identifier. 121 * @return EOK on success. 122 * @return Other error codes as defined for the find_device() 123 * function. 124 * @return Other error codes as defined for the 125 * netif_stop_message() function. 126 */ 72 127 int netif_stop_req_remote(int netif_phone, device_id_t device_id) 73 128 { … … 75 130 } 76 131 132 /** Return the device usage statistics. 133 * 134 * @param[in] netif_phone The network interface phone. 135 * @param[in] device_id The device identifier. 136 * @param[out] stats The device usage statistics. 137 * @return EOK on success. 138 */ 77 139 int netif_stats_req_remote(int netif_phone, device_id_t device_id, 78 140 device_stats_ref stats) … … 99 161 * @param[in] receiver The message receiver. 100 162 * 101 * @return 102 * @return 103 * @return Other error codes as defined for the bind_service() function.104 * 163 * @return The phone of the needed service. 164 * @return EOK on success. 165 * @return Other error codes as defined for the bind_service() 166 * function. 105 167 */ 106 int netif_bind_service_remote(services_t service, device_id_t device_id, services_t me, 107 async_client_conn_t receiver) 168 int 169 netif_bind_service_remote(services_t service, device_id_t device_id, 170 services_t me, async_client_conn_t receiver) 108 171 { 109 172 return bind_service(service, device_id, me, 0, receiver); -
uspace/lib/net/nil/nil_remote.c
r58b833c r1b11576d 27 27 */ 28 28 29 /** @addtogroup net_nil29 /** @addtogroup libnet 30 30 * @{ 31 31 */ … … 47 47 /** Notify the network interface layer about the device state change. 48 48 * 49 * @param[in] nil_phone The network interface layer phone. 50 * @param[in] device_id The device identifier. 51 * @param[in] state The new device state. 52 * 53 * @return EOK on success. 54 * @return Other error codes as defined for each specific module device 55 * state function. 56 * 49 * @param[in] nil_phone The network interface layer phone. 50 * @param[in] device_id The device identifier. 51 * @param[in] state The new device state. 52 * @return EOK on success. 53 * @return Other error codes as defined for each specific module 54 * device state function. 57 55 */ 58 56 int nil_device_state_msg_remote(int nil_phone, device_id_t device_id, int state) … … 67 65 * upper layers. 68 66 * 69 * @param[in] nil_phone The network interface layer phone. 70 * @param[in] device_id The source device identifier. 71 * @param[in] packet The received packet or the received packet queue. 72 * @param target The target service. Ignored parameter. 73 * 74 * @return EOK on success. 75 * @return Other error codes as defined for each specific module 76 * received function. 77 * 67 * @param[in] nil_phone The network interface layer phone. 68 * @param[in] device_id The source device identifier. 69 * @param[in] packet The received packet or the received packet queue. 70 * @param target The target service. Ignored parameter. 71 * @return EOK on success. 72 * @return Other error codes as defined for each specific module 73 * received function. 78 74 */ 79 75 int nil_received_msg_remote(int nil_phone, device_id_t device_id, 80 76 packet_t packet, services_t target) 81 77 { 82 return generic_received_msg_remote(nil_phone, NET_NIL_RECEIVED, device_id,83 packet_get_id(packet), target, 0);78 return generic_received_msg_remote(nil_phone, NET_NIL_RECEIVED, 79 device_id, packet_get_id(packet), target, 0); 84 80 } 85 81 -
uspace/lib/net/tl/icmp_client.c
r58b833c r1b11576d 27 27 */ 28 28 29 /** @addtogroup icmp30 * 29 /** @addtogroup libnet 30 * @{ 31 31 */ 32 32 33 33 /** @file 34 * 35 * 34 * ICMP client interface implementation. 35 * @see icmp_client.h 36 36 */ 37 37 38 #include <icmp_client.h> 39 #include <icmp_header.h> 40 #include <packet_client.h> 41 38 42 #ifdef CONFIG_DEBUG 39 43 #include <stdio.h> 40 44 #endif 41 45 … … 44 48 45 49 #include <net/icmp_codes.h> 46 #include <icmp_client.h>47 50 #include <net/packet.h> 48 #include <packet_client.h>49 #include <icmp_header.h>50 51 51 int icmp_client_process_packet(packet_t packet, icmp_type_t * type, icmp_code_t * code, icmp_param_t * pointer, icmp_param_t * mtu){ 52 /** Processes the received packet prefixed with an ICMP header. 53 * 54 * @param[in] packet The received packet. 55 * @param[out] type The ICMP header type. 56 * @param[out] code The ICMP header code. 57 * @param[out] pointer The ICMP header pointer. 58 * @param[out] mtu The ICMP header MTU. 59 * @returns The ICMP header length. 60 * @returns Zero if the packet contains no data. 61 */ 62 int 63 icmp_client_process_packet(packet_t packet, icmp_type_t *type, 64 icmp_code_t *code, icmp_param_t *pointer, icmp_param_t *mtu) 65 { 52 66 icmp_header_ref header; 53 67 54 68 header = (icmp_header_ref) packet_get_data(packet); 55 if ((! header)56 || (packet_get_data_length(packet) < sizeof(icmp_header_t))){69 if (!header || 70 (packet_get_data_length(packet) < sizeof(icmp_header_t))) { 57 71 return 0; 58 72 } 59 if(type){ 73 74 if (type) 60 75 *type = header->type; 61 } 62 if(code){ 76 if (code) 63 77 *code = header->code; 64 } 65 if(pointer){ 78 if (pointer) 66 79 *pointer = header->un.param.pointer; 67 } 68 if(mtu){ 80 if (mtu) 69 81 *mtu = header->un.frag.mtu; 70 } 82 71 83 // remove debug dump 72 84 #ifdef CONFIG_DEBUG 73 printf("ICMP error %d (%d) in packet %d\n", header->type, header->code, packet_get_id(packet)); 85 printf("ICMP error %d (%d) in packet %d\n", header->type, header->code, 86 packet_get_id(packet)); 74 87 #endif 75 88 return sizeof(icmp_header_t); 76 89 } 77 90 78 size_t icmp_client_header_length(packet_t packet){ 79 if(packet_get_data_length(packet) < sizeof(icmp_header_t)){ 91 /** Returns the ICMP header length. 92 * 93 * @param[in] packet The packet. 94 * @returns The ICMP header length in bytes. 95 */ 96 size_t icmp_client_header_length(packet_t packet) 97 { 98 if (packet_get_data_length(packet) < sizeof(icmp_header_t)) 80 99 return 0; 81 } 100 82 101 return sizeof(icmp_header_t); 83 102 } -
uspace/lib/net/tl/tl_common.c
r58b833c r1b11576d 27 27 */ 28 28 29 /** @addtogroup net_tl30 * 29 /** @addtogroup libnet 30 * @{ 31 31 */ 32 32 33 33 /** @file 34 * Transport layer common functions implementation. 35 * @see tl_common.h 36 */ 34 * Transport layer common functions implementation. 35 * @see tl_common.h 36 */ 37 38 #include <tl_common.h> 39 #include <packet_client.h> 40 #include <packet_remote.h> 41 #include <icmp_interface.h> 42 #include <ip_remote.h> 43 #include <ip_interface.h> 44 #include <tl_interface.h> 37 45 38 46 #include <net/socket_codes.h> … … 40 48 #include <net/in6.h> 41 49 #include <net/inet.h> 50 #include <net/device.h> 51 #include <net/packet.h> 52 42 53 #include <async.h> 43 54 #include <ipc/services.h> … … 45 56 #include <err.h> 46 57 47 #include <net/packet.h>48 #include <packet_client.h>49 #include <packet_remote.h>50 #include <net/device.h>51 #include <icmp_interface.h>52 #include <ip_remote.h>53 #include <ip_interface.h>54 #include <tl_interface.h>55 #include <tl_common.h>56 57 58 DEVICE_MAP_IMPLEMENT(packet_dimensions, packet_dimension_t); 58 59 60 /** Gets the address port. 61 * 62 * Supports AF_INET and AF_INET6 address families. 63 * 64 * @param[in,out] addr The address to be updated. 65 * @param[in] addrlen The address length. 66 * @param[out] port The set port. 67 * @returns EOK on success. 68 * @returns EINVAL if the address length does not match the address 69 * family. 70 * @returns EAFNOSUPPORT if the address family is not supported. 71 */ 59 72 int 60 73 tl_get_address_port(const struct sockaddr *addr, int addrlen, uint16_t *port) … … 74 87 *port = ntohs(address_in->sin_port); 75 88 break; 89 76 90 case AF_INET6: 77 91 if (addrlen != sizeof(struct sockaddr_in6)) 78 92 return EINVAL; 79 93 80 94 address_in6 = (struct sockaddr_in6 *) addr; 81 95 *port = ntohs(address_in6->sin6_port); 82 96 break; 97 83 98 default: 84 99 return EAFNOSUPPORT; … … 93 108 * The reply is cached then. 94 109 * 95 * @param[in] ip_phoneThe IP moduel phone for (semi)remote calls.96 * @param[in] 97 * @param[in] device_idThe device identifier.98 * @param[out] packet_dimension 99 * 100 * @return EOK on success.101 * @return EBADMEM if the packet_dimension parameter is NULL.102 * @return ENOMEM if there is not enough memory left.103 * @return EINVAL if the packet_dimensions cache is not valid.104 * @return Other codes as defined for the ip_packet_size_req()function.105 * 106 */ 107 inttl_get_ip_packet_dimension(int ip_phone,110 * @param[in] ip_phone The IP moduel phone for (semi)remote calls. 111 * @param[in] packet_dimensions The packet dimensions cache. 112 * @param[in] device_id The device identifier. 113 * @param[out] packet_dimension The IP packet dimensions. 114 * @return EOK on success. 115 * @return EBADMEM if the packet_dimension parameter is NULL. 116 * @return ENOMEM if there is not enough memory left. 117 * @return EINVAL if the packet_dimensions cache is not valid. 118 * @return Other codes as defined for the ip_packet_size_req() 119 * function. 120 */ 121 int 122 tl_get_ip_packet_dimension(int ip_phone, 108 123 packet_dimensions_ref packet_dimensions, device_id_t device_id, 109 124 packet_dimension_ref *packet_dimension) … … 139 154 } 140 155 156 /** Updates IP device packet dimensions cache. 157 * 158 * @param[in,out] packet_dimensions The packet dimensions cache. 159 * @param[in] device_id The device identifier. 160 * @param[in] content The new maximum content size. 161 * @returns EOK on success. 162 * @return ENOENT if the packet dimension is not cached. 163 */ 141 164 int 142 165 tl_update_ip_packet_dimension(packet_dimensions_ref packet_dimensions, … … 148 171 if (!packet_dimension) 149 172 return ENOENT; 173 150 174 packet_dimension->content = content; 151 175 … … 160 184 packet_dimensions_exclude(packet_dimensions, 161 185 DEVICE_INVALID_ID); 162 163 186 } 164 187 } … … 167 190 } 168 191 192 /** Sets the address port. 193 * 194 * Supports AF_INET and AF_INET6 address families. 195 * 196 * @param[in,out] addr The address to be updated. 197 * @param[in] addrlen The address length. 198 * @param[in] port The port to be set. 199 * @returns EOK on success. 200 * @returns EINVAL if the address length does not match the address 201 * family. 202 * @returns EAFNOSUPPORT if the address family is not supported. 203 */ 169 204 int tl_set_address_port(struct sockaddr * addr, int addrlen, uint16_t port) 170 205 { … … 187 222 address_in->sin_port = htons(port); 188 223 return EOK; 224 189 225 case AF_INET6: 190 226 if (length != sizeof(struct sockaddr_in6)) … … 193 229 address_in6->sin6_port = htons(port); 194 230 return EOK; 231 195 232 default: 196 233 return EAFNOSUPPORT; … … 198 235 } 199 236 237 /** Prepares the packet for ICMP error notification. 238 * 239 * Keeps the first packet and releases all the others. 240 * Releases all the packets on error. 241 * 242 * @param[in] packet_phone The packet server module phone. 243 * @param[in] icmp_phone The ICMP module phone. 244 * @param[in] packet The packet to be send. 245 * @param[in] error The packet error reporting service. Prefixes the 246 * received packet. 247 * @returns EOK on success. 248 * @returns ENOENT if no packet may be sent. 249 */ 200 250 int 201 251 tl_prepare_icmp_packet(int packet_phone, int icmp_phone, packet_t packet, … … 223 273 } 224 274 275 /** Receives data from the socket into a packet. 276 * 277 * @param[in] packet_phone The packet server module phone. 278 * @param[out] packet The new created packet. 279 * @param[in] prefix Reserved packet data prefix length. 280 * @param[in] dimension The packet dimension. 281 * @param[in] addr The destination address. 282 * @param[in] addrlen The address length. 283 * @returns Number of bytes received. 284 * @returns EINVAL if the client does not send data. 285 * @returns ENOMEM if there is not enough memory left. 286 * @returns Other error codes as defined for the 287 * async_data_read_finalize() function. 288 */ 225 289 int 226 290 tl_socket_read_packet_data(int packet_phone, packet_ref packet, size_t prefix, -
uspace/srv/net/il/arp/arp_module.c
r58b833c r1b11576d 57 57 extern arp_globals_t arp_globals; 58 58 59 /** Processes the ARP message.60 * @param[in] callid The message identifier.61 * @param[in] call The message parameters.62 * @param[out] answer The message answer parameters.63 * @param[out] answer_count The last parameter for the actual answer in the answer parameter.64 * @returns EOK on success.65 * @returns Other error codes as defined for the arp_message() function.66 */67 59 int il_module_message_standalone(ipc_callid_t callid, ipc_call_t * call, ipc_call_t * answer, int * answer_count){ 68 60 return arp_message_standalone(callid, call, answer, answer_count); 69 61 } 70 62 71 /** Starts the ARP module.72 * Initializes the client connection serving function, initializes the module, registers the module service and starts the async manager, processing IPC messages in an infinite loop.73 * @param[in] client_connection The client connection processing function. The module skeleton propagates its own one.74 * @returns EOK on successful module termination.75 * @returns Other error codes as defined for the arp_initialize() function.76 * @returns Other error codes as defined for the REGISTER_ME() macro function.77 */78 63 int il_module_start_standalone(async_client_conn_t client_connection){ 79 64 ERROR_DECLARE; -
uspace/srv/net/il/ip/ip.c
r58b833c r1b11576d 67 67 #include <ip_client.h> 68 68 #include <ip_interface.h> 69 #include <ip_header.h> 69 70 #include <net_interface.h> 70 71 #include <nil_interface.h> … … 77 78 78 79 #include "ip.h" 79 #include "ip_header.h"80 80 #include "ip_module.h" 81 81 #include "ip_local.h" -
uspace/srv/net/il/ip/ip_module.c
r58b833c r1b11576d 56 56 extern ip_globals_t ip_globals; 57 57 58 /** Processes the IP message.59 * @param[in] callid The message identifier.60 * @param[in] call The message parameters.61 * @param[out] answer The message answer parameters.62 * @param[out] answer_count The last parameter for the actual answer in the answer parameter.63 * @returns EOK on success.64 * @returns Other error codes as defined for the ip_message() function.65 */66 58 int il_module_message_standalone(ipc_callid_t callid, ipc_call_t * call, ipc_call_t * answer, int * answer_count){ 67 59 return ip_message_standalone(callid, call, answer, answer_count); 68 60 } 69 61 70 /** Starts the IP module.71 * Initializes the client connection serving function, initializes the module, registers the module service and starts the async manager, processing IPC messages in an infinite loop.72 * @param[in] client_connection The client connection processing function. The module skeleton propagates its own one.73 * @returns EOK on successful module termination.74 * @returns Other error codes as defined for the ip_initialize() function.75 * @returns Other error codes as defined for the REGISTER_ME() macro function.76 */77 62 int il_module_start_standalone(async_client_conn_t client_connection){ 78 63 ERROR_DECLARE; -
uspace/srv/net/nil/eth/eth_module.c
r58b833c r1b11576d 50 50 #include "eth.h" 51 51 52 /** Starts the Ethernet module.53 * Initializes the client connection serving function, initializes the module, registers the module service and starts the async manager, processing IPC messages in an infinite loop.54 * @param[in] client_connection The client connection processing function. The module skeleton propagates its own one.55 * @returns EOK on success.56 * @returns Other error codes as defined for the pm_init() function.57 * @returns Other error codes as defined for the nil_initialize() function.58 * @returns Other error codes as defined for the REGISTER_ME() macro function.59 */60 52 int nil_module_start_standalone(async_client_conn_t client_connection) 61 53 { … … 79 71 } 80 72 81 /** Pass the parameters to the module specific nil_message() function.82 *83 * @param[in] name Module name.84 * @param[in] callid The message identifier.85 * @param[in] call The message parameters.86 * @param[out] answer The message answer parameters.87 * @param[out] answer_count The last parameter for the actual answer88 * in the answer parameter.89 *90 * @return EOK on success.91 * @return ENOTSUP if the message is not known.92 * @return Other error codes as defined for each93 * specific module message function.94 *95 */96 73 int nil_module_message_standalone(const char *name, ipc_callid_t callid, ipc_call_t *call, 97 74 ipc_call_t *answer, int *answer_count) -
uspace/srv/net/nil/nildummy/nildummy_module.c
r58b833c r1b11576d 50 50 #include "nildummy.h" 51 51 52 /** Start the dummy nil module.53 *54 * Initialize the client connection serving function, initialize55 * the module, register the module service and start the async56 * manager, processing IPC messages in an infinite loop.57 *58 * @param[in] client_connection The client connection processing59 * function. The module skeleton propagates60 * its own one.61 *62 * @return EOK on success.63 * @return Other error codes as defined for the pm_init() function.64 * @return Other error codes as defined for the nil_initialize() function.65 * @return Other error codes as defined for the REGISTER_ME() macro function.66 *67 */68 52 int nil_module_start_standalone(async_client_conn_t client_connection) 69 53 { … … 87 71 } 88 72 89 /** Pass the parameters to the module specific nil_message() function.90 *91 * @param[in] name Module name.92 * @param[in] callid The message identifier.93 * @param[in] call The message parameters.94 * @param[out] answer The message answer parameters.95 * @param[out] answer_count The last parameter for the actual answer96 * in the answer parameter.97 *98 * @return EOK on success.99 * @return ENOTSUP if the message is not known.100 * @return Other error codes as defined for each specific101 * module message function.102 *103 */104 73 int nil_module_message_standalone(const char *name, ipc_callid_t callid, 105 74 ipc_call_t *call, ipc_call_t *answer, int *answer_count)
Note:
See TracChangeset
for help on using the changeset viewer.