Changeset f023251 in mainline for uspace/lib/c/generic/inet/addr.c


Ignore:
Timestamp:
2013-09-29T21:06:10Z (11 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
e948fde
Parents:
13be2583
Message:

HelenOS internet address version should not be based on BSD sockets definition.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/inet/addr.c

    r13be2583 rf023251  
    3333 */
    3434
     35#include <assert.h>
    3536#include <errno.h>
    3637#include <unistd.h>
     
    5960
    6061static const inet_addr_t inet_addr_any_addr = {
    61         .family = AF_INET,
     62        .version = ip_v4,
    6263        .addr = 0
    6364};
    6465
    6566static const inet_addr_t inet_addr_any_addr6 = {
    66         .family = AF_INET6,
     67        .version = ip_v6,
    6768        .addr6 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
    6869};
     
    150151void inet_addr(inet_addr_t *addr, uint8_t a, uint8_t b, uint8_t c, uint8_t d)
    151152{
    152         addr->family = AF_INET;
     153        addr->version = ip_v4;
    153154        addr->addr = ((addr32_t) a << 24) | ((addr32_t) b << 16) |
    154155            ((addr32_t) c << 8) | ((addr32_t) d);
     
    158159    uint8_t prefix)
    159160{
    160         naddr->family = AF_INET;
     161        naddr->version = ip_v4;
    161162        naddr->addr = ((addr32_t) a << 24) | ((addr32_t) b << 16) |
    162163            ((addr32_t) c << 8) | ((addr32_t) d);
     
    167168    uint16_t d, uint16_t e, uint16_t f, uint16_t g, uint16_t h)
    168169{
    169         addr->family = AF_INET6;
     170        addr->version = ip_v6;
    170171        addr->addr6[0] = (a >> 8) & 0xff;
    171172        addr->addr6[1] = a & 0xff;
     
    189190    uint16_t d, uint16_t e, uint16_t f, uint16_t g, uint16_t h, uint8_t prefix)
    190191{
    191         naddr->family = AF_INET6;
     192        naddr->version = ip_v6;
    192193        naddr->addr6[0] = (a >> 8) & 0xff;
    193194        naddr->addr6[1] = a & 0xff;
     
    209210}
    210211
    211 /** Parse network address family.
    212  *
    213  * @param text Network address in common notation.
    214  * @param af   Place to store network address family.
     212/** Determine address version.
     213 *
     214 * @param text Address in common notation.
     215 * @param af   Place to store address version.
    215216 *
    216217 * @return EOK on success, EINVAL if input is not in valid format.
    217218 *
    218219 */
    219 int inet_addr_family(const char *text, uint16_t *af)
     220static int inet_addr_version(const char *text, ip_ver_t *ver)
    220221{
    221222        char *dot = str_chr(text, '.');
    222223        if (dot != NULL) {
    223                 *af = AF_INET;
     224                *ver = ip_v4;
    224225                return EOK;
    225226        }
    226        
     227
    227228        char *collon = str_chr(text, ':');
    228229        if (collon != NULL) {
    229                 *af = AF_INET6;
     230                *ver = ip_v6;
    230231                return EOK;
    231232        }
    232        
     233
    233234        return EINVAL;
    234235}
    235236
     237static int ipver_af(ip_ver_t ver)
     238{
     239        switch (ver) {
     240        case ip_any:
     241                return AF_NONE;
     242        case ip_v4:
     243                return AF_INET;
     244        case ip_v6:
     245                return AF_INET6;
     246        default:
     247                assert(false);
     248                return EINVAL;
     249        }
     250}
     251
    236252void inet_naddr_addr(const inet_naddr_t *naddr, inet_addr_t *addr)
    237253{
    238         addr->family = naddr->family;
     254        addr->version = naddr->version;
    239255        memcpy(addr->addr6, naddr->addr6, 16);
    240256}
     
    243259    inet_naddr_t *naddr)
    244260{
    245         naddr->family = addr->family;
     261        naddr->version = addr->version;
    246262        memcpy(naddr->addr6, addr->addr6, 16);
    247263        naddr->prefix = prefix;
     
    250266void inet_addr_any(inet_addr_t *addr)
    251267{
    252         addr->family = AF_NONE;
     268        addr->version = ip_any;
    253269        memset(addr->addr6, 0, 16);
    254270}
     
    256272void inet_naddr_any(inet_naddr_t *naddr)
    257273{
    258         naddr->family = AF_NONE;
     274        naddr->version = ip_any;
    259275        memset(naddr->addr6, 0, 16);
    260276        naddr->prefix = 0;
     
    263279int inet_addr_compare(const inet_addr_t *a, const inet_addr_t *b)
    264280{
    265         if (a->family != b->family)
     281        if (a->version != b->version)
    266282                return 0;
    267        
    268         switch (a->family) {
    269         case AF_INET:
     283
     284        switch (a->version) {
     285        case ip_v4:
    270286                return (a->addr == b->addr);
    271         case AF_INET6:
     287        case ip_v6:
    272288                return addr128_compare(a->addr6, b->addr6);
    273289        default:
     
    278294int inet_addr_is_any(const inet_addr_t *addr)
    279295{
    280         return ((addr->family == 0) ||
     296        return ((addr->version == ip_any) ||
    281297            (inet_addr_compare(addr, &inet_addr_any_addr)) ||
    282298            (inet_addr_compare(addr, &inet_addr_any_addr6)));
     
    285301int inet_naddr_compare(const inet_naddr_t *naddr, const inet_addr_t *addr)
    286302{
    287         if (naddr->family != addr->family)
     303        if (naddr->version != addr->version)
    288304                return 0;
    289305       
    290         switch (naddr->family) {
    291         case AF_INET:
     306        switch (naddr->version) {
     307        case ip_v4:
    292308                return (naddr->addr == addr->addr);
    293         case AF_INET6:
     309        case ip_v6:
    294310                return addr128_compare(naddr->addr6, addr->addr6);
    295311        default:
     
    300316int inet_naddr_compare_mask(const inet_naddr_t *naddr, const inet_addr_t *addr)
    301317{
    302         if (naddr->family != addr->family)
     318        if (naddr->version != addr->version)
    303319                return 0;
    304        
    305         switch (naddr->family) {
    306         case AF_INET:
     320
     321        switch (naddr->version) {
     322        case ip_v4:
    307323                if (naddr->prefix > 32)
    308324                        return 0;
    309                
     325
    310326                addr32_t mask =
    311327                    BIT_RANGE(addr32_t, 31, 31 - (naddr->prefix - 1));
    312328                return ((naddr->addr & mask) == (addr->addr & mask));
    313         case AF_INET6:
     329        case ip_v6:
    314330                if (naddr->prefix > 128)
    315331                        return 0;
     
    352368int inet_addr_parse(const char *text, inet_addr_t *addr)
    353369{
    354         int rc = inet_addr_family(text, &addr->family);
     370        int rc = inet_addr_version(text, &addr->version);
    355371        if (rc != EOK)
    356372                return rc;
    357373       
    358374        uint8_t buf[16];
    359         rc = inet_pton(addr->family, text, buf);
     375        rc = inet_pton(ipver_af(addr->version), text, buf);
    360376        if (rc != EOK)
    361377                return rc;
    362378       
    363         switch (addr->family) {
    364         case AF_INET:
     379        switch (addr->version) {
     380        case ip_v4:
    365381                addr->addr = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) |
    366382                    buf[3];
    367383                break;
    368         case AF_INET6:
     384        case ip_v6:
    369385                memcpy(addr->addr6, buf, 16);
    370386                break;
     
    392408        *slash = 0;
    393409       
    394         int rc = inet_addr_family(text, &naddr->family);
     410        int rc = inet_addr_version(text, &naddr->version);
    395411        if (rc != EOK)
    396412                return rc;
    397413       
    398414        uint8_t buf[16];
    399         rc = inet_pton(naddr->family, text, buf);
     415        rc = inet_pton(ipver_af(naddr->version), text, buf);
    400416        *slash = '/';
    401417       
     
    406422        uint8_t prefix;
    407423       
    408         switch (naddr->family) {
    409         case AF_INET:
     424        switch (naddr->version) {
     425        case ip_v4:
    410426                prefix = strtoul(slash, &slash, 10);
    411427                if (prefix > 32)
     
    417433               
    418434                break;
    419         case AF_INET6:
     435        case ip_v6:
    420436                prefix = strtoul(slash, &slash, 10);
    421437                if (prefix > 128)
     
    447463        int rc = 0;
    448464       
    449         switch (addr->family) {
    450         case AF_NONE:
     465        switch (addr->version) {
     466        case ip_any:
    451467                rc = asprintf(bufp, "none");
    452468                break;
    453         case AF_INET:
     469        case ip_v4:
    454470                rc = asprintf(bufp, "%u.%u.%u.%u", (addr->addr >> 24) & 0xff,
    455471                    (addr->addr >> 16) & 0xff, (addr->addr >> 8) & 0xff,
    456472                    addr->addr & 0xff);
    457473                break;
    458         case AF_INET6:
     474        case ip_v6:
    459475                *bufp = (char *) malloc(INET6_ADDRSTRLEN);
    460476                if (*bufp == NULL)
     
    487503        char prefix[INET_PREFIXSTRSIZE];
    488504       
    489         switch (naddr->family) {
    490         case AF_NONE:
     505        switch (naddr->version) {
     506        case ip_any:
    491507                rc = asprintf(bufp, "none");
    492508                break;
    493         case AF_INET:
     509        case ip_v4:
    494510                rc = asprintf(bufp, "%" PRIu8 ".%" PRIu8 ".%" PRIu8 ".%" PRIu8
    495511                    "/%" PRIu8, (naddr->addr >> 24) & 0xff,
     
    497513                    naddr->addr & 0xff, naddr->prefix);
    498514                break;
    499         case AF_INET6:
     515        case ip_v6:
    500516                *bufp = (char *) malloc(INET6_ADDRSTRLEN + INET_PREFIXSTRSIZE);
    501517                if (*bufp == NULL)
     
    529545}
    530546
    531 uint16_t inet_addr_get(const inet_addr_t *addr, addr32_t *v4, addr128_t *v6)
    532 {
    533         switch (addr->family) {
    534         case AF_INET:
     547ip_ver_t inet_addr_get(const inet_addr_t *addr, addr32_t *v4, addr128_t *v6)
     548{
     549        switch (addr->version) {
     550        case ip_v4:
    535551                if (v4 != NULL)
    536552                        *v4 = addr->addr;
    537                
    538                 break;
    539         case AF_INET6:
     553                break;
     554        case ip_v6:
    540555                if (v6 != NULL)
    541556                        memcpy(*v6, addr->addr6, 16);
    542                
    543                 break;
    544         }
    545        
    546         return addr->family;
    547 }
    548 
    549 uint16_t inet_naddr_get(const inet_naddr_t *naddr, addr32_t *v4, addr128_t *v6,
     557                break;
     558        default:
     559                assert(false);
     560                break;
     561        }
     562
     563        return addr->version;
     564}
     565
     566ip_ver_t inet_naddr_get(const inet_naddr_t *naddr, addr32_t *v4, addr128_t *v6,
    550567    uint8_t *prefix)
    551568{
    552         switch (naddr->family) {
    553         case AF_INET:
     569        switch (naddr->version) {
     570        case ip_v4:
    554571                if (v4 != NULL)
    555572                        *v4 = naddr->addr;
    556                
    557573                if (prefix != NULL)
    558574                        *prefix = naddr->prefix;
    559                
    560                 break;
    561         case AF_INET6:
     575                break;
     576        case ip_v6:
    562577                if (v6 != NULL)
    563578                        memcpy(*v6, naddr->addr6, 16);
    564                
    565579                if (prefix != NULL)
    566580                        *prefix = naddr->prefix;
    567                
    568                 break;
    569         }
    570        
    571         return naddr->family;
     581                break;
     582        default:
     583                assert(false);
     584                break;
     585        }
     586
     587        return naddr->version;
    572588}
    573589
    574590void inet_addr_set(addr32_t v4, inet_addr_t *addr)
    575591{
    576         addr->family = AF_INET;
     592        addr->version = ip_v4;
    577593        addr->addr = v4;
    578594}
     
    580596void inet_naddr_set(addr32_t v4, uint8_t prefix, inet_naddr_t *naddr)
    581597{
    582         naddr->family = AF_INET;
     598        naddr->version = ip_v4;
    583599        naddr->addr = v4;
    584600        naddr->prefix = prefix;
     
    587603void inet_sockaddr_in_addr(const sockaddr_in_t *sockaddr_in, inet_addr_t *addr)
    588604{
    589         addr->family = AF_INET;
     605        addr->version = ip_v4;
    590606        addr->addr = uint32_t_be2host(sockaddr_in->sin_addr.s_addr);
    591607}
     
    593609void inet_addr_set6(addr128_t v6, inet_addr_t *addr)
    594610{
    595         addr->family = AF_INET6;
     611        addr->version = ip_v6;
    596612        memcpy(addr->addr6, v6, 16);
    597613}
     
    599615void inet_naddr_set6(addr128_t v6, uint8_t prefix, inet_naddr_t *naddr)
    600616{
    601         naddr->family = AF_INET6;
     617        naddr->version = ip_v6;
    602618        memcpy(naddr->addr6, v6, 16);
    603619        naddr->prefix = prefix;
     
    607623    inet_addr_t *addr)
    608624{
    609         addr->family = AF_INET6;
     625        addr->version = ip_v6;
    610626        addr128_t_be2host(sockaddr_in6->sin6_addr.s6_addr, addr->addr6);
    611627}
     
    614630    sockaddr_in_t *sockaddr_in, sockaddr_in6_t *sockaddr_in6)
    615631{
    616         switch (addr->family) {
    617         case AF_INET:
     632        switch (addr->version) {
     633        case ip_v4:
    618634                if (sockaddr_in != NULL) {
    619635                        sockaddr_in->sin_family = AF_INET;
    620636                        sockaddr_in->sin_addr.s_addr = host2uint32_t_be(addr->addr);
    621637                }
    622                
    623                 break;
    624         case AF_INET6:
     638                break;
     639        case ip_v6:
    625640                if (sockaddr_in6 != NULL) {
    626641                        sockaddr_in6->sin6_family = AF_INET6;
    627642                        host2addr128_t_be(addr->addr6, sockaddr_in6->sin6_addr.s6_addr);
    628643                }
    629                
    630                 break;
    631         }
    632        
    633         return addr->family;
     644                break;
     645        default:
     646                assert(false);
     647                break;
     648        }
     649
     650        return ipver_af(addr->version);
    634651}
    635652
Note: See TracChangeset for help on using the changeset viewer.