Looks ok to me. Will this be accessible via ovs-vsctl?
If so, hsflowd will be able to tell ovs to use the same agent-address
as the one it already settled on. Instead of just specifying the
device and hoping it works out:
https://github.com/sflow/host-sflow/blob/v2.0.15/src/Linux/mod_ovs.c#L258
So that's another use-case for this new option.
On Fri, Apr 13, 2018 at 10:26 AM, Ben Pfaff wrote:
> Suggested-by: Neil McKee
> Signed-off-by: Ben Pfaff
> ---
> ofproto/ofproto-dpif-sflow.c | 55
> ++--
> 1 file changed, 33 insertions(+), 22 deletions(-)
>
> diff --git a/ofproto/ofproto-dpif-sflow.c b/ofproto/ofproto-dpif-sflow.c
> index 5d8c0e19f8e3..fe79a9dbbad6 100644
> --- a/ofproto/ofproto-dpif-sflow.c
> +++ b/ofproto/ofproto-dpif-sflow.c
> @@ -446,43 +446,45 @@ sflow_choose_agent_address(const char *agent_device,
> const char *control_ip,
> SFLAddress *agent_addr)
> {
> -const char *target;
> -struct in_addr in4;
> -
> -memset(agent_addr, 0, sizeof *agent_addr);
> -agent_addr->type = SFLADDRESSTYPE_IP_V4;
> +struct in6_addr ip;
>
> if (agent_device) {
> -if (!netdev_get_in4_by_name(agent_device, &in4)
> -|| !lookup_ip(agent_device, &in4)) {
> +/* If 'agent_device' is the name of a network device, use its IP
> + * address. */
> +if (!netdev_get_ip_by_name(agent_device, &ip)) {
> +goto success;
> +}
> +
> +/* If 'agent_device' is itself an IP address, use it. */
> +struct sockaddr_storage ss;
> +if (inet_parse_address(agent_device, &ss)) {
> +ip = ss_get_address(&ss);
> goto success;
> }
> }
>
> +/* Otherwise, use an appropriate local IP address for one of the
> + * collectors' remote IP addresses. */
> +const char *target;
> SSET_FOR_EACH (target, targets) {
> -union {
> -struct sockaddr_storage ss;
> -struct sockaddr_in sin;
> -} sa;
> -char name[IFNAMSIZ];
> -
> -if (inet_parse_active(target, SFL_DEFAULT_COLLECTOR_PORT, &sa.ss)
> -&& sa.ss.ss_family == AF_INET) {
> -struct in6_addr addr6, src, gw;
> -
> -in6_addr_set_mapped_ipv4(&addr6, sa.sin.sin_addr.s_addr);
> +struct sockaddr_storage ss;
> +if (inet_parse_active(target, SFL_DEFAULT_COLLECTOR_PORT, &ss)) {
> /* sFlow only supports target in default routing table with
> * packet mark zero.
> */
> -if (ovs_router_lookup(0, &addr6, name, &src, &gw)) {
> +ip = ss_get_address(&ss);
>
> -in4.s_addr = in6_addr_get_mapped_ipv4(&src);
> +struct in6_addr src, gw;
> +char name[IFNAMSIZ];
> +if (ovs_router_lookup(0, &ip, name, &src, &gw)) {
> goto success;
> }
> }
> }
>
> -if (control_ip && !lookup_ip(control_ip, &in4)) {
> +struct sockaddr_storage ss;
> +if (control_ip && inet_parse_address(control_ip, &ss)) {
> +ip = ss_get_address(&ss);
> goto success;
> }
>
> @@ -490,7 +492,16 @@ sflow_choose_agent_address(const char *agent_device,
> return false;
>
> success:
> -agent_addr->address.ip_v4.addr = (OVS_FORCE uint32_t) in4.s_addr;
> +memset(agent_addr, 0, sizeof *agent_addr);
> +if (IN6_IS_ADDR_V4MAPPED(&ip)) {
> +agent_addr->type = SFLADDRESSTYPE_IP_V4;
> +agent_addr->address.ip_v4.addr
> += (OVS_FORCE uint32_t) in6_addr_get_mapped_ipv4(&ip);
> +} else {
> +agent_addr->type = SFLADDRESSTYPE_IP_V6;
> +memcpy(agent_addr->address.ip_v6.addr, ip.s6_addr,
> + sizeof agent_addr->address.ip_v6.addr);
> +}
> return true;
> }
>
> --
> 2.16.1
>
___
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev