diff options
| author | Dmitry Torokhov <[email protected]> | 2023-08-30 16:06:38 -0700 | 
|---|---|---|
| committer | Dmitry Torokhov <[email protected]> | 2023-08-30 16:06:38 -0700 | 
| commit | 1ac731c529cd4d6adbce134754b51ff7d822b145 (patch) | |
| tree | 143ab3f35ca5f3b69f583c84e6964b17139c2ec1 /drivers/net/vxlan/vxlan_private.h | |
| parent | 07b4c950f27bef0362dc6ad7ee713aab61d58149 (diff) | |
| parent | 54116d442e001e1b6bd482122043b1870998a1f3 (diff) | |
Merge branch 'next' into for-linus
Prepare input updates for 6.6 merge window.
Diffstat (limited to 'drivers/net/vxlan/vxlan_private.h')
| -rw-r--r-- | drivers/net/vxlan/vxlan_private.h | 84 | 
1 files changed, 84 insertions, 0 deletions
diff --git a/drivers/net/vxlan/vxlan_private.h b/drivers/net/vxlan/vxlan_private.h index 599c3b4fdd5e..817fa3075842 100644 --- a/drivers/net/vxlan/vxlan_private.h +++ b/drivers/net/vxlan/vxlan_private.h @@ -85,6 +85,39 @@ bool vxlan_addr_equal(const union vxlan_addr *a, const union vxlan_addr *b)  		return a->sin.sin_addr.s_addr == b->sin.sin_addr.s_addr;  } +static inline int vxlan_nla_get_addr(union vxlan_addr *ip, +				     const struct nlattr *nla) +{ +	if (nla_len(nla) >= sizeof(struct in6_addr)) { +		ip->sin6.sin6_addr = nla_get_in6_addr(nla); +		ip->sa.sa_family = AF_INET6; +		return 0; +	} else if (nla_len(nla) >= sizeof(__be32)) { +		ip->sin.sin_addr.s_addr = nla_get_in_addr(nla); +		ip->sa.sa_family = AF_INET; +		return 0; +	} else { +		return -EAFNOSUPPORT; +	} +} + +static inline int vxlan_nla_put_addr(struct sk_buff *skb, int attr, +				     const union vxlan_addr *ip) +{ +	if (ip->sa.sa_family == AF_INET6) +		return nla_put_in6_addr(skb, attr, &ip->sin6.sin6_addr); +	else +		return nla_put_in_addr(skb, attr, ip->sin.sin_addr.s_addr); +} + +static inline bool vxlan_addr_is_multicast(const union vxlan_addr *ip) +{ +	if (ip->sa.sa_family == AF_INET6) +		return ipv6_addr_is_multicast(&ip->sin6.sin6_addr); +	else +		return ipv4_is_multicast(ip->sin.sin_addr.s_addr); +} +  #else /* !CONFIG_IPV6 */  static inline @@ -93,8 +126,41 @@ bool vxlan_addr_equal(const union vxlan_addr *a, const union vxlan_addr *b)  	return a->sin.sin_addr.s_addr == b->sin.sin_addr.s_addr;  } +static inline int vxlan_nla_get_addr(union vxlan_addr *ip, +				     const struct nlattr *nla) +{ +	if (nla_len(nla) >= sizeof(struct in6_addr)) { +		return -EAFNOSUPPORT; +	} else if (nla_len(nla) >= sizeof(__be32)) { +		ip->sin.sin_addr.s_addr = nla_get_in_addr(nla); +		ip->sa.sa_family = AF_INET; +		return 0; +	} else { +		return -EAFNOSUPPORT; +	} +} + +static inline int vxlan_nla_put_addr(struct sk_buff *skb, int attr, +				     const union vxlan_addr *ip) +{ +	return nla_put_in_addr(skb, attr, ip->sin.sin_addr.s_addr); +} + +static inline bool vxlan_addr_is_multicast(const union vxlan_addr *ip) +{ +	return ipv4_is_multicast(ip->sin.sin_addr.s_addr); +} +  #endif +static inline size_t vxlan_addr_size(const union vxlan_addr *ip) +{ +	if (ip->sa.sa_family == AF_INET6) +		return sizeof(struct in6_addr); +	else +		return sizeof(__be32); +} +  static inline struct vxlan_vni_node *  vxlan_vnifilter_lookup(struct vxlan_dev *vxlan, __be32 vni)  { @@ -127,6 +193,8 @@ int vxlan_fdb_update(struct vxlan_dev *vxlan,  		     __be16 port, __be32 src_vni, __be32 vni,  		     __u32 ifindex, __u16 ndm_flags, u32 nhid,  		     bool swdev_notify, struct netlink_ext_ack *extack); +void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev, +		    __be32 default_vni, struct vxlan_rdst *rdst, bool did_rsc);  int vxlan_vni_in_use(struct net *src_net, struct vxlan_dev *vxlan,  		     struct vxlan_config *conf, __be32 vni); @@ -159,4 +227,20 @@ int vxlan_igmp_join(struct vxlan_dev *vxlan, union vxlan_addr *rip,  		    int rifindex);  int vxlan_igmp_leave(struct vxlan_dev *vxlan, union vxlan_addr *rip,  		     int rifindex); + +/* vxlan_mdb.c */ +int vxlan_mdb_dump(struct net_device *dev, struct sk_buff *skb, +		   struct netlink_callback *cb); +int vxlan_mdb_add(struct net_device *dev, struct nlattr *tb[], u16 nlmsg_flags, +		  struct netlink_ext_ack *extack); +int vxlan_mdb_del(struct net_device *dev, struct nlattr *tb[], +		  struct netlink_ext_ack *extack); +struct vxlan_mdb_entry *vxlan_mdb_entry_skb_get(struct vxlan_dev *vxlan, +						struct sk_buff *skb, +						__be32 src_vni); +netdev_tx_t vxlan_mdb_xmit(struct vxlan_dev *vxlan, +			   const struct vxlan_mdb_entry *mdb_entry, +			   struct sk_buff *skb); +int vxlan_mdb_init(struct vxlan_dev *vxlan); +void vxlan_mdb_fini(struct vxlan_dev *vxlan);  #endif  |