source: mainline/uspace/lib/net/il/ip_remote.c@ 095bddfc

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 095bddfc was 00d7e1b, checked in by Martin Decky <martin@…>, 14 years ago

networking improvements

  • start the networking stack from init
  • add loopback network interface driver (cherrypicked and sanitized from lp:~helenos-nicf/helenos/nicf)
  • add libnic and various small pieces from lp:~helenos-nicf/helenos/nicf
  • fix client side of NIC_GET_ADDRESS
  • net binary overhaul

Note: "ping 127.0.0.1" works, but the first three pings timeout for some reason

  • Property mode set to 100644
File size: 8.2 KB
RevLine 
[21580dd]1/*
2 * Copyright (c) 2009 Lukas Mejdrech
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
[e037e20e]29/** @addtogroup libnet
[24ab58b3]30 * @{
[21580dd]31 */
32
33/** @file
[24ab58b3]34 *
[14f1db0]35 * IP interface implementation for remote modules.
[24ab58b3]36 *
37 * @see ip_interface.h
[797b704]38 * @see il_remote.h
[24ab58b3]39 *
[21580dd]40 */
41
[514ee46]42#include <ip_remote.h>
43#include <ip_interface.h>
44#include <packet_client.h>
45#include <generic.h>
[21580dd]46#include <ipc/services.h>
[522253c1]47#include <ipc/il.h>
[779a47d]48#include <ipc/ip.h>
[c7a8442]49#include <net/modules.h>
[e526f08]50#include <net/device.h>
[e4554d4]51#include <net/inet.h>
[21580dd]52
[14f1db0]53/** Add a route to the device routing table.
54 *
55 * The target network is routed using this device.
56 *
[6b82009]57 * @param[in] sess IP module sessions.
58 * @param[in] device_id Device identifier.
59 * @param[in] address Target network address.
60 * @param[in] netmask Target network mask.
61 * @param[in] gateway Target network gateway. Not used if zero.
62 *
[14f1db0]63 */
[609243f4]64int ip_add_route_req_remote(async_sess_t *sess, nic_device_id_t device_id,
[14f1db0]65 in_addr_t address, in_addr_t netmask, in_addr_t gateway)
[24ab58b3]66{
[6b82009]67 async_exch_t *exch = async_exchange_begin(sess);
68 int rc = async_req_4_0(exch, NET_IP_ADD_ROUTE,
[96b02eb9]69 (sysarg_t) device_id, (sysarg_t) gateway.s_addr,
70 (sysarg_t) address.s_addr, (sysarg_t) netmask.s_addr);
[6b82009]71 async_exchange_end(exch);
72
73 return rc;
[21580dd]74}
75
[6b82009]76/** Create bidirectional connection with the ip module service and register
[e037e20e]77 * the message receiver.
78 *
[6b82009]79 * @param[in] service IP module service.
80 * @param[in] protocol Transport layer protocol.
81 * @param[in] me Rquesting module service.
82 * @param[in] receiver Message receiver. Used for remote connection.
83 *
84 * @return Session to the needed service.
85 * @return NULL on failure.
86 *
[e037e20e]87 */
[6b82009]88async_sess_t *ip_bind_service(services_t service, int protocol, services_t me,
[5a868d7]89 async_client_conn_t receiver)
[24ab58b3]90{
[6b82009]91 return bind_service(service, (sysarg_t) protocol, me, service,
[24ab58b3]92 receiver);
[21580dd]93}
94
[6b82009]95/** Connect to the IP module.
96 *
97 * @return The IP module session.
[e037e20e]98 *
99 */
[6b82009]100async_sess_t *ip_connect_module(services_t service)
[24ab58b3]101{
[6b82009]102 // FIXME: Get rid of the useless argument
[a64c64d]103 return connect_to_service(SERVICE_IP);
104}
105
[14f1db0]106/** Register the new device.
107 *
108 * Register itself as the ip packet receiver.
109 * If the device uses ARP registers also the new ARP device.
110 *
[6b82009]111 * @param[in] sess IP module session.
112 * @param[in] device_id New device identifier.
113 *
114 * @return EOK on success.
115 * @return ENOMEM if there is not enough memory left.
116 * @return EINVAL if the device configuration is invalid.
117 * @return ENOTSUP if the device uses IPv6.
118 * @return ENOTSUP if the device uses DHCP.
119 * @return Other error codes as defined for the
120 * net_get_device_conf_req() function.
121 * @return Other error codes as defined for the arp_device_req()
122 * function.
123 *
[14f1db0]124 */
[00d7e1b]125int ip_device_req(async_sess_t *sess, nic_device_id_t device_id,
[ee2fa30a]126 services_t service)
[24ab58b3]127{
[609243f4]128 return generic_device_req_remote(sess, NET_IP_DEVICE, device_id,
[ee2fa30a]129 service);
[21580dd]130}
131
[e037e20e]132/** Return the device identifier and the IP pseudo header based on the
133 * destination address.
[14f1db0]134 *
[6b82009]135 * @param[in] sess IP module session.
136 * @param[in] protocol Transport protocol.
137 * @param[in] destination Destination address.
138 * @param[in] addrlen Destination address length.
139 * @param[out] device_id Device identifier.
140 * @param[out] header Constructed IP pseudo header.
141 * @param[out] headerlen IP pseudo header length.
[14f1db0]142 *
143 */
[6b82009]144int ip_get_route_req_remote(async_sess_t *sess, ip_protocol_t protocol,
[24ab58b3]145 const struct sockaddr *destination, socklen_t addrlen,
[609243f4]146 nic_device_id_t *device_id, void **header, size_t *headerlen)
[24ab58b3]147{
[6b82009]148 if ((!destination) || (addrlen == 0))
[aadf01e]149 return EINVAL;
[24ab58b3]150
[6b82009]151 if ((!device_id) || (!header) || (!headerlen))
[aadf01e]152 return EBADMEM;
[24ab58b3]153
[aadf01e]154 *header = NULL;
[24ab58b3]155
[6b82009]156 async_exch_t *exch = async_exchange_begin(sess);
157
[24ab58b3]158 ipc_call_t answer;
[6b82009]159 aid_t message_id = async_send_1(exch, NET_IP_GET_ROUTE,
[96b02eb9]160 (sysarg_t) protocol, &answer);
[24ab58b3]161
[6b82009]162 if ((async_data_write_start(exch, destination, addrlen) == EOK) &&
163 (async_data_read_start(exch, headerlen, sizeof(*headerlen)) == EOK) &&
164 (*headerlen > 0)) {
[14f1db0]165 *header = malloc(*headerlen);
[24ab58b3]166 if (*header) {
[6b82009]167 if (async_data_read_start(exch, *header,
[e037e20e]168 *headerlen) != EOK)
[aadf01e]169 free(*header);
[21580dd]170 }
171 }
[24ab58b3]172
[6b82009]173 async_exchange_end(exch);
174
[96b02eb9]175 sysarg_t result;
[aadf01e]176 async_wait_for(message_id, &result);
[24ab58b3]177
[d3cdb7f0]178 if ((result != EOK) && *header)
[aadf01e]179 free(*header);
[24ab58b3]180 else
[774e6d1a]181 *device_id = IPC_GET_DEVICE(answer);
[24ab58b3]182
[aadf01e]183 return (int) result;
[21580dd]184}
185
[14f1db0]186/** Return the device packet dimension for sending.
187 *
[6b82009]188 * @param[in] sess IP module session.
189 * @param[in] device_id Device identifier.
190 * @param[out] packet_dimension Packet dimension.
191 *
192 * @return EOK on success.
193 * @return ENOENT if there is no such device.
194 * @return Other error codes as defined for the
195 * generic_packet_size_req_remote() function.
196 *
[14f1db0]197 */
[609243f4]198int ip_packet_size_req_remote(async_sess_t *sess, nic_device_id_t device_id,
[f772bc55]199 packet_dimension_t *packet_dimension)
[24ab58b3]200{
[6b82009]201 return generic_packet_size_req_remote(sess, NET_IP_PACKET_SPACE,
[e037e20e]202 device_id, packet_dimension);
[a64c64d]203}
204
[14f1db0]205/** Notify the IP module about the received error notification packet.
206 *
[6b82009]207 * @param[in] sess IP module session.
208 * @param[in] device_id Device identifier.
209 * @param[in] packet Received packet or the received packet queue.
210 * @param[in] target Target internetwork module service to be
211 * delivered to.
212 * @param[in] error Packet error reporting service. Prefixes the
213 * received packet.
214 *
215 * @return EOK on success.
216 *
[14f1db0]217 */
[609243f4]218int ip_received_error_msg_remote(async_sess_t *sess, nic_device_id_t device_id,
[46d4d9f]219 packet_t *packet, services_t target, services_t error)
[24ab58b3]220{
[6b82009]221 return generic_received_msg_remote(sess, NET_IP_RECEIVED_ERROR,
[14f1db0]222 device_id, packet_get_id(packet), target, error);
[a64c64d]223}
224
[14f1db0]225/** Send the packet queue.
226 *
227 * The packets may get fragmented if needed.
228 *
[6b82009]229 * @param[in] sess IP module session.
230 * @param[in] device_id Device identifier.
231 * @param[in] packet Packet fragments as a packet queue. All the
232 * packets have to have the same destination address.
233 * @param[in] sender Sending module service.
234 * @param[in] error Packet error reporting service. Prefixes the
235 * received packet.
236 *
237 * @return EOK on success.
238 * @return Other error codes as defined for the generic_send_msg()
239 * function.
240 *
[14f1db0]241 */
[609243f4]242int ip_send_msg_remote(async_sess_t *sess, nic_device_id_t device_id,
[6b82009]243 packet_t *packet, services_t sender, services_t error)
[24ab58b3]244{
[6b82009]245 return generic_send_msg_remote(sess, NET_IP_SEND, device_id,
[24ab58b3]246 packet_get_id(packet), sender, error);
[a64c64d]247}
248
[14f1db0]249/** Set the default gateway.
250 *
251 * This gateway is used if no other route is found.
252 *
[6b82009]253 * @param[in] sess IP module session.
254 * @param[in] device_id Device identifier.
255 * @param[in] gateway Default gateway.
256 *
[14f1db0]257 */
[609243f4]258int ip_set_gateway_req_remote(async_sess_t *sess, nic_device_id_t device_id,
[14f1db0]259 in_addr_t gateway)
[24ab58b3]260{
[6b82009]261 async_exch_t *exch = async_exchange_begin(sess);
262 int rc = async_req_2_0(exch, NET_IP_SET_GATEWAY,
[96b02eb9]263 (sysarg_t) device_id, (sysarg_t) gateway.s_addr);
[6b82009]264 async_exchange_end(exch);
265
266 return rc;
[a64c64d]267}
268
[21580dd]269/** @}
270 */
Note: See TracBrowser for help on using the repository browser.