Applied. Thanks!
On Sun, Apr 27, 2014 at 9:58 PM, Umut Tezduyar Lindskog <umut.tezdu...@axis.com> wrote: > - Also only allow positive ifindex on both dhcp and ipv4ll > --- > Makefile.am | 14 +- > src/libsystemd-network/sd-dhcp-client.c | 2 +- > src/libsystemd-network/sd-ipv4ll.c | 7 +- > src/libsystemd-network/test-dhcp-client.c | 4 +- > src/libsystemd-network/test-ipv4ll.c | 225 > +++++++++++++++++++++++++++++ > 5 files changed, 247 insertions(+), 5 deletions(-) > create mode 100644 src/libsystemd-network/test-ipv4ll.c > > diff --git a/Makefile.am b/Makefile.am > index 7f3924f..5fc14d9 100644 > --- a/Makefile.am > +++ b/Makefile.am > @@ -2514,9 +2514,21 @@ test_dhcp_client_LDADD = \ > libsystemd-internal.la \ > libsystemd-shared.la > > +test_ipv4ll_SOURCES = \ > + src/systemd/sd-ipv4ll.h \ > + src/libsystemd-network/ipv4ll-internal.h \ > + src/libsystemd-network/test-ipv4ll.c > + > +test_ipv4ll_LDADD = \ > + libsystemd-network.la \ > + libsystemd-label.la \ > + libsystemd-internal.la \ > + libsystemd-shared.la > + > tests += \ > test-dhcp-option \ > - test-dhcp-client > + test-dhcp-client \ > + test-ipv4ll > > # > ------------------------------------------------------------------------------ > if ENABLE_GTK_DOC > diff --git a/src/libsystemd-network/sd-dhcp-client.c > b/src/libsystemd-network/sd-dhcp-client.c > index 854c671..14f2267 100644 > --- a/src/libsystemd-network/sd-dhcp-client.c > +++ b/src/libsystemd-network/sd-dhcp-client.c > @@ -143,7 +143,7 @@ int sd_dhcp_client_set_index(sd_dhcp_client *client, int > interface_index) { > assert_return(client, -EINVAL); > assert_return (IN_SET(client->state, DHCP_STATE_INIT, > DHCP_STATE_STOPPED), -EBUSY); > - assert_return(interface_index >= -1, -EINVAL); > + assert_return(interface_index > 0, -EINVAL); > > client->index = interface_index; > > diff --git a/src/libsystemd-network/sd-ipv4ll.c > b/src/libsystemd-network/sd-ipv4ll.c > index 72289b2..fd39c12 100644 > --- a/src/libsystemd-network/sd-ipv4ll.c > +++ b/src/libsystemd-network/sd-ipv4ll.c > @@ -382,7 +382,7 @@ static int ipv4ll_receive_message(sd_event_source *s, int > fd, > > int sd_ipv4ll_set_index(sd_ipv4ll *ll, int interface_index) { > assert_return(ll, -EINVAL); > - assert_return(interface_index >= -1, -EINVAL); > + assert_return(interface_index > 0, -EINVAL); > assert_return(IN_SET(ll->state, IPV4LL_STATE_INIT, > IPV4LL_STATE_STOPPED), -EBUSY); > > @@ -469,10 +469,13 @@ int sd_ipv4ll_get_address(sd_ipv4ll *ll, struct in_addr > *address){ > } > > int sd_ipv4ll_set_address_seed (sd_ipv4ll *ll, uint8_t seed[8]) { > - unsigned int entropy = *seed; > + unsigned int entropy; > int r; > > assert_return(ll, -EINVAL); > + assert_return(seed, -EINVAL); > + > + entropy = *seed; > > free(ll->random_data); > free(ll->random_data_state); > diff --git a/src/libsystemd-network/test-dhcp-client.c > b/src/libsystemd-network/test-dhcp-client.c > index e7787fa..83dd619 100644 > --- a/src/libsystemd-network/test-dhcp-client.c > +++ b/src/libsystemd-network/test-dhcp-client.c > @@ -79,7 +79,9 @@ static void test_request_basic(sd_event *e) > > assert_se(sd_dhcp_client_set_index(client, 15) == 0); > assert_se(sd_dhcp_client_set_index(client, -42) == -EINVAL); > - assert_se(sd_dhcp_client_set_index(client, -1) == 0); > + assert_se(sd_dhcp_client_set_index(client, -1) == -EINVAL); > + assert_se(sd_dhcp_client_set_index(client, 0) == -EINVAL); > + assert_se(sd_dhcp_client_set_index(client, 1) == 0); > > assert_se(sd_dhcp_client_set_request_option(client, > DHCP_OPTION_SUBNET_MASK) == -EEXIST); > diff --git a/src/libsystemd-network/test-ipv4ll.c > b/src/libsystemd-network/test-ipv4ll.c > new file mode 100644 > index 0000000..459d5c3 > --- /dev/null > +++ b/src/libsystemd-network/test-ipv4ll.c > @@ -0,0 +1,225 @@ > +/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ > +/*** > + This file is part of systemd. > + > + Copyright (C) 2014 Axis Communications AB. All rights reserved. > + > + systemd is free software; you can redistribute it and/or modify it > + under the terms of the GNU Lesser General Public License as published by > + the Free Software Foundation; either version 2.1 of the License, or > + (at your option) any later version. > + > + systemd is distributed in the hope that it will be useful, but > + WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public License > + along with systemd; If not, see <http://www.gnu.org/licenses/>. > +***/ > + > +#include <stdlib.h> > +#include <assert.h> > +#include <errno.h> > +#include <stdio.h> > +#include <sys/types.h> > +#include <sys/socket.h> > +#include <unistd.h> > + > +#include "util.h" > +#include "socket-util.h" > + > +#include "sd-ipv4ll.h" > +#include "ipv4ll-internal.h" > + > +static bool verbose = false; > +static bool extended = false; > +static int test_fd[2]; > + > +static int basic_request_handler_bind = 0; > +static int basic_request_handler_stop = 0; > +static void* basic_request_handler_user_data = (void*)0xCABCAB; > +static void basic_request_handler(sd_ipv4ll *ll, int event, void *userdata) { > + assert_se(userdata == basic_request_handler_user_data); > + > + switch(event) { > + case IPV4LL_EVENT_STOP: > + basic_request_handler_stop = 1; > + break; > + case IPV4LL_EVENT_BIND: > + basic_request_handler_bind = 1; > + break; > + default: > + assert_se(0); > + break; > + } > +} > + > +int arp_network_send_raw_socket(int fd, const union sockaddr_union *link, > + const struct ether_arp *arp) { > + assert_se(arp); > + assert_se(link); > + assert_se(fd >= 0); > + > + if (send(fd, arp, sizeof(struct ether_arp), 0) < 0) > + return -errno; > + > + return 0; > +} > + > +int arp_network_bind_raw_socket(int index, union sockaddr_union *link) { > + if (socketpair(AF_UNIX, SOCK_DGRAM | SOCK_NONBLOCK, 0, test_fd) < 0) > + return -errno; > + > + return test_fd[0]; > +} > + > +static void test_arp_header(struct ether_arp *arp) { > + assert_se(arp); > + assert_se(arp->ea_hdr.ar_hrd == htons(ARPHRD_ETHER)); /* HTYPE */ > + assert_se(arp->ea_hdr.ar_pro == htons(ETHERTYPE_IP)); /* PTYPE */ > + assert_se(arp->ea_hdr.ar_hln == ETH_ALEN); /* HLEN */ > + assert_se(arp->ea_hdr.ar_pln == sizeof arp->arp_spa); /* PLEN */ > + assert_se(arp->ea_hdr.ar_op == htons(ARPOP_REQUEST)); /* REQUEST */ > +} > + > +static void test_arp_probe(void) { > + struct ether_arp arp; > + struct ether_addr mac_addr = { > + .ether_addr_octet = {'A', 'B', 'C', '1', '2', '3'}}; > + be32_t pa = 0x3030; > + > + if (verbose) > + printf("* %s\n", __FUNCTION__); > + > + arp_packet_probe(&arp, pa, &mac_addr); > + test_arp_header(&arp); > + assert_se(memcmp(arp.arp_sha, &mac_addr, ETH_ALEN) == 0); > + assert_se(memcmp(arp.arp_tpa, &pa, sizeof(pa)) == 0); > +} > + > +static void test_arp_announce(void) { > + struct ether_arp arp; > + struct ether_addr mac_addr = { > + .ether_addr_octet = {'A', 'B', 'C', '1', '2', '3'}}; > + be32_t pa = 0x3131; > + > + if (verbose) > + printf("* %s\n", __FUNCTION__); > + > + arp_packet_announcement(&arp, pa, &mac_addr); > + test_arp_header(&arp); > + assert_se(memcmp(arp.arp_sha, &mac_addr, ETH_ALEN) == 0); > + assert_se(memcmp(arp.arp_tpa, &pa, sizeof(pa)) == 0); > + assert_se(memcmp(arp.arp_spa, &pa, sizeof(pa)) == 0); > +} > + > +static void test_public_api_setters(sd_event *e) { > + uint8_t seed[8]; > + sd_ipv4ll *ll; > + struct ether_addr mac_addr = { > + .ether_addr_octet = {'A', 'B', 'C', '1', '2', '3'}}; > + > + if (verbose) > + printf("* %s\n", __FUNCTION__); > + > + assert_se(sd_ipv4ll_new(&ll) == 0); > + assert_se(ll); > + > + assert_se(sd_ipv4ll_attach_event(NULL, NULL, 0) == -EINVAL); > + assert_se(sd_ipv4ll_attach_event(ll, e, 0) == 0); > + assert_se(sd_ipv4ll_attach_event(ll, e, 0) == -EBUSY); > + > + assert_se(sd_ipv4ll_set_callback(NULL, NULL, NULL) == -EINVAL); > + assert_se(sd_ipv4ll_set_callback(ll, NULL, NULL) == 0); > + > + assert_se(sd_ipv4ll_set_address_seed(NULL, NULL) == -EINVAL); > + assert_se(sd_ipv4ll_set_address_seed(ll, NULL) == -EINVAL); > + assert_se(sd_ipv4ll_set_address_seed(ll, seed) == 0); > + > + assert_se(sd_ipv4ll_set_mac(NULL, NULL) == -EINVAL); > + assert_se(sd_ipv4ll_set_mac(ll, NULL) == -EINVAL); > + assert_se(sd_ipv4ll_set_mac(ll, &mac_addr) == 0); > + > + assert_se(sd_ipv4ll_set_index(NULL, -1) == -EINVAL); > + assert_se(sd_ipv4ll_set_index(ll, -1) == -EINVAL); > + assert_se(sd_ipv4ll_set_index(ll, -99) == -EINVAL); > + assert_se(sd_ipv4ll_set_index(ll, 1) == 0); > + assert_se(sd_ipv4ll_set_index(ll, 99) == 0); > + > + assert_se(sd_ipv4ll_ref(ll) == ll); > + assert_se(sd_ipv4ll_unref(ll) == ll); > + > + /* Cleanup */ > + assert_se(sd_ipv4ll_unref(ll) == NULL); > +} > + > +static void test_basic_request(sd_event *e) { > + > + sd_ipv4ll *ll; > + struct ether_arp arp; > + struct ether_addr mac_addr = { > + .ether_addr_octet = {'A', 'B', 'C', '1', '2', '3'}}; > + > + if (verbose) > + printf("* %s\n", __FUNCTION__); > + > + assert_se(sd_ipv4ll_new(&ll) == 0); > + assert_se(sd_ipv4ll_start(ll) == -EINVAL); > + > + assert_se(sd_ipv4ll_attach_event(ll, e, 0) == 0); > + assert_se(sd_ipv4ll_start(ll) == -EINVAL); > + > + assert_se(sd_ipv4ll_set_mac(ll, &mac_addr) == 0); > + assert_se(sd_ipv4ll_start(ll) == -EINVAL); > + > + assert_se(sd_ipv4ll_set_callback(ll, basic_request_handler, > + basic_request_handler_user_data) == > 0); > + assert_se(sd_ipv4ll_start(ll) == -EINVAL); > + > + assert_se(sd_ipv4ll_set_index(ll, 1) == 0); > + assert_se(sd_ipv4ll_start(ll) == 0); > + > + sd_event_run(e, (uint64_t) -1); > + assert_se(sd_ipv4ll_start(ll) == -EBUSY); > + > + /* PROBE */ > + sd_event_run(e, (uint64_t) -1); > + assert_se(read(test_fd[1], &arp, sizeof(struct ether_arp)) == > sizeof(struct ether_arp)); > + test_arp_header(&arp); > + > + if (extended) { > + /* PROBE */ > + sd_event_run(e, (uint64_t) -1); > + assert_se(read(test_fd[1], &arp, sizeof(struct ether_arp)) > == sizeof(struct ether_arp)); > + test_arp_header(&arp); > + > + /* PROBE */ > + sd_event_run(e, (uint64_t) -1); > + assert_se(read(test_fd[1], &arp, sizeof(struct ether_arp)) > == sizeof(struct ether_arp)); > + test_arp_header(&arp); > + > + sd_event_run(e, (uint64_t) -1); > + assert_se(basic_request_handler_bind == 1); > + } > + > + sd_ipv4ll_stop(ll); > + assert_se(basic_request_handler_stop == 1); > + > + /* Cleanup */ > + assert_se(sd_ipv4ll_unref(ll) == NULL); > + safe_close(test_fd[1]); > +} > + > +int main(int argc, char *argv[]) { > + sd_event *e; > + > + assert_se(sd_event_new(&e) >= 0); > + > + test_public_api_setters(e); > + test_arp_probe(); > + test_arp_announce(); > + test_basic_request(e); > + > + return 0; > +} > -- > 1.7.10.4 > > _______________________________________________ > systemd-devel mailing list > systemd-devel@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/systemd-devel _______________________________________________ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel