Re: [ovs-dev] [PATCH v6 1/5] netdev-dummy: Support multiple IP addresses.

2023-03-03 Thread Eelco Chaudron



On 2 Mar 2023, at 7:34, Nobuhiro MIKI wrote:

> This is useful in test cases where multiple IPv4/IPv6 addresses
> are assigned together.
>
> Acked-by: Eelco Chaudron 
> Reviewed-by: Simon Horman 
> Signed-off-by: Nobuhiro MIKI 
> ---

This patch still looks good with the additional changes!

Acked-by: Eelco Chaudron 

___
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev


[ovs-dev] [PATCH v6 1/5] netdev-dummy: Support multiple IP addresses.

2023-03-01 Thread Nobuhiro MIKI
This is useful in test cases where multiple IPv4/IPv6 addresses
are assigned together.

Acked-by: Eelco Chaudron 
Reviewed-by: Simon Horman 
Signed-off-by: Nobuhiro MIKI 
---
 lib/netdev-dummy.c | 70 +-
 1 file changed, 44 insertions(+), 26 deletions(-)

diff --git a/lib/netdev-dummy.c b/lib/netdev-dummy.c
index 5d59c9c0312b..7467e9fbcb97 100644
--- a/lib/netdev-dummy.c
+++ b/lib/netdev-dummy.c
@@ -136,8 +136,7 @@ struct netdev_dummy {
 
 struct pcap_file *tx_pcap, *rxq_pcap OVS_GUARDED;
 
-struct in_addr address, netmask;
-struct in6_addr ipv6, ipv6_mask;
+struct ovs_list addrs OVS_GUARDED;
 struct ovs_list rxes OVS_GUARDED; /* List of child "netdev_rxq_dummy"s. */
 
 struct hmap offloaded_flows OVS_GUARDED;
@@ -161,6 +160,12 @@ struct netdev_rxq_dummy {
 struct seq *seq;/* Reports newly queued packets. */
 };
 
+struct netdev_addr_dummy {
+struct in6_addr address;
+struct in6_addr netmask;
+struct ovs_list node;   /* In netdev_dummy's "addrs" list. */
+};
+
 static unixctl_cb_func netdev_dummy_set_admin_state;
 static int netdev_dummy_construct(struct netdev *);
 static void netdev_dummy_queue_packet(struct netdev_dummy *,
@@ -169,6 +174,7 @@ static void netdev_dummy_queue_packet(struct netdev_dummy *,
 static void dummy_packet_stream_close(struct dummy_packet_stream *);
 
 static void pkt_list_delete(struct ovs_list *);
+static void addr_list_delete(struct ovs_list *);
 
 static bool
 is_dummy_class(const struct netdev_class *class)
@@ -720,6 +726,7 @@ netdev_dummy_construct(struct netdev *netdev_)
 dummy_packet_conn_init(>conn);
 
 ovs_list_init(>rxes);
+ovs_list_init(>addrs);
 hmap_init(>offloaded_flows);
 ovs_mutex_unlock(>mutex);
 
@@ -756,6 +763,7 @@ netdev_dummy_destruct(struct netdev *netdev_)
 free(off_flow);
 }
 hmap_destroy(>offloaded_flows);
+addr_list_delete(>addrs);
 
 ovs_mutex_unlock(>mutex);
 ovs_mutex_destroy(>mutex);
@@ -803,32 +811,24 @@ netdev_dummy_get_addr_list(const struct netdev *netdev_, 
struct in6_addr **paddr
 struct netdev_dummy *netdev = netdev_dummy_cast(netdev_);
 int cnt = 0, i = 0, err = 0;
 struct in6_addr *addr, *mask;
+struct netdev_addr_dummy *addr_dummy;
 
 ovs_mutex_lock(>mutex);
-if (netdev->address.s_addr != INADDR_ANY) {
-cnt++;
-}
 
-if (ipv6_addr_is_set(>ipv6)) {
-cnt++;
-}
+cnt = ovs_list_size(>addrs);
 if (!cnt) {
 err = EADDRNOTAVAIL;
 goto out;
 }
 addr = xmalloc(sizeof *addr * cnt);
 mask = xmalloc(sizeof *mask * cnt);
-if (netdev->address.s_addr != INADDR_ANY) {
-in6_addr_set_mapped_ipv4([i], netdev->address.s_addr);
-in6_addr_set_mapped_ipv4([i], netdev->netmask.s_addr);
+
+LIST_FOR_EACH (addr_dummy, node, >addrs) {
+memcpy([i], _dummy->address, sizeof *addr);
+memcpy([i], _dummy->netmask, sizeof *mask);
 i++;
 }
 
-if (ipv6_addr_is_set(>ipv6)) {
-memcpy([i], >ipv6, sizeof *addr);
-memcpy([i], >ipv6_mask, sizeof *mask);
-i++;
-}
 if (paddr) {
 *paddr = addr;
 *pmask = mask;
@@ -844,14 +844,16 @@ out:
 }
 
 static int
-netdev_dummy_set_in4(struct netdev *netdev_, struct in_addr address,
+netdev_dummy_add_in4(struct netdev *netdev_, struct in_addr address,
  struct in_addr netmask)
 {
 struct netdev_dummy *netdev = netdev_dummy_cast(netdev_);
+struct netdev_addr_dummy *addr_dummy = xmalloc(sizeof *addr_dummy);
 
 ovs_mutex_lock(>mutex);
-netdev->address = address;
-netdev->netmask = netmask;
+in6_addr_set_mapped_ipv4(_dummy->address, address.s_addr);
+in6_addr_set_mapped_ipv4(_dummy->netmask, netmask.s_addr);
+ovs_list_push_back(>addrs, _dummy->node);
 netdev_change_seq_changed(netdev_);
 ovs_mutex_unlock(>mutex);
 
@@ -859,14 +861,16 @@ netdev_dummy_set_in4(struct netdev *netdev_, struct 
in_addr address,
 }
 
 static int
-netdev_dummy_set_in6(struct netdev *netdev_, struct in6_addr *in6,
+netdev_dummy_add_in6(struct netdev *netdev_, struct in6_addr *in6,
  struct in6_addr *mask)
 {
 struct netdev_dummy *netdev = netdev_dummy_cast(netdev_);
+struct netdev_addr_dummy *addr_dummy = xmalloc(sizeof *addr_dummy);
 
 ovs_mutex_lock(>mutex);
-netdev->ipv6 = *in6;
-netdev->ipv6_mask = *mask;
+addr_dummy->address = *in6;
+addr_dummy->netmask = *mask;
+ovs_list_push_back(>addrs, _dummy->node);
 netdev_change_seq_changed(netdev_);
 ovs_mutex_unlock(>mutex);
 
@@ -1178,7 +1182,10 @@ netdev_dummy_send(struct netdev *netdev, int qid,
 dummy_packet_conn_send(>conn, buffer, size);
 
 /* Reply to ARP requests for 'dev''s assigned IP address. */
-if (dev->address.s_addr) {
+struct netdev_addr_dummy *addr_dummy;
+LIST_FOR_EACH (addr_dummy, node, >addrs) {
+ovs_be32