source: mainline/uspace/lib/net/generic/packet_remote.c@ 7c8267b

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 7c8267b was 7c8267b, checked in by Jakub Jermar <jakub@…>, 15 years ago

Coding style fixes.

This changeset converts the entire TCP code into HelenOS cstyle and improves
its general legibility by adding vertical spacing and removing unnecessary
clutter. It also attempts to suppress too deep nesting of blocks by
functional-equivalent code restructuralization.

This changeset brings no change in functionality (hopefully), but it should make
it easier to understand and eventually fix TCP code.

  • Property mode set to 100644
File size: 4.4 KB
Line 
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
29/** @addtogroup packet
30 * @{
31 */
32
33/** @file
34 * Packet client interface implementation for remote modules.
35 * @see packet_client.h
36 */
37
38#include <async.h>
39#include <errno.h>
40#include <ipc/ipc.h>
41#include <sys/mman.h>
42
43#include <net_err.h>
44#include <net_messages.h>
45#include <packet/packet.h>
46#include <packet/packet_client.h>
47#include <packet/packet_header.h>
48#include <packet/packet_messages.h>
49#include <packet_remote.h>
50
51/** Obtain the packet from the packet server as the shared memory block.
52 *
53 * Create the local packet mapping as well.
54 *
55 * @param[in] phone The packet server module phone.
56 * @param[out] packet The packet reference pointer to store the received
57 * packet reference.
58 * @param[in] packet_id The packet identifier.
59 * @param[in] size The packet total size in bytes.
60 *
61 * @return EOK on success.
62 * @return Other error codes as defined for the pm_add() function.
63 * @return Other error codes as defined for the async_share_in_start() function.
64 *
65 */
66static int packet_return(int phone, packet_ref packet, packet_id_t packet_id, size_t size){
67 ERROR_DECLARE;
68
69 ipc_call_t answer;
70 aid_t message = async_send_1(phone, NET_PACKET_GET, packet_id, &answer);
71 *packet = (packet_t) as_get_mappable_page(size);
72 if (ERROR_OCCURRED(async_share_in_start_0_0(phone, *packet, size)) ||
73 ERROR_OCCURRED(pm_add(*packet))) {
74 munmap(*packet, size);
75 async_wait_for(message, NULL);
76 return ERROR_CODE;
77 }
78
79 ipcarg_t result;
80 async_wait_for(message, &result);
81
82 return result;
83}
84
85int packet_translate_remote(int phone, packet_ref packet, packet_id_t packet_id)
86{
87 ERROR_DECLARE;
88
89 if (!packet)
90 return EINVAL;
91
92 *packet = pm_find(packet_id);
93 if (!(*packet)) {
94 ipcarg_t size;
95
96 ERROR_PROPAGATE(async_req_1_1(phone, NET_PACKET_GET_SIZE, packet_id, &size));
97 ERROR_PROPAGATE(packet_return(phone, packet, packet_id, size));
98 }
99 if ((** packet).next) {
100 packet_t next;
101
102 return packet_translate_remote(phone, &next, (** packet).next);
103 }
104
105 return EOK;
106}
107
108packet_t packet_get_4_remote(int phone, size_t max_content, size_t addr_len,
109 size_t max_prefix, size_t max_suffix)
110{
111 ERROR_DECLARE;
112
113 ipcarg_t packet_id;
114 ipcarg_t size;
115
116 if (ERROR_OCCURRED(async_req_4_2(phone, NET_PACKET_CREATE_4, max_content,
117 addr_len, max_prefix, max_suffix, &packet_id, &size)))
118 return NULL;
119
120
121 packet_t packet = pm_find(packet_id);
122 if (!packet) {
123 if (ERROR_OCCURRED(packet_return(phone, &packet, packet_id, size)))
124 return NULL;
125 }
126
127 return packet;
128}
129
130packet_t packet_get_1_remote(int phone, size_t content)
131{
132 ERROR_DECLARE;
133
134 ipcarg_t packet_id;
135 ipcarg_t size;
136
137 if (ERROR_OCCURRED(async_req_1_2(phone, NET_PACKET_CREATE_1, content,
138 &packet_id, &size)))
139 return NULL;
140
141 packet_t packet = pm_find(packet_id);
142 if (!packet) {
143 if (ERROR_OCCURRED(packet_return(phone, &packet, packet_id, size)))
144 return NULL;
145 }
146
147 return packet;
148}
149
150void pq_release_remote(int phone, packet_id_t packet_id)
151{
152 async_msg_1(phone, NET_PACKET_RELEASE, packet_id);
153}
154
155/** @}
156 */
Note: See TracBrowser for help on using the repository browser.