Changes in uspace/lib/net/generic/packet_remote.c [ffa2c8ef:49bd793b] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/net/generic/packet_remote.c
rffa2c8ef r49bd793b 51 51 * Create the local packet mapping as well. 52 52 * 53 * @param[in] phone The packet server module phone.54 * @param[out] packet The packet reference pointer to store the received53 * @param[in] sess Packet server module session. 54 * @param[out] packet Packet reference pointer to store the received 55 55 * packet reference. 56 * @param[in] packet_id The packet identifier.57 * @param[in] size The packet total size in bytes.56 * @param[in] packet_id Packet identifier. 57 * @param[in] size Packet total size in bytes. 58 58 * 59 59 * @return EOK on success. 60 60 * @return Other error codes as defined for the pm_add() function. 61 * @return Other error codes as defined for the async_share_in_start() function. 62 * 63 */ 64 static int 65 packet_return(int phone, packet_t **packet, packet_id_t packet_id, size_t size) 66 { 61 * @return Other error codes as defined for the async_share_in_start() 62 * function. 63 * 64 */ 65 static int packet_return(async_sess_t *sess, packet_t **packet, 66 packet_id_t packet_id, size_t size) 67 { 68 *packet = (packet_t *) as_get_mappable_page(size); 69 70 async_exch_t *exch = async_exchange_begin(sess); 67 71 ipc_call_t answer; 68 aid_t message ;69 int rc ;70 71 message = async_send_1(phone, NET_PACKET_GET, packet_id, &answer);72 73 *packet = (packet_t *) as_get_mappable_page(size);74 rc = async_share_in_start_0_0(phone, *packet, size);72 aid_t message = async_send_1(exch, NET_PACKET_GET, packet_id, &answer); 73 int rc = async_share_in_start_0_0(exch, *packet, size); 74 async_exchange_end(exch); 75 76 sysarg_t result; 77 async_wait_for(message, &result); 78 75 79 if (rc != EOK) { 76 80 munmap(*packet, size); 77 async_wait_for(message, NULL);78 81 return rc; 79 82 } 83 80 84 rc = pm_add(*packet); 81 85 if (rc != EOK) { 82 86 munmap(*packet, size); 83 async_wait_for(message, NULL);84 87 return rc; 85 88 } 86 89 87 sysarg_t result;88 async_wait_for(message, &result);89 90 90 return result; 91 91 } 92 92 93 /** Translates the packet identifier to the packet reference. 94 * 95 * Tries to find mapping first. 96 * Contacts the packet server to share the packet if the mapping is not present. 97 * 98 * @param[in] phone The packet server module phone. 99 * @param[out] packet The packet reference. 100 * @param[in] packet_id The packet identifier. 101 * @return EOK on success. 102 * @return EINVAL if the packet parameter is NULL. 103 * @return Other error codes as defined for the NET_PACKET_GET_SIZE 104 * message. 105 * @return Other error codes as defined for the packet_return() 106 * function. 107 */ 108 int packet_translate_remote(int phone, packet_t **packet, packet_id_t packet_id) 109 { 110 int rc; 111 93 /** Translate the packet identifier to the packet reference. 94 * 95 * Try to find mapping first. The packet server is asked to share 96 * the packet if the mapping is not present. 97 * 98 * @param[in] sess Packet server module session. 99 * @param[out] packet Packet reference. 100 * @param[in] packet_id Packet identifier. 101 * 102 * @return EOK on success. 103 * @return EINVAL if the packet parameter is NULL. 104 * @return Other error codes as defined for the NET_PACKET_GET_SIZE 105 * message. 106 * @return Other error codes as defined for the packet_return() 107 * function. 108 * 109 */ 110 int packet_translate_remote(async_sess_t *sess, packet_t **packet, 111 packet_id_t packet_id) 112 { 112 113 if (!packet) 113 114 return EINVAL; 114 115 115 116 *packet = pm_find(packet_id); 116 if (!*packet) { 117 if (*packet == NULL) { 118 async_exch_t *exch = async_exchange_begin(sess); 117 119 sysarg_t size; 120 int rc = async_req_1_1(exch, NET_PACKET_GET_SIZE, packet_id, 121 &size); 122 async_exchange_end(exch); 118 123 119 rc = async_req_1_1(phone, NET_PACKET_GET_SIZE, packet_id,120 &size);121 124 if (rc != EOK) 122 125 return rc; 123 rc = packet_return(phone, packet, packet_id, size); 126 127 rc = packet_return(sess, packet, packet_id, size); 124 128 if (rc != EOK) 125 129 return rc; 126 130 } 127 if ((*packet)->next) { 131 132 if ((*packet != NULL) && ((*packet)->next)) { 128 133 packet_t *next; 129 130 return packet_translate_remote(phone, &next, (*packet)->next); 134 return packet_translate_remote(sess, &next, (*packet)->next); 131 135 } 132 136 … … 134 138 } 135 139 136 /** Obtains the packet of the given dimensions. 137 * 138 * Contacts the packet server to return the appropriate packet. 139 * 140 * @param[in] phone The packet server module phone. 141 * @param[in] addr_len The source and destination addresses maximal length in 142 * bytes. 143 * @param[in] max_prefix The maximal prefix length in bytes. 144 * @param[in] max_content The maximal content length in bytes. 145 * @param[in] max_suffix The maximal suffix length in bytes. 146 * @return The packet reference. 147 * @return NULL on error. 148 */ 149 packet_t *packet_get_4_remote(int phone, size_t max_content, size_t addr_len, 150 size_t max_prefix, size_t max_suffix) 151 { 140 /** Obtain the packet of given dimensions. 141 * 142 * Contact the packet server to return the appropriate packet. 143 * 144 * @param[in] sess Packet server module session. 145 * @param[in] addr_len Source and destination addresses maximal length 146 * in bytes. 147 * @param[in] max_prefix Maximal prefix length in bytes. 148 * @param[in] max_content Maximal content length in bytes. 149 * @param[in] max_suffix Maximal suffix length in bytes. 150 * 151 * @return The packet reference. 152 * @return NULL on error. 153 * 154 */ 155 packet_t *packet_get_4_remote(async_sess_t *sess, size_t max_content, 156 size_t addr_len, size_t max_prefix, size_t max_suffix) 157 { 158 async_exch_t *exch = async_exchange_begin(sess); 152 159 sysarg_t packet_id; 153 160 sysarg_t size; 154 int rc; 155 156 rc = async_req_4_2(phone, NET_PACKET_CREATE_4, max_content, addr_len, 161 int rc = async_req_4_2(exch, NET_PACKET_CREATE_4, max_content, addr_len, 157 162 max_prefix, max_suffix, &packet_id, &size); 163 async_exchange_end(exch); 164 158 165 if (rc != EOK) 159 166 return NULL; 160 167 161 162 168 packet_t *packet = pm_find(packet_id); 163 169 if (!packet) { 164 rc = packet_return( phone, &packet, packet_id, size);170 rc = packet_return(sess, &packet, packet_id, size); 165 171 if (rc != EOK) 166 172 return NULL; … … 170 176 } 171 177 172 /** Obtains the packet of the given content size. 173 * 174 * Contacts the packet server to return the appropriate packet. 175 * 176 * @param[in] phone The packet server module phone. 177 * @param[in] content The maximal content length in bytes. 178 * @return The packet reference. 179 * @return NULL on error. 180 */ 181 packet_t *packet_get_1_remote(int phone, size_t content) 182 { 178 /** Obtain the packet of given content size. 179 * 180 * Contact the packet server to return the appropriate packet. 181 * 182 * @param[in] sess Packet server module session. 183 * @param[in] content Maximal content length in bytes. 184 * 185 * @return The packet reference. 186 * @return NULL on error. 187 * 188 */ 189 packet_t *packet_get_1_remote(async_sess_t *sess, size_t content) 190 { 191 async_exch_t *exch = async_exchange_begin(sess); 183 192 sysarg_t packet_id; 184 193 sysarg_t size; 185 int rc; 186 187 rc = async_req_1_2(phone, NET_PACKET_CREATE_1, content, &packet_id, 194 int rc = async_req_1_2(exch, NET_PACKET_CREATE_1, content, &packet_id, 188 195 &size); 196 async_exchange_end(exch); 197 189 198 if (rc != EOK) 190 199 return NULL; … … 192 201 packet_t *packet = pm_find(packet_id); 193 202 if (!packet) { 194 rc = packet_return( phone, &packet, packet_id, size);203 rc = packet_return(sess, &packet, packet_id, size); 195 204 if (rc != EOK) 196 205 return NULL; … … 200 209 } 201 210 202 /** Release sthe packet queue.211 /** Release the packet queue. 203 212 * 204 213 * All packets in the queue are marked as free for use. … … 207 216 * received or obtained again. 208 217 * 209 * @param[in] phone The packet server module phone. 210 * @param[in] packet_id The packet identifier. 211 */ 212 void pq_release_remote(int phone, packet_id_t packet_id) 213 { 214 async_msg_1(phone, NET_PACKET_RELEASE, packet_id); 218 * @param[in] sess Packet server module session. 219 * @param[in] packet_id Packet identifier. 220 * 221 */ 222 void pq_release_remote(async_sess_t *sess, packet_id_t packet_id) 223 { 224 async_exch_t *exch = async_exchange_begin(sess); 225 async_msg_1(exch, NET_PACKET_RELEASE, packet_id); 226 async_exchange_end(exch); 215 227 } 216 228
Note:
See TracChangeset
for help on using the changeset viewer.