Changes in uspace/srv/net/nil/eth/eth.c [4ee7364:8d7ec69d] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/nil/eth/eth.c
r4ee7364 r8d7ec69d 48 48 #include <ipc/net.h> 49 49 #include <ipc/services.h> 50 #include <loc.h> 50 51 #include <net/modules.h> 51 52 #include <net_checksum.h> … … 169 170 INT_MAP_IMPLEMENT(eth_protos, eth_proto_t); 170 171 171 int nil_device_state_msg_local(nic_device_id_t device_id, sysarg_t state) 172 static void eth_nic_cb_connection(ipc_callid_t iid, ipc_call_t *icall, 173 void *arg); 174 175 static int eth_device_state(nic_device_id_t device_id, sysarg_t state) 172 176 { 173 177 int index; … … 226 230 * 227 231 * @param[in] device_id New device identifier. 228 * @param[in] handle Device driver handle.232 * @param[in] sid NIC service ID. 229 233 * @param[in] mtu Device maximum transmission unit. 230 234 * … … 234 238 * 235 239 */ 236 static int eth_device_message(nic_device_id_t device_id, devman_handle_t handle,240 static int eth_device_message(nic_device_id_t device_id, service_id_t sid, 237 241 size_t mtu) 238 242 { … … 259 263 device = eth_devices_find(ð_globals.devices, device_id); 260 264 if (device) { 261 if (device-> handle != handle) {265 if (device->sid != sid) { 262 266 printf("Device %d already exists\n", device->device_id); 263 267 fibril_rwlock_write_unlock(ð_globals.devices_lock); … … 298 302 299 303 device->device_id = device_id; 300 device-> handle = handle;304 device->sid = sid; 301 305 device->flags = 0; 302 306 if ((mtu > 0) && (mtu <= ETH_MAX_TAGGED_CONTENT(device->flags))) … … 335 339 336 340 /* Bind the device driver */ 337 device->sess = devman_device_connect(EXCHANGE_SERIALIZE, handle,341 device->sess = loc_service_connect(EXCHANGE_SERIALIZE, sid, 338 342 IPC_FLAG_BLOCKING); 339 343 if (device->sess == NULL) { … … 343 347 } 344 348 345 nic_connect_to_nil(device->sess, SERVICE_ETHERNET, device_id); 349 rc = nic_callback_create(device->sess, device_id, 350 eth_nic_cb_connection, NULL); 351 if (rc != EOK) { 352 fibril_rwlock_write_unlock(ð_globals.devices_lock); 353 async_hangup(device->sess); 354 free(device); 355 return EIO; 356 } 346 357 347 358 /* Get hardware address */ … … 362 373 } 363 374 364 printf("%s: Device registered (id: %d, handle: %zu: mtu: %zu, "375 printf("%s: Device registered (id: %d, sid: %zu: mtu: %zu, " 365 376 "mac: " PRIMAC ", flags: 0x%x)\n", NAME, 366 device->device_id, device-> handle, device->mtu,377 device->device_id, device->sid, device->mtu, 367 378 ARGSMAC(device->addr.address), device->flags); 368 379 … … 802 813 next = tmp; 803 814 } else { 815 nic_send_frame(device->sess, packet_get_data(next), 816 packet_get_data_length(next)); 804 817 next = pq_next(next); 805 818 } 806 819 } while (next); 807 820 808 /* Send packet queue */ 809 if (packet) 810 nic_send_message(device->sess, packet_get_id(packet)); 821 pq_release_remote(eth_globals.net_sess, packet_get_id(packet)); 811 822 812 823 fibril_rwlock_read_unlock(ð_globals.devices_lock); 813 824 return EOK; 825 } 826 827 static int eth_received(nic_device_id_t device_id) 828 { 829 void *data; 830 size_t size; 831 int rc; 832 833 rc = async_data_write_accept(&data, false, 0, 0, 0, &size); 834 if (rc != EOK) { 835 printf("%s: data_write_accept() failed\n", NAME); 836 return rc; 837 } 838 839 packet_t *packet = packet_get_1_remote(eth_globals.net_sess, size); 840 if (packet == NULL) 841 return ENOMEM; 842 843 void *pdata = packet_suffix(packet, size); 844 memcpy(pdata, data, size); 845 free(data); 846 847 return nil_received_msg_local(device_id, packet); 814 848 } 815 849 … … 921 955 922 956 return EOK; 923 case NET_NIL_DEVICE_STATE:924 nil_device_state_msg_local(IPC_GET_DEVICE(*call), IPC_GET_STATE(*call));925 async_answer_0(callid, EOK);926 return EOK;927 case NET_NIL_RECEIVED:928 rc = packet_translate_remote(eth_globals.net_sess, &packet,929 IPC_GET_ARG2(*call));930 if (rc == EOK)931 rc = nil_received_msg_local(IPC_GET_ARG1(*call), packet);932 933 async_answer_0(callid, (sysarg_t) rc);934 return rc;935 case NET_NIL_ADDR_CHANGED:936 rc = eth_addr_changed(IPC_GET_DEVICE(*call));937 async_answer_0(callid, (sysarg_t) rc);938 return rc;939 957 } 940 958 941 959 return ENOTSUP; 960 } 961 962 static void eth_nic_cb_connection(ipc_callid_t iid, ipc_call_t *icall, void *arg) 963 { 964 int rc; 965 966 async_answer_0(iid, EOK); 967 968 while (true) { 969 ipc_call_t call; 970 ipc_callid_t callid = async_get_call(&call); 971 972 if (!IPC_GET_IMETHOD(call)) 973 break; 974 975 switch (IPC_GET_IMETHOD(call)) { 976 case NIC_EV_DEVICE_STATE: 977 rc = eth_device_state(IPC_GET_ARG1(call), 978 IPC_GET_ARG2(call)); 979 async_answer_0(callid, (sysarg_t) rc); 980 break; 981 case NIC_EV_RECEIVED: 982 rc = eth_received(IPC_GET_ARG1(call)); 983 async_answer_0(callid, (sysarg_t) rc); 984 break; 985 case NIC_EV_ADDR_CHANGED: 986 rc = eth_addr_changed(IPC_GET_ARG1(call)); 987 async_answer_0(callid, (sysarg_t) rc); 988 break; 989 default: 990 async_answer_0(callid, ENOTSUP); 991 } 992 } 942 993 } 943 994
Note:
See TracChangeset
for help on using the changeset viewer.