Changes in uspace/srv/net/nil/nildummy/nildummy.c [3cd95ef:ffa2c8ef] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/nil/nildummy/nildummy.c
r3cd95ef rffa2c8ef 41 41 #include <stdio.h> 42 42 #include <str.h> 43 #include <err.h> 44 #include <ipc/ipc.h> 43 #include <ipc/nil.h> 45 44 #include <ipc/net.h> 46 45 #include <ipc/services.h> … … 48 47 #include <net/modules.h> 49 48 #include <net/device.h> 50 #include <netif_interface.h> 51 #include <nil_interface.h> 52 #include <il_interface.h> 49 #include <il_remote.h> 53 50 #include <adt/measured_strings.h> 54 51 #include <net/packet.h> 55 52 #include <packet_remote.h> 56 #include <nil_local.h> 53 #include <netif_remote.h> 54 #include <nil_skel.h> 57 55 58 56 #include "nildummy.h" … … 82 80 int nil_initialize(int net_phone) 83 81 { 84 ERROR_DECLARE;85 86 82 fibril_rwlock_initialize(&nildummy_globals.devices_lock); 87 83 fibril_rwlock_initialize(&nildummy_globals.protos_lock); … … 91 87 nildummy_globals.net_phone = net_phone; 92 88 nildummy_globals.proto.phone = 0; 93 ERROR_CODE= nildummy_devices_initialize(&nildummy_globals.devices);89 int rc = nildummy_devices_initialize(&nildummy_globals.devices); 94 90 95 91 fibril_rwlock_write_unlock(&nildummy_globals.protos_lock); 96 92 fibril_rwlock_write_unlock(&nildummy_globals.devices_lock); 97 93 98 return ERROR_CODE;99 } 100 101 /** Process IPC messages from the registered device driver modules in an102 * infinite loop.103 * 104 * @param[in ] iid The message identifier.105 * @param[in,out] icall The message parameters.94 return rc; 95 } 96 97 /** Process IPC messages from the registered device driver modules 98 * 99 * @param[in] iid Message identifier. 100 * @param[in,out] icall Message parameters. 101 * 106 102 */ 107 103 static void nildummy_receiver(ipc_callid_t iid, ipc_call_t *icall) 108 104 { 109 ERROR_DECLARE; 110 111 packet_t packet; 112 105 packet_t *packet; 106 int rc; 107 113 108 while (true) { 114 switch (IPC_GET_ METHOD(*icall)) {109 switch (IPC_GET_IMETHOD(*icall)) { 115 110 case NET_NIL_DEVICE_STATE: 116 ERROR_CODE= nil_device_state_msg_local(0,117 IPC_GET_DEVICE( icall), IPC_GET_STATE(icall));118 ipc_answer_0(iid, (ipcarg_t) ERROR_CODE);111 rc = nil_device_state_msg_local(0, 112 IPC_GET_DEVICE(*icall), IPC_GET_STATE(*icall)); 113 async_answer_0(iid, (sysarg_t) rc); 119 114 break; 120 115 121 116 case NET_NIL_RECEIVED: 122 if (ERROR_NONE(packet_translate_remote(123 nildummy_globals.net_phone, &packet,124 IPC_GET_PACKET(icall)))) {125 ERROR_CODE= nil_received_msg_local(0,126 IPC_GET_DEVICE( icall), packet, 0);127 }128 ipc_answer_0(iid, (ipcarg_t) ERROR_CODE);117 rc = packet_translate_remote(nildummy_globals.net_phone, 118 &packet, IPC_GET_PACKET(*icall)); 119 if (rc == EOK) 120 rc = nil_received_msg_local(0, 121 IPC_GET_DEVICE(*icall), packet, 0); 122 123 async_answer_0(iid, (sysarg_t) rc); 129 124 break; 130 125 131 126 default: 132 ipc_answer_0(iid, (ipcarg_t) ENOTSUP);127 async_answer_0(iid, (sysarg_t) ENOTSUP); 133 128 } 134 129 … … 141 136 * Determine the device local hardware address. 142 137 * 143 * @param[in] device_id The new device identifier. 144 * @param[in] service The device driver service. 145 * @param[in] mtu The device maximum transmission unit. 146 * @returns EOK on success. 147 * @returns EEXIST if the device with the different service exists. 148 * @returns ENOMEM if there is not enough memory left. 149 * @returns Other error codes as defined for the 150 * netif_bind_service() function. 151 * @returns Other error codes as defined for the 152 * netif_get_addr_req() function. 153 */ 154 static int 155 nildummy_device_message(device_id_t device_id, services_t service, size_t mtu) 156 { 157 ERROR_DECLARE; 158 159 nildummy_device_ref device; 160 int index; 161 138 * @param[in] device_id New device identifier. 139 * @param[in] service Device driver service. 140 * @param[in] mtu Device maximum transmission unit. 141 * 142 * @return EOK on success. 143 * @return EEXIST if the device with the different service exists. 144 * @return ENOMEM if there is not enough memory left. 145 * @return Other error codes as defined for the 146 * netif_bind_service() function. 147 * @return Other error codes as defined for the 148 * netif_get_addr_req() function. 149 * 150 */ 151 static int nildummy_device_message(device_id_t device_id, services_t service, 152 size_t mtu) 153 { 162 154 fibril_rwlock_write_lock(&nildummy_globals.devices_lock); 163 164 // an existing device? 165 device = nildummy_devices_find(&nildummy_globals.devices, device_id); 155 156 /* An existing device? */ 157 nildummy_device_t *device = 158 nildummy_devices_find(&nildummy_globals.devices, device_id); 166 159 if (device) { 167 160 if (device->service != service) { … … 172 165 } 173 166 174 / / update mtu167 /* Update MTU */ 175 168 if (mtu > 0) 176 169 device->mtu = mtu; … … 178 171 device->mtu = NET_DEFAULT_MTU; 179 172 180 printf("Device %d already exists:\tMTU\t= % d\n",173 printf("Device %d already exists:\tMTU\t= %zu\n", 181 174 device->device_id, device->mtu); 182 175 fibril_rwlock_write_unlock(&nildummy_globals.devices_lock); 183 176 184 / / notify the upper layer module177 /* Notify the upper layer module */ 185 178 fibril_rwlock_read_lock(&nildummy_globals.protos_lock); 186 179 if (nildummy_globals.proto.phone) { … … 194 187 } 195 188 196 / / create a new device197 device = (nildummy_device_ ref) malloc(sizeof(nildummy_device_t));189 /* Create a new device */ 190 device = (nildummy_device_t *) malloc(sizeof(nildummy_device_t)); 198 191 if (!device) 199 192 return ENOMEM; … … 206 199 device->mtu = NET_DEFAULT_MTU; 207 200 208 / / bind the device driver201 /* Bind the device driver */ 209 202 device->phone = netif_bind_service(device->service, device->device_id, 210 203 SERVICE_ETHERNET, nildummy_receiver); … … 215 208 } 216 209 217 // get hardware address 218 if (ERROR_OCCURRED(netif_get_addr_req(device->phone, device->device_id, 219 &device->addr, &device->addr_data))) { 210 /* Get hardware address */ 211 int rc = netif_get_addr_req(device->phone, device->device_id, 212 &device->addr, &device->addr_data); 213 if (rc != EOK) { 220 214 fibril_rwlock_write_unlock(&nildummy_globals.devices_lock); 221 215 free(device); 222 return ERROR_CODE;223 } 224 225 / / add to the cache226 in dex = nildummy_devices_add(&nildummy_globals.devices,216 return rc; 217 } 218 219 /* Add to the cache */ 220 int index = nildummy_devices_add(&nildummy_globals.devices, 227 221 device->device_id, device); 228 222 if (index < 0) { … … 234 228 } 235 229 236 printf("%s: Device registered (id: %d, service: %d, mtu: % d)\n",230 printf("%s: Device registered (id: %d, service: %d, mtu: %zu)\n", 237 231 NAME, device->device_id, device->service, device->mtu); 238 232 fibril_rwlock_write_unlock(&nildummy_globals.devices_lock); … … 242 236 /** Return the device hardware address. 243 237 * 244 * @param[in] device_id The device identifier. 245 * @param[out] address The device hardware address. 246 * @return EOK on success. 247 * @return EBADMEM if the address parameter is NULL. 248 * @return ENOENT if there no such device. 249 * 250 */ 251 static int 252 nildummy_addr_message(device_id_t device_id, measured_string_ref *address) 253 { 254 nildummy_device_ref device; 255 238 * @param[in] device_id Device identifier. 239 * @param[out] address Device hardware address. 240 * 241 * @return EOK on success. 242 * @return EBADMEM if the address parameter is NULL. 243 * @return ENOENT if there no such device. 244 * 245 */ 246 static int nildummy_addr_message(device_id_t device_id, 247 measured_string_t **address) 248 { 256 249 if (!address) 257 250 return EBADMEM; 258 251 259 252 fibril_rwlock_read_lock(&nildummy_globals.devices_lock); 260 device = nildummy_devices_find(&nildummy_globals.devices, device_id); 253 254 nildummy_device_t *device = 255 nildummy_devices_find(&nildummy_globals.devices, device_id); 261 256 if (!device) { 262 257 fibril_rwlock_read_unlock(&nildummy_globals.devices_lock); 263 258 return ENOENT; 264 259 } 260 265 261 *address = device->addr; 262 266 263 fibril_rwlock_read_unlock(&nildummy_globals.devices_lock); 267 264 … … 271 268 /** Return the device packet dimensions for sending. 272 269 * 273 * @param[in] device_id The device identifier.274 * @param[out] addr_len The minimum reserved address length.275 * @param[out] prefix The minimum reserved prefix size.276 * @param[out] content The maximum content size.277 * @param[out] suffix The minimum reserved suffix size.278 * @return EOK on success.279 * @return EBADMEM if either one of the parameters is NULL.280 * @return ENOENT if there is no such device.281 * 282 * /283 static int 284 nildummy_packet_space_message(device_id_t device_id, size_t *addr_len,270 * @param[in] device_id Device identifier. 271 * @param[out] addr_len Minimum reserved address length. 272 * @param[out] prefix Minimum reserved prefix size. 273 * @param[out] content Maximum content size. 274 * @param[out] suffix Minimum reserved suffix size. 275 * 276 * @return EOK on success. 277 * @return EBADMEM if either one of the parameters is NULL. 278 * @return ENOENT if there is no such device. 279 * 280 */ 281 static int nildummy_packet_space_message(device_id_t device_id, size_t *addr_len, 285 282 size_t *prefix, size_t *content, size_t *suffix) 286 283 { 287 nildummy_device_ref device; 288 289 if (!addr_len || !prefix || !content || !suffix) 284 if ((!addr_len) || (!prefix) || (!content) || (!suffix)) 290 285 return EBADMEM; 291 286 292 287 fibril_rwlock_read_lock(&nildummy_globals.devices_lock); 293 device = nildummy_devices_find(&nildummy_globals.devices, device_id); 288 289 nildummy_device_t *device = 290 nildummy_devices_find(&nildummy_globals.devices, device_id); 294 291 if (!device) { 295 292 fibril_rwlock_read_unlock(&nildummy_globals.devices_lock); 296 293 return ENOENT; 297 294 } 295 298 296 *content = device->mtu; 297 299 298 fibril_rwlock_read_unlock(&nildummy_globals.devices_lock); 300 299 … … 305 304 } 306 305 307 int 308 nil_received_msg_local(int nil_phone, device_id_t device_id, packet_t packet, 309 services_t target) 310 { 311 packet_t next; 312 306 int nil_received_msg_local(int nil_phone, device_id_t device_id, 307 packet_t *packet, services_t target) 308 { 313 309 fibril_rwlock_read_lock(&nildummy_globals.protos_lock); 310 314 311 if (nildummy_globals.proto.phone) { 315 312 do { 316 next = pq_detach(packet);313 packet_t *next = pq_detach(packet); 317 314 il_received_msg(nildummy_globals.proto.phone, device_id, 318 315 packet, nildummy_globals.proto.service); 319 316 packet = next; 320 } while(packet); 321 } 317 } while (packet); 318 } 319 322 320 fibril_rwlock_read_unlock(&nildummy_globals.protos_lock); 323 321 … … 329 327 * Pass received packets for this service. 330 328 * 331 * @param[in] service The module service. 332 * @param[in] phone The service phone. 333 * @return EOK on success. 334 * @return ENOENT if the service is not known. 335 * @return ENOMEM if there is not enough memory left. 329 * @param[in] service Module service. 330 * @param[in] phone Service phone. 331 * 332 * @return EOK on success. 333 * @return ENOENT if the service is not known. 334 * @return ENOMEM if there is not enough memory left. 335 * 336 336 */ 337 337 static int nildummy_register_message(services_t service, int phone) … … 350 350 /** Send the packet queue. 351 351 * 352 * @param[in] device_id The device identifier.353 * @param[in] packet The packet queue.354 * @param[in] sender The sending module service.355 * @return EOK on success.356 * @return ENOENT if there no such device.357 * @return EINVAL if the service parameter is not known.358 * /359 static int 360 nildummy_send_message(device_id_t device_id, packet_t packet, services_t sender) 361 { 362 nildummy_device_ref device; 363 352 * @param[in] device_id Device identifier. 353 * @param[in] packet Packet queue. 354 * @param[in] sender Sending module service. 355 * 356 * @return EOK on success. 357 * @return ENOENT if there no such device. 358 * @return EINVAL if the service parameter is not known. 359 * 360 */ 361 static int nildummy_send_message(device_id_t device_id, packet_t *packet, 362 services_t sender) 363 { 364 364 fibril_rwlock_read_lock(&nildummy_globals.devices_lock); 365 device = nildummy_devices_find(&nildummy_globals.devices, device_id); 365 366 nildummy_device_t *device = 367 nildummy_devices_find(&nildummy_globals.devices, device_id); 366 368 if (!device) { 367 369 fibril_rwlock_read_unlock(&nildummy_globals.devices_lock); 368 370 return ENOENT; 369 371 } 370 // send packet queue 372 373 /* Send packet queue */ 371 374 if (packet) 372 375 netif_send_msg(device->phone, device_id, packet, 373 376 SERVICE_NILDUMMY); 377 374 378 fibril_rwlock_read_unlock(&nildummy_globals.devices_lock); 375 return EOK; 376 } 377 378 int 379 nil_message_standalone(const char *name, ipc_callid_t callid, ipc_call_t *call, 380 ipc_call_t *answer, int *answer_count) 381 { 382 ERROR_DECLARE; 383 384 measured_string_ref address; 385 packet_t packet; 379 380 return EOK; 381 } 382 383 int nil_module_message(ipc_callid_t callid, ipc_call_t *call, 384 ipc_call_t *answer, size_t *answer_count) 385 { 386 measured_string_t *address; 387 packet_t *packet; 386 388 size_t addrlen; 387 389 size_t prefix; 388 390 size_t suffix; 389 391 size_t content; 392 int rc; 390 393 391 394 *answer_count = 0; 392 switch (IPC_GET_ METHOD(*call)) {395 switch (IPC_GET_IMETHOD(*call)) { 393 396 case IPC_M_PHONE_HUNGUP: 394 397 return EOK; 395 398 396 399 case NET_NIL_DEVICE: 397 return nildummy_device_message(IPC_GET_DEVICE( call),398 IPC_GET_SERVICE( call), IPC_GET_MTU(call));400 return nildummy_device_message(IPC_GET_DEVICE(*call), 401 IPC_GET_SERVICE(*call), IPC_GET_MTU(*call)); 399 402 400 403 case NET_NIL_SEND: 401 ERROR_PROPAGATE(packet_translate_remote( 402 nildummy_globals.net_phone, &packet, IPC_GET_PACKET(call))); 403 return nildummy_send_message(IPC_GET_DEVICE(call), packet, 404 IPC_GET_SERVICE(call)); 404 rc = packet_translate_remote(nildummy_globals.net_phone, 405 &packet, IPC_GET_PACKET(*call)); 406 if (rc != EOK) 407 return rc; 408 return nildummy_send_message(IPC_GET_DEVICE(*call), packet, 409 IPC_GET_SERVICE(*call)); 405 410 406 411 case NET_NIL_PACKET_SPACE: 407 ERROR_PROPAGATE(nildummy_packet_space_message( 408 IPC_GET_DEVICE(call), &addrlen, &prefix, &content, 409 &suffix)); 410 IPC_SET_ADDR(answer, addrlen); 411 IPC_SET_PREFIX(answer, prefix); 412 IPC_SET_CONTENT(answer, content); 413 IPC_SET_SUFFIX(answer, suffix); 412 rc = nildummy_packet_space_message(IPC_GET_DEVICE(*call), 413 &addrlen, &prefix, &content, &suffix); 414 if (rc != EOK) 415 return rc; 416 IPC_SET_ADDR(*answer, addrlen); 417 IPC_SET_PREFIX(*answer, prefix); 418 IPC_SET_CONTENT(*answer, content); 419 IPC_SET_SUFFIX(*answer, suffix); 414 420 *answer_count = 4; 415 421 return EOK; 416 422 417 423 case NET_NIL_ADDR: 418 ERROR_PROPAGATE(nildummy_addr_message(IPC_GET_DEVICE(call), 419 &address)); 424 rc = nildummy_addr_message(IPC_GET_DEVICE(*call), &address); 425 if (rc != EOK) 426 return rc; 420 427 return measured_strings_reply(address, 1); 421 428 422 429 case NET_NIL_BROADCAST_ADDR: 423 ERROR_PROPAGATE(nildummy_addr_message(IPC_GET_DEVICE(call), 424 &address)); 430 rc = nildummy_addr_message(IPC_GET_DEVICE(*call), &address); 431 if (rc != EOK) 432 return rc; 425 433 return measured_strings_reply(address, 1); 426 434 427 435 case IPC_M_CONNECT_TO_ME: 428 return nildummy_register_message(NIL_GET_PROTO( call),429 IPC_GET_PHONE( call));436 return nildummy_register_message(NIL_GET_PROTO(*call), 437 IPC_GET_PHONE(*call)); 430 438 } 431 439 … … 433 441 } 434 442 435 /** Default thread for new connections.436 *437 * @param[in] iid The initial message identifier.438 * @param[in] icall The initial message call structure.439 */440 static void nil_client_connection(ipc_callid_t iid, ipc_call_t *icall)441 {442 /*443 * Accept the connection444 * - Answer the first IPC_M_CONNECT_ME_TO call.445 */446 ipc_answer_0(iid, EOK);447 448 while (true) {449 ipc_call_t answer;450 int answer_count;451 452 /* Clear the answer structure */453 refresh_answer(&answer, &answer_count);454 455 /* Fetch the next message */456 ipc_call_t call;457 ipc_callid_t callid = async_get_call(&call);458 459 /* Process the message */460 int res = nil_module_message_standalone(NAME, callid, &call,461 &answer, &answer_count);462 463 /*464 * End if told to either by the message or the processing465 * result.466 */467 if ((IPC_GET_METHOD(call) == IPC_M_PHONE_HUNGUP) ||468 (res == EHANGUP))469 return;470 471 /* Answer the message */472 answer_call(callid, res, &answer, answer_count);473 }474 }475 476 443 int main(int argc, char *argv[]) 477 444 { 478 ERROR_DECLARE;479 480 445 /* Start the module */ 481 ERROR_PROPAGATE(nil_module_start_standalone(nil_client_connection)); 482 return EOK; 446 return nil_module_start(SERVICE_NILDUMMY); 483 447 } 484 448
Note:
See TracChangeset
for help on using the changeset viewer.