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