Changeset 4687a26c in mainline for uspace/lib/net/generic/packet_remote.c
- Timestamp:
- 2010-11-02T18:29:01Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 4f35b9ff
- Parents:
- 76e1121f (diff), 28f4adb (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/net/generic/packet_remote.c
r76e1121f r4687a26c 27 27 */ 28 28 29 /** @addtogroup packet30 * 29 /** @addtogroup libnet 30 * @{ 31 31 */ 32 32 33 33 /** @file 34 * 35 * 34 * Packet client interface implementation for remote modules. 35 * @see packet_client.h 36 36 */ 37 37 38 38 #include <async.h> 39 39 #include <errno.h> 40 #include <err.h> 40 41 #include <ipc/ipc.h> 42 #include <ipc/packet.h> 41 43 #include <sys/mman.h> 42 44 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> 45 #include <packet_client.h> 49 46 #include <packet_remote.h> 47 48 #include <net/packet.h> 49 #include <net/packet_header.h> 50 50 51 51 /** Obtain the packet from the packet server as the shared memory block. … … 64 64 * 65 65 */ 66 static int packet_return(int phone, packet_ref packet, packet_id_t packet_id, size_t size){ 66 static int 67 packet_return(int phone, packet_ref packet, packet_id_t packet_id, size_t size) 68 { 67 69 ERROR_DECLARE; 68 70 69 71 ipc_call_t answer; 70 72 aid_t message = async_send_1(phone, NET_PACKET_GET, packet_id, &answer); 73 71 74 *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))) {75 if (ERROR_OCCURRED(async_share_in_start_0_0(phone, *packet, size)) || 76 ERROR_OCCURRED(pm_add(*packet))) { 74 77 munmap(*packet, size); 75 78 async_wait_for(message, NULL); … … 83 86 } 84 87 88 /** Translates the packet identifier to the packet reference. 89 * 90 * Tries to find mapping first. 91 * Contacts the packet server to share the packet if the mapping is not present. 92 * 93 * @param[in] phone The packet server module phone. 94 * @param[out] packet The packet reference. 95 * @param[in] packet_id The packet identifier. 96 * @returns EOK on success. 97 * @returns EINVAL if the packet parameter is NULL. 98 * @returns Other error codes as defined for the NET_PACKET_GET_SIZE 99 * message. 100 * @returns Other error codes as defined for the packet_return() 101 * function. 102 */ 85 103 int packet_translate_remote(int phone, packet_ref packet, packet_id_t packet_id) 86 104 { … … 91 109 92 110 *packet = pm_find(packet_id); 93 if (! (*packet)) {111 if (!*packet) { 94 112 ipcarg_t size; 95 113 96 ERROR_PROPAGATE(async_req_1_1(phone, NET_PACKET_GET_SIZE, packet_id, &size)); 114 ERROR_PROPAGATE(async_req_1_1(phone, NET_PACKET_GET_SIZE, 115 packet_id, &size)); 97 116 ERROR_PROPAGATE(packet_return(phone, packet, packet_id, size)); 98 117 } 99 if ((* * packet).next) {118 if ((*packet)->next) { 100 119 packet_t next; 101 120 102 return packet_translate_remote(phone, &next, (* * packet).next);121 return packet_translate_remote(phone, &next, (*packet)->next); 103 122 } 104 123 … … 106 125 } 107 126 127 /** Obtains the packet of the given dimensions. 128 * 129 * Contacts the packet server to return the appropriate packet. 130 * 131 * @param[in] phone The packet server module phone. 132 * @param[in] addr_len The source and destination addresses maximal length in 133 * bytes. 134 * @param[in] max_prefix The maximal prefix length in bytes. 135 * @param[in] max_content The maximal content length in bytes. 136 * @param[in] max_suffix The maximal suffix length in bytes. 137 * @returns The packet reference. 138 * @returns NULL on error. 139 */ 108 140 packet_t packet_get_4_remote(int phone, size_t max_content, size_t addr_len, 109 141 size_t max_prefix, size_t max_suffix) … … 114 146 ipcarg_t size; 115 147 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)))148 if (ERROR_OCCURRED(async_req_4_2(phone, NET_PACKET_CREATE_4, 149 max_content, addr_len, max_prefix, max_suffix, &packet_id, &size))) 118 150 return NULL; 119 151 … … 121 153 packet_t packet = pm_find(packet_id); 122 154 if (!packet) { 123 if (ERROR_OCCURRED(packet_return(phone, &packet, packet_id, size))) 155 if (ERROR_OCCURRED(packet_return(phone, &packet, packet_id, 156 size))) 124 157 return NULL; 125 158 } … … 128 161 } 129 162 163 /** Obtains the packet of the given content size. 164 * 165 * Contacts the packet server to return the appropriate packet. 166 * 167 * @param[in] phone The packet server module phone. 168 * @param[in] content The maximal content length in bytes. 169 * @returns The packet reference. 170 * @returns NULL on error. 171 */ 130 172 packet_t packet_get_1_remote(int phone, size_t content) 131 173 { … … 141 183 packet_t packet = pm_find(packet_id); 142 184 if (!packet) { 143 if (ERROR_OCCURRED(packet_return(phone, &packet, packet_id, size))) 185 if (ERROR_OCCURRED(packet_return(phone, &packet, packet_id, 186 size))) 144 187 return NULL; 145 188 } … … 148 191 } 149 192 193 /** Releases the packet queue. 194 * 195 * All packets in the queue are marked as free for use. 196 * The packet queue may be one packet only. 197 * The module should not use the packets after this point until they are 198 * received or obtained again. 199 * 200 * @param[in] phone The packet server module phone. 201 * @param[in] packet_id The packet identifier. 202 */ 150 203 void pq_release_remote(int phone, packet_id_t packet_id) 151 204 {
Note:
See TracChangeset
for help on using the changeset viewer.