Changeset 80cd7cd in mainline for uspace/srv/net/nil/eth/eth.c


Ignore:
Timestamp:
2011-01-13T20:58:24Z (13 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
87e373b
Parents:
eaef141 (diff), a613fea1 (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.
Message:

Merge mainline changes.

File:
1 edited

Legend:

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

    reaef141 r80cd7cd  
    4545
    4646#include <ipc/ipc.h>
     47#include <ipc/nil.h>
    4748#include <ipc/net.h>
    4849#include <ipc/services.h>
     
    5455#include <protocol_map.h>
    5556#include <net/device.h>
    56 #include <netif_interface.h>
     57#include <netif_remote.h>
    5758#include <net_interface.h>
    58 #include <nil_interface.h>
    59 #include <il_interface.h>
     59#include <il_remote.h>
    6060#include <adt/measured_strings.h>
    6161#include <packet_client.h>
    6262#include <packet_remote.h>
    63 #include <nil_local.h>
     63#include <nil_skel.h>
    6464
    6565#include "eth.h"
    66 #include "eth_header.h"
    6766
    6867/** The module name. */
     
    7271#define ETH_PREFIX \
    7372        (sizeof(eth_header_t) + sizeof(eth_header_lsap_t) + \
    74         sizeof(eth_header_snap_t))
     73            sizeof(eth_header_snap_t))
    7574
    7675/** Reserved packet suffix length. */
    77 #define ETH_SUFFIX \
    78         sizeof(eth_fcs_t)
     76#define ETH_SUFFIX  (sizeof(eth_fcs_t))
    7977
    8078/** Maximum packet content length. */
    81 #define ETH_MAX_CONTENT 1500u
     79#define ETH_MAX_CONTENT  1500u
    8280
    8381/** Minimum packet content length. */
    84 #define ETH_MIN_CONTENT 46u
     82#define ETH_MIN_CONTENT  46u
    8583
    8684/** Maximum tagged packet content length. */
    8785#define ETH_MAX_TAGGED_CONTENT(flags) \
    8886        (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))
    9290
    9391/** Minimum tagged packet content length. */
    9492#define ETH_MIN_TAGGED_CONTENT(flags) \
    9593        (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))
    9997
    10098/** Dummy flag shift value. */
    101 #define ETH_DUMMY_SHIFT 0
     99#define ETH_DUMMY_SHIFT  0
    102100
    103101/** Mode flag shift value. */
    104 #define ETH_MODE_SHIFT  1
     102#define ETH_MODE_SHIFT  1
    105103
    106104/** Dummy device flag.
    107105 * Preamble and FCS are mandatory part of the packets.
    108106 */
    109 #define ETH_DUMMY               (1 << ETH_DUMMY_SHIFT)
     107#define ETH_DUMMY  (1 << ETH_DUMMY_SHIFT)
    110108
    111109/** Returns the dummy flag.
    112110 * @see ETH_DUMMY
    113111 */
    114 #define IS_DUMMY(flags)         ((flags) & ETH_DUMMY)
     112#define IS_DUMMY(flags)  ((flags) & ETH_DUMMY)
    115113
    116114/** Device mode flags.
     
    119117 * @see ETH_8023_2_SNAP
    120118 */
    121 #define ETH_MODE_MASK           (3 << ETH_MODE_SHIFT)
     119#define ETH_MODE_MASK  (3 << ETH_MODE_SHIFT)
    122120
    123121/** 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.
     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.
    129127 * @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)
    132131
    133132/** 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.
     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.
    139138 * @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)
    142142
    143143/** 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.
     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.
    149149 * @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)
    152153
    153154/** Type definition of the ethernet address type.
     
    201202
    202203        eth_globals.broadcast_addr =
    203             measured_string_create_bulk("\xFF\xFF\xFF\xFF\xFF\xFF", ETH_ADDR);
     204            measured_string_create_bulk((uint8_t *) "\xFF\xFF\xFF\xFF\xFF\xFF", ETH_ADDR);
    204205        if (!eth_globals.broadcast_addr) {
    205206                rc = ENOMEM;
     
    239240                switch (IPC_GET_IMETHOD(*icall)) {
    240241                case NET_NIL_DEVICE_STATE:
    241                         nil_device_state_msg_local(0, IPC_GET_DEVICE(icall),
    242                             IPC_GET_STATE(icall));
     242                        nil_device_state_msg_local(0, IPC_GET_DEVICE(*icall),
     243                            IPC_GET_STATE(*icall));
    243244                        ipc_answer_0(iid, EOK);
    244245                        break;
    245246                case NET_NIL_RECEIVED:
    246247                        rc = packet_translate_remote(eth_globals.net_phone,
    247                             &packet, IPC_GET_PACKET(icall));
    248                         if (rc == EOK) {
     248                            &packet, IPC_GET_PACKET(*icall));
     249                        if (rc == EOK)
    249250                                rc = nil_received_msg_local(0,
    250                                     IPC_GET_DEVICE(icall), packet, 0);
    251                         }
     251                                    IPC_GET_DEVICE(*icall), packet, 0);
     252                       
    252253                        ipc_answer_0(iid, (sysarg_t) rc);
    253254                        break;
     
    284285        measured_string_t names[2] = {
    285286                {
    286                         (char *) "ETH_MODE",
     287                        (uint8_t *) "ETH_MODE",
    287288                        8
    288289                },
    289290                {
    290                         (char *) "ETH_DUMMY",
     291                        (uint8_t *) "ETH_DUMMY",
    291292                        9
    292293                }
     
    294295        measured_string_t *configuration;
    295296        size_t count = sizeof(names) / sizeof(measured_string_t);
    296         char *data;
     297        uint8_t *data;
    297298        eth_proto_t *proto;
    298299        int rc;
     
    358359
    359360        if (configuration) {
    360                 if (!str_lcmp(configuration[0].value, "DIX",
     361                if (!str_lcmp((char *) configuration[0].value, "DIX",
    361362                    configuration[0].length)) {
    362363                        device->flags |= ETH_DIX;
    363                 } else if(!str_lcmp(configuration[0].value, "8023_2_LSAP",
     364                } else if(!str_lcmp((char *) configuration[0].value, "8023_2_LSAP",
    364365                    configuration[0].length)) {
    365366                        device->flags |= ETH_8023_2_LSAP;
     
    407408       
    408409        printf("%s: Device registered (id: %d, service: %d: mtu: %zu, "
    409             "mac: %x:%x:%x:%x:%x:%x, flags: 0x%x)\n",
     410            "mac: %02x:%02x:%02x:%02x:%02x:%02x, flags: 0x%x)\n",
    410411            NAME, device->device_id, device->service, device->mtu,
    411412            device->addr_data[0], device->addr_data[1],
     
    836837}
    837838
    838 int nil_message_standalone(const char *name, ipc_callid_t callid,
    839     ipc_call_t *call, ipc_call_t *answer, int *answer_count)
     839int nil_module_message(ipc_callid_t callid, ipc_call_t *call,
     840    ipc_call_t *answer, size_t *answer_count)
    840841{
    841842        measured_string_t *address;
     
    853854       
    854855        case NET_NIL_DEVICE:
    855                 return eth_device_message(IPC_GET_DEVICE(call),
    856                     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));
    857858        case NET_NIL_SEND:
    858859                rc = packet_translate_remote(eth_globals.net_phone, &packet,
    859                     IPC_GET_PACKET(call));
     860                    IPC_GET_PACKET(*call));
    860861                if (rc != EOK)
    861862                        return rc;
    862                 return eth_send_message(IPC_GET_DEVICE(call), packet,
    863                     IPC_GET_SERVICE(call));
     863                return eth_send_message(IPC_GET_DEVICE(*call), packet,
     864                    IPC_GET_SERVICE(*call));
    864865        case NET_NIL_PACKET_SPACE:
    865                 rc = eth_packet_space_message(IPC_GET_DEVICE(call), &addrlen,
     866                rc = eth_packet_space_message(IPC_GET_DEVICE(*call), &addrlen,
    866867                    &prefix, &content, &suffix);
    867868                if (rc != EOK)
    868869                        return rc;
    869                 IPC_SET_ADDR(answer, addrlen);
    870                 IPC_SET_PREFIX(answer, prefix);
    871                 IPC_SET_CONTENT(answer, content);
    872                 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);
    873874                *answer_count = 4;
    874875                return EOK;
    875876        case NET_NIL_ADDR:
    876                 rc = eth_addr_message(IPC_GET_DEVICE(call), ETH_LOCAL_ADDR,
     877                rc = eth_addr_message(IPC_GET_DEVICE(*call), ETH_LOCAL_ADDR,
    877878                    &address);
    878879                if (rc != EOK)
     
    880881                return measured_strings_reply(address, 1);
    881882        case NET_NIL_BROADCAST_ADDR:
    882                 rc = eth_addr_message(IPC_GET_DEVICE(call), ETH_BROADCAST_ADDR,
     883                rc = eth_addr_message(IPC_GET_DEVICE(*call), ETH_BROADCAST_ADDR,
    883884                    &address);
    884885                if (rc != EOK)
     
    886887                return measured_strings_reply(address, 1);
    887888        case IPC_M_CONNECT_TO_ME:
    888                 return eth_register_message(NIL_GET_PROTO(call),
    889                     IPC_GET_PHONE(call));
     889                return eth_register_message(NIL_GET_PROTO(*call),
     890                    IPC_GET_PHONE(*call));
    890891        }
    891892       
     
    893894}
    894895
    895 /** Default thread for new connections.
    896  *
    897  * @param[in] iid       The initial message identifier.
    898  * @param[in] icall     The initial message call structure.
    899  */
    900 static void nil_client_connection(ipc_callid_t iid, ipc_call_t *icall)
    901 {
    902         /*
    903          * Accept the connection
    904          *  - Answer the first IPC_M_CONNECT_ME_TO call.
    905          */
    906         ipc_answer_0(iid, EOK);
    907        
    908         while (true) {
    909                 ipc_call_t answer;
    910                 int answer_count;
    911                
    912                 /* Clear the answer structure */
    913                 refresh_answer(&answer, &answer_count);
    914                
    915                 /* Fetch the next message */
    916                 ipc_call_t call;
    917                 ipc_callid_t callid = async_get_call(&call);
    918                
    919                 /* Process the message */
    920                 int res = nil_module_message_standalone(NAME, callid, &call,
    921                     &answer, &answer_count);
    922                
    923                 /*
    924                  * End if told to either by the message or the processing
    925                  * result.
    926                  */
    927                 if ((IPC_GET_IMETHOD(call) == IPC_M_PHONE_HUNGUP) ||
    928                     (res == EHANGUP))
    929                         return;
    930                
    931                 /* Answer the message */
    932                 answer_call(callid, res, &answer, answer_count);
    933         }
    934 }
    935 
    936896int main(int argc, char *argv[])
    937897{
    938         int rc;
    939        
    940898        /* Start the module */
    941         rc = nil_module_start_standalone(nil_client_connection);
    942         return rc;
     899        return nil_module_start(SERVICE_ETHERNET);
    943900}
    944901
Note: See TracChangeset for help on using the changeset viewer.