Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/net/nil/eth/eth.c

    r7e752b2 rffa2c8ef  
    4343#include <str.h>
    4444#include <errno.h>
    45 
    46 #include <ipc/ipc.h>
     45#include <ipc/nil.h>
    4746#include <ipc/net.h>
    4847#include <ipc/services.h>
    49 
    5048#include <net/modules.h>
    5149#include <net_checksum.h>
     
    5452#include <protocol_map.h>
    5553#include <net/device.h>
    56 #include <netif_interface.h>
     54#include <netif_remote.h>
    5755#include <net_interface.h>
    58 #include <nil_interface.h>
    59 #include <il_interface.h>
     56#include <il_remote.h>
    6057#include <adt/measured_strings.h>
    6158#include <packet_client.h>
    6259#include <packet_remote.h>
    63 #include <nil_local.h>
     60#include <nil_skel.h>
    6461
    6562#include "eth.h"
    66 #include "eth_header.h"
    6763
    6864/** The module name. */
     
    7268#define ETH_PREFIX \
    7369        (sizeof(eth_header_t) + sizeof(eth_header_lsap_t) + \
    74         sizeof(eth_header_snap_t))
     70            sizeof(eth_header_snap_t))
    7571
    7672/** Reserved packet suffix length. */
    77 #define ETH_SUFFIX \
    78         sizeof(eth_fcs_t)
     73#define ETH_SUFFIX  (sizeof(eth_fcs_t))
    7974
    8075/** Maximum packet content length. */
    81 #define ETH_MAX_CONTENT 1500u
     76#define ETH_MAX_CONTENT  1500u
    8277
    8378/** Minimum packet content length. */
    84 #define ETH_MIN_CONTENT 46u
     79#define ETH_MIN_CONTENT  46u
    8580
    8681/** Maximum tagged packet content length. */
    8782#define ETH_MAX_TAGGED_CONTENT(flags) \
    8883        (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))
     84            ((IS_8023_2_LSAP(flags) || IS_8023_2_SNAP(flags)) ? \
     85            sizeof(eth_header_lsap_t) : 0) - \
     86            (IS_8023_2_SNAP(flags) ? sizeof(eth_header_snap_t) : 0))
    9287
    9388/** Minimum tagged packet content length. */
    9489#define ETH_MIN_TAGGED_CONTENT(flags) \
    9590        (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))
     91            ((IS_8023_2_LSAP(flags) || IS_8023_2_SNAP(flags)) ? \
     92            sizeof(eth_header_lsap_t) : 0) - \
     93            (IS_8023_2_SNAP(flags) ? sizeof(eth_header_snap_t) : 0))
    9994
    10095/** Dummy flag shift value. */
    101 #define ETH_DUMMY_SHIFT 0
     96#define ETH_DUMMY_SHIFT  0
    10297
    10398/** Mode flag shift value. */
    104 #define ETH_MODE_SHIFT  1
     99#define ETH_MODE_SHIFT  1
    105100
    106101/** Dummy device flag.
    107102 * Preamble and FCS are mandatory part of the packets.
    108103 */
    109 #define ETH_DUMMY               (1 << ETH_DUMMY_SHIFT)
     104#define ETH_DUMMY  (1 << ETH_DUMMY_SHIFT)
    110105
    111106/** Returns the dummy flag.
    112107 * @see ETH_DUMMY
    113108 */
    114 #define IS_DUMMY(flags)         ((flags) & ETH_DUMMY)
     109#define IS_DUMMY(flags)  ((flags) & ETH_DUMMY)
    115110
    116111/** Device mode flags.
     
    119114 * @see ETH_8023_2_SNAP
    120115 */
    121 #define ETH_MODE_MASK           (3 << ETH_MODE_SHIFT)
     116#define ETH_MODE_MASK  (3 << ETH_MODE_SHIFT)
    122117
    123118/** DIX Ethernet mode flag. */
    124 #define ETH_DIX                 (1 << ETH_MODE_SHIFT)
    125 
    126 /** Returns whether the DIX Ethernet mode flag is set.
    127  *
    128  * @param[in] flags     The ethernet flags.
     119#define ETH_DIX  (1 << ETH_MODE_SHIFT)
     120
     121/** Return whether the DIX Ethernet mode flag is set.
     122 *
     123 * @param[in] flags Ethernet flags.
    129124 * @see ETH_DIX
    130  */
    131 #define IS_DIX(flags)           (((flags) & ETH_MODE_MASK) == ETH_DIX)
     125 *
     126 */
     127#define IS_DIX(flags)  (((flags) & ETH_MODE_MASK) == ETH_DIX)
    132128
    133129/** 802.3 + 802.2 + LSAP mode flag. */
    134 #define ETH_8023_2_LSAP         (2 << ETH_MODE_SHIFT)
    135 
    136 /** Returns whether the 802.3 + 802.2 + LSAP mode flag is set.
    137  *
    138  * @param[in] flags     The ethernet flags.
     130#define ETH_8023_2_LSAP  (2 << ETH_MODE_SHIFT)
     131
     132/** Return whether the 802.3 + 802.2 + LSAP mode flag is set.
     133 *
     134 * @param[in] flags Ethernet flags.
    139135 * @see ETH_8023_2_LSAP
    140  */
    141 #define IS_8023_2_LSAP(flags)   (((flags) & ETH_MODE_MASK) == ETH_8023_2_LSAP)
     136 *
     137 */
     138#define IS_8023_2_LSAP(flags)  (((flags) & ETH_MODE_MASK) == ETH_8023_2_LSAP)
    142139
    143140/** 802.3 + 802.2 + LSAP + SNAP mode flag. */
    144 #define ETH_8023_2_SNAP         (3 << ETH_MODE_SHIFT)
    145 
    146 /** Returns whether the 802.3 + 802.2 + LSAP + SNAP mode flag is set.
    147  *
    148  * @param[in] flags     The ethernet flags.
     141#define ETH_8023_2_SNAP  (3 << ETH_MODE_SHIFT)
     142
     143/** Return whether the 802.3 + 802.2 + LSAP + SNAP mode flag is set.
     144 *
     145 * @param[in] flags Ethernet flags.
    149146 * @see ETH_8023_2_SNAP
    150  */
    151 #define IS_8023_2_SNAP(flags)   (((flags) & ETH_MODE_MASK) == ETH_8023_2_SNAP)
     147 *
     148 */
     149#define IS_8023_2_SNAP(flags)  (((flags) & ETH_MODE_MASK) == ETH_8023_2_SNAP)
    152150
    153151/** Type definition of the ethernet address type.
     
    201199
    202200        eth_globals.broadcast_addr =
    203             measured_string_create_bulk("\xFF\xFF\xFF\xFF\xFF\xFF",
    204             CONVERT_SIZE(uint8_t, char, ETH_ADDR));
     201            measured_string_create_bulk((uint8_t *) "\xFF\xFF\xFF\xFF\xFF\xFF", ETH_ADDR);
    205202        if (!eth_globals.broadcast_addr) {
    206203                rc = ENOMEM;
     
    238235
    239236        while (true) {
    240                 switch (IPC_GET_METHOD(*icall)) {
     237                switch (IPC_GET_IMETHOD(*icall)) {
    241238                case NET_NIL_DEVICE_STATE:
    242                         nil_device_state_msg_local(0, IPC_GET_DEVICE(icall),
    243                             IPC_GET_STATE(icall));
    244                         ipc_answer_0(iid, EOK);
     239                        nil_device_state_msg_local(0, IPC_GET_DEVICE(*icall),
     240                            IPC_GET_STATE(*icall));
     241                        async_answer_0(iid, EOK);
    245242                        break;
    246243                case NET_NIL_RECEIVED:
    247244                        rc = packet_translate_remote(eth_globals.net_phone,
    248                             &packet, IPC_GET_PACKET(icall));
    249                         if (rc == EOK) {
     245                            &packet, IPC_GET_PACKET(*icall));
     246                        if (rc == EOK)
    250247                                rc = nil_received_msg_local(0,
    251                                     IPC_GET_DEVICE(icall), packet, 0);
    252                         }
    253                         ipc_answer_0(iid, (ipcarg_t) rc);
     248                                    IPC_GET_DEVICE(*icall), packet, 0);
     249                       
     250                        async_answer_0(iid, (sysarg_t) rc);
    254251                        break;
    255252                default:
    256                         ipc_answer_0(iid, (ipcarg_t) ENOTSUP);
     253                        async_answer_0(iid, (sysarg_t) ENOTSUP);
    257254                }
    258255               
     
    285282        measured_string_t names[2] = {
    286283                {
    287                         (char *) "ETH_MODE",
     284                        (uint8_t *) "ETH_MODE",
    288285                        8
    289286                },
    290287                {
    291                         (char *) "ETH_DUMMY",
     288                        (uint8_t *) "ETH_DUMMY",
    292289                        9
    293290                }
     
    295292        measured_string_t *configuration;
    296293        size_t count = sizeof(names) / sizeof(measured_string_t);
    297         char *data;
     294        uint8_t *data;
    298295        eth_proto_t *proto;
    299296        int rc;
     
    359356
    360357        if (configuration) {
    361                 if (!str_lcmp(configuration[0].value, "DIX",
     358                if (!str_lcmp((char *) configuration[0].value, "DIX",
    362359                    configuration[0].length)) {
    363360                        device->flags |= ETH_DIX;
    364                 } else if(!str_lcmp(configuration[0].value, "8023_2_LSAP",
     361                } else if(!str_lcmp((char *) configuration[0].value, "8023_2_LSAP",
    365362                    configuration[0].length)) {
    366363                        device->flags |= ETH_8023_2_LSAP;
     
    408405       
    409406        printf("%s: Device registered (id: %d, service: %d: mtu: %zu, "
    410             "mac: %x:%x:%x:%x:%x:%x, flags: 0x%x)\n",
     407            "mac: %02x:%02x:%02x:%02x:%02x:%02x, flags: 0x%x)\n",
    411408            NAME, device->device_id, device->service, device->mtu,
    412409            device->addr_data[0], device->addr_data[1],
     
    837834}
    838835
    839 int nil_message_standalone(const char *name, ipc_callid_t callid,
    840     ipc_call_t *call, ipc_call_t *answer, int *answer_count)
     836int nil_module_message(ipc_callid_t callid, ipc_call_t *call,
     837    ipc_call_t *answer, size_t *answer_count)
    841838{
    842839        measured_string_t *address;
     
    849846       
    850847        *answer_count = 0;
    851         switch (IPC_GET_METHOD(*call)) {
     848        switch (IPC_GET_IMETHOD(*call)) {
    852849        case IPC_M_PHONE_HUNGUP:
    853850                return EOK;
    854851       
    855852        case NET_NIL_DEVICE:
    856                 return eth_device_message(IPC_GET_DEVICE(call),
    857                     IPC_GET_SERVICE(call), IPC_GET_MTU(call));
     853                return eth_device_message(IPC_GET_DEVICE(*call),
     854                    IPC_GET_SERVICE(*call), IPC_GET_MTU(*call));
    858855        case NET_NIL_SEND:
    859856                rc = packet_translate_remote(eth_globals.net_phone, &packet,
    860                     IPC_GET_PACKET(call));
     857                    IPC_GET_PACKET(*call));
    861858                if (rc != EOK)
    862859                        return rc;
    863                 return eth_send_message(IPC_GET_DEVICE(call), packet,
    864                     IPC_GET_SERVICE(call));
     860                return eth_send_message(IPC_GET_DEVICE(*call), packet,
     861                    IPC_GET_SERVICE(*call));
    865862        case NET_NIL_PACKET_SPACE:
    866                 rc = eth_packet_space_message(IPC_GET_DEVICE(call), &addrlen,
     863                rc = eth_packet_space_message(IPC_GET_DEVICE(*call), &addrlen,
    867864                    &prefix, &content, &suffix);
    868865                if (rc != EOK)
    869866                        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);
     867                IPC_SET_ADDR(*answer, addrlen);
     868                IPC_SET_PREFIX(*answer, prefix);
     869                IPC_SET_CONTENT(*answer, content);
     870                IPC_SET_SUFFIX(*answer, suffix);
    874871                *answer_count = 4;
    875872                return EOK;
    876873        case NET_NIL_ADDR:
    877                 rc = eth_addr_message(IPC_GET_DEVICE(call), ETH_LOCAL_ADDR,
     874                rc = eth_addr_message(IPC_GET_DEVICE(*call), ETH_LOCAL_ADDR,
    878875                    &address);
    879876                if (rc != EOK)
     
    881878                return measured_strings_reply(address, 1);
    882879        case NET_NIL_BROADCAST_ADDR:
    883                 rc = eth_addr_message(IPC_GET_DEVICE(call), ETH_BROADCAST_ADDR,
     880                rc = eth_addr_message(IPC_GET_DEVICE(*call), ETH_BROADCAST_ADDR,
    884881                    &address);
    885882                if (rc != EOK)
     
    887884                return measured_strings_reply(address, 1);
    888885        case IPC_M_CONNECT_TO_ME:
    889                 return eth_register_message(NIL_GET_PROTO(call),
    890                     IPC_GET_PHONE(call));
     886                return eth_register_message(NIL_GET_PROTO(*call),
     887                    IPC_GET_PHONE(*call));
    891888        }
    892889       
     
    894891}
    895892
    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 connection
    905          *  - 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 processing
    926                  * 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 
    937893int main(int argc, char *argv[])
    938894{
    939         int rc;
    940        
    941895        /* Start the module */
    942         rc = nil_module_start_standalone(nil_client_connection);
    943         return rc;
     896        return nil_module_start(SERVICE_ETHERNET);
    944897}
    945898
Note: See TracChangeset for help on using the changeset viewer.