Changeset 357b5f5 in mainline for uspace/srv/net/nil/eth/eth.c
- Timestamp:
- 2011-01-23T20:09:13Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- fdb9982c
- Parents:
- cead2aa (diff), 7e36c8d (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/srv/net/nil/eth/eth.c
rcead2aa r357b5f5 45 45 46 46 #include <ipc/ipc.h> 47 #include <ipc/nil.h> 47 48 #include <ipc/net.h> 48 49 #include <ipc/services.h> … … 54 55 #include <protocol_map.h> 55 56 #include <net/device.h> 56 #include <netif_ interface.h>57 #include <netif_remote.h> 57 58 #include <net_interface.h> 58 #include <nil_interface.h> 59 #include <il_interface.h> 59 #include <il_remote.h> 60 60 #include <adt/measured_strings.h> 61 61 #include <packet_client.h> 62 62 #include <packet_remote.h> 63 #include <nil_ local.h>63 #include <nil_skel.h> 64 64 65 65 #include "eth.h" 66 #include "eth_header.h"67 66 68 67 /** The module name. */ … … 72 71 #define ETH_PREFIX \ 73 72 (sizeof(eth_header_t) + sizeof(eth_header_lsap_t) + \ 74 sizeof(eth_header_snap_t))73 sizeof(eth_header_snap_t)) 75 74 76 75 /** Reserved packet suffix length. */ 77 #define ETH_SUFFIX \ 78 sizeof(eth_fcs_t) 76 #define ETH_SUFFIX (sizeof(eth_fcs_t)) 79 77 80 78 /** Maximum packet content length. */ 81 #define ETH_MAX_CONTENT 1500u79 #define ETH_MAX_CONTENT 1500u 82 80 83 81 /** Minimum packet content length. */ 84 #define ETH_MIN_CONTENT 46u82 #define ETH_MIN_CONTENT 46u 85 83 86 84 /** Maximum tagged packet content length. */ 87 85 #define ETH_MAX_TAGGED_CONTENT(flags) \ 88 86 (ETH_MAX_CONTENT - \ 89 ((IS_8023_2_LSAP(flags) || IS_8023_2_SNAP(flags)) ? \90 sizeof(eth_header_lsap_t) : 0) - \91 (IS_8023_2_SNAP(flags) ? sizeof(eth_header_snap_t) : 0))87 ((IS_8023_2_LSAP(flags) || IS_8023_2_SNAP(flags)) ? \ 88 sizeof(eth_header_lsap_t) : 0) - \ 89 (IS_8023_2_SNAP(flags) ? sizeof(eth_header_snap_t) : 0)) 92 90 93 91 /** Minimum tagged packet content length. */ 94 92 #define ETH_MIN_TAGGED_CONTENT(flags) \ 95 93 (ETH_MIN_CONTENT - \ 96 ((IS_8023_2_LSAP(flags) || IS_8023_2_SNAP(flags)) ? \97 sizeof(eth_header_lsap_t) : 0) - \98 (IS_8023_2_SNAP(flags) ? sizeof(eth_header_snap_t) : 0))94 ((IS_8023_2_LSAP(flags) || IS_8023_2_SNAP(flags)) ? \ 95 sizeof(eth_header_lsap_t) : 0) - \ 96 (IS_8023_2_SNAP(flags) ? sizeof(eth_header_snap_t) : 0)) 99 97 100 98 /** Dummy flag shift value. */ 101 #define ETH_DUMMY_SHIFT 99 #define ETH_DUMMY_SHIFT 0 102 100 103 101 /** Mode flag shift value. */ 104 #define ETH_MODE_SHIFT 102 #define ETH_MODE_SHIFT 1 105 103 106 104 /** Dummy device flag. 107 105 * Preamble and FCS are mandatory part of the packets. 108 106 */ 109 #define ETH_DUMMY 107 #define ETH_DUMMY (1 << ETH_DUMMY_SHIFT) 110 108 111 109 /** Returns the dummy flag. 112 110 * @see ETH_DUMMY 113 111 */ 114 #define IS_DUMMY(flags) 112 #define IS_DUMMY(flags) ((flags) & ETH_DUMMY) 115 113 116 114 /** Device mode flags. … … 119 117 * @see ETH_8023_2_SNAP 120 118 */ 121 #define ETH_MODE_MASK 119 #define ETH_MODE_MASK (3 << ETH_MODE_SHIFT) 122 120 123 121 /** DIX Ethernet mode flag. */ 124 #define ETH_DIX 125 126 /** Return swhether the DIX Ethernet mode flag is set.127 * 128 * @param[in] flags The ethernet flags.122 #define ETH_DIX (1 << ETH_MODE_SHIFT) 123 124 /** Return whether the DIX Ethernet mode flag is set. 125 * 126 * @param[in] flags Ethernet flags. 129 127 * @see ETH_DIX 130 */ 131 #define IS_DIX(flags) (((flags) & ETH_MODE_MASK) == ETH_DIX) 128 * 129 */ 130 #define IS_DIX(flags) (((flags) & ETH_MODE_MASK) == ETH_DIX) 132 131 133 132 /** 802.3 + 802.2 + LSAP mode flag. */ 134 #define ETH_8023_2_LSAP 135 136 /** Return swhether the 802.3 + 802.2 + LSAP mode flag is set.137 * 138 * @param[in] flags The ethernet flags.133 #define ETH_8023_2_LSAP (2 << ETH_MODE_SHIFT) 134 135 /** Return whether the 802.3 + 802.2 + LSAP mode flag is set. 136 * 137 * @param[in] flags Ethernet flags. 139 138 * @see ETH_8023_2_LSAP 140 */ 141 #define IS_8023_2_LSAP(flags) (((flags) & ETH_MODE_MASK) == ETH_8023_2_LSAP) 139 * 140 */ 141 #define IS_8023_2_LSAP(flags) (((flags) & ETH_MODE_MASK) == ETH_8023_2_LSAP) 142 142 143 143 /** 802.3 + 802.2 + LSAP + SNAP mode flag. */ 144 #define ETH_8023_2_SNAP 145 146 /** Return swhether the 802.3 + 802.2 + LSAP + SNAP mode flag is set.147 * 148 * @param[in] flags The ethernet flags.144 #define ETH_8023_2_SNAP (3 << ETH_MODE_SHIFT) 145 146 /** Return whether the 802.3 + 802.2 + LSAP + SNAP mode flag is set. 147 * 148 * @param[in] flags Ethernet flags. 149 149 * @see ETH_8023_2_SNAP 150 */ 151 #define IS_8023_2_SNAP(flags) (((flags) & ETH_MODE_MASK) == ETH_8023_2_SNAP) 150 * 151 */ 152 #define IS_8023_2_SNAP(flags) (((flags) & ETH_MODE_MASK) == ETH_8023_2_SNAP) 152 153 153 154 /** Type definition of the ethernet address type. … … 201 202 202 203 eth_globals.broadcast_addr = 203 measured_string_create_bulk("\xFF\xFF\xFF\xFF\xFF\xFF", 204 CONVERT_SIZE(uint8_t, char, ETH_ADDR)); 204 measured_string_create_bulk((uint8_t *) "\xFF\xFF\xFF\xFF\xFF\xFF", ETH_ADDR); 205 205 if (!eth_globals.broadcast_addr) { 206 206 rc = ENOMEM; … … 238 238 239 239 while (true) { 240 switch (IPC_GET_ METHOD(*icall)) {240 switch (IPC_GET_IMETHOD(*icall)) { 241 241 case NET_NIL_DEVICE_STATE: 242 nil_device_state_msg_local(0, IPC_GET_DEVICE( icall),243 IPC_GET_STATE( icall));242 nil_device_state_msg_local(0, IPC_GET_DEVICE(*icall), 243 IPC_GET_STATE(*icall)); 244 244 ipc_answer_0(iid, EOK); 245 245 break; 246 246 case NET_NIL_RECEIVED: 247 247 rc = packet_translate_remote(eth_globals.net_phone, 248 &packet, IPC_GET_PACKET( icall));249 if (rc == EOK) {248 &packet, IPC_GET_PACKET(*icall)); 249 if (rc == EOK) 250 250 rc = nil_received_msg_local(0, 251 IPC_GET_DEVICE( icall), packet, 0);252 }253 ipc_answer_0(iid, ( ipcarg_t) rc);251 IPC_GET_DEVICE(*icall), packet, 0); 252 253 ipc_answer_0(iid, (sysarg_t) rc); 254 254 break; 255 255 default: 256 ipc_answer_0(iid, ( ipcarg_t) ENOTSUP);256 ipc_answer_0(iid, (sysarg_t) ENOTSUP); 257 257 } 258 258 … … 285 285 measured_string_t names[2] = { 286 286 { 287 ( char*) "ETH_MODE",287 (uint8_t *) "ETH_MODE", 288 288 8 289 289 }, 290 290 { 291 ( char*) "ETH_DUMMY",291 (uint8_t *) "ETH_DUMMY", 292 292 9 293 293 } … … 295 295 measured_string_t *configuration; 296 296 size_t count = sizeof(names) / sizeof(measured_string_t); 297 char*data;297 uint8_t *data; 298 298 eth_proto_t *proto; 299 299 int rc; … … 359 359 360 360 if (configuration) { 361 if (!str_lcmp( configuration[0].value, "DIX",361 if (!str_lcmp((char *) configuration[0].value, "DIX", 362 362 configuration[0].length)) { 363 363 device->flags |= ETH_DIX; 364 } else if(!str_lcmp( configuration[0].value, "8023_2_LSAP",364 } else if(!str_lcmp((char *) configuration[0].value, "8023_2_LSAP", 365 365 configuration[0].length)) { 366 366 device->flags |= ETH_8023_2_LSAP; … … 408 408 409 409 printf("%s: Device registered (id: %d, service: %d: mtu: %zu, " 410 "mac: % x:%x:%x:%x:%x:%x, flags: 0x%x)\n",410 "mac: %02x:%02x:%02x:%02x:%02x:%02x, flags: 0x%x)\n", 411 411 NAME, device->device_id, device->service, device->mtu, 412 412 device->addr_data[0], device->addr_data[1], … … 837 837 } 838 838 839 int nil_m essage_standalone(const char *name, ipc_callid_t callid,840 ipc_call_t * call, ipc_call_t *answer, int *answer_count)839 int nil_module_message(ipc_callid_t callid, ipc_call_t *call, 840 ipc_call_t *answer, size_t *answer_count) 841 841 { 842 842 measured_string_t *address; … … 849 849 850 850 *answer_count = 0; 851 switch (IPC_GET_ METHOD(*call)) {851 switch (IPC_GET_IMETHOD(*call)) { 852 852 case IPC_M_PHONE_HUNGUP: 853 853 return EOK; 854 854 855 855 case NET_NIL_DEVICE: 856 return eth_device_message(IPC_GET_DEVICE( call),857 IPC_GET_SERVICE( call), IPC_GET_MTU(call));856 return eth_device_message(IPC_GET_DEVICE(*call), 857 IPC_GET_SERVICE(*call), IPC_GET_MTU(*call)); 858 858 case NET_NIL_SEND: 859 859 rc = packet_translate_remote(eth_globals.net_phone, &packet, 860 IPC_GET_PACKET( call));860 IPC_GET_PACKET(*call)); 861 861 if (rc != EOK) 862 862 return rc; 863 return eth_send_message(IPC_GET_DEVICE( call), packet,864 IPC_GET_SERVICE( call));863 return eth_send_message(IPC_GET_DEVICE(*call), packet, 864 IPC_GET_SERVICE(*call)); 865 865 case NET_NIL_PACKET_SPACE: 866 rc = eth_packet_space_message(IPC_GET_DEVICE( call), &addrlen,866 rc = eth_packet_space_message(IPC_GET_DEVICE(*call), &addrlen, 867 867 &prefix, &content, &suffix); 868 868 if (rc != EOK) 869 869 return rc; 870 IPC_SET_ADDR( answer, addrlen);871 IPC_SET_PREFIX( answer, prefix);872 IPC_SET_CONTENT( answer, content);873 IPC_SET_SUFFIX( answer, suffix);870 IPC_SET_ADDR(*answer, addrlen); 871 IPC_SET_PREFIX(*answer, prefix); 872 IPC_SET_CONTENT(*answer, content); 873 IPC_SET_SUFFIX(*answer, suffix); 874 874 *answer_count = 4; 875 875 return EOK; 876 876 case NET_NIL_ADDR: 877 rc = eth_addr_message(IPC_GET_DEVICE( call), ETH_LOCAL_ADDR,877 rc = eth_addr_message(IPC_GET_DEVICE(*call), ETH_LOCAL_ADDR, 878 878 &address); 879 879 if (rc != EOK) … … 881 881 return measured_strings_reply(address, 1); 882 882 case NET_NIL_BROADCAST_ADDR: 883 rc = eth_addr_message(IPC_GET_DEVICE( call), ETH_BROADCAST_ADDR,883 rc = eth_addr_message(IPC_GET_DEVICE(*call), ETH_BROADCAST_ADDR, 884 884 &address); 885 885 if (rc != EOK) … … 887 887 return measured_strings_reply(address, 1); 888 888 case IPC_M_CONNECT_TO_ME: 889 return eth_register_message(NIL_GET_PROTO( call),890 IPC_GET_PHONE( call));889 return eth_register_message(NIL_GET_PROTO(*call), 890 IPC_GET_PHONE(*call)); 891 891 } 892 892 … … 894 894 } 895 895 896 /** Default thread for new connections.897 *898 * @param[in] iid The initial message identifier.899 * @param[in] icall The initial message call structure.900 */901 static void nil_client_connection(ipc_callid_t iid, ipc_call_t *icall)902 {903 /*904 * Accept the connection905 * - Answer the first IPC_M_CONNECT_ME_TO call.906 */907 ipc_answer_0(iid, EOK);908 909 while (true) {910 ipc_call_t answer;911 int answer_count;912 913 /* Clear the answer structure */914 refresh_answer(&answer, &answer_count);915 916 /* Fetch the next message */917 ipc_call_t call;918 ipc_callid_t callid = async_get_call(&call);919 920 /* Process the message */921 int res = nil_module_message_standalone(NAME, callid, &call,922 &answer, &answer_count);923 924 /*925 * End if told to either by the message or the processing926 * result.927 */928 if ((IPC_GET_METHOD(call) == IPC_M_PHONE_HUNGUP) ||929 (res == EHANGUP))930 return;931 932 /* Answer the message */933 answer_call(callid, res, &answer, answer_count);934 }935 }936 937 896 int main(int argc, char *argv[]) 938 897 { 939 int rc;940 941 898 /* Start the module */ 942 rc = nil_module_start_standalone(nil_client_connection); 943 return rc; 899 return nil_module_start(SERVICE_ETHERNET); 944 900 } 945 901
Note:
See TracChangeset
for help on using the changeset viewer.