Skip to content

Commit

Permalink
dhcp6: split ia/iadr clone/copy and move to options
Browse files Browse the repository at this point in the history
  • Loading branch information
mtomaschewski committed Sep 6, 2019
1 parent 1895289 commit ccd68a1
Show file tree
Hide file tree
Showing 4 changed files with 100 additions and 54 deletions.
94 changes: 94 additions & 0 deletions src/dhcp6/options.c
Expand Up @@ -114,6 +114,30 @@ ni_dhcp6_ia_addr_new(const struct in6_addr addr, unsigned int plen)
return iadr;
}

ni_dhcp6_ia_addr_t *
ni_dhcp6_ia_addr_clone(const ni_dhcp6_ia_addr_t *iadr, ni_bool_t clean)
{
ni_dhcp6_ia_addr_t *nadr;

if (!iadr || !(nadr = ni_dhcp6_ia_addr_new(iadr->addr, iadr->plen)))
return NULL;

if (!clean) {
nadr->flags = iadr->flags;
nadr->valid_lft = iadr->valid_lft;
nadr->preferred_lft = iadr->preferred_lft;
nadr->status.code = iadr->status.code;
nadr->status.message = xstrdup(iadr->status.message);
if (iadr->status.message && !nadr->status.message)
goto failure;
}
return nadr;

failure:
ni_dhcp6_ia_addr_free(nadr);
return NULL;
}

void
ni_dhcp6_ia_addr_free(ni_dhcp6_ia_addr_t *iadr)
{
Expand Down Expand Up @@ -178,6 +202,26 @@ ni_dhcp6_ia_addr_list_delete(ni_dhcp6_ia_addr_t **list, ni_dhcp6_ia_addr_t *iadr
return FALSE;
}

ni_bool_t
ni_dhcp6_ia_addr_list_copy(ni_dhcp6_ia_addr_t **dst, const ni_dhcp6_ia_addr_t *src, ni_bool_t clean)
{
const ni_dhcp6_ia_addr_t *iadr;
ni_dhcp6_ia_addr_t *nadr;

ni_dhcp6_ia_addr_list_destroy(dst);
for (iadr = src; iadr; iadr = iadr->next) {
nadr = ni_dhcp6_ia_addr_clone(iadr, clean);

if (!ni_dhcp6_ia_addr_list_append(dst, nadr))
goto failure;
}
return TRUE;

failure:
ni_dhcp6_ia_addr_list_destroy(dst);
return FALSE;
}

size_t
ni_dhcp6_ia_addr_list_count(const ni_dhcp6_ia_addr_t *list)
{
Expand Down Expand Up @@ -237,6 +281,35 @@ ni_dhcp6_ia_new(unsigned int type, unsigned int iaid)
return ia;
}

ni_dhcp6_ia_t *
ni_dhcp6_ia_clone(const ni_dhcp6_ia_t *ia, ni_bool_t clean)
{
ni_dhcp6_ia_t *nia;

if (!ia || !(nia = ni_dhcp6_ia_new(ia->type, ia->iaid)))
return NULL;

if (!clean) {
nia->flags = ia->flags;
nia->rebind_time = ia->rebind_time;
nia->renewal_time = ia->renewal_time;
nia->acquired = ia->acquired;
nia->status.code = ia->status.code;
nia->status.message = xstrdup(ia->status.message);
if (ia->status.message && !nia->status.message)
goto failure;
}

if (!ni_dhcp6_ia_addr_list_copy(&nia->addrs, ia->addrs, clean))
goto failure;

return nia;

failure:
ni_dhcp6_ia_free(nia);
return NULL;
}

void
ni_dhcp6_ia_free(ni_dhcp6_ia_t *ia)
{
Expand Down Expand Up @@ -290,6 +363,27 @@ ni_dhcp6_ia_list_delete(ni_dhcp6_ia_t **list, ni_dhcp6_ia_t *ia)
return FALSE;
}

ni_bool_t
ni_dhcp6_ia_list_copy(ni_dhcp6_ia_t **dst, const ni_dhcp6_ia_t *src, ni_bool_t clean)
{
const ni_dhcp6_ia_t *ia;
ni_dhcp6_ia_t *nia;

ni_dhcp6_ia_list_destroy(dst);
for (ia = src; ia; ia = ia->next) {
if (!(nia = ni_dhcp6_ia_clone(ia, clean)))
goto failure;

if (!ni_dhcp6_ia_list_append(dst, nia))
goto failure;
}
return TRUE;

failure:
ni_dhcp6_ia_list_destroy(dst);
return FALSE;
}

size_t
ni_dhcp6_ia_list_count(const ni_dhcp6_ia_t *list)
{
Expand Down
6 changes: 6 additions & 0 deletions src/dhcp6/options.h
Expand Up @@ -187,6 +187,7 @@ extern const char * ni_dhcp6_option_name(unsigned int);

extern ni_dhcp6_ia_addr_t * ni_dhcp6_ia_addr_new(const struct in6_addr,
unsigned int);
extern ni_dhcp6_ia_addr_t * ni_dhcp6_ia_addr_clone(const ni_dhcp6_ia_addr_t *, ni_bool_t);
extern void ni_dhcp6_ia_addr_free(ni_dhcp6_ia_addr_t *);

extern ni_bool_t ni_dhcp6_ia_addr_equal_address(const ni_dhcp6_ia_addr_t *,
Expand All @@ -200,6 +201,8 @@ extern ni_bool_t ni_dhcp6_ia_addr_list_remove(ni_dhcp6_ia_addr_t **,
ni_dhcp6_ia_addr_t *);
extern ni_bool_t ni_dhcp6_ia_addr_list_delete(ni_dhcp6_ia_addr_t **,
ni_dhcp6_ia_addr_t *);
extern ni_bool_t ni_dhcp6_ia_addr_list_copy(ni_dhcp6_ia_addr_t **,
const ni_dhcp6_ia_addr_t *, ni_bool_t);
extern size_t ni_dhcp6_ia_addr_list_count(const ni_dhcp6_ia_addr_t *);
extern void ni_dhcp6_ia_addr_list_destroy(ni_dhcp6_ia_addr_t **);

Expand All @@ -210,6 +213,7 @@ extern ni_dhcp6_ia_addr_t * ni_dhcp6_ia_addr_list_find(ni_dhcp6_ia_addr_t *,
ni_dhcp6_ia_addr_match_fn_t *);

extern ni_dhcp6_ia_t * ni_dhcp6_ia_new(unsigned int, unsigned int);
extern ni_dhcp6_ia_t * ni_dhcp6_ia_clone(const ni_dhcp6_ia_t *, ni_bool_t);
extern void ni_dhcp6_ia_free(ni_dhcp6_ia_t *);

extern ni_bool_t ni_dhcp6_ia_list_append(ni_dhcp6_ia_t **,
Expand All @@ -218,6 +222,8 @@ extern ni_bool_t ni_dhcp6_ia_list_remove(ni_dhcp6_ia_t **,
ni_dhcp6_ia_t *);
extern ni_bool_t ni_dhcp6_ia_list_delete(ni_dhcp6_ia_t **,
ni_dhcp6_ia_t *);
extern ni_bool_t ni_dhcp6_ia_list_copy(ni_dhcp6_ia_t **,
const ni_dhcp6_ia_t *, ni_bool_t);
extern size_t ni_dhcp6_ia_list_count(const ni_dhcp6_ia_t *);
extern void ni_dhcp6_ia_list_destroy(ni_dhcp6_ia_t **);

Expand Down
52 changes: 0 additions & 52 deletions src/dhcp6/protocol.c
Expand Up @@ -2129,58 +2129,6 @@ ni_dhcp6_ia_set_default_lifetimes(ni_dhcp6_ia_t *ia, unsigned int pref_time)
__ni_dhcp6_ia_set_default_lifetimes(ia, pref_time);
}

int
ni_dhcp6_ia_list_copy(ni_dhcp6_ia_t **dst, const ni_dhcp6_ia_t *src, ni_bool_t clean)
{
const ni_dhcp6_ia_t *ia;
ni_dhcp6_ia_t *nia;

ni_dhcp6_ia_list_destroy(dst);
for (ia = src; ia; ia = ia->next) {
if ((nia = ni_dhcp6_ia_new(ia->type, ia->iaid)) == NULL)
goto failure;

if( !clean) {
nia->flags = ia->flags;
nia->rebind_time = ia->rebind_time;
nia->renewal_time = ia->renewal_time;
nia->acquired = ia->acquired;
nia->status.code = ia->status.code;
nia->status.message = xstrdup(ia->status.message);
}
if (ni_dhcp6_ia_addr_list_copy(&nia->addrs, ia->addrs, clean) < 0)
goto failure;

ni_dhcp6_ia_list_append(dst, nia);
}
return 0;

failure:
ni_dhcp6_ia_list_destroy(dst);
return -1;
}

int
ni_dhcp6_ia_addr_list_copy(ni_dhcp6_ia_addr_t **dst, const ni_dhcp6_ia_addr_t *src, ni_bool_t clean)
{
const ni_dhcp6_ia_addr_t *iadr;
ni_dhcp6_ia_addr_t *nadr;

ni_dhcp6_ia_addr_list_destroy(dst);
for (iadr = src; iadr; iadr = iadr->next) {
nadr = ni_dhcp6_ia_addr_new(iadr->addr, iadr->plen);
if (!clean) {
nadr->flags = iadr->flags;
nadr->valid_lft = iadr->valid_lft;
nadr->preferred_lft = iadr->preferred_lft;
nadr->status.code = iadr->status.code;
nadr->status.message = xstrdup(iadr->status.message);
}
ni_dhcp6_ia_addr_list_append(dst, nadr);
}
return 0;
}

ni_bool_t
ni_dhcp6_ia_addr_is_usable(const ni_dhcp6_ia_addr_t *iadr)
{
Expand Down
2 changes: 0 additions & 2 deletions src/dhcp6/protocol.h
Expand Up @@ -253,7 +253,6 @@ extern ssize_t ni_dhcp6_socket_send(ni_socket_t *, const ni_buffer_t *, const n

/* FIXME: cleanup */
extern ni_bool_t ni_dhcp6_ia_addr_is_usable(const ni_dhcp6_ia_addr_t *);
extern int ni_dhcp6_ia_addr_list_copy(ni_dhcp6_ia_addr_t **, const ni_dhcp6_ia_addr_t *, ni_bool_t);

extern unsigned int ni_dhcp6_ia_release_matching(ni_dhcp6_ia_t *, struct in6_addr *,
unsigned int);
Expand All @@ -268,7 +267,6 @@ extern unsigned int ni_dhcp6_ia_get_renewal_time(ni_dhcp6_ia_t *);

extern ni_bool_t ni_dhcp6_ia_is_active(ni_dhcp6_ia_t *, struct timeval *);
extern unsigned int ni_dhcp6_ia_list_count_active(ni_dhcp6_ia_t *, struct timeval *now);
extern int ni_dhcp6_ia_list_copy(ni_dhcp6_ia_t **, const ni_dhcp6_ia_t *, ni_bool_t);
extern unsigned int ni_dhcp6_ia_copy_to_lease_addrs(const ni_dhcp6_device_t *, ni_addrconf_lease_t *);

extern const char * ni_dhcp6_print_timeval(const struct timeval *);
Expand Down

0 comments on commit ccd68a1

Please sign in to comment.