[PATCH 1/3] route/link: Add link info compare operation

roopa roopa at cumulusnetworks.com
Sun Nov 1 16:42:35 PST 2015


looks good. thanks!


On 10/30/15, 3:08 PM, David Ahern wrote:
> Signed-off-by: Balki Raman <ramanb at cumulusnetworks.com>
> Signed-off-by: David Ahern <dsa at cumulusnetworks.com>
> ---
>  include/netlink-private/route/link/api.h |  6 ++++++
>  lib/route/link.c                         |  1 +
>  lib/route/link/api.c                     | 22 ++++++++++++++++++++++
>  3 files changed, 29 insertions(+)
>
> diff --git a/include/netlink-private/route/link/api.h b/include/netlink-private/route/link/api.h
> index bb98cccb080f..85f83f39539d 100644
> --- a/include/netlink-private/route/link/api.h
> +++ b/include/netlink-private/route/link/api.h
> @@ -60,6 +60,10 @@ struct rtnl_link_info_ops
>  	 * in either io_alloc() or io_parse(). */
>  	void	      (*io_free)(struct rtnl_link *);
>  
> +	/** Called to compare link info parameters between two links. */
> +	int	      (*io_compare)(struct rtnl_link *, struct rtnl_link *,
> +				    uint32_t attrs, int flags);
> +
>  	struct nl_list_head		io_list;
>  };
>  
> @@ -145,6 +149,8 @@ extern int			rtnl_link_af_unregister(struct rtnl_link_af_ops *);
>  extern int			rtnl_link_af_data_compare(struct rtnl_link *a,
>  							  struct rtnl_link *b,
>  							  int family);
> +extern int			rtnl_link_info_data_compare(struct rtnl_link *a,
> +							    struct rtnl_link *b);
>  
>  #ifdef __cplusplus
>  }
> diff --git a/lib/route/link.c b/lib/route/link.c
> index 5c3255022dff..c61965b5df8a 100644
> --- a/lib/route/link.c
> +++ b/lib/route/link.c
> @@ -949,6 +949,7 @@ static int link_compare(struct nl_object *_a, struct nl_object *_b,
>  			goto protinfo_mismatch;
>  	}
>  
> +	diff |= LINK_DIFF(LINKINFO, rtnl_link_info_data_compare(a, b) != 0);
>  out:
>  	return diff;
>  
> diff --git a/lib/route/link/api.c b/lib/route/link/api.c
> index 6d1e12f88b21..00893ad051b1 100644
> --- a/lib/route/link/api.c
> +++ b/lib/route/link/api.c
> @@ -391,6 +391,28 @@ int rtnl_link_af_data_compare(struct rtnl_link *a, struct rtnl_link *b,
>  	return ret;
>  }
>  
> +/**
> + * Compare link info data
> + * @arg a              Link object a
> + * @arg b              Link object b
> + *
> + * This function will compare link_info data between two links
> + * a and b
> + *
> + * @return 0 if link_info data matches or is not present
> + * or != 0 if it mismatches.
> + */
> +int rtnl_link_info_data_compare(struct rtnl_link *a, struct rtnl_link *b)
> +{
> +	if (a->l_info_ops != b->l_info_ops)
> +		return ~0;
> +
> +	if (!a->l_info_ops || !a->l_info_ops->io_compare)
> +		return 0;
> +
> +	return a->l_info_ops->io_compare(a, b, ~0, 0);
> +}
> +
>  /** @} */
>  
>  /** @} */




More information about the libnl mailing list