Changeset 962f03b in mainline for uspace/srv


Ignore:
Timestamp:
2012-02-27T19:32:15Z (14 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
56792a2
Parents:
87e5658c
Message:

IP links need to be made aware of configured IP addresses.

Location:
uspace/srv
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/ethip/arp.c

    r87e5658c r962f03b  
    4646#include "std.h"
    4747
    48 #define MY_IPV4_ADDR ( (192 << 24) | (168 << 16) | (0 << 8) | 4U )
    4948#define MY_ETH_ADDR 0xaafeedfaceee
    5049
     
    5655        arp_eth_packet_t packet;
    5756        arp_eth_packet_t reply;
     57        ethip_link_addr_t *laddr;
    5858
    5959        log_msg(LVL_DEBUG, "arp_received()");
     
    6565        log_msg(LVL_DEBUG, "ARP PDU decoded, opcode=%d, tpa=%x",
    6666            packet.opcode, packet.target_proto_addr.ipv4);
    67         if (packet.opcode == aop_request &&
    68             packet.target_proto_addr.ipv4 == MY_IPV4_ADDR) {
    69                 log_msg(LVL_DEBUG, "Request on my address");
     67        if (packet.opcode == aop_request) {
     68                log_msg(LVL_DEBUG, "ARP request");
    7069
    71                 reply.opcode = aop_reply;
    72                 reply.sender_hw_addr.addr = MY_ETH_ADDR;
    73                 reply.sender_proto_addr.ipv4 = MY_IPV4_ADDR;
    74                 reply.target_hw_addr = packet.sender_hw_addr;
    75                 reply.target_proto_addr = packet.sender_proto_addr;
     70                laddr = ethip_nic_addr_find(nic, &packet.target_proto_addr);
     71                if (laddr != NULL) {
     72                        log_msg(LVL_DEBUG, "Request on my address");
    7673
    77                 arp_send_packet(nic, &reply);
     74                        reply.opcode = aop_reply;
     75                        reply.sender_hw_addr.addr = MY_ETH_ADDR;
     76                        reply.sender_proto_addr = laddr->addr;
     77                        reply.target_hw_addr = packet.sender_hw_addr;
     78                        reply.target_proto_addr = packet.sender_proto_addr;
     79
     80                        arp_send_packet(nic, &reply);
     81                }
    7882        }
    7983}
  • uspace/srv/ethip/ethip.c

    r87e5658c r962f03b  
    5757static int ethip_send(iplink_srv_t *srv, iplink_srv_sdu_t *sdu);
    5858static int ethip_get_mtu(iplink_srv_t *srv, size_t *mtu);
     59static int ethip_addr_add(iplink_srv_t *srv, iplink_srv_addr_t *addr);
     60static int ethip_addr_remove(iplink_srv_t *srv, iplink_srv_addr_t *addr);
    5961
    6062static void ethip_client_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg);
     
    6466        .close = ethip_close,
    6567        .send = ethip_send,
    66         .get_mtu = ethip_get_mtu
     68        .get_mtu = ethip_get_mtu,
     69        .addr_add = ethip_addr_add,
     70        .addr_remove = ethip_addr_remove
    6771};
    6872
     
    234238}
    235239
     240static int ethip_addr_add(iplink_srv_t *srv, iplink_srv_addr_t *addr)
     241{
     242        ethip_nic_t *nic = (ethip_nic_t *)srv->arg;
     243
     244        log_msg(LVL_DEBUG, "ethip_addr_add(0x%" PRIx32 ")", addr->ipv4);
     245        return ethip_nic_addr_add(nic, addr);
     246}
     247
     248static int ethip_addr_remove(iplink_srv_t *srv, iplink_srv_addr_t *addr)
     249{
     250        ethip_nic_t *nic = (ethip_nic_t *)srv->arg;
     251
     252        log_msg(LVL_DEBUG, "ethip_addr_remove(0x%" PRIx32 ")", addr->ipv4);
     253        return ethip_nic_addr_add(nic, addr);
     254}
     255
    236256int main(int argc, char *argv[])
    237257{
  • uspace/srv/ethip/ethip.h

    r87e5658c r962f03b  
    5252        iplink_srv_t iplink;
    5353        service_id_t iplink_sid;
     54
     55        /** List of IP addresses configured on this link */
     56        list_t addr_list; /* of ethip_link_addr_t */
    5457} ethip_nic_t;
     58
     59typedef struct {
     60        link_t addr_list;
     61        iplink_srv_addr_t addr;
     62} ethip_link_addr_t;
    5563
    5664/** IEEE MAC-48 identifier */
  • uspace/srv/ethip/ethip_nic.c

    r87e5658c r962f03b  
    115115
    116116        link_initialize(&nic->nic_list);
     117        list_initialize(&nic->addr_list);
    117118
    118119        return nic;
     120}
     121
     122static ethip_link_addr_t *ethip_nic_addr_new(iplink_srv_addr_t *addr)
     123{
     124        ethip_link_addr_t *laddr = calloc(1, sizeof(ethip_link_addr_t));
     125
     126        if (laddr == NULL) {
     127                log_msg(LVL_ERROR, "Failed allocating NIC address structure. "
     128                    "Out of memory.");
     129                return NULL;
     130        }
     131
     132        link_initialize(&laddr->addr_list);
     133        laddr->addr.ipv4 = addr->ipv4;
     134        return laddr;
    119135}
    120136
     
    124140                free(nic->svc_name);
    125141        free(nic);
     142}
     143
     144static void ethip_link_addr_delete(ethip_link_addr_t *laddr)
     145{
     146        free(laddr);
    126147}
    127148
     
    308329        rc = nic_send_frame(nic->sess, data, size);
    309330        log_msg(LVL_DEBUG, "nic_send_frame -> %d", rc);
    310         log_msg(LVL_DEBUG, "nic_send_frame -> %d", rc);
    311         log_msg(LVL_DEBUG, "nic_send_frame -> %d", rc);
    312         log_msg(LVL_DEBUG, "nic_send_frame -> %d", rc);
    313         log_msg(LVL_DEBUG, "nic_send_frame -> %d", rc);
    314         log_msg(LVL_DEBUG, "nic_send_frame -> %d", rc);
    315         log_msg(LVL_DEBUG, "nic_send_frame -> %d", rc);
    316         log_msg(LVL_DEBUG, "nic_send_frame -> %d", rc);
    317331        return rc;
     332}
     333
     334int ethip_nic_addr_add(ethip_nic_t *nic, iplink_srv_addr_t *addr)
     335{
     336        ethip_link_addr_t *laddr;
     337
     338        log_msg(LVL_DEBUG, "ethip_nic_addr_add()");
     339        laddr = ethip_nic_addr_new(addr);
     340        if (laddr == NULL)
     341                return ENOMEM;
     342
     343        list_append(&laddr->addr_list, &nic->addr_list);
     344        return EOK;
     345}
     346
     347int ethip_nic_addr_remove(ethip_nic_t *nic, iplink_srv_addr_t *addr)
     348{
     349        ethip_link_addr_t *laddr;
     350
     351        log_msg(LVL_DEBUG, "ethip_nic_addr_remove()");
     352
     353        laddr = ethip_nic_addr_find(nic, addr);
     354        if (laddr == NULL)
     355                return ENOENT;
     356
     357        list_remove(&laddr->addr_list);
     358        ethip_link_addr_delete(laddr);
     359        return EOK;
     360}
     361
     362ethip_link_addr_t *ethip_nic_addr_find(ethip_nic_t *nic,
     363    iplink_srv_addr_t *addr)
     364{
     365        log_msg(LVL_DEBUG, "ethip_nic_addr_find()");
     366
     367        list_foreach(nic->addr_list, link) {
     368                ethip_link_addr_t *laddr = list_get_instance(link,
     369                    ethip_link_addr_t, addr_list);
     370
     371                if (addr->ipv4 == laddr->addr.ipv4)
     372                        return laddr;
     373        }
     374
     375        return NULL;
    318376}
    319377
  • uspace/srv/ethip/ethip_nic.h

    r87e5658c r962f03b  
    3939
    4040#include <ipc/loc.h>
     41#include "ethip.h"
    4142
    4243extern int ethip_nic_discovery_start(void);
    4344extern ethip_nic_t *ethip_nic_find_by_iplink_sid(service_id_t);
    4445extern int ethip_nic_send(ethip_nic_t *, void *, size_t);
    45 
     46extern int ethip_nic_addr_add(ethip_nic_t *, iplink_srv_addr_t *);
     47extern int ethip_nic_addr_remove(ethip_nic_t *, iplink_srv_addr_t *);
     48extern ethip_link_addr_t *ethip_nic_addr_find(ethip_nic_t *,
     49    iplink_srv_addr_t *);
    4650
    4751#endif
  • uspace/srv/inet/inet_link.c

    r87e5658c r962f03b  
    151151{
    152152        inet_link_t *ilink;
     153        iplink_addr_t iaddr;
    153154        int rc;
    154155
     
    194195        addr->ilink = ilink;
    195196        inet_addrobj_add(addr);
     197
     198        iaddr.ipv4 = addr->naddr.ipv4;
     199        rc = iplink_addr_add(ilink->iplink, &iaddr);
     200        if (rc != EOK) {
     201                log_msg(LVL_ERROR, "Failed setting IP address on internet link.");
     202                /* XXX Roll back */
     203                return rc;
     204        }
    196205
    197206        return EOK;
Note: See TracChangeset for help on using the changeset viewer.