Changes in / [47f5a77:cdc3afa] in mainline


Ignore:
Files:
4 deleted
44 edited

Legend:

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

    r47f5a77 rcdc3afa  
    177177{
    178178        const unsigned inum = am335x_irc_inum_get(bbone.irc_addr);
     179        am335x_irc_irq_ack(bbone.irc_addr);
    179180
    180181        irq_t *irq = irq_dispatch_and_lock(inum);
     
    186187                printf("Spurious interrupt\n");
    187188        }
    188 
    189         am335x_irc_irq_ack(bbone.irc_addr);
    190189}
    191190
  • kernel/genarch/src/drivers/am335x/timer.c

    r47f5a77 rcdc3afa  
    119119        /* Disable compare mode */
    120120        tclr &= ~AM335x_TIMER_TCLR_CE_FLAG;
    121 
     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);
    122124        /* Enable auto-reload mode */
    123125        tclr |= AM335x_TIMER_TCLR_AR_FLAG;
  • uspace/app/mkmfs/mkmfs.c

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

    r47f5a77 rcdc3afa  
    102102        }
    103103       
    104         printf("Received ICMPv6 echo reply: from %s to %s, seq. no %u, "
     104        printf("Received ICMP 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

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

    r47f5a77 rcdc3afa  
    236236 *
    237237 * @param fun           The serial port function
    238  * @param buf           The output buffer for read data.
     238 * @param buf           The ouput 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 assigned irq = 0x%x.",
     422                        ddf_msg(LVL_NOTE, "Device %s was asigned 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 assigned I/O address = "
     435                        ddf_msg(LVL_NOTE, "Device %s was asigned 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;
    830829        int rc;
    831830       
     
    870869                goto fail;
    871870        }
    872         need_unreg_intr_handler = true;
    873871       
    874872        /* Enable interrupt. */
     
    905903        if (fun != NULL)
    906904                ddf_fun_destroy(fun);
    907         if (need_unreg_intr_handler)
    908                 ns8250_unregister_interrupt_handler(ns);
    909905        if (need_cleanup)
    910906                ns8250_dev_cleanup(ns);
     
    918914       
    919915        fibril_mutex_lock(&ns->mutex);
    920         if (ns->client_connections > 0) {
     916                if (ns->client_connections > 0) {
    921917                fibril_mutex_unlock(&ns->mutex);
    922918                return EBUSY;
  • uspace/lib/c/generic/inet/addr.c

    r47f5a77 rcdc3afa  
    7070{
    7171        memcpy(dst, src, 16);
    72 }
    73 
    74 int addr128_compare(const addr128_t a, const addr128_t b)
    75 {
    76         return memcmp(a, b, 16);
    7772}
    7873
     
    217212}
    218213
    219 void 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 
    227214void inet_addr_any(inet_addr_t *addr)
    228215{
     
    247234                return (a->addr == b->addr);
    248235        case AF_INET6:
    249                 return addr128_compare(a->addr6, b->addr6);
     236                return memcmp(&a->addr6, &b->addr6, 16);
    250237        default:
    251238                return 0;
     
    258245            (inet_addr_compare(addr, &inet_addr_any_addr)) ||
    259246            (inet_addr_compare(addr, &inet_addr_any_addr6)));
    260 }
    261 
    262 int 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         }
    275247}
    276248
  • uspace/lib/c/generic/inetping6.c

    r47f5a77 rcdc3afa  
    7979       
    8080        ipc_call_t answer;
    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);
     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);
     84       
     85        async_exchange_end(exch);
     86       
     87        if (retval != EOK) {
    8688                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);
    98        
    99         async_exchange_end(exch);
    100        
    101         if (rc != EOK) {
    102                 async_forget(req);
    103                 return rc;
    104         }
    105        
    106         sysarg_t retval;
     89                return retval;
     90        }
     91       
    10792        async_wait_for(req, &retval);
    108        
    109         return (int) retval;
     93        return retval;
    11094}
    11195
     
    158142        }
    159143       
    160         if (size != sizeof(addr128_t)) {
     144        if (size != sizeof(inet_addr_t)) {
    161145                async_answer_0(callid, EINVAL);
    162146                async_answer_0(iid, EINVAL);
     
    177161        }
    178162       
    179         if (size != sizeof(addr128_t)) {
     163        if (size != sizeof(inet_addr_t)) {
    180164                async_answer_0(callid, EINVAL);
    181165                async_answer_0(iid, EINVAL);
  • uspace/lib/c/generic/iplink.c

    r47f5a77 rcdc3afa  
    8686       
    8787        ipc_call_t answer;
    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);
     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));
     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->dest, sizeof(inet_addr_t));
     98        if (rc != EOK) {
     99                async_exchange_end(exch);
     100                async_forget(req);
     101                return rc;
     102        }
     103       
     104        rc = async_data_write_start(exch, sdu->data, sdu->size);
    92105       
    93106        async_exchange_end(exch);
     
    104117}
    105118
    106 int 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));
    114         if (rc != EOK) {
    115                 async_exchange_end(exch);
    116                 async_forget(req);
    117                 return rc;
    118         }
    119        
    120         rc = async_data_write_start(exch, sdu->data, sdu->size);
    121        
    122         async_exchange_end(exch);
    123        
    124         if (rc != EOK) {
    125                 async_forget(req);
    126                 return rc;
    127         }
    128        
    129         sysarg_t retval;
    130         async_wait_for(req, &retval);
    131        
    132         return (int) retval;
    133 }
    134 
    135119int iplink_get_mtu(iplink_t *iplink, size_t *rmtu)
    136120{
    137         async_exch_t *exch = async_exchange_begin(iplink->sess);
    138        
    139121        sysarg_t mtu;
     122        async_exch_t *exch = async_exchange_begin(iplink->sess);
     123
    140124        int rc = async_req_0_1(exch, IPLINK_GET_MTU, &mtu);
    141        
    142         async_exchange_end(exch);
    143        
     125        async_exchange_end(exch);
     126
    144127        if (rc != EOK)
    145128                return rc;
    146        
     129
    147130        *rmtu = mtu;
    148131        return EOK;
    149 }
    150 
    151 int 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;
    171132}
    172133
  • uspace/lib/c/generic/iplink_srv.c

    r47f5a77 rcdc3afa  
    5050}
    5151
    52 static void iplink_get_mac48_srv(iplink_srv_t *srv, ipc_callid_t iid,
     52static void iplink_addr_add_srv(iplink_srv_t *srv, ipc_callid_t iid,
    5353    ipc_call_t *icall)
    5454{
    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        
    6255        ipc_callid_t callid;
    6356        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        
     57        if (!async_data_write_receive(&callid, &size)) {
     58                async_answer_0(callid, EREFUSED);
     59                async_answer_0(iid, EREFUSED);
     60                return;
     61        }
     62       
     63        if (size != sizeof(inet_addr_t)) {
     64                async_answer_0(callid, EINVAL);
     65                async_answer_0(iid, EINVAL);
     66                return;
     67        }
     68       
     69        inet_addr_t addr;
     70        int rc = async_data_write_finalize(callid, &addr, size);
     71        if (rc != EOK) {
     72                async_answer_0(callid, (sysarg_t) rc);
     73                async_answer_0(iid, (sysarg_t) rc);
     74        }
     75       
     76        rc = srv->ops->addr_add(srv, &addr);
    8077        async_answer_0(iid, (sysarg_t) rc);
    8178}
    8279
    83 static void iplink_addr_add_srv(iplink_srv_t *srv, ipc_callid_t iid,
     80static void iplink_addr_remove_srv(iplink_srv_t *srv, ipc_callid_t iid,
    8481    ipc_call_t *icall)
    8582{
     
    105102        }
    106103       
    107         rc = srv->ops->addr_add(srv, &addr);
     104        rc = srv->ops->addr_remove(srv, &addr);
    108105        async_answer_0(iid, (sysarg_t) rc);
    109106}
    110107
    111 static void iplink_addr_remove_srv(iplink_srv_t *srv, ipc_callid_t iid,
     108static void iplink_send_srv(iplink_srv_t *srv, ipc_callid_t iid,
    112109    ipc_call_t *icall)
    113110{
     111        iplink_sdu_t sdu;
     112       
    114113        ipc_callid_t callid;
    115114        size_t size;
     
    126125        }
    127126       
    128         inet_addr_t addr;
    129         int rc = async_data_write_finalize(callid, &addr, size);
    130         if (rc != EOK) {
    131                 async_answer_0(callid, (sysarg_t) rc);
    132                 async_answer_0(iid, (sysarg_t) rc);
    133         }
    134        
    135         rc = srv->ops->addr_remove(srv, &addr);
    136         async_answer_0(iid, (sysarg_t) rc);
    137 }
    138 
    139 static void iplink_send_srv(iplink_srv_t *srv, ipc_callid_t iid,
    140     ipc_call_t *icall)
    141 {
    142         iplink_sdu_t sdu;
    143        
    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 
    159 static void iplink_send6_srv(iplink_srv_t *srv, ipc_callid_t iid,
    160     ipc_call_t *icall)
    161 {
    162         iplink_sdu6_t sdu;
    163        
    164         ipc_callid_t callid;
    165         size_t size;
    166         if (!async_data_write_receive(&callid, &size)) {
    167                 async_answer_0(callid, EREFUSED);
    168                 async_answer_0(iid, EREFUSED);
    169                 return;
    170         }
    171        
    172         if (size != sizeof(addr48_t)) {
    173                 async_answer_0(callid, EINVAL);
    174                 async_answer_0(iid, EINVAL);
    175                 return;
    176         }
    177        
    178         int rc = async_data_write_finalize(callid, &sdu.dest, size);
     127        int rc = async_data_write_finalize(callid, &sdu.src, size);
     128        if (rc != EOK) {
     129                async_answer_0(callid, (sysarg_t) rc);
     130                async_answer_0(iid, (sysarg_t) rc);
     131        }
     132       
     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);
    179146        if (rc != EOK) {
    180147                async_answer_0(callid, (sysarg_t) rc);
     
    184151        rc = async_data_write_accept(&sdu.data, false, 0, 0, 0,
    185152            &sdu.size);
    186         if (rc != EOK) {
    187                 async_answer_0(iid, rc);
    188                 return;
    189         }
    190        
    191         rc = srv->ops->send6(srv, &sdu);
     153        if (rc != EOK)
     154                return;
     155       
     156        rc = srv->ops->send(srv, &sdu);
    192157        free(sdu.data);
    193158        async_answer_0(iid, rc);
     
    205170int iplink_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg)
    206171{
    207         iplink_srv_t *srv = (iplink_srv_t *) arg;
     172        iplink_srv_t *srv = (iplink_srv_t *)arg;
    208173        int rc;
    209174       
     
    249214                        iplink_get_mtu_srv(srv, callid, &call);
    250215                        break;
    251                 case IPLINK_GET_MAC48:
    252                         iplink_get_mac48_srv(srv, callid, &call);
    253                         break;
    254216                case IPLINK_SEND:
    255217                        iplink_send_srv(srv, callid, &call);
    256                         break;
    257                 case IPLINK_SEND6:
    258                         iplink_send6_srv(srv, callid, &call);
    259218                        break;
    260219                case IPLINK_ADDR_ADD:
  • uspace/lib/c/generic/net/socket_parse.c

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

    r47f5a77 rcdc3afa  
    7373extern void addr128(const addr128_t, addr128_t);
    7474
    75 extern int addr128_compare(const addr128_t, const addr128_t);
    76 
    7775extern void host2addr128_t_be(const addr128_t, addr128_t);
    7876extern void addr128_t_be2host(const addr128_t, addr128_t);
     
    8987extern int inet_addr_family(const char *, uint16_t *);
    9088extern void inet_naddr_addr(const inet_naddr_t *, inet_addr_t *);
    91 extern void inet_addr_naddr(const inet_addr_t *, uint8_t, inet_naddr_t *);
    9289
    9390extern void inet_addr_any(inet_addr_t *);
     
    9794extern int inet_addr_is_any(const inet_addr_t *);
    9895
    99 extern int inet_naddr_compare(const inet_naddr_t *, const inet_addr_t *);
    10096extern int inet_naddr_compare_mask(const inet_naddr_t *, const inet_addr_t *);
    10197
  • uspace/lib/c/include/inet/iplink.h

    r47f5a77 rcdc3afa  
    4747} iplink_t;
    4848
    49 /** IPv4 link Service Data Unit */
     49/** Internet link Service Data Unit */
    5050typedef struct {
    5151        /** Local source address */
    52         addr32_t src;
     52        inet_addr_t src;
    5353        /** Local destination address */
    54         addr32_t dest;
     54        inet_addr_t dest;
    5555        /** Serialized IP packet */
    5656        void *data;
     
    5858        size_t size;
    5959} iplink_sdu_t;
    60 
    61 /** IPv6 link Service Data Unit */
    62 typedef 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;
    7060
    7161/** Internet link receive Service Data Unit */
     
    8474extern void iplink_close(iplink_t *);
    8575extern int iplink_send(iplink_t *, iplink_sdu_t *);
    86 extern int iplink_send6(iplink_t *, iplink_sdu6_t *);
    8776extern int iplink_addr_add(iplink_t *, inet_addr_t *);
    8877extern int iplink_addr_remove(iplink_t *, inet_addr_t *);
    8978extern int iplink_get_mtu(iplink_t *, size_t *);
    90 extern int iplink_get_mac48(iplink_t *, addr48_t *);
    9179
    9280#endif
  • uspace/lib/c/include/inet/iplink_srv.h

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

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

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

    r47f5a77 rcdc3afa  
    5656static int ethip_close(iplink_srv_t *srv);
    5757static int ethip_send(iplink_srv_t *srv, iplink_sdu_t *sdu);
    58 static int ethip_send6(iplink_srv_t *srv, iplink_sdu6_t *sdu);
    5958static int ethip_get_mtu(iplink_srv_t *srv, size_t *mtu);
    60 static int ethip_get_mac48(iplink_srv_t *srv, addr48_t *mac);
    6159static int ethip_addr_add(iplink_srv_t *srv, inet_addr_t *addr);
    6260static int ethip_addr_remove(iplink_srv_t *srv, inet_addr_t *addr);
     
    6866        .close = ethip_close,
    6967        .send = ethip_send,
    70         .send6 = ethip_send6,
    7168        .get_mtu = ethip_get_mtu,
    72         .get_mac48 = ethip_get_mac48,
    7369        .addr_add = ethip_addr_add,
    7470        .addr_remove = ethip_addr_remove
     
    173169       
    174170        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;
    175184        eth_frame_t frame;
    176185       
    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;
     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        }
    188207       
    189208        void *data;
    190209        size_t size;
    191210        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 
    201 static 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);
    217211        if (rc != EOK)
    218212                return rc;
     
    274268}
    275269
    276 static 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 
    286270static int ethip_addr_add(iplink_srv_t *srv, inet_addr_t *addr)
    287271{
  • uspace/srv/net/ethip/pdu.c

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

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

    r47f5a77 rcdc3afa  
    4242#include <stdlib.h>
    4343#include <str.h>
    44 #include <net/socket_codes.h>
    4544#include "addrobj.h"
    4645#include "inetsrv.h"
    4746#include "inet_link.h"
    48 #include "ndp.h"
    4947
    5048static inet_addrobj_t *inet_addrobj_find_by_name_locked(const char *, inet_link_t *);
     
    119117                    inet_addrobj_t, addr_list);
    120118               
    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;
     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;
    138124                }
    139125        }
     
    228214        inet_naddr_addr(&addr->naddr, &lsrc_addr);
    229215       
    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;
     216        return inet_link_send_dgram(addr->ilink, &lsrc_addr, ldest, dgram,
     217            proto, ttl, df);
    261218}
    262219
  • uspace/srv/net/inetsrv/icmp.c

    r47f5a77 rcdc3afa  
    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

    r47f5a77 rcdc3afa  
    4747#include "pdu.h"
    4848
     49static int ndp_received(inet_dgram_t *dgram)
     50{
     51        // FIXME TODO
     52        return ENOTSUP;
     53}
     54
    4955static int icmpv6_recv_echo_request(inet_dgram_t *dgram)
    5056{
     
    7884        inet_dgram_t rdgram;
    7985       
    80         inet_get_srcaddr(&dgram->src, 0, &rdgram.src);
     86        rdgram.src = dgram->dest;
    8187        rdgram.dest = dgram->src;
    8288        rdgram.tos = 0;
     
    8490        rdgram.size = size;
    8591       
    86         icmpv6_phdr_t phdr;
     92        icmpv6_pseudo_header phdr;
    8793       
    8894        host2addr128_t_be(dest_v6, phdr.src_addr);
     
    94100        uint16_t cs_phdr =
    95101            inet_checksum_calc(INET_CHECKSUM_INIT, &phdr,
    96             sizeof(icmpv6_phdr_t));
     102            sizeof(icmpv6_pseudo_header));
    97103       
    98104        uint16_t cs_all = inet_checksum_calc(cs_phdr, reply, size);
     
    150156        case ICMPV6_NEIGHBOUR_SOLICITATION:
    151157        case ICMPV6_NEIGHBOUR_ADVERTISEMENT:
     158#ifdef ACCEPT_RA
    152159        case ICMPV6_ROUTER_ADVERTISEMENT:
     160#endif
    153161                return ndp_received(dgram);
    154162        default:
     
    184192        dgram.size = rsize;
    185193       
    186         icmpv6_phdr_t phdr;
     194        icmpv6_pseudo_header phdr;
    187195       
    188196        host2addr128_t_be(sdu->src, phdr.src_addr);
     
    194202        uint16_t cs_phdr =
    195203            inet_checksum_calc(INET_CHECKSUM_INIT, &phdr,
    196             sizeof(icmpv6_phdr_t));
     204            sizeof(icmpv6_pseudo_header));
    197205       
    198206        uint16_t cs_all = inet_checksum_calc(cs_phdr, rdata, rsize);
  • uspace/srv/net/inetsrv/icmpv6_std.h

    r47f5a77 rcdc3afa  
    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 
    5349/** ICMPv6 message type */
    5450enum icmpv6_type {
     
    8783                        uint8_t flags;
    8884                        /** Reserved bytes */
    89                         uint8_t reserved[3];
     85                        uint8_t reserved [3];
    9086                } ndp;
    9187        } un;
     
    9591typedef struct {
    9692        /** Source IPv6 address */
    97         uint8_t src_addr[16];
     93        uint8_t src_addr [16];
    9894        /** Target IPv6 address */
    99         uint8_t dest_addr[16];
     95        uint8_t dest_addr [16];
    10096        /** ICMPv6 length */
    10197        uint32_t length;
    10298        /** Zeroes */
    103         uint8_t zeroes[3];
     99        uint8_t zeroes [3];
    104100        /** Next header */
    105101        uint8_t next;
    106 } icmpv6_phdr_t;
     102} icmpv6_pseudo_header;
    107103
    108104/** NDP neighbour body */
    109105typedef struct {
    110106        /** Target IPv6 address */
    111         uint8_t target_address[16];
     107        uint8_t target_address [16];
    112108        /** Option code */
    113109        uint8_t option;
     
    115111        uint8_t length;
    116112        /** MAC address */
    117         uint8_t mac[6];
     113        uint8_t mac [6];
    118114} ndp_message_t;
    119115
     
    135131        uint32_t reserved;
    136132        /** Prefix */
    137         uint8_t prefix[16];
     133        uint8_t prefix [16];
    138134} ndp_prefix_t;
    139135
  • uspace/srv/net/inetsrv/inet_link.c

    r47f5a77 rcdc3afa  
    4949#include "pdu.h"
    5050
    51 static bool first_link = true;
    52 static bool first_link6 = true;
    53 
    54 static FIBRIL_MUTEX_INITIALIZE(ip_ident_lock);
    55 static uint16_t ip_ident = 0;
    56 
    5751static int inet_link_open(service_id_t);
    5852static int inet_iplink_recv(iplink_t *, iplink_recv_sdu_t *, uint16_t);
     
    6458static LIST_INITIALIZE(inet_link_list);
    6559static FIBRIL_MUTEX_INITIALIZE(inet_discovery_lock);
    66 
    67 static addr128_t link_local_node_ip =
    68     {0xfe, 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xfe, 0, 0, 0};
    69 
    70 static 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 }
    8260
    8361static int inet_iplink_recv(iplink_t *iplink, iplink_recv_sdu_t *sdu, uint16_t af)
     
    181159        if (ilink->svc_name != NULL)
    182160                free(ilink->svc_name);
    183        
    184161        free(ilink);
    185162}
     
    224201                goto error;
    225202        }
    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);
    233203
    234204        log_msg(LOG_DEFAULT, LVL_DEBUG, "Opened IP link '%s'", ilink->svc_name);
    235205        list_append(&ilink->link_list, &inet_link_list);
    236206
    237         inet_addrobj_t *addr = NULL;
    238        
    239         if (first_link) {
    240                 addr = inet_addrobj_new();
    241                
     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) {
    242216                inet_naddr(&addr->naddr, 127, 0, 0, 1, 24);
    243                 first_link = false;
     217                inet_naddr6(&addr6->naddr, 0, 0, 0, 0, 0, 0, 0, 1, 128);
     218                first = 0;
    244219        } else {
    245220                /*
    246221                 * FIXME
    247                  * Setting static IPv4 address for testing purposes:
     222                 * Setting static IP addresses for testing purposes
    248223                 * 10.0.2.15/24
     224                 * fd19:1680::4/120
    249225                 */
    250                 addr = inet_addrobj_new();
    251                
    252226                inet_naddr(&addr->naddr, 10, 0, 2, 15, 24);
    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                 }
     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;
    309269        }
    310270       
     
    338298}
    339299
    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  */
    355 int 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        
     300/** Send datagram over Internet link */
     301int 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{
    368304        /*
    369305         * Fill packet structure. Fragmentation is performed by
    370306         * inet_pdu_encode().
    371307         */
    372        
    373         iplink_sdu_t sdu;
    374        
    375         sdu.src = lsrc;
    376         sdu.dest = ldest;
    377308       
    378309        inet_packet_t packet;
     
    383314        packet.proto = proto;
    384315        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        
    391316        packet.df = df;
    392317        packet.data = dgram->data;
    393318        packet.size = dgram->size;
    394319       
    395         int rc;
     320        iplink_sdu_t sdu;
    396321        size_t offs = 0;
     322        int rc;
     323       
     324        sdu.src = *lsrc;
     325        sdu.dest = *ldest;
    397326       
    398327        do {
    399328                /* Encode one fragment */
    400                
    401329                size_t roffs;
    402                 rc = inet_pdu_encode(&packet, src_v4, dest_v4, offs, ilink->def_mtu,
    403                     &sdu.data, &sdu.size, &roffs);
     330                rc = inet_pdu_encode(&packet, offs, ilink->def_mtu, &sdu.data,
     331                    &sdu.size, &roffs);
    404332                if (rc != EOK)
    405333                        return rc;
     
    407335                /* Send the PDU */
    408336                rc = iplink_send(ilink->iplink, &sdu);
     337                free(sdu.data);
    409338               
    410                 free(sdu.data);
    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  */
    430 int 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);
    484339                offs = roffs;
    485340        } while (offs < packet.size);
  • uspace/srv/net/inetsrv/inet_link.h

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

    r47f5a77 rcdc3afa  
    4848        /** Total Length */
    4949        uint16_t tot_len;
    50         /** Identifier */
     50        /** Identification */
    5151        uint16_t id;
    5252        /** Flags, Fragment Offset */
     
    9090};
    9191
    92 /** Bits in ip6_frag_header_t.offsmf */
    93 enum 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 
    10292/** IPv6 Datagram header (fixed part) */
    10393typedef struct {
     
    124114        /** Reserved */
    125115        uint8_t reserved;
    126         /** Fragmentation offset, reserved and M flag */
    127         uint16_t offsmf;
    128         /** Identifier */
     116        /** Fragment Offset, Flags */
     117        uint16_t foff_flags;
     118        /** Identification */
    129119        uint32_t id;
    130120} ip6_header_fragment_t;
  • uspace/srv/net/inetsrv/inetping6.c

    r47f5a77 rcdc3afa  
    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, sizeof(addr128_t));
     111        int rc = async_data_write_start(exch, sdu->src, 16);
    112112        if (rc != EOK) {
    113113                async_exchange_end(exch);
     
    116116        }
    117117       
    118         rc = async_data_write_start(exch, sdu->dest, sizeof(addr128_t));
     118        rc = async_data_write_start(exch, sdu->dest, 16);
    119119        if (rc != EOK) {
    120120                async_exchange_end(exch);
  • uspace/srv/net/inetsrv/inetsrv.c

    r47f5a77 rcdc3afa  
    6262#define NAME "inetsrv"
    6363
    64 static 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 
    70 static 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 
    7564static void inet_client_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg);
    7665
     
    525514
    526515        addr = inet_addrobj_find(&packet->dest, iaf_addr);
    527         if ((addr != NULL) ||
    528             (inet_naddr_compare_mask(&solicited_node_mask, &packet->dest)) ||
    529             (inet_addr_compare(&multicast_all_nodes, &packet->dest))) {
     516        if (addr != NULL) {
    530517                /* Destined for one of the local addresses */
    531518
  • uspace/srv/net/inetsrv/inetsrv.h

    r47f5a77 rcdc3afa  
    113113        uint8_t ttl;
    114114        /** Identifier */
    115         uint32_t ident;
     115        uint16_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;
    145143} inet_link_t;
    146144
  • uspace/srv/net/inetsrv/pdu.c

    r47f5a77 rcdc3afa  
    4949#include "pdu.h"
    5050
     51static FIBRIL_MUTEX_INITIALIZE(ip_ident_lock);
     52static uint16_t ip_ident = 0;
     53
    5154/** One's complement addition.
    5255 *
     
    8588}
    8689
    87 /** Encode IPv4 PDU.
     90/** Encode Internet PDU.
    8891 *
    8992 * Encode internet packet into PDU (serialized form). Will encode a
     
    9396 * be set in the header, otherwise the offset will equal @a packet->size.
    9497 *
    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  */
    105 int 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 {
     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 */
     105int 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       
    108119        /* Upper bound for fragment offset field */
    109120        size_t fragoff_limit = 1 << (FF_FRAGOFF_h - FF_FRAGOFF_l);
     
    113124                return ELIMIT;
    114125       
    115         size_t hdr_size = sizeof(ip_header_t);
     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        }
    116138       
    117139        size_t data_offs = ROUND_UP(hdr_size, 4);
     
    149171                return ENOMEM;
    150172       
     173        /* Allocate identifier */
     174        fibril_mutex_lock(&ip_ident_lock);
     175        uint16_t ident = ++ip_ident;
     176        fibril_mutex_unlock(&ip_ident_lock);
     177       
    151178        /* Encode header fields */
    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);
     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        }
    170222       
    171223        /* Copy payload */
     
    179231}
    180232
    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  */
    199 int 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  */
    286233int inet_pdu_decode(void *data, size_t size, inet_packet_t *packet)
    287234{
     
    310257        if (tot_len > size) {
    311258                log_msg(LOG_DEFAULT, LVL_DEBUG, "Total Length = %zu > PDU size = %zu",
    312                     tot_len, size);
     259                        tot_len, size);
    313260                return EINVAL;
    314261        }
     
    347294}
    348295
    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  */
    360296int inet_pdu_decode6(void *data, size_t size, inet_packet_t *packet)
    361297{
    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  */
    447 int 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  */
    508 int 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;
     298        // FIXME TODO
     299        return ENOTSUP;
    528300}
    529301
  • uspace/srv/net/inetsrv/pdu.h

    r47f5a77 rcdc3afa  
    4040#include <sys/types.h>
    4141#include "inetsrv.h"
    42 #include "ndp.h"
    4342
    4443#define INET_CHECKSUM_INIT 0xffff
     
    4645extern uint16_t inet_checksum_calc(uint16_t, void *, size_t);
    4746
    48 extern int inet_pdu_encode(inet_packet_t *, addr32_t, addr32_t, size_t, size_t,
    49     void **, size_t *, size_t *);
    50 extern int inet_pdu_encode6(inet_packet_t *, addr128_t, addr128_t, size_t,
    51     size_t, void **, size_t *, size_t *);
     47extern int inet_pdu_encode(inet_packet_t *, size_t, size_t, void **,
     48    size_t *, size_t *);
    5249extern int inet_pdu_decode(void *, size_t, inet_packet_t *);
    5350extern int inet_pdu_decode6(void *, size_t, inet_packet_t *);
    54 
    55 extern int ndp_pdu_decode(inet_dgram_t *, ndp_packet_t *);
    56 extern int ndp_pdu_encode(ndp_packet_t *, inet_dgram_t *);
    5751
    5852#endif
  • uspace/srv/net/loopip/loopip.c

    r47f5a77 rcdc3afa  
    4040#include <inet/iplink_srv.h>
    4141#include <inet/addr.h>
    42 #include <net/socket_codes.h>
    4342#include <io/log.h>
    4443#include <loc.h>
     
    5150static int loopip_close(iplink_srv_t *srv);
    5251static int loopip_send(iplink_srv_t *srv, iplink_sdu_t *sdu);
    53 static int loopip_send6(iplink_srv_t *srv, iplink_sdu6_t *sdu);
    5452static int loopip_get_mtu(iplink_srv_t *srv, size_t *mtu);
    55 static int loopip_get_mac48(iplink_srv_t *srv, addr48_t *mac);
    5653static int loopip_addr_add(iplink_srv_t *srv, inet_addr_t *addr);
    5754static int loopip_addr_remove(iplink_srv_t *srv, inet_addr_t *addr);
     
    6360        .close = loopip_close,
    6461        .send = loopip_send,
    65         .send6 = loopip_send6,
    6662        .get_mtu = loopip_get_mtu,
    67         .get_mac48 = loopip_get_mac48,
    6863        .addr_add = loopip_addr_add,
    6964        .addr_remove = loopip_addr_remove
     
    167162        log_msg(LOG_DEFAULT, LVL_DEBUG, "loopip_send()");
    168163       
     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       
    169175        rqueue_entry_t *rqe = calloc(1, sizeof(rqueue_entry_t));
    170176        if (rqe == NULL)
     
    174180         * Clone SDU
    175181         */
    176         rqe->af = AF_INET;
     182        rqe->af = src_af;
    177183        rqe->sdu.data = malloc(sdu->size);
    178184        if (rqe->sdu.data == NULL) {
     
    192198}
    193199
    194 static 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 
    223200static int loopip_get_mtu(iplink_srv_t *srv, size_t *mtu)
    224201{
     
    226203        *mtu = 1500;
    227204        return EOK;
    228 }
    229 
    230 static 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;
    234205}
    235206
  • uspace/srv/net/slip/slip.c

    r47f5a77 rcdc3afa  
    5858static int slip_close(iplink_srv_t *);
    5959static int slip_send(iplink_srv_t *, iplink_sdu_t *);
    60 static int slip_send6(iplink_srv_t *, iplink_sdu6_t *);
    6160static int slip_get_mtu(iplink_srv_t *, size_t *);
    62 static int slip_get_mac48(iplink_srv_t *, addr48_t *);
    6361static int slip_addr_add(iplink_srv_t *, inet_addr_t *);
    6462static int slip_addr_remove(iplink_srv_t *, inet_addr_t *);
     
    7068        .close = slip_close,
    7169        .send = slip_send,
    72         .send6 = slip_send6,
    7370        .get_mtu = slip_get_mtu,
    74         .get_mac48 = slip_get_mac48,
    7571        .addr_add = slip_addr_add,
    7672        .addr_remove = slip_addr_remove
     
    126122int slip_send(iplink_srv_t *srv, iplink_sdu_t *sdu)
    127123{
    128         log_msg(LOG_DEFAULT, LVL_DEBUG, "slip_send()");
    129        
    130124        async_sess_t *sess = (async_sess_t *) srv->arg;
    131125        uint8_t *data = sdu->data;
    132        
     126        unsigned i;
     127
     128        log_msg(LOG_DEFAULT, LVL_DEBUG, "slip_send()");
     129
    133130        /*
    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          */
     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         */
    138135        write_buffered(sess, SLIP_END);
    139        
    140         for (size_t i = 0; i < sdu->size; i++) {
     136
     137        for (i = 0; i < sdu->size; i++) {
    141138                switch (data[i]) {
    142139                case SLIP_END:
     
    153150                }
    154151        }
    155        
    156152        write_buffered(sess, SLIP_END);
    157153        write_flush(sess);
    158        
    159         return EOK;
    160 }
    161 
    162 int slip_send6(iplink_srv_t *srv, iplink_sdu6_t *sdu)
    163 {
    164         log_msg(LOG_DEFAULT, LVL_DEBUG, "slip_send6()");
    165        
    166         return ENOTSUP;
     154
     155        return EOK;
    167156}
    168157
     
    172161        *mtu = SLIP_MTU;
    173162        return EOK;
    174 }
    175 
    176 int slip_get_mac48(iplink_srv_t *src, addr48_t *mac)
    177 {
    178         log_msg(LOG_DEFAULT, LVL_DEBUG, "slip_get_mac48()");
    179         return ENOTSUP;
    180163}
    181164
  • uspace/srv/net/tcp/conn.c

    r47f5a77 rcdc3afa  
    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        
    317314        if ((!inet_addr_is_any(&patt->addr)) &&
    318315            (!inet_addr_compare(&patt->addr, &sock->addr)))
     
    354351{
    355352        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);
    359353       
    360354        fibril_mutex_lock(&conn_list_lock);
     
    363357                tcp_conn_t *conn = list_get_instance(link, tcp_conn_t, link);
    364358                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);
    368359               
    369360                if (tcp_sockpair_match(sp, csp)) {
  • uspace/srv/net/tcp/pdu.c

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

    r47f5a77 rcdc3afa  
    613613        ipc_callid_t wcallid;
    614614        size_t length;
     615        uint8_t buffer[TCP_SOCK_FRAGMENT_SIZE];
    615616        tcp_error_t trc;
    616617        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         }
    623618
    624619        log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_send()");
     
    630625        if (sock_core == NULL) {
    631626                async_answer_0(callid, ENOTSOCK);
    632                 goto out;
     627                return;
    633628        }
    634629
     
    646641                        fibril_mutex_unlock(&socket->lock);
    647642                        async_answer_0(callid, EINVAL);
    648                         goto out;
     643                        return;
    649644                }
    650645
     
    656651                        fibril_mutex_unlock(&socket->lock);
    657652                        async_answer_0(callid, rc);
    658                         goto out;
     653                        return;
    659654                }
    660655
     
    681676                        fibril_mutex_unlock(&socket->lock);
    682677                        async_answer_0(callid, rc);
    683                         goto out;
     678                        return;
    684679                }
    685680        }
     
    690685            IPC_GET_ARG2(answer));
    691686        fibril_mutex_unlock(&socket->lock);
    692        
    693 out:
    694         free(buffer);
    695687}
    696688
  • uspace/srv/net/tcp/std.h

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

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

    r47f5a77 rcdc3afa  
    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        
    288284        log_msg(LOG_DEFAULT, LVL_DEBUG, "SEG.SEQ=%" PRIu32 ", SEG.WND=%" PRIu32,
    289285            seg->seq, seg->wnd);
  • uspace/srv/net/tcp/ucall.c

    r47f5a77 rcdc3afa  
    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 
    304300        conn = tcp_conn_find_ref(sp);
    305301        if (conn == NULL) {
  • uspace/srv/net/udp/assoc.c

    r47f5a77 rcdc3afa  
    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        
    377374        if ((!inet_addr_is_any(&patt->addr)) &&
    378375            (!inet_addr_compare(&patt->addr, &sock->addr)))
  • uspace/srv/net/udp/pdu.c

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

    r47f5a77 rcdc3afa  
    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        
    273267        struct sockaddr_in6 *addr6 = NULL;
    274268        struct sockaddr_in *addr;
     
    282276                if (rc != EOK) {
    283277                        async_answer_0(callid, rc);
    284                         goto out;
     278                        return;
    285279                }
    286280               
     
    363357                        log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_sendto: Failed to "
    364358                            "determine local address.");
    365                         goto out;
     359                        return;
    366360                }
    367361               
     
    385379                        length = UDP_FRAGMENT_SIZE;
    386380               
     381                uint8_t buffer[UDP_FRAGMENT_SIZE];
    387382                int rc = async_data_write_finalize(wcallid, buffer, length);
    388383                if (rc != EOK) {
     
    430425        if (addr6 != NULL)
    431426                free(addr6);
    432        
    433         free(buffer);
    434427}
    435428
  • uspace/srv/net/udp/std.h

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