Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset c3b25985 in mainline


Ignore:
Timestamp:
2014-08-05T21:43:50Z (6 years ago)
Author:
Agnieszka Tabaka <nufcia@…>
Branches:
master
Children:
ee95794
Parents:
1f1fa64
Message:

Add support for actual MAC change in networking stack.

Location:
uspace
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/iplink.c

    r1f1fa64 rc3b25985  
    171171}
    172172
     173int iplink_set_mac48(iplink_t *iplink, addr48_t mac)
     174{
     175        async_exch_t *exch = async_exchange_begin(iplink->sess);
     176       
     177        ipc_call_t answer;
     178        aid_t req = async_send_0(exch, IPLINK_GET_MAC48, &answer);
     179       
     180        int rc = async_data_read_start(exch, mac, sizeof(addr48_t));
     181       
     182        loc_exchange_end(exch);
     183       
     184        if (rc != EOK) {
     185                async_forget(req);
     186                return rc;
     187        }
     188       
     189        sysarg_t retval;
     190        async_wait_for(req, &retval);
     191       
     192        return (int) retval;
     193}
     194
     195
    173196int iplink_addr_add(iplink_t *iplink, inet_addr_t *addr)
    174197{
     
    230253        free(sdu.data);
    231254        async_answer_0(iid, rc);
     255}
     256
     257static void iplink_ev_change_addr(iplink_t *iplink, ipc_callid_t iid,
     258    ipc_call_t *icall)
     259{
     260        addr48_t *addr;
     261        size_t size;
     262       
     263        int rc = async_data_write_accept((void **)&addr, false,
     264            sizeof(addr48_t), sizeof(addr48_t), 0, &size);
     265        if (rc != EOK) {
     266                async_answer_0(iid, rc);
     267                return;
     268        }
     269
     270        rc = iplink->ev_ops->change_addr(iplink, *addr);
     271        free(addr);
     272        async_answer_0(iid, EOK);
    232273}
    233274
     
    249290                        iplink_ev_recv(iplink, callid, &call);
    250291                        break;
     292                case IPLINK_EV_CHANGE_ADDR:
     293                        iplink_ev_change_addr(iplink, callid, &call);
    251294                default:
    252295                        async_answer_0(callid, ENOTSUP);
  • uspace/lib/c/generic/iplink_srv.c

    r1f1fa64 rc3b25985  
    8181}
    8282
     83static void iplink_set_mac48_srv(iplink_srv_t *srv, ipc_callid_t iid,
     84    ipc_call_t *icall)
     85{
     86        int rc;
     87        size_t size;
     88        addr48_t mac;
     89        ipc_callid_t callid;
     90
     91        rc = async_data_write_receive(&callid, &size);
     92        if (rc != EOK) {
     93                async_answer_0(callid, (sysarg_t) rc);
     94                async_answer_0(iid, (sysarg_t) rc);
     95        }
     96
     97        rc = srv->ops->set_mac48(srv, &mac);
     98        if (rc != EOK) {
     99                async_answer_0(iid, rc);
     100                return;
     101        }
     102       
     103        rc = async_data_read_finalize(callid, &mac, sizeof(addr48_t));
     104        if (rc != EOK)
     105                async_answer_0(callid, rc);
     106       
     107        async_answer_0(iid, (sysarg_t) rc);
     108}
     109
    83110static void iplink_addr_add_srv(iplink_srv_t *srv, ipc_callid_t iid,
    84111    ipc_call_t *icall)
     
    252279                        iplink_get_mac48_srv(srv, callid, &call);
    253280                        break;
     281                case IPLINK_SET_MAC48:
     282                        iplink_set_mac48_srv(srv, callid, &call);
     283                        break;
    254284                case IPLINK_SEND:
    255285                        iplink_send_srv(srv, callid, &call);
     
    300330}
    301331
     332int iplink_ev_change_addr(iplink_srv_t *srv, addr48_t *addr)
     333{
     334        if (srv->client_sess == NULL)
     335                return EIO;
     336       
     337        async_exch_t *exch = async_exchange_begin(srv->client_sess);
     338       
     339        ipc_call_t answer;
     340        aid_t req = async_send_0(exch, IPLINK_EV_CHANGE_ADDR, &answer);
     341       
     342        int rc = async_data_write_start(exch, addr, sizeof(addr48_t));
     343        async_exchange_end(exch);
     344       
     345        if (rc != EOK) {
     346                async_forget(req);
     347                return rc;
     348        }
     349       
     350        sysarg_t retval;
     351        async_wait_for(req, &retval);
     352        if (retval != EOK)
     353                return retval;
     354       
     355        return EOK;
     356}
     357
    302358/** @}
    303359 */
  • uspace/lib/c/include/inet/iplink.h

    r1f1fa64 rc3b25985  
    7878typedef struct iplink_ev_ops {
    7979        int (*recv)(iplink_t *, iplink_recv_sdu_t *, ip_ver_t);
     80        int (*change_addr)(iplink_t *, addr48_t);
    8081} iplink_ev_ops_t;
    8182
     
    8889extern int iplink_get_mtu(iplink_t *, size_t *);
    8990extern int iplink_get_mac48(iplink_t *, addr48_t *);
     91extern int iplink_set_mac48(iplink_t *, addr48_t);
    9092
    9193#endif
  • uspace/lib/c/include/inet/iplink_srv.h

    r1f1fa64 rc3b25985  
    5959        int (*get_mtu)(iplink_srv_t *, size_t *);
    6060        int (*get_mac48)(iplink_srv_t *, addr48_t *);
     61        int (*set_mac48)(iplink_srv_t *, addr48_t *);
    6162        int (*addr_add)(iplink_srv_t *, inet_addr_t *);
    6263        int (*addr_remove)(iplink_srv_t *, inet_addr_t *);
     
    6768extern int iplink_conn(ipc_callid_t, ipc_call_t *, void *);
    6869extern int iplink_ev_recv(iplink_srv_t *, iplink_recv_sdu_t *, ip_ver_t);
     70extern int iplink_ev_change_addr(iplink_srv_t *, addr48_t *);
    6971
    7072#endif
  • uspace/lib/c/include/ipc/iplink.h

    r1f1fa64 rc3b25985  
    4141        IPLINK_GET_MTU = IPC_FIRST_USER_METHOD,
    4242        IPLINK_GET_MAC48,
     43        IPLINK_SET_MAC48,
    4344        IPLINK_SEND,
    4445        IPLINK_SEND6,
     
    4849
    4950typedef enum {
    50         IPLINK_EV_RECV = IPC_FIRST_USER_METHOD
     51        IPLINK_EV_RECV = IPC_FIRST_USER_METHOD,
     52        IPLINK_EV_CHANGE_ADDR,
    5153} iplink_event_t;
    5254
  • uspace/lib/nic/src/nic_driver.c

    r1f1fa64 rc3b25985  
    532532        fibril_rwlock_write_lock(&nic_data->stats_lock);
    533533
     534        log_msg(LOG_DEFAULT, LVL_WARN, "nic_received_frame(), check=%d", check);
     535
    534536        if (nic_data->state == NIC_STATE_ACTIVE && check) {
    535537                nic_data->stats.receive_packets++;
  • uspace/srv/net/ethip/ethip.c

    r1f1fa64 rc3b25985  
    5858static int ethip_get_mtu(iplink_srv_t *srv, size_t *mtu);
    5959static int ethip_get_mac48(iplink_srv_t *srv, addr48_t *mac);
     60static int ethip_set_mac48(iplink_srv_t *srv, addr48_t *mac);
    6061static int ethip_addr_add(iplink_srv_t *srv, inet_addr_t *addr);
    6162static int ethip_addr_remove(iplink_srv_t *srv, inet_addr_t *addr);
     
    7071        .get_mtu = ethip_get_mtu,
    7172        .get_mac48 = ethip_get_mac48,
     73        .set_mac48 = ethip_set_mac48,
    7274        .addr_add = ethip_addr_add,
    7375        .addr_remove = ethip_addr_remove
     
    283285}
    284286
     287static int ethip_set_mac48(iplink_srv_t *srv, addr48_t *mac)
     288{
     289        log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_set_mac48()");
     290       
     291        ethip_nic_t *nic = (ethip_nic_t *) srv->arg;
     292        addr48(*mac, nic->mac_addr);
     293       
     294        return EOK;
     295}
     296
    285297static int ethip_addr_add(iplink_srv_t *srv, inet_addr_t *addr)
    286298{
  • uspace/srv/net/ethip/ethip_nic.c

    r1f1fa64 rc3b25985  
    245245            addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
    246246
     247        memcpy(&nic->mac_addr, addr, sizeof(nic->mac_addr));
     248
     249        rc = iplink_ev_change_addr(&nic->iplink, &nic->mac_addr);
     250        if (rc != EOK) {
     251                log_msg(LOG_DEFAULT, LVL_DEBUG, "iplink_ev_change_addr() failed");
     252                return;
     253        }
     254
    247255        free(addr);
    248256        async_answer_0(callid, EOK);
  • uspace/srv/net/inetsrv/inet_link.c

    r1f1fa64 rc3b25985  
    5555
    5656static int inet_iplink_recv(iplink_t *, iplink_recv_sdu_t *, ip_ver_t);
     57static int inet_iplink_change_addr(iplink_t *, addr48_t);
    5758static inet_link_t *inet_link_get_by_id_locked(sysarg_t);
    5859
    5960static iplink_ev_ops_t inet_iplink_ev_ops = {
    60         .recv = inet_iplink_recv
     61        .recv = inet_iplink_recv,
     62        .change_addr = inet_iplink_change_addr,
    6163};
    6264
     
    110112       
    111113        return rc;
     114}
     115
     116static int inet_iplink_change_addr(iplink_t *iplink, addr48_t mac)
     117{
     118        log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_iplink_change_addr(): "
     119            "new addr=%02x:%02x:%02x:%02x:%02x:%02x",
     120            mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
     121
     122        list_foreach(inet_links, link_list, inet_link_t, ilink) {
     123                if (ilink->sess == iplink->sess)
     124                        memcpy(&ilink->mac, mac, sizeof(addr48_t));
     125        }
     126
     127        return EOK;
    112128}
    113129
Note: See TracChangeset for help on using the changeset viewer.