162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *  SR-IPv6 implementation
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci *  Author:
662306a36Sopenharmony_ci *  David Lebrun <david.lebrun@uclouvain.be>
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#ifndef _NET_SEG6_HMAC_H
1062306a36Sopenharmony_ci#define _NET_SEG6_HMAC_H
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#include <net/flow.h>
1362306a36Sopenharmony_ci#include <net/ip6_fib.h>
1462306a36Sopenharmony_ci#include <net/sock.h>
1562306a36Sopenharmony_ci#include <linux/ip.h>
1662306a36Sopenharmony_ci#include <linux/ipv6.h>
1762306a36Sopenharmony_ci#include <linux/route.h>
1862306a36Sopenharmony_ci#include <net/seg6.h>
1962306a36Sopenharmony_ci#include <linux/seg6_hmac.h>
2062306a36Sopenharmony_ci#include <linux/rhashtable-types.h>
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci#define SEG6_HMAC_MAX_DIGESTSIZE	160
2362306a36Sopenharmony_ci#define SEG6_HMAC_RING_SIZE		256
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_cistruct seg6_hmac_info {
2662306a36Sopenharmony_ci	struct rhash_head node;
2762306a36Sopenharmony_ci	struct rcu_head rcu;
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci	u32 hmackeyid;
3062306a36Sopenharmony_ci	char secret[SEG6_HMAC_SECRET_LEN];
3162306a36Sopenharmony_ci	u8 slen;
3262306a36Sopenharmony_ci	u8 alg_id;
3362306a36Sopenharmony_ci};
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_cistruct seg6_hmac_algo {
3662306a36Sopenharmony_ci	u8 alg_id;
3762306a36Sopenharmony_ci	char name[64];
3862306a36Sopenharmony_ci	struct crypto_shash * __percpu *tfms;
3962306a36Sopenharmony_ci	struct shash_desc * __percpu *shashs;
4062306a36Sopenharmony_ci};
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ciextern int seg6_hmac_compute(struct seg6_hmac_info *hinfo,
4362306a36Sopenharmony_ci			     struct ipv6_sr_hdr *hdr, struct in6_addr *saddr,
4462306a36Sopenharmony_ci			     u8 *output);
4562306a36Sopenharmony_ciextern struct seg6_hmac_info *seg6_hmac_info_lookup(struct net *net, u32 key);
4662306a36Sopenharmony_ciextern int seg6_hmac_info_add(struct net *net, u32 key,
4762306a36Sopenharmony_ci			      struct seg6_hmac_info *hinfo);
4862306a36Sopenharmony_ciextern int seg6_hmac_info_del(struct net *net, u32 key);
4962306a36Sopenharmony_ciextern int seg6_push_hmac(struct net *net, struct in6_addr *saddr,
5062306a36Sopenharmony_ci			  struct ipv6_sr_hdr *srh);
5162306a36Sopenharmony_ciextern bool seg6_hmac_validate_skb(struct sk_buff *skb);
5262306a36Sopenharmony_ciextern int seg6_hmac_init(void);
5362306a36Sopenharmony_ciextern void seg6_hmac_exit(void);
5462306a36Sopenharmony_ciextern int seg6_hmac_net_init(struct net *net);
5562306a36Sopenharmony_ciextern void seg6_hmac_net_exit(struct net *net);
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci#endif
58