Changeset 47f5a77 in mainline


Ignore:
Timestamp:
2013-07-17T08:46:06Z (11 years ago)
Author:
Maurizio Lombardi <m.lombardi85@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
3a0a4d8
Parents:
cdc3afa (diff), 1d94e21 (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

Files:
4 added
44 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/arm32/src/mach/beaglebone/beaglebone.c

    rcdc3afa r47f5a77  
    177177{
    178178        const unsigned inum = am335x_irc_inum_get(bbone.irc_addr);
    179         am335x_irc_irq_ack(bbone.irc_addr);
    180179
    181180        irq_t *irq = irq_dispatch_and_lock(inum);
     
    187186                printf("Spurious interrupt\n");
    188187        }
     188
     189        am335x_irc_irq_ack(bbone.irc_addr);
    189190}
    190191
  • kernel/genarch/src/drivers/am335x/timer.c

    rcdc3afa r47f5a77  
    119119        /* Disable compare mode */
    120120        tclr &= ~AM335x_TIMER_TCLR_CE_FLAG;
    121         /* Enable the prescaler, divisor = 2 */
    122         tclr |= AM335x_TIMER_TCLR_PRE_FLAG;
    123         tclr &= ~(AM335x_TIMER_TCLR_PTV_MASK << AM335x_TIMER_TCLR_PTV_SHIFT);
     121
    124122        /* Enable auto-reload mode */
    125123        tclr |= AM335x_TIMER_TCLR_AR_FLAG;
  • uspace/app/mkmfs/mkmfs.c

    rcdc3afa r47f5a77  
    649649                mark_bmap(ibmap_buf, i, FREE);
    650650
    651         for (i = 2; i < sb->n_zones; ++i)
     651        for (i = 2; i < sb->n_zones - sb->first_data_zone; ++i)
    652652                mark_bmap(zbmap_buf, i, FREE);
    653653
  • uspace/app/ping6/ping6.c

    rcdc3afa r47f5a77  
    102102        }
    103103       
    104         printf("Received ICMP echo reply: from %s to %s, seq. no %u, "
     104        printf("Received ICMPv6 echo reply: from %s to %s, seq. no %u, "
    105105            "payload size %zu\n", asrc, adest, sdu->seq_no, sdu->size);
    106106       
  • uspace/drv/block/ata_bd/main.c

    rcdc3afa r47f5a77  
    198198        }
    199199
     200        ddf_fun_add_to_category(fun, "bd");
     201
    200202        free(fun_name);
    201203        disk->afun = afun;
  • uspace/drv/char/ns8250/ns8250.c

    rcdc3afa r47f5a77  
    236236 *
    237237 * @param fun           The serial port function
    238  * @param buf           The ouput buffer for read data.
     238 * @param buf           The output buffer for read data.
    239239 * @param count         The number of bytes to be read.
    240240 *
     
    420420                        ns->irq = res->res.interrupt.irq;
    421421                        irq = true;
    422                         ddf_msg(LVL_NOTE, "Device %s was asigned irq = 0x%x.",
     422                        ddf_msg(LVL_NOTE, "Device %s was assigned irq = 0x%x.",
    423423                            ddf_dev_get_name(ns->dev), ns->irq);
    424424                        break;
     
    433433                        }
    434434                        ioport = true;
    435                         ddf_msg(LVL_NOTE, "Device %s was asigned I/O address = "
     435                        ddf_msg(LVL_NOTE, "Device %s was assigned I/O address = "
    436436                            "0x%x.", ddf_dev_get_name(ns->dev), ns->io_addr);
    437437                        break;
     
    827827        ddf_fun_t *fun = NULL;
    828828        bool need_cleanup = false;
     829        bool need_unreg_intr_handler = false;
    829830        int rc;
    830831       
     
    869870                goto fail;
    870871        }
     872        need_unreg_intr_handler = true;
    871873       
    872874        /* Enable interrupt. */
     
    903905        if (fun != NULL)
    904906                ddf_fun_destroy(fun);
     907        if (need_unreg_intr_handler)
     908                ns8250_unregister_interrupt_handler(ns);
    905909        if (need_cleanup)
    906910                ns8250_dev_cleanup(ns);
     
    914918       
    915919        fibril_mutex_lock(&ns->mutex);
    916                 if (ns->client_connections > 0) {
     920        if (ns->client_connections > 0) {
    917921                fibril_mutex_unlock(&ns->mutex);
    918922                return EBUSY;
  • uspace/lib/c/generic/inet/addr.c

    rcdc3afa r47f5a77  
    7070{
    7171        memcpy(dst, src, 16);
     72}
     73
     74int addr128_compare(const addr128_t a, const addr128_t b)
     75{
     76        return memcmp(a, b, 16);
    7277}
    7378
     
    212217}
    213218
     219void inet_addr_naddr(const inet_addr_t *addr, uint8_t prefix,
     220    inet_naddr_t *naddr)
     221{
     222        naddr->family = addr->family;
     223        memcpy(naddr->addr6, addr->addr6, 16);
     224        naddr->prefix = prefix;
     225}
     226
    214227void inet_addr_any(inet_addr_t *addr)
    215228{
     
    234247                return (a->addr == b->addr);
    235248        case AF_INET6:
    236                 return memcmp(&a->addr6, &b->addr6, 16);
     249                return addr128_compare(a->addr6, b->addr6);
    237250        default:
    238251                return 0;
     
    245258            (inet_addr_compare(addr, &inet_addr_any_addr)) ||
    246259            (inet_addr_compare(addr, &inet_addr_any_addr6)));
     260}
     261
     262int inet_naddr_compare(const inet_naddr_t *naddr, const inet_addr_t *addr)
     263{
     264        if (naddr->family != addr->family)
     265                return 0;
     266       
     267        switch (naddr->family) {
     268        case AF_INET:
     269                return (naddr->addr == addr->addr);
     270        case AF_INET6:
     271                return addr128_compare(naddr->addr6, addr->addr6);
     272        default:
     273                return 0;
     274        }
    247275}
    248276
  • uspace/lib/c/generic/inetping6.c

    rcdc3afa r47f5a77  
    7979       
    8080        ipc_call_t answer;
    81         aid_t req = async_send_3(exch, INETPING6_SEND, (sysarg_t) sdu->src,
    82             (sysarg_t) sdu->dest, sdu->seq_no, &answer);
    83         sysarg_t retval = async_data_write_start(exch, sdu->data, sdu->size);
     81        aid_t req = async_send_1(exch, INETPING6_SEND, sdu->seq_no, &answer);
     82       
     83        int rc = async_data_write_start(exch, &sdu->src, sizeof(addr128_t));
     84        if (rc != EOK) {
     85                async_exchange_end(exch);
     86                async_forget(req);
     87                return rc;
     88        }
     89       
     90        rc = async_data_write_start(exch, &sdu->dest, sizeof(addr128_t));
     91        if (rc != EOK) {
     92                async_exchange_end(exch);
     93                async_forget(req);
     94                return rc;
     95        }
     96       
     97        rc = async_data_write_start(exch, sdu->data, sdu->size);
    8498       
    8599        async_exchange_end(exch);
    86100       
    87         if (retval != EOK) {
    88                 async_forget(req);
    89                 return retval;
    90         }
    91        
     101        if (rc != EOK) {
     102                async_forget(req);
     103                return rc;
     104        }
     105       
     106        sysarg_t retval;
    92107        async_wait_for(req, &retval);
    93         return retval;
     108       
     109        return (int) retval;
    94110}
    95111
     
    142158        }
    143159       
    144         if (size != sizeof(inet_addr_t)) {
     160        if (size != sizeof(addr128_t)) {
    145161                async_answer_0(callid, EINVAL);
    146162                async_answer_0(iid, EINVAL);
     
    161177        }
    162178       
    163         if (size != sizeof(inet_addr_t)) {
     179        if (size != sizeof(addr128_t)) {
    164180                async_answer_0(callid, EINVAL);
    165181                async_answer_0(iid, EINVAL);
  • uspace/lib/c/generic/iplink.c

    rcdc3afa r47f5a77  
    8686       
    8787        ipc_call_t answer;
    88         aid_t req = async_send_0(exch, IPLINK_SEND, &answer);
    89        
    90         int rc = async_data_write_start(exch, &sdu->src, sizeof(inet_addr_t));
     88        aid_t req = async_send_2(exch, IPLINK_SEND, (sysarg_t) sdu->src,
     89            (sysarg_t) sdu->dest, &answer);
     90       
     91        int rc = async_data_write_start(exch, sdu->data, sdu->size);
     92       
     93        async_exchange_end(exch);
     94       
     95        if (rc != EOK) {
     96                async_forget(req);
     97                return rc;
     98        }
     99       
     100        sysarg_t retval;
     101        async_wait_for(req, &retval);
     102       
     103        return (int) retval;
     104}
     105
     106int iplink_send6(iplink_t *iplink, iplink_sdu6_t *sdu)
     107{
     108        async_exch_t *exch = async_exchange_begin(iplink->sess);
     109       
     110        ipc_call_t answer;
     111        aid_t req = async_send_0(exch, IPLINK_SEND6, &answer);
     112       
     113        int rc = async_data_write_start(exch, &sdu->dest, sizeof(addr48_t));
    91114        if (rc != EOK) {
    92115                async_exchange_end(exch);
     
    95118        }
    96119       
    97         rc = async_data_write_start(exch, &sdu->dest, sizeof(inet_addr_t));
    98         if (rc != EOK) {
    99                 async_exchange_end(exch);
    100                 async_forget(req);
    101                 return rc;
    102         }
    103        
    104120        rc = async_data_write_start(exch, sdu->data, sdu->size);
    105121       
     
    119135int iplink_get_mtu(iplink_t *iplink, size_t *rmtu)
    120136{
     137        async_exch_t *exch = async_exchange_begin(iplink->sess);
     138       
    121139        sysarg_t mtu;
    122         async_exch_t *exch = async_exchange_begin(iplink->sess);
    123 
    124140        int rc = async_req_0_1(exch, IPLINK_GET_MTU, &mtu);
    125         async_exchange_end(exch);
    126 
     141       
     142        async_exchange_end(exch);
     143       
    127144        if (rc != EOK)
    128145                return rc;
    129 
     146       
    130147        *rmtu = mtu;
    131148        return EOK;
     149}
     150
     151int iplink_get_mac48(iplink_t *iplink, addr48_t *mac)
     152{
     153        async_exch_t *exch = async_exchange_begin(iplink->sess);
     154       
     155        ipc_call_t answer;
     156        aid_t req = async_send_0(exch, IPLINK_GET_MAC48, &answer);
     157       
     158        int rc = async_data_read_start(exch, mac, sizeof(addr48_t));
     159       
     160        loc_exchange_end(exch);
     161       
     162        if (rc != EOK) {
     163                async_forget(req);
     164                return rc;
     165        }
     166       
     167        sysarg_t retval;
     168        async_wait_for(req, &retval);
     169       
     170        return (int) retval;
    132171}
    133172
  • uspace/lib/c/generic/iplink_srv.c

    rcdc3afa r47f5a77  
    5050}
    5151
     52static void iplink_get_mac48_srv(iplink_srv_t *srv, ipc_callid_t iid,
     53    ipc_call_t *icall)
     54{
     55        addr48_t mac;
     56        int rc = srv->ops->get_mac48(srv, &mac);
     57        if (rc != EOK) {
     58                async_answer_0(iid, rc);
     59                return;
     60        }
     61       
     62        ipc_callid_t callid;
     63        size_t size;
     64        if (!async_data_read_receive(&callid, &size)) {
     65                async_answer_0(callid, EREFUSED);
     66                async_answer_0(iid, EREFUSED);
     67                return;
     68        }
     69       
     70        if (size != sizeof(addr48_t)) {
     71                async_answer_0(callid, EINVAL);
     72                async_answer_0(iid, EINVAL);
     73                return;
     74        }
     75       
     76        rc = async_data_read_finalize(callid, &mac, size);
     77        if (rc != EOK)
     78                async_answer_0(callid, rc);
     79       
     80        async_answer_0(iid, (sysarg_t) rc);
     81}
     82
    5283static void iplink_addr_add_srv(iplink_srv_t *srv, ipc_callid_t iid,
    5384    ipc_call_t *icall)
     
    111142        iplink_sdu_t sdu;
    112143       
     144        sdu.src = IPC_GET_ARG1(*icall);
     145        sdu.dest = IPC_GET_ARG2(*icall);
     146       
     147        int rc = async_data_write_accept(&sdu.data, false, 0, 0, 0,
     148            &sdu.size);
     149        if (rc != EOK) {
     150                async_answer_0(iid, rc);
     151                return;
     152        }
     153       
     154        rc = srv->ops->send(srv, &sdu);
     155        free(sdu.data);
     156        async_answer_0(iid, rc);
     157}
     158
     159static void iplink_send6_srv(iplink_srv_t *srv, ipc_callid_t iid,
     160    ipc_call_t *icall)
     161{
     162        iplink_sdu6_t sdu;
     163       
    113164        ipc_callid_t callid;
    114165        size_t size;
     
    119170        }
    120171       
    121         if (size != sizeof(inet_addr_t)) {
     172        if (size != sizeof(addr48_t)) {
    122173                async_answer_0(callid, EINVAL);
    123174                async_answer_0(iid, EINVAL);
     
    125176        }
    126177       
    127         int rc = async_data_write_finalize(callid, &sdu.src, size);
     178        int rc = async_data_write_finalize(callid, &sdu.dest, size);
    128179        if (rc != EOK) {
    129180                async_answer_0(callid, (sysarg_t) rc);
     
    131182        }
    132183       
    133         if (!async_data_write_receive(&callid, &size)) {
    134                 async_answer_0(callid, EREFUSED);
    135                 async_answer_0(iid, EREFUSED);
    136                 return;
    137         }
    138        
    139         if (size != sizeof(inet_addr_t)) {
    140                 async_answer_0(callid, EINVAL);
    141                 async_answer_0(iid, EINVAL);
    142                 return;
    143         }
    144        
    145         rc = async_data_write_finalize(callid, &sdu.dest, size);
    146         if (rc != EOK) {
    147                 async_answer_0(callid, (sysarg_t) rc);
    148                 async_answer_0(iid, (sysarg_t) rc);
    149         }
    150        
    151184        rc = async_data_write_accept(&sdu.data, false, 0, 0, 0,
    152185            &sdu.size);
    153         if (rc != EOK)
    154                 return;
    155        
    156         rc = srv->ops->send(srv, &sdu);
     186        if (rc != EOK) {
     187                async_answer_0(iid, rc);
     188                return;
     189        }
     190       
     191        rc = srv->ops->send6(srv, &sdu);
    157192        free(sdu.data);
    158193        async_answer_0(iid, rc);
     
    170205int iplink_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg)
    171206{
    172         iplink_srv_t *srv = (iplink_srv_t *)arg;
     207        iplink_srv_t *srv = (iplink_srv_t *) arg;
    173208        int rc;
    174209       
     
    214249                        iplink_get_mtu_srv(srv, callid, &call);
    215250                        break;
     251                case IPLINK_GET_MAC48:
     252                        iplink_get_mac48_srv(srv, callid, &call);
     253                        break;
    216254                case IPLINK_SEND:
    217255                        iplink_send_srv(srv, callid, &call);
     256                        break;
     257                case IPLINK_SEND6:
     258                        iplink_send6_srv(srv, callid, &call);
    218259                        break;
    219260                case IPLINK_ADDR_ADD:
  • uspace/lib/c/generic/net/socket_parse.c

    rcdc3afa r47f5a77  
    5353int socket_parse_address_family(const char *name, int *af)
    5454{
    55         if (str_lcmp(name, "AF_INET", 7) == 0) {
    56                 *af = AF_INET;
     55        if (str_lcmp(name, "AF_INET6", 8) == 0) {
     56                *af = AF_INET6;
    5757                return EOK;
    5858        }
    5959       
    60         if (str_lcmp(name, "AF_INET6", 8) == 0) {
    61                 *af = AF_INET6;
     60        if (str_lcmp(name, "AF_INET", 7) == 0) {
     61                *af = AF_INET;
    6262                return EOK;
    6363        }
  • uspace/lib/c/include/inet/addr.h

    rcdc3afa r47f5a77  
    7373extern void addr128(const addr128_t, addr128_t);
    7474
     75extern int addr128_compare(const addr128_t, const addr128_t);
     76
    7577extern void host2addr128_t_be(const addr128_t, addr128_t);
    7678extern void addr128_t_be2host(const addr128_t, addr128_t);
     
    8789extern int inet_addr_family(const char *, uint16_t *);
    8890extern void inet_naddr_addr(const inet_naddr_t *, inet_addr_t *);
     91extern void inet_addr_naddr(const inet_addr_t *, uint8_t, inet_naddr_t *);
    8992
    9093extern void inet_addr_any(inet_addr_t *);
     
    9497extern int inet_addr_is_any(const inet_addr_t *);
    9598
     99extern int inet_naddr_compare(const inet_naddr_t *, const inet_addr_t *);
    96100extern int inet_naddr_compare_mask(const inet_naddr_t *, const inet_addr_t *);
    97101
  • uspace/lib/c/include/inet/iplink.h

    rcdc3afa r47f5a77  
    4747} iplink_t;
    4848
    49 /** Internet link Service Data Unit */
     49/** IPv4 link Service Data Unit */
    5050typedef struct {
    5151        /** Local source address */
    52         inet_addr_t src;
     52        addr32_t src;
    5353        /** Local destination address */
    54         inet_addr_t dest;
     54        addr32_t dest;
    5555        /** Serialized IP packet */
    5656        void *data;
     
    5858        size_t size;
    5959} iplink_sdu_t;
     60
     61/** IPv6 link Service Data Unit */
     62typedef struct {
     63        /** Local MAC destination address */
     64        addr48_t dest;
     65        /** Serialized IP packet */
     66        void *data;
     67        /** Size of @c data in bytes */
     68        size_t size;
     69} iplink_sdu6_t;
    6070
    6171/** Internet link receive Service Data Unit */
     
    7484extern void iplink_close(iplink_t *);
    7585extern int iplink_send(iplink_t *, iplink_sdu_t *);
     86extern int iplink_send6(iplink_t *, iplink_sdu6_t *);
    7687extern int iplink_addr_add(iplink_t *, inet_addr_t *);
    7788extern int iplink_addr_remove(iplink_t *, inet_addr_t *);
    7889extern int iplink_get_mtu(iplink_t *, size_t *);
     90extern int iplink_get_mac48(iplink_t *, addr48_t *);
    7991
    8092#endif
  • uspace/lib/c/include/inet/iplink_srv.h

    rcdc3afa r47f5a77  
    5757        int (*close)(iplink_srv_t *);
    5858        int (*send)(iplink_srv_t *, iplink_sdu_t *);
     59        int (*send6)(iplink_srv_t *, iplink_sdu6_t *);
    5960        int (*get_mtu)(iplink_srv_t *, size_t *);
     61        int (*get_mac48)(iplink_srv_t *, addr48_t *);
    6062        int (*addr_add)(iplink_srv_t *, inet_addr_t *);
    6163        int (*addr_remove)(iplink_srv_t *, inet_addr_t *);
  • uspace/lib/c/include/ipc/iplink.h

    rcdc3afa r47f5a77  
    4040typedef enum {
    4141        IPLINK_GET_MTU = IPC_FIRST_USER_METHOD,
     42        IPLINK_GET_MAC48,
    4243        IPLINK_SEND,
     44        IPLINK_SEND6,
    4345        IPLINK_ADDR_ADD,
    4446        IPLINK_ADDR_REMOVE
  • uspace/srv/net/dnsrsrv/dns_std.h

    rcdc3afa r47f5a77  
    6565        DTYPE_MX        = 15,
    6666        DTYPE_TXT       = 16,
     67        DTYPE_AAAA      = 28,
    6768        DQTYPE_AXFR     = 252,
    6869        DQTYPE_MAILB    = 253,
  • uspace/srv/net/ethip/ethip.c

    rcdc3afa r47f5a77  
    5656static int ethip_close(iplink_srv_t *srv);
    5757static int ethip_send(iplink_srv_t *srv, iplink_sdu_t *sdu);
     58static int ethip_send6(iplink_srv_t *srv, iplink_sdu6_t *sdu);
    5859static int ethip_get_mtu(iplink_srv_t *srv, size_t *mtu);
     60static int ethip_get_mac48(iplink_srv_t *srv, addr48_t *mac);
    5961static int ethip_addr_add(iplink_srv_t *srv, inet_addr_t *addr);
    6062static int ethip_addr_remove(iplink_srv_t *srv, inet_addr_t *addr);
     
    6668        .close = ethip_close,
    6769        .send = ethip_send,
     70        .send6 = ethip_send6,
    6871        .get_mtu = ethip_get_mtu,
     72        .get_mac48 = ethip_get_mac48,
    6973        .addr_add = ethip_addr_add,
    7074        .addr_remove = ethip_addr_remove
     
    169173       
    170174        ethip_nic_t *nic = (ethip_nic_t *) srv->arg;
    171        
    172         addr32_t src_v4;
    173         addr128_t src_v6;
    174         uint16_t src_af = inet_addr_get(&sdu->src, &src_v4, &src_v6);
    175        
    176         addr32_t dest_v4;
    177         addr128_t dest_v6;
    178         uint16_t dest_af = inet_addr_get(&sdu->dest, &dest_v4, &dest_v6);
    179        
    180         if (src_af != dest_af)
    181                 return EINVAL;
    182        
    183         int rc;
    184175        eth_frame_t frame;
    185176       
    186         switch (src_af) {
    187         case AF_INET:
    188                 rc = arp_translate(nic, src_v4, dest_v4, frame.dest);
    189                 if (rc != EOK) {
    190                         log_msg(LOG_DEFAULT, LVL_WARN, "Failed to look up IPv4 address 0x%"
    191                             PRIx32, dest_v4);
    192                         return rc;
    193                 }
    194                
    195                 addr48(nic->mac_addr, frame.src);
    196                 frame.etype_len = ETYPE_IP;
    197                 frame.data = sdu->data;
    198                 frame.size = sdu->size;
    199                
    200                 break;
    201         case AF_INET6:
    202                 // FIXME TODO
    203                 return ENOTSUP;
    204         default:
    205                 return EINVAL;
    206         }
     177        int rc = arp_translate(nic, sdu->src, sdu->dest, frame.dest);
     178        if (rc != EOK) {
     179                log_msg(LOG_DEFAULT, LVL_WARN, "Failed to look up IPv4 address 0x%"
     180                    PRIx32, sdu->dest);
     181                return rc;
     182        }
     183       
     184        addr48(nic->mac_addr, frame.src);
     185        frame.etype_len = ETYPE_IP;
     186        frame.data = sdu->data;
     187        frame.size = sdu->size;
    207188       
    208189        void *data;
    209190        size_t size;
    210191        rc = eth_pdu_encode(&frame, &data, &size);
     192        if (rc != EOK)
     193                return rc;
     194       
     195        rc = ethip_nic_send(nic, data, size);
     196        free(data);
     197       
     198        return rc;
     199}
     200
     201static int ethip_send6(iplink_srv_t *srv, iplink_sdu6_t *sdu)
     202{
     203        log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_send6()");
     204       
     205        ethip_nic_t *nic = (ethip_nic_t *) srv->arg;
     206        eth_frame_t frame;
     207       
     208        addr48(sdu->dest, frame.dest);
     209        addr48(nic->mac_addr, frame.src);
     210        frame.etype_len = ETYPE_IPV6;
     211        frame.data = sdu->data;
     212        frame.size = sdu->size;
     213       
     214        void *data;
     215        size_t size;
     216        int rc = eth_pdu_encode(&frame, &data, &size);
    211217        if (rc != EOK)
    212218                return rc;
     
    268274}
    269275
     276static int ethip_get_mac48(iplink_srv_t *srv, addr48_t *mac)
     277{
     278        log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_get_mac48()");
     279       
     280        ethip_nic_t *nic = (ethip_nic_t *) srv->arg;
     281        addr48(nic->mac_addr, *mac);
     282       
     283        return EOK;
     284}
     285
    270286static int ethip_addr_add(iplink_srv_t *srv, inet_addr_t *addr)
    271287{
  • uspace/srv/net/ethip/pdu.c

    rcdc3afa r47f5a77  
    4646#include "pdu.h"
    4747
    48 #define MAC48_BYTES 6
    49 
    5048/** Encode Ethernet PDU. */
    5149int eth_pdu_encode(eth_frame_t *frame, void **rdata, size_t *rsize)
  • uspace/srv/net/inetsrv/Makefile

    rcdc3afa r47f5a77  
    3939        inetping.c \
    4040        inetping6.c \
     41        ndp.c \
     42        ntrans.c \
    4143        pdu.c \
    4244        reass.c \
  • uspace/srv/net/inetsrv/addrobj.c

    rcdc3afa r47f5a77  
    4242#include <stdlib.h>
    4343#include <str.h>
     44#include <net/socket_codes.h>
    4445#include "addrobj.h"
    4546#include "inetsrv.h"
    4647#include "inet_link.h"
     48#include "ndp.h"
    4749
    4850static inet_addrobj_t *inet_addrobj_find_by_name_locked(const char *, inet_link_t *);
     
    117119                    inet_addrobj_t, addr_list);
    118120               
    119                 if (inet_naddr_compare_mask(&naddr->naddr, addr)) {
    120                         fibril_mutex_unlock(&addr_list_lock);
    121                         log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_addrobj_find: found %p",
    122                             naddr);
    123                         return naddr;
     121                switch (find) {
     122                case iaf_net:
     123                        if (inet_naddr_compare_mask(&naddr->naddr, addr)) {
     124                                fibril_mutex_unlock(&addr_list_lock);
     125                                log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_addrobj_find: found %p",
     126                                    naddr);
     127                                return naddr;
     128                        }
     129                        break;
     130                case iaf_addr:
     131                        if (inet_naddr_compare(&naddr->naddr, addr)) {
     132                                fibril_mutex_unlock(&addr_list_lock);
     133                                log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_addrobj_find: found %p",
     134                                    naddr);
     135                                return naddr;
     136                        }
     137                        break;
    124138                }
    125139        }
     
    214228        inet_naddr_addr(&addr->naddr, &lsrc_addr);
    215229       
    216         return inet_link_send_dgram(addr->ilink, &lsrc_addr, ldest, dgram,
    217             proto, ttl, df);
     230        addr32_t lsrc_v4;
     231        addr128_t lsrc_v6;
     232        uint16_t lsrc_af = inet_addr_get(&lsrc_addr, &lsrc_v4, &lsrc_v6);
     233       
     234        addr32_t ldest_v4;
     235        addr128_t ldest_v6;
     236        uint16_t ldest_af = inet_addr_get(ldest, &ldest_v4, &ldest_v6);
     237       
     238        if (lsrc_af != ldest_af)
     239                return EINVAL;
     240       
     241        int rc;
     242        addr48_t ldest_mac;
     243       
     244        switch (ldest_af) {
     245        case AF_INET:
     246                return inet_link_send_dgram(addr->ilink, lsrc_v4, ldest_v4,
     247                    dgram, proto, ttl, df);
     248        case AF_INET6:
     249                /*
     250                 * Translate local destination IPv6 address.
     251                 */
     252                rc = ndp_translate(lsrc_v6, ldest_v6, ldest_mac, addr->ilink);
     253                if (rc != EOK)
     254                        return rc;
     255               
     256                return inet_link_send_dgram6(addr->ilink, ldest_mac, dgram,
     257                    proto, ttl, df);
     258        }
     259       
     260        return ENOTSUP;
    218261}
    219262
  • uspace/srv/net/inetsrv/icmp.c

    rcdc3afa r47f5a77  
    153153                return ENOMEM;
    154154       
    155         icmp_echo_t *request = (icmp_echo_t *)rdata;
     155        icmp_echo_t *request = (icmp_echo_t *) rdata;
    156156       
    157157        request->type = ICMP_ECHO_REQUEST;
  • uspace/srv/net/inetsrv/icmpv6.c

    rcdc3afa r47f5a77  
    4747#include "pdu.h"
    4848
    49 static int ndp_received(inet_dgram_t *dgram)
    50 {
    51         // FIXME TODO
    52         return ENOTSUP;
    53 }
    54 
    5549static int icmpv6_recv_echo_request(inet_dgram_t *dgram)
    5650{
     
    8478        inet_dgram_t rdgram;
    8579       
    86         rdgram.src = dgram->dest;
     80        inet_get_srcaddr(&dgram->src, 0, &rdgram.src);
    8781        rdgram.dest = dgram->src;
    8882        rdgram.tos = 0;
     
    9084        rdgram.size = size;
    9185       
    92         icmpv6_pseudo_header phdr;
     86        icmpv6_phdr_t phdr;
    9387       
    9488        host2addr128_t_be(dest_v6, phdr.src_addr);
     
    10094        uint16_t cs_phdr =
    10195            inet_checksum_calc(INET_CHECKSUM_INIT, &phdr,
    102             sizeof(icmpv6_pseudo_header));
     96            sizeof(icmpv6_phdr_t));
    10397       
    10498        uint16_t cs_all = inet_checksum_calc(cs_phdr, reply, size);
     
    156150        case ICMPV6_NEIGHBOUR_SOLICITATION:
    157151        case ICMPV6_NEIGHBOUR_ADVERTISEMENT:
    158 #ifdef ACCEPT_RA
    159152        case ICMPV6_ROUTER_ADVERTISEMENT:
    160 #endif
    161153                return ndp_received(dgram);
    162154        default:
     
    192184        dgram.size = rsize;
    193185       
    194         icmpv6_pseudo_header phdr;
     186        icmpv6_phdr_t phdr;
    195187       
    196188        host2addr128_t_be(sdu->src, phdr.src_addr);
     
    202194        uint16_t cs_phdr =
    203195            inet_checksum_calc(INET_CHECKSUM_INIT, &phdr,
    204             sizeof(icmpv6_pseudo_header));
     196            sizeof(icmpv6_phdr_t));
    205197       
    206198        uint16_t cs_all = inet_checksum_calc(cs_phdr, rdata, rsize);
  • uspace/srv/net/inetsrv/icmpv6_std.h

    rcdc3afa r47f5a77  
    4747#define INET6_HOP_LIMIT_MAX  255
    4848
     49#define NDP_FLAG_ROUTER     0x80
     50#define NDP_FLAG_OVERRIDE   0x40
     51#define NDP_FLAG_SOLICITED  0x20
     52
    4953/** ICMPv6 message type */
    5054enum icmpv6_type {
     
    8387                        uint8_t flags;
    8488                        /** Reserved bytes */
    85                         uint8_t reserved [3];
     89                        uint8_t reserved[3];
    8690                } ndp;
    8791        } un;
     
    9195typedef struct {
    9296        /** Source IPv6 address */
    93         uint8_t src_addr [16];
     97        uint8_t src_addr[16];
    9498        /** Target IPv6 address */
    95         uint8_t dest_addr [16];
     99        uint8_t dest_addr[16];
    96100        /** ICMPv6 length */
    97101        uint32_t length;
    98102        /** Zeroes */
    99         uint8_t zeroes [3];
     103        uint8_t zeroes[3];
    100104        /** Next header */
    101105        uint8_t next;
    102 } icmpv6_pseudo_header;
     106} icmpv6_phdr_t;
    103107
    104108/** NDP neighbour body */
    105109typedef struct {
    106110        /** Target IPv6 address */
    107         uint8_t target_address [16];
     111        uint8_t target_address[16];
    108112        /** Option code */
    109113        uint8_t option;
     
    111115        uint8_t length;
    112116        /** MAC address */
    113         uint8_t mac [6];
     117        uint8_t mac[6];
    114118} ndp_message_t;
    115119
     
    131135        uint32_t reserved;
    132136        /** Prefix */
    133         uint8_t prefix [16];
     137        uint8_t prefix[16];
    134138} ndp_prefix_t;
    135139
  • uspace/srv/net/inetsrv/inet_link.c

    rcdc3afa r47f5a77  
    4949#include "pdu.h"
    5050
     51static bool first_link = true;
     52static bool first_link6 = true;
     53
     54static FIBRIL_MUTEX_INITIALIZE(ip_ident_lock);
     55static uint16_t ip_ident = 0;
     56
    5157static int inet_link_open(service_id_t);
    5258static int inet_iplink_recv(iplink_t *, iplink_recv_sdu_t *, uint16_t);
     
    5864static LIST_INITIALIZE(inet_link_list);
    5965static FIBRIL_MUTEX_INITIALIZE(inet_discovery_lock);
     66
     67static addr128_t link_local_node_ip =
     68    {0xfe, 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xfe, 0, 0, 0};
     69
     70static void inet_link_local_node_ip(addr48_t mac_addr,
     71    addr128_t ip_addr)
     72{
     73        memcpy(ip_addr, link_local_node_ip, 16);
     74       
     75        ip_addr[8] = mac_addr[0] ^ 0x02;
     76        ip_addr[9] = mac_addr[1];
     77        ip_addr[10] = mac_addr[2];
     78        ip_addr[13] = mac_addr[3];
     79        ip_addr[14] = mac_addr[4];
     80        ip_addr[15] = mac_addr[5];
     81}
    6082
    6183static int inet_iplink_recv(iplink_t *iplink, iplink_recv_sdu_t *sdu, uint16_t af)
     
    159181        if (ilink->svc_name != NULL)
    160182                free(ilink->svc_name);
     183       
    161184        free(ilink);
    162185}
     
    201224                goto error;
    202225        }
     226       
     227        /*
     228         * Get the MAC address of the link. If the link has a MAC
     229         * address, we assume that it supports NDP.
     230         */
     231        rc = iplink_get_mac48(ilink->iplink, &ilink->mac);
     232        ilink->mac_valid = (rc == EOK);
    203233
    204234        log_msg(LOG_DEFAULT, LVL_DEBUG, "Opened IP link '%s'", ilink->svc_name);
    205235        list_append(&ilink->link_list, &inet_link_list);
    206236
    207         inet_addrobj_t *addr;
    208         inet_addrobj_t *addr6;
    209 
    210         static int first = 1;
    211        
    212         addr = inet_addrobj_new();
    213         addr6 = inet_addrobj_new();
    214        
    215         if (first) {
     237        inet_addrobj_t *addr = NULL;
     238       
     239        if (first_link) {
     240                addr = inet_addrobj_new();
     241               
    216242                inet_naddr(&addr->naddr, 127, 0, 0, 1, 24);
    217                 inet_naddr6(&addr6->naddr, 0, 0, 0, 0, 0, 0, 0, 1, 128);
    218                 first = 0;
     243                first_link = false;
    219244        } else {
    220245                /*
    221246                 * FIXME
    222                  * Setting static IP addresses for testing purposes
     247                 * Setting static IPv4 address for testing purposes:
    223248                 * 10.0.2.15/24
    224                  * fd19:1680::4/120
    225249                 */
     250                addr = inet_addrobj_new();
     251               
    226252                inet_naddr(&addr->naddr, 10, 0, 2, 15, 24);
    227                 inet_naddr6(&addr6->naddr, 0xfd19, 0x1680, 0, 0, 0, 0, 0, 4, 120);
    228         }
    229        
    230         addr->ilink = ilink;
    231         addr6->ilink = ilink;
    232         addr->name = str_dup("v4a");
    233         addr6->name = str_dup("v6a");
    234        
    235         rc = inet_addrobj_add(addr);
    236         if (rc != EOK) {
    237                 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed adding IPv4 address.");
    238                 inet_addrobj_delete(addr);
    239                 /* XXX Roll back */
    240                 return rc;
    241         }
    242        
    243         rc = inet_addrobj_add(addr6);
    244         if (rc != EOK) {
    245                 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed adding IPv6 address.");
    246                 inet_addrobj_delete(addr6);
    247                 /* XXX Roll back */
    248                 return rc;
    249         }
    250        
    251         inet_naddr_addr(&addr->naddr, &iaddr);
    252         rc = iplink_addr_add(ilink->iplink, &iaddr);
    253         if (rc != EOK) {
    254                 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed setting IPv4 address on internet link.");
    255                 inet_addrobj_remove(addr);
    256                 inet_addrobj_delete(addr);
    257                 /* XXX Roll back */
    258                 return rc;
    259         }
    260        
    261         inet_naddr_addr(&addr6->naddr, &iaddr);
    262         rc = iplink_addr_add(ilink->iplink, &iaddr);
    263         if (rc != EOK) {
    264                 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed setting IPv6 address on internet link.");
    265                 inet_addrobj_remove(addr6);
    266                 inet_addrobj_delete(addr6);
    267                 /* XXX Roll back */
    268                 return rc;
     253        }
     254       
     255        if (addr != NULL) {
     256                addr->ilink = ilink;
     257                addr->name = str_dup("v4a");
     258               
     259                rc = inet_addrobj_add(addr);
     260                if (rc == EOK) {
     261                        inet_naddr_addr(&addr->naddr, &iaddr);
     262                        rc = iplink_addr_add(ilink->iplink, &iaddr);
     263                        if (rc != EOK) {
     264                                log_msg(LOG_DEFAULT, LVL_ERROR,
     265                                    "Failed setting IPv4 address on internet link.");
     266                                inet_addrobj_remove(addr);
     267                                inet_addrobj_delete(addr);
     268                        }
     269                } else {
     270                        log_msg(LOG_DEFAULT, LVL_ERROR, "Failed adding IPv4 address.");
     271                        inet_addrobj_delete(addr);
     272                }
     273        }
     274       
     275        inet_addrobj_t *addr6 = NULL;
     276       
     277        if (first_link6) {
     278                addr6 = inet_addrobj_new();
     279               
     280                inet_naddr6(&addr6->naddr, 0, 0, 0, 0, 0, 0, 0, 1, 128);
     281                first_link6 = false;
     282        } else if (ilink->mac_valid) {
     283                addr6 = inet_addrobj_new();
     284               
     285                addr128_t link_local;
     286                inet_link_local_node_ip(ilink->mac, link_local);
     287               
     288                inet_naddr_set6(link_local, 64, &addr6->naddr);
     289        }
     290       
     291        if (addr6 != NULL) {
     292                addr6->ilink = ilink;
     293                addr6->name = str_dup("v6a");
     294               
     295                rc = inet_addrobj_add(addr6);
     296                if (rc == EOK) {
     297                        inet_naddr_addr(&addr6->naddr, &iaddr);
     298                        rc = iplink_addr_add(ilink->iplink, &iaddr);
     299                        if (rc != EOK) {
     300                                log_msg(LOG_DEFAULT, LVL_ERROR,
     301                                    "Failed setting IPv6 address on internet link.");
     302                                inet_addrobj_remove(addr6);
     303                                inet_addrobj_delete(addr6);
     304                        }
     305                } else {
     306                        log_msg(LOG_DEFAULT, LVL_ERROR, "Failed adding IPv6 address.");
     307                        inet_addrobj_delete(addr6);
     308                }
    269309        }
    270310       
     
    298338}
    299339
    300 /** Send datagram over Internet link */
    301 int inet_link_send_dgram(inet_link_t *ilink, inet_addr_t *lsrc,
    302     inet_addr_t *ldest, inet_dgram_t *dgram, uint8_t proto, uint8_t ttl, int df)
    303 {
     340/** Send IPv4 datagram over Internet link
     341 *
     342 * @param ilink Internet link
     343 * @param lsrc  Source IPv4 address
     344 * @param ldest Destination IPv4 address
     345 * @param dgram IPv4 datagram body
     346 * @param proto Protocol
     347 * @param ttl   Time-to-live
     348 * @param df    Do-not-Fragment flag
     349 *
     350 * @return EOK on success
     351 * @return ENOMEM when not enough memory to create the datagram
     352 * @return ENOTSUP if networking mode is not supported
     353 *
     354 */
     355int inet_link_send_dgram(inet_link_t *ilink, addr32_t lsrc, addr32_t ldest,
     356    inet_dgram_t *dgram, uint8_t proto, uint8_t ttl, int df)
     357{
     358        addr32_t src_v4;
     359        uint16_t src_af = inet_addr_get(&dgram->src, &src_v4, NULL);
     360        if (src_af != AF_INET)
     361                return EINVAL;
     362       
     363        addr32_t dest_v4;
     364        uint16_t dest_af = inet_addr_get(&dgram->dest, &dest_v4, NULL);
     365        if (dest_af != AF_INET)
     366                return EINVAL;
     367       
    304368        /*
    305369         * Fill packet structure. Fragmentation is performed by
    306370         * inet_pdu_encode().
    307371         */
     372       
     373        iplink_sdu_t sdu;
     374       
     375        sdu.src = lsrc;
     376        sdu.dest = ldest;
    308377       
    309378        inet_packet_t packet;
     
    314383        packet.proto = proto;
    315384        packet.ttl = ttl;
     385       
     386        /* Allocate identifier */
     387        fibril_mutex_lock(&ip_ident_lock);
     388        packet.ident = ++ip_ident;
     389        fibril_mutex_unlock(&ip_ident_lock);
     390       
    316391        packet.df = df;
    317392        packet.data = dgram->data;
    318393        packet.size = dgram->size;
    319394       
    320         iplink_sdu_t sdu;
     395        int rc;
    321396        size_t offs = 0;
    322         int rc;
    323        
    324         sdu.src = *lsrc;
    325         sdu.dest = *ldest;
    326397       
    327398        do {
    328399                /* Encode one fragment */
     400               
    329401                size_t roffs;
    330                 rc = inet_pdu_encode(&packet, offs, ilink->def_mtu, &sdu.data,
    331                     &sdu.size, &roffs);
     402                rc = inet_pdu_encode(&packet, src_v4, dest_v4, offs, ilink->def_mtu,
     403                    &sdu.data, &sdu.size, &roffs);
    332404                if (rc != EOK)
    333405                        return rc;
     
    335407                /* Send the PDU */
    336408                rc = iplink_send(ilink->iplink, &sdu);
     409               
    337410                free(sdu.data);
    338                
     411                offs = roffs;
     412        } while (offs < packet.size);
     413       
     414        return rc;
     415}
     416
     417/** Send IPv6 datagram over Internet link
     418 *
     419 * @param ilink Internet link
     420 * @param ldest Destination MAC address
     421 * @param dgram IPv6 datagram body
     422 * @param proto Next header
     423 * @param ttl   Hop limit
     424 * @param df    Do-not-Fragment flag (unused)
     425 *
     426 * @return EOK on success
     427 * @return ENOMEM when not enough memory to create the datagram
     428 *
     429 */
     430int inet_link_send_dgram6(inet_link_t *ilink, addr48_t ldest,
     431    inet_dgram_t *dgram, uint8_t proto, uint8_t ttl, int df)
     432{
     433        addr128_t src_v6;
     434        uint16_t src_af = inet_addr_get(&dgram->src, NULL, &src_v6);
     435        if (src_af != AF_INET6)
     436                return EINVAL;
     437       
     438        addr128_t dest_v6;
     439        uint16_t dest_af = inet_addr_get(&dgram->dest, NULL, &dest_v6);
     440        if (dest_af != AF_INET6)
     441                return EINVAL;
     442       
     443        iplink_sdu6_t sdu6;
     444        addr48(ldest, sdu6.dest);
     445       
     446        /*
     447         * Fill packet structure. Fragmentation is performed by
     448         * inet_pdu_encode6().
     449         */
     450       
     451        inet_packet_t packet;
     452       
     453        packet.src = dgram->src;
     454        packet.dest = dgram->dest;
     455        packet.tos = dgram->tos;
     456        packet.proto = proto;
     457        packet.ttl = ttl;
     458       
     459        /* Allocate identifier */
     460        fibril_mutex_lock(&ip_ident_lock);
     461        packet.ident = ++ip_ident;
     462        fibril_mutex_unlock(&ip_ident_lock);
     463       
     464        packet.df = df;
     465        packet.data = dgram->data;
     466        packet.size = dgram->size;
     467       
     468        int rc;
     469        size_t offs = 0;
     470       
     471        do {
     472                /* Encode one fragment */
     473               
     474                size_t roffs;
     475                rc = inet_pdu_encode6(&packet, src_v6, dest_v6, offs, ilink->def_mtu,
     476                    &sdu6.data, &sdu6.size, &roffs);
     477                if (rc != EOK)
     478                        return rc;
     479               
     480                /* Send the PDU */
     481                rc = iplink_send6(ilink->iplink, &sdu6);
     482               
     483                free(sdu6.data);
    339484                offs = roffs;
    340485        } while (offs < packet.size);
  • uspace/srv/net/inetsrv/inet_link.h

    rcdc3afa r47f5a77  
    4242
    4343extern int inet_link_discovery_start(void);
    44 extern int inet_link_send_dgram(inet_link_t *, inet_addr_t *,
    45     inet_addr_t *, inet_dgram_t *, uint8_t, uint8_t, int);
     44extern int inet_link_send_dgram(inet_link_t *, addr32_t,
     45    addr32_t, inet_dgram_t *, uint8_t, uint8_t, int);
     46extern int inet_link_send_dgram6(inet_link_t *, addr48_t, inet_dgram_t *,
     47    uint8_t, uint8_t, int);
    4648extern inet_link_t *inet_link_get_by_id(sysarg_t);
    4749
  • uspace/srv/net/inetsrv/inet_std.h

    rcdc3afa r47f5a77  
    4848        /** Total Length */
    4949        uint16_t tot_len;
    50         /** Identification */
     50        /** Identifier */
    5151        uint16_t id;
    5252        /** Flags, Fragment Offset */
     
    9090};
    9191
     92/** Bits in ip6_frag_header_t.offsmf */
     93enum flags_offsmt_bits {
     94        /** More fragments */
     95        OF_FLAG_M = 0,
     96        /** Fragment offset, highest bit */
     97        OF_FRAGOFF_h = 15,
     98        /** Fragment offset, lowest bit */
     99        OF_FRAGOFF_l = 3
     100};
     101
    92102/** IPv6 Datagram header (fixed part) */
    93103typedef struct {
     
    114124        /** Reserved */
    115125        uint8_t reserved;
    116         /** Fragment Offset, Flags */
    117         uint16_t foff_flags;
    118         /** Identification */
     126        /** Fragmentation offset, reserved and M flag */
     127        uint16_t offsmf;
     128        /** Identifier */
    119129        uint32_t id;
    120130} ip6_header_fragment_t;
  • uspace/srv/net/inetsrv/inetping6.c

    rcdc3afa r47f5a77  
    109109        aid_t req = async_send_1(exch, INETPING6_EV_RECV, sdu->seq_no, &answer);
    110110       
    111         int rc = async_data_write_start(exch, sdu->src, 16);
     111        int rc = async_data_write_start(exch, sdu->src, sizeof(addr128_t));
    112112        if (rc != EOK) {
    113113                async_exchange_end(exch);
     
    116116        }
    117117       
    118         rc = async_data_write_start(exch, sdu->dest, 16);
     118        rc = async_data_write_start(exch, sdu->dest, sizeof(addr128_t));
    119119        if (rc != EOK) {
    120120                async_exchange_end(exch);
  • uspace/srv/net/inetsrv/inetsrv.c

    rcdc3afa r47f5a77  
    6262#define NAME "inetsrv"
    6363
     64static inet_naddr_t solicited_node_mask = {
     65        .family = AF_INET6,
     66        .addr6 = {0xff, 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01, 0xff, 0, 0, 0},
     67        .prefix = 104
     68};
     69
     70static inet_addr_t multicast_all_nodes = {
     71        .family = AF_INET,
     72        .addr6 = {0xff, 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01}
     73};
     74
    6475static void inet_client_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg);
    6576
     
    514525
    515526        addr = inet_addrobj_find(&packet->dest, iaf_addr);
    516         if (addr != NULL) {
     527        if ((addr != NULL) ||
     528            (inet_naddr_compare_mask(&solicited_node_mask, &packet->dest)) ||
     529            (inet_addr_compare(&multicast_all_nodes, &packet->dest))) {
    517530                /* Destined for one of the local addresses */
    518531
  • uspace/srv/net/inetsrv/inetsrv.h

    rcdc3afa r47f5a77  
    113113        uint8_t ttl;
    114114        /** Identifier */
    115         uint16_t ident;
     115        uint32_t ident;
    116116        /** Do not fragment */
    117117        bool df;
     
    141141        iplink_t *iplink;
    142142        size_t def_mtu;
     143        addr48_t mac;
     144        bool mac_valid;
    143145} inet_link_t;
    144146
  • uspace/srv/net/inetsrv/pdu.c

    rcdc3afa r47f5a77  
    4949#include "pdu.h"
    5050
    51 static FIBRIL_MUTEX_INITIALIZE(ip_ident_lock);
    52 static uint16_t ip_ident = 0;
    53 
    5451/** One's complement addition.
    5552 *
     
    8885}
    8986
    90 /** Encode Internet PDU.
     87/** Encode IPv4 PDU.
    9188 *
    9289 * Encode internet packet into PDU (serialized form). Will encode a
     
    9693 * be set in the header, otherwise the offset will equal @a packet->size.
    9794 *
    98  * @param packet        Packet to encode
    99  * @param offs          Offset into packet payload (in bytes)
    100  * @param mtu           MTU (Maximum Transmission Unit) in bytes
    101  * @param rdata         Place to store pointer to allocated data buffer
    102  * @param rsize         Place to store size of allocated data buffer
    103  * @param roffs         Place to store offset of remaning data
    104  */
    105 int inet_pdu_encode(inet_packet_t *packet, size_t offs, size_t mtu,
    106     void **rdata, size_t *rsize, size_t *roffs)
    107 {
    108         addr32_t src_v4;
    109         addr128_t src_v6;
    110         uint16_t src_af = inet_addr_get(&packet->src, &src_v4, &src_v6);
    111        
    112         addr32_t dest_v4;
    113         addr128_t dest_v6;
    114         uint16_t dest_af = inet_addr_get(&packet->dest, &dest_v4, &dest_v6);
    115        
    116         if (src_af != dest_af)
    117                 return EINVAL;
    118        
     95 * @param packet Packet to encode
     96 * @param src    Source address
     97 * @param dest   Destination address
     98 * @param offs   Offset into packet payload (in bytes)
     99 * @param mtu    MTU (Maximum Transmission Unit) in bytes
     100 * @param rdata  Place to store pointer to allocated data buffer
     101 * @param rsize  Place to store size of allocated data buffer
     102 * @param roffs  Place to store offset of remaning data
     103 *
     104 */
     105int inet_pdu_encode(inet_packet_t *packet, addr32_t src, addr32_t dest,
     106    size_t offs, size_t mtu, void **rdata, size_t *rsize, size_t *roffs)
     107{
    119108        /* Upper bound for fragment offset field */
    120109        size_t fragoff_limit = 1 << (FF_FRAGOFF_h - FF_FRAGOFF_l);
     
    124113                return ELIMIT;
    125114       
    126         size_t hdr_size;
    127        
    128         switch (src_af) {
    129         case AF_INET:
    130                 hdr_size = sizeof(ip_header_t);
    131                 break;
    132         case AF_INET6:
    133                 hdr_size = sizeof(ip6_header_t);
    134                 break;
    135         default:
    136                 assert(false);
    137         }
     115        size_t hdr_size = sizeof(ip_header_t);
    138116       
    139117        size_t data_offs = ROUND_UP(hdr_size, 4);
     
    171149                return ENOMEM;
    172150       
    173         /* Allocate identifier */
    174         fibril_mutex_lock(&ip_ident_lock);
    175         uint16_t ident = ++ip_ident;
    176         fibril_mutex_unlock(&ip_ident_lock);
    177        
    178151        /* Encode header fields */
    179         ip_header_t *hdr;
    180         ip6_header_t *hdr6;
    181        
    182         switch (src_af) {
    183         case AF_INET:
    184                 hdr = (ip_header_t *) data;
    185                
    186                 hdr->ver_ihl =
    187                     (4 << VI_VERSION_l) | (hdr_size / sizeof(uint32_t));
    188                 hdr->tos = packet->tos;
    189                 hdr->tot_len = host2uint16_t_be(size);
    190                 hdr->id = host2uint16_t_be(ident);
    191                 hdr->flags_foff = host2uint16_t_be(flags_foff);
    192                 hdr->ttl = packet->ttl;
    193                 hdr->proto = packet->proto;
    194                 hdr->chksum = 0;
    195                 hdr->src_addr = host2uint32_t_be(src_v4);
    196                 hdr->dest_addr = host2uint32_t_be(dest_v4);
    197                
    198                 /* Compute checksum */
    199                 uint16_t chksum = inet_checksum_calc(INET_CHECKSUM_INIT,
    200                     (void *) hdr, hdr_size);
    201                 hdr->chksum = host2uint16_t_be(chksum);
    202                
    203                 break;
    204         case AF_INET6:
    205                 // TODO FIXME: fragmentation
    206                
    207                 hdr6 = (ip6_header_t *) data;
    208                
    209                 hdr6->ver_tc = (6 << (VI_VERSION_l));
    210                 memset(hdr6->tc_fl, 0, 3);
    211                 hdr6->payload_len = host2uint16_t_be(packet->size);
    212                 hdr6->next = packet->proto;
    213                 hdr6->hop_limit = packet->ttl;
    214                
    215                 host2addr128_t_be(src_v6, hdr6->src_addr);
    216                 host2addr128_t_be(dest_v6, hdr6->dest_addr);
    217                
    218                 break;
    219         default:
    220                 assert(false);
    221         }
     152        ip_header_t *hdr = (ip_header_t *) data;
     153       
     154        hdr->ver_ihl =
     155            (4 << VI_VERSION_l) | (hdr_size / sizeof(uint32_t));
     156        hdr->tos = packet->tos;
     157        hdr->tot_len = host2uint16_t_be(size);
     158        hdr->id = host2uint16_t_be(packet->ident);
     159        hdr->flags_foff = host2uint16_t_be(flags_foff);
     160        hdr->ttl = packet->ttl;
     161        hdr->proto = packet->proto;
     162        hdr->chksum = 0;
     163        hdr->src_addr = host2uint32_t_be(src);
     164        hdr->dest_addr = host2uint32_t_be(dest);
     165       
     166        /* Compute checksum */
     167        uint16_t chksum = inet_checksum_calc(INET_CHECKSUM_INIT,
     168            (void *) hdr, hdr_size);
     169        hdr->chksum = host2uint16_t_be(chksum);
    222170       
    223171        /* Copy payload */
     
    231179}
    232180
     181/** Encode IPv6 PDU.
     182 *
     183 * Encode internet packet into PDU (serialized form). Will encode a
     184 * fragment of the payload starting at offset @a offs. The resulting
     185 * PDU will have at most @a mtu bytes. @a *roffs will be set to the offset
     186 * of remaining payload. If some data is remaining, the MF flag will
     187 * be set in the header, otherwise the offset will equal @a packet->size.
     188 *
     189 * @param packet Packet to encode
     190 * @param src    Source address
     191 * @param dest   Destination address
     192 * @param offs   Offset into packet payload (in bytes)
     193 * @param mtu    MTU (Maximum Transmission Unit) in bytes
     194 * @param rdata  Place to store pointer to allocated data buffer
     195 * @param rsize  Place to store size of allocated data buffer
     196 * @param roffs Place to store offset of remaning data
     197 *
     198 */
     199int inet_pdu_encode6(inet_packet_t *packet, addr128_t src, addr128_t dest,
     200    size_t offs, size_t mtu, void **rdata, size_t *rsize, size_t *roffs)
     201{
     202        /* Upper bound for fragment offset field */
     203        size_t fragoff_limit = 1 << (FF_FRAGOFF_h - FF_FRAGOFF_l);
     204       
     205        /* Verify that total size of datagram is within reasonable bounds */
     206        if (offs + packet->size > FRAG_OFFS_UNIT * fragoff_limit)
     207                return ELIMIT;
     208       
     209        size_t hdr_size = sizeof(ip6_header_t);
     210       
     211        size_t data_offs = ROUND_UP(hdr_size, 4);
     212       
     213        assert(offs % FRAG_OFFS_UNIT == 0);
     214        assert(offs / FRAG_OFFS_UNIT < fragoff_limit);
     215       
     216#if 0
     217        // FIXME TODO fragmentation
     218       
     219        /* Value for the fragment offset field */
     220        uint16_t foff = offs / FRAG_OFFS_UNIT;
     221#endif
     222       
     223        if (hdr_size >= mtu)
     224                return EINVAL;
     225       
     226        /* Amount of space in the PDU available for payload */
     227        size_t spc_avail = mtu - hdr_size;
     228        spc_avail -= (spc_avail % FRAG_OFFS_UNIT);
     229       
     230        /* Amount of data (payload) to transfer */
     231        size_t xfer_size = min(packet->size - offs, spc_avail);
     232       
     233        /* Total PDU size */
     234        size_t size = hdr_size + xfer_size;
     235       
     236        /* Offset of remaining payload */
     237        size_t rem_offs = offs + xfer_size;
     238       
     239#if 0
     240        // FIXME TODO fragmentation
     241       
     242        /* Flags */
     243        uint16_t flags_foff =
     244            (packet->df ? BIT_V(uint16_t, FF_FLAG_DF) : 0) +
     245            (rem_offs < packet->size ? BIT_V(uint16_t, FF_FLAG_MF) : 0) +
     246            (foff << FF_FRAGOFF_l);
     247#endif
     248       
     249        void *data = calloc(size, 1);
     250        if (data == NULL)
     251                return ENOMEM;
     252       
     253        /* Encode header fields */
     254        ip6_header_t *hdr6 = (ip6_header_t *) data;
     255       
     256        hdr6->ver_tc = (6 << (VI_VERSION_l));
     257        memset(hdr6->tc_fl, 0, 3);
     258        hdr6->payload_len = host2uint16_t_be(packet->size);
     259        hdr6->next = packet->proto;
     260        hdr6->hop_limit = packet->ttl;
     261       
     262        host2addr128_t_be(src, hdr6->src_addr);
     263        host2addr128_t_be(dest, hdr6->dest_addr);
     264       
     265        /* Copy payload */
     266        memcpy((uint8_t *) data + data_offs, packet->data + offs, xfer_size);
     267       
     268        *rdata = data;
     269        *rsize = size;
     270        *roffs = rem_offs;
     271       
     272        return EOK;
     273}
     274
     275/** Decode IPv4 datagram
     276 *
     277 * @param data   Serialized IPv4 datagram
     278 * @param size   Length of serialized IPv4 datagram
     279 * @param packet IP datagram structure to be filled
     280 *
     281 * @return EOK on success
     282 * @return EINVAL if the datagram is invalid or damaged
     283 * @return ENOMEM if not enough memory
     284 *
     285 */
    233286int inet_pdu_decode(void *data, size_t size, inet_packet_t *packet)
    234287{
     
    257310        if (tot_len > size) {
    258311                log_msg(LOG_DEFAULT, LVL_DEBUG, "Total Length = %zu > PDU size = %zu",
    259                         tot_len, size);
     312                    tot_len, size);
    260313                return EINVAL;
    261314        }
     
    294347}
    295348
     349/** Decode IPv6 datagram
     350 *
     351 * @param data   Serialized IPv6 datagram
     352 * @param size   Length of serialized IPv6 datagram
     353 * @param packet IP datagram structure to be filled
     354 *
     355 * @return EOK on success
     356 * @return EINVAL if the datagram is invalid or damaged
     357 * @return ENOMEM if not enough memory
     358 *
     359 */
    296360int inet_pdu_decode6(void *data, size_t size, inet_packet_t *packet)
    297361{
    298         // FIXME TODO
    299         return ENOTSUP;
     362        log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_pdu_decode6()");
     363       
     364        if (size < sizeof(ip6_header_t)) {
     365                log_msg(LOG_DEFAULT, LVL_DEBUG, "PDU too short (%zu)", size);
     366                return EINVAL;
     367        }
     368       
     369        ip6_header_t *hdr6 = (ip6_header_t *) data;
     370       
     371        uint8_t version = BIT_RANGE_EXTRACT(uint8_t, VI_VERSION_h,
     372            VI_VERSION_l, hdr6->ver_tc);
     373        if (version != 6) {
     374                log_msg(LOG_DEFAULT, LVL_DEBUG, "Version (%d) != 6", version);
     375                return EINVAL;
     376        }
     377       
     378        size_t payload_len = uint16_t_be2host(hdr6->payload_len);
     379        if (payload_len + sizeof(ip6_header_t) > size) {
     380                log_msg(LOG_DEFAULT, LVL_DEBUG, "Total Length = %zu > PDU size = %zu",
     381                    payload_len + sizeof(ip6_header_t), size);
     382                return EINVAL;
     383        }
     384       
     385#if 0
     386        // FIXME TODO fragmentation
     387       
     388        uint16_t ident = uint16_t_be2host(hdr->id);
     389        uint16_t flags_foff = uint16_t_be2host(hdr->flags_foff);
     390        uint16_t foff = BIT_RANGE_EXTRACT(uint16_t, FF_FRAGOFF_h, FF_FRAGOFF_l,
     391            flags_foff);
     392#endif
     393       
     394        /* XXX Checksum */
     395       
     396        addr128_t src;
     397        addr128_t dest;
     398       
     399        addr128_t_be2host(hdr6->src_addr, src);
     400        inet_addr_set6(src, &packet->src);
     401       
     402        addr128_t_be2host(hdr6->dest_addr, dest);
     403        inet_addr_set6(dest, &packet->dest);
     404       
     405        packet->tos = 0;
     406        packet->proto = hdr6->next;
     407        packet->ttl = hdr6->hop_limit;
     408       
     409#if 0
     410        // FIXME TODO fragmentation
     411       
     412        packet->ident = ident;
     413        packet->df = (flags_foff & BIT_V(uint16_t, FF_FLAG_DF)) != 0;
     414        packet->mf = (flags_foff & BIT_V(uint16_t, FF_FLAG_MF)) != 0;
     415        packet->offs = foff * FRAG_OFFS_UNIT;
     416       
     417        /* XXX IP options */
     418        size_t data_offs = sizeof(uint32_t) *
     419            BIT_RANGE_EXTRACT(uint8_t, VI_IHL_h, VI_IHL_l, hdr->ver_ihl);
     420#endif
     421       
     422        packet->ident = 0;
     423        packet->df = 0;
     424        packet->mf = 0;
     425        packet->offs = 0;
     426       
     427        packet->size = payload_len;
     428        packet->data = calloc(packet->size, 1);
     429        if (packet->data == NULL) {
     430                log_msg(LOG_DEFAULT, LVL_WARN, "Out of memory.");
     431                return ENOMEM;
     432        }
     433       
     434        memcpy(packet->data, (uint8_t *) data + sizeof(ip6_header_t), packet->size);
     435       
     436        return EOK;
     437}
     438
     439/** Encode NDP packet
     440 *
     441 * @param ndp   NDP packet structure to be serialized
     442 * @param dgram IPv6 datagram structure to be filled
     443 *
     444 * @return EOK on success
     445 *
     446 */
     447int ndp_pdu_encode(ndp_packet_t *ndp, inet_dgram_t *dgram)
     448{
     449        inet_addr_set6(ndp->sender_proto_addr, &dgram->src);
     450        inet_addr_set6(ndp->target_proto_addr, &dgram->dest);
     451        dgram->tos = 0;
     452        dgram->size = sizeof(icmpv6_message_t) + sizeof(ndp_message_t);
     453       
     454        dgram->data = calloc(1, dgram->size);
     455        if (dgram->data == NULL)
     456                return ENOMEM;
     457       
     458        icmpv6_message_t *icmpv6 = (icmpv6_message_t *) dgram->data;
     459       
     460        icmpv6->type = ndp->opcode;
     461        icmpv6->code = 0;
     462        memset(icmpv6->un.ndp.reserved, 0, 3);
     463       
     464        ndp_message_t *message = (ndp_message_t *) (icmpv6 + 1);
     465       
     466        if (ndp->opcode == ICMPV6_NEIGHBOUR_SOLICITATION) {
     467                host2addr128_t_be(ndp->solicited_ip, message->target_address);
     468                message->option = 1;
     469                icmpv6->un.ndp.flags = 0;
     470        } else {
     471                host2addr128_t_be(ndp->sender_proto_addr, message->target_address);
     472                message->option = 2;
     473                icmpv6->un.ndp.flags = NDP_FLAG_OVERRIDE | NDP_FLAG_SOLICITED;
     474        }
     475       
     476        message->length = 1;
     477        addr48(ndp->sender_hw_addr, message->mac);
     478       
     479        icmpv6_phdr_t phdr;
     480       
     481        host2addr128_t_be(ndp->sender_proto_addr, phdr.src_addr);
     482        host2addr128_t_be(ndp->target_proto_addr, phdr.dest_addr);
     483        phdr.length = host2uint32_t_be(dgram->size);
     484        memset(phdr.zeroes, 0, 3);
     485        phdr.next = IP_PROTO_ICMPV6;
     486       
     487        uint16_t cs_phdr =
     488            inet_checksum_calc(INET_CHECKSUM_INIT, &phdr,
     489            sizeof(icmpv6_phdr_t));
     490       
     491        uint16_t cs_all = inet_checksum_calc(cs_phdr, dgram->data,
     492            dgram->size);
     493       
     494        icmpv6->checksum = host2uint16_t_be(cs_all);
     495       
     496        return EOK;
     497}
     498
     499/** Decode NDP packet
     500 *
     501 * @param dgram Incoming IPv6 datagram encapsulating NDP packet
     502 * @param ndp   NDP packet structure to be filled
     503 *
     504 * @return EOK on success
     505 * @return EINVAL if the Datagram is invalid
     506 *
     507 */
     508int ndp_pdu_decode(inet_dgram_t *dgram, ndp_packet_t *ndp)
     509{
     510        uint16_t src_af = inet_addr_get(&dgram->src, NULL,
     511            &ndp->sender_proto_addr);
     512        if (src_af != AF_INET6)
     513                return EINVAL;
     514       
     515        if (dgram->size < sizeof(icmpv6_message_t) + sizeof(ndp_message_t))
     516                return EINVAL;
     517       
     518        icmpv6_message_t *icmpv6 = (icmpv6_message_t *) dgram->data;
     519       
     520        ndp->opcode = icmpv6->type;
     521       
     522        ndp_message_t *message = (ndp_message_t *) (icmpv6 + 1);
     523       
     524        addr128_t_be2host(message->target_address, ndp->target_proto_addr);
     525        addr48(message->mac, ndp->sender_hw_addr);
     526       
     527        return EOK;
    300528}
    301529
  • uspace/srv/net/inetsrv/pdu.h

    rcdc3afa r47f5a77  
    4040#include <sys/types.h>
    4141#include "inetsrv.h"
     42#include "ndp.h"
    4243
    4344#define INET_CHECKSUM_INIT 0xffff
     
    4546extern uint16_t inet_checksum_calc(uint16_t, void *, size_t);
    4647
    47 extern int inet_pdu_encode(inet_packet_t *, size_t, size_t, void **,
    48     size_t *, size_t *);
     48extern int inet_pdu_encode(inet_packet_t *, addr32_t, addr32_t, size_t, size_t,
     49    void **, size_t *, size_t *);
     50extern int inet_pdu_encode6(inet_packet_t *, addr128_t, addr128_t, size_t,
     51    size_t, void **, size_t *, size_t *);
    4952extern int inet_pdu_decode(void *, size_t, inet_packet_t *);
    5053extern int inet_pdu_decode6(void *, size_t, inet_packet_t *);
     54
     55extern int ndp_pdu_decode(inet_dgram_t *, ndp_packet_t *);
     56extern int ndp_pdu_encode(ndp_packet_t *, inet_dgram_t *);
    5157
    5258#endif
  • uspace/srv/net/loopip/loopip.c

    rcdc3afa r47f5a77  
    4040#include <inet/iplink_srv.h>
    4141#include <inet/addr.h>
     42#include <net/socket_codes.h>
    4243#include <io/log.h>
    4344#include <loc.h>
     
    5051static int loopip_close(iplink_srv_t *srv);
    5152static int loopip_send(iplink_srv_t *srv, iplink_sdu_t *sdu);
     53static int loopip_send6(iplink_srv_t *srv, iplink_sdu6_t *sdu);
    5254static int loopip_get_mtu(iplink_srv_t *srv, size_t *mtu);
     55static int loopip_get_mac48(iplink_srv_t *srv, addr48_t *mac);
    5356static int loopip_addr_add(iplink_srv_t *srv, inet_addr_t *addr);
    5457static int loopip_addr_remove(iplink_srv_t *srv, inet_addr_t *addr);
     
    6063        .close = loopip_close,
    6164        .send = loopip_send,
     65        .send6 = loopip_send6,
    6266        .get_mtu = loopip_get_mtu,
     67        .get_mac48 = loopip_get_mac48,
    6368        .addr_add = loopip_addr_add,
    6469        .addr_remove = loopip_addr_remove
     
    162167        log_msg(LOG_DEFAULT, LVL_DEBUG, "loopip_send()");
    163168       
    164         addr32_t src_v4;
    165         addr128_t src_v6;
    166         uint16_t src_af = inet_addr_get(&sdu->src, &src_v4, &src_v6);
    167        
    168         addr32_t dest_v4;
    169         addr128_t dest_v6;
    170         uint16_t dest_af = inet_addr_get(&sdu->dest, &dest_v4, &dest_v6);
    171        
    172         if (src_af != dest_af)
    173                 return EINVAL;
    174        
    175169        rqueue_entry_t *rqe = calloc(1, sizeof(rqueue_entry_t));
    176170        if (rqe == NULL)
     
    180174         * Clone SDU
    181175         */
    182         rqe->af = src_af;
     176        rqe->af = AF_INET;
    183177        rqe->sdu.data = malloc(sdu->size);
    184178        if (rqe->sdu.data == NULL) {
     
    198192}
    199193
     194static int loopip_send6(iplink_srv_t *srv, iplink_sdu6_t *sdu)
     195{
     196        log_msg(LOG_DEFAULT, LVL_DEBUG, "loopip6_send()");
     197       
     198        rqueue_entry_t *rqe = calloc(1, sizeof(rqueue_entry_t));
     199        if (rqe == NULL)
     200                return ENOMEM;
     201       
     202        /*
     203         * Clone SDU
     204         */
     205        rqe->af = AF_INET6;
     206        rqe->sdu.data = malloc(sdu->size);
     207        if (rqe->sdu.data == NULL) {
     208                free(rqe);
     209                return ENOMEM;
     210        }
     211       
     212        memcpy(rqe->sdu.data, sdu->data, sdu->size);
     213        rqe->sdu.size = sdu->size;
     214       
     215        /*
     216         * Insert to receive queue
     217         */
     218        prodcons_produce(&loopip_rcv_queue, &rqe->link);
     219       
     220        return EOK;
     221}
     222
    200223static int loopip_get_mtu(iplink_srv_t *srv, size_t *mtu)
    201224{
     
    203226        *mtu = 1500;
    204227        return EOK;
     228}
     229
     230static int loopip_get_mac48(iplink_srv_t *src, addr48_t *mac)
     231{
     232        log_msg(LOG_DEFAULT, LVL_DEBUG, "loopip_get_mac48()");
     233        return ENOTSUP;
    205234}
    206235
  • uspace/srv/net/slip/slip.c

    rcdc3afa r47f5a77  
    5858static int slip_close(iplink_srv_t *);
    5959static int slip_send(iplink_srv_t *, iplink_sdu_t *);
     60static int slip_send6(iplink_srv_t *, iplink_sdu6_t *);
    6061static int slip_get_mtu(iplink_srv_t *, size_t *);
     62static int slip_get_mac48(iplink_srv_t *, addr48_t *);
    6163static int slip_addr_add(iplink_srv_t *, inet_addr_t *);
    6264static int slip_addr_remove(iplink_srv_t *, inet_addr_t *);
     
    6870        .close = slip_close,
    6971        .send = slip_send,
     72        .send6 = slip_send6,
    7073        .get_mtu = slip_get_mtu,
     74        .get_mac48 = slip_get_mac48,
    7175        .addr_add = slip_addr_add,
    7276        .addr_remove = slip_addr_remove
     
    122126int slip_send(iplink_srv_t *srv, iplink_sdu_t *sdu)
    123127{
     128        log_msg(LOG_DEFAULT, LVL_DEBUG, "slip_send()");
     129       
    124130        async_sess_t *sess = (async_sess_t *) srv->arg;
    125131        uint8_t *data = sdu->data;
    126         unsigned i;
    127 
    128         log_msg(LOG_DEFAULT, LVL_DEBUG, "slip_send()");
    129 
     132       
    130133        /*
    131          * Strictly speaking, this is not prescribed by the RFC, but the RFC
    132          * suggests to start with sending a SLIP_END byte as a synchronization
    133          * measure for dealing with previous possible noise on the line.
    134          */
     134         * Strictly speaking, this is not prescribed by the RFC, but the RFC
     135         * suggests to start with sending a SLIP_END byte as a synchronization
     136         * measure for dealing with previous possible noise on the line.
     137         */
    135138        write_buffered(sess, SLIP_END);
    136 
    137         for (i = 0; i < sdu->size; i++) {
     139       
     140        for (size_t i = 0; i < sdu->size; i++) {
    138141                switch (data[i]) {
    139142                case SLIP_END:
     
    150153                }
    151154        }
     155       
    152156        write_buffered(sess, SLIP_END);
    153157        write_flush(sess);
    154 
    155         return EOK;
     158       
     159        return EOK;
     160}
     161
     162int slip_send6(iplink_srv_t *srv, iplink_sdu6_t *sdu)
     163{
     164        log_msg(LOG_DEFAULT, LVL_DEBUG, "slip_send6()");
     165       
     166        return ENOTSUP;
    156167}
    157168
     
    161172        *mtu = SLIP_MTU;
    162173        return EOK;
     174}
     175
     176int slip_get_mac48(iplink_srv_t *src, addr48_t *mac)
     177{
     178        log_msg(LOG_DEFAULT, LVL_DEBUG, "slip_get_mac48()");
     179        return ENOTSUP;
    163180}
    164181
  • uspace/srv/net/tcp/conn.c

    rcdc3afa r47f5a77  
    312312static bool tcp_socket_match(tcp_sock_t *sock, tcp_sock_t *patt)
    313313{
     314        log_msg(LOG_DEFAULT, LVL_DEBUG2,
     315            "tcp_socket_match(sock=(%u), pat=(%u))", sock->port, patt->port);
     316       
    314317        if ((!inet_addr_is_any(&patt->addr)) &&
    315318            (!inet_addr_compare(&patt->addr, &sock->addr)))
     
    351354{
    352355        log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_conn_find_ref(%p)", sp);
     356       
     357        log_msg(LOG_DEFAULT, LVL_DEBUG2, "compare conn (f:(%u), l:(%u))",
     358            sp->foreign.port, sp->local.port);
    353359       
    354360        fibril_mutex_lock(&conn_list_lock);
     
    357363                tcp_conn_t *conn = list_get_instance(link, tcp_conn_t, link);
    358364                tcp_sockpair_t *csp = &conn->ident;
     365               
     366                log_msg(LOG_DEFAULT, LVL_DEBUG2, " - with (f:(%u), l:(%u))",
     367                    csp->foreign.port, csp->local.port);
    359368               
    360369                if (tcp_sockpair_match(sp, csp)) {
  • uspace/srv/net/tcp/pdu.c

    rcdc3afa r47f5a77  
    172172                phdr6->tcp_length =
    173173                    host2uint32_t_be(pdu->header_size + pdu->text_size);
    174                 memset(phdr6->zero, 0, 3);
     174                memset(phdr6->zeroes, 0, 3);
    175175                phdr6->next = IP_PROTO_TCP;
    176176                break;
  • uspace/srv/net/tcp/sock.c

    rcdc3afa r47f5a77  
    613613        ipc_callid_t wcallid;
    614614        size_t length;
    615         uint8_t buffer[TCP_SOCK_FRAGMENT_SIZE];
    616615        tcp_error_t trc;
    617616        int rc;
     617       
     618        uint8_t *buffer = calloc(TCP_SOCK_FRAGMENT_SIZE, 1);
     619        if (buffer == NULL) {
     620                async_answer_0(callid, ENOMEM);
     621                return;
     622        }
    618623
    619624        log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_send()");
     
    625630        if (sock_core == NULL) {
    626631                async_answer_0(callid, ENOTSOCK);
    627                 return;
     632                goto out;
    628633        }
    629634
     
    641646                        fibril_mutex_unlock(&socket->lock);
    642647                        async_answer_0(callid, EINVAL);
    643                         return;
     648                        goto out;
    644649                }
    645650
     
    651656                        fibril_mutex_unlock(&socket->lock);
    652657                        async_answer_0(callid, rc);
    653                         return;
     658                        goto out;
    654659                }
    655660
     
    676681                        fibril_mutex_unlock(&socket->lock);
    677682                        async_answer_0(callid, rc);
    678                         return;
     683                        goto out;
    679684                }
    680685        }
     
    685690            IPC_GET_ARG2(answer));
    686691        fibril_mutex_unlock(&socket->lock);
     692       
     693out:
     694        free(buffer);
    687695}
    688696
  • uspace/srv/net/tcp/std.h

    rcdc3afa r47f5a77  
    7575};
    7676
    77 /** TCP IPv4 pseudo header */
     77/** TCP over IPv4 checksum pseudo header */
    7878typedef struct {
    7979        /** Source address */
     
    8989} tcp_phdr_t;
    9090
    91 /** TCP IPv6 pseudo header */
     91/** TCP over IPv6 checksum pseudo header */
    9292typedef struct {
    9393        /** Source address */
     
    9898        uint32_t tcp_length;
    9999        /** Zeroes */
    100         uint8_t zero[3];
     100        uint8_t zeroes[3];
    101101        /** Next header */
    102102        uint8_t next;
  • uspace/srv/net/tcp/tcp.c

    rcdc3afa r47f5a77  
    5454#define NAME       "tcp"
    5555
    56 #define IP_PROTO_TCP 6
    57 
    5856static int tcp_inet_ev_recv(inet_dgram_t *dgram);
    5957static void tcp_received_pdu(tcp_pdu_t *pdu);
  • uspace/srv/net/tcp/tqueue.c

    rcdc3afa r47f5a77  
    282282void tcp_transmit_segment(tcp_sockpair_t *sp, tcp_segment_t *seg)
    283283{
     284        log_msg(LOG_DEFAULT, LVL_DEBUG,
     285            "tcp_transmit_segment(f:(%u),l:(%u), %p)",
     286            sp->local.port, sp->foreign.port, seg);
     287       
    284288        log_msg(LOG_DEFAULT, LVL_DEBUG, "SEG.SEQ=%" PRIu32 ", SEG.WND=%" PRIu32,
    285289            seg->seq, seg->wnd);
  • uspace/srv/net/tcp/ucall.c

    rcdc3afa r47f5a77  
    298298        tcp_conn_t *conn;
    299299
     300        log_msg(LOG_DEFAULT, LVL_DEBUG,
     301            "tcp_as_segment_arrived(f:(%u), l:(%u))",
     302            sp->foreign.port, sp->local.port);
     303
    300304        conn = tcp_conn_find_ref(sp);
    301305        if (conn == NULL) {
  • uspace/srv/net/udp/assoc.c

    rcdc3afa r47f5a77  
    372372static bool udp_socket_match(udp_sock_t *sock, udp_sock_t *patt)
    373373{
     374        log_msg(LOG_DEFAULT, LVL_DEBUG,
     375            "udp_socket_match(sock=(%u), pat=(%u))", sock->port, patt->port);
     376       
    374377        if ((!inet_addr_is_any(&patt->addr)) &&
    375378            (!inet_addr_compare(&patt->addr, &sock->addr)))
  • uspace/srv/net/udp/pdu.c

    rcdc3afa r47f5a77  
    110110                host2addr128_t_be(dest_v6, phdr6->dest_addr);
    111111                phdr6->udp_length = host2uint32_t_be(pdu->data_size);
    112                 memset(phdr6->zero, 0, 3);
     112                memset(phdr6->zeroes, 0, 3);
    113113                phdr6->next = IP_PROTO_UDP;
    114114                break;
  • uspace/srv/net/udp/sock.c

    rcdc3afa r47f5a77  
    265265        log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_send()");
    266266       
     267        uint8_t *buffer = calloc(UDP_FRAGMENT_SIZE, 1);
     268        if (buffer == NULL) {
     269                async_answer_0(callid, ENOMEM);
     270                return;
     271        }
     272       
    267273        struct sockaddr_in6 *addr6 = NULL;
    268274        struct sockaddr_in *addr;
     
    276282                if (rc != EOK) {
    277283                        async_answer_0(callid, rc);
    278                         return;
     284                        goto out;
    279285                }
    280286               
     
    357363                        log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_sendto: Failed to "
    358364                            "determine local address.");
    359                         return;
     365                        goto out;
    360366                }
    361367               
     
    379385                        length = UDP_FRAGMENT_SIZE;
    380386               
    381                 uint8_t buffer[UDP_FRAGMENT_SIZE];
    382387                int rc = async_data_write_finalize(wcallid, buffer, length);
    383388                if (rc != EOK) {
     
    425430        if (addr6 != NULL)
    426431                free(addr6);
     432       
     433        free(buffer);
    427434}
    428435
  • uspace/srv/net/udp/std.h

    rcdc3afa r47f5a77  
    5454} udp_header_t;
    5555
    56 /** UDP IPv4 pseudo header */
     56/** UDP over IPv4 checksum pseudo header */
    5757typedef struct {
    5858        /** Source address */
     
    6868} udp_phdr_t;
    6969
    70 /** UDP IPv6 pseudo header */
     70/** UDP over IPv6 checksum pseudo header */
    7171typedef struct {
    7272        /** Source address */
     
    7676        /** UDP length */
    7777        uint32_t udp_length;
    78         /** Reserved */
    79         uint8_t zero[3];
     78        /** Zeroes */
     79        uint8_t zeroes[3];
    8080        /** Next header */
    8181        uint8_t next;
Note: See TracChangeset for help on using the changeset viewer.