162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * CALIPSO - Common Architecture Label IPv6 Security Option
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * This is an implementation of the CALIPSO protocol as specified in
662306a36Sopenharmony_ci * RFC 5570.
762306a36Sopenharmony_ci *
862306a36Sopenharmony_ci * Authors: Paul Moore <paul@paul-moore.com>
962306a36Sopenharmony_ci *          Huw Davies <huw@codeweavers.com>
1062306a36Sopenharmony_ci */
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci/*
1362306a36Sopenharmony_ci * (c) Copyright Hewlett-Packard Development Company, L.P., 2006
1462306a36Sopenharmony_ci * (c) Copyright Huw Davies <huw@codeweavers.com>, 2015
1562306a36Sopenharmony_ci */
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#ifndef _CALIPSO_H
1862306a36Sopenharmony_ci#define _CALIPSO_H
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#include <linux/types.h>
2162306a36Sopenharmony_ci#include <linux/rcupdate.h>
2262306a36Sopenharmony_ci#include <linux/list.h>
2362306a36Sopenharmony_ci#include <linux/net.h>
2462306a36Sopenharmony_ci#include <linux/skbuff.h>
2562306a36Sopenharmony_ci#include <net/netlabel.h>
2662306a36Sopenharmony_ci#include <net/request_sock.h>
2762306a36Sopenharmony_ci#include <linux/refcount.h>
2862306a36Sopenharmony_ci#include <asm/unaligned.h>
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci/* known doi values */
3162306a36Sopenharmony_ci#define CALIPSO_DOI_UNKNOWN          0x00000000
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci/* doi mapping types */
3462306a36Sopenharmony_ci#define CALIPSO_MAP_UNKNOWN          0
3562306a36Sopenharmony_ci#define CALIPSO_MAP_PASS             2
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci/*
3862306a36Sopenharmony_ci * CALIPSO DOI definitions
3962306a36Sopenharmony_ci */
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci/* DOI definition struct */
4262306a36Sopenharmony_cistruct calipso_doi {
4362306a36Sopenharmony_ci	u32 doi;
4462306a36Sopenharmony_ci	u32 type;
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci	refcount_t refcount;
4762306a36Sopenharmony_ci	struct list_head list;
4862306a36Sopenharmony_ci	struct rcu_head rcu;
4962306a36Sopenharmony_ci};
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci/*
5262306a36Sopenharmony_ci * Sysctl Variables
5362306a36Sopenharmony_ci */
5462306a36Sopenharmony_ciextern int calipso_cache_enabled;
5562306a36Sopenharmony_ciextern int calipso_cache_bucketsize;
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci#ifdef CONFIG_NETLABEL
5862306a36Sopenharmony_ciint __init calipso_init(void);
5962306a36Sopenharmony_civoid calipso_exit(void);
6062306a36Sopenharmony_cibool calipso_validate(const struct sk_buff *skb, const unsigned char *option);
6162306a36Sopenharmony_ci#else
6262306a36Sopenharmony_cistatic inline int __init calipso_init(void)
6362306a36Sopenharmony_ci{
6462306a36Sopenharmony_ci	return 0;
6562306a36Sopenharmony_ci}
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_cistatic inline void calipso_exit(void)
6862306a36Sopenharmony_ci{
6962306a36Sopenharmony_ci}
7062306a36Sopenharmony_cistatic inline bool calipso_validate(const struct sk_buff *skb,
7162306a36Sopenharmony_ci				    const unsigned char *option)
7262306a36Sopenharmony_ci{
7362306a36Sopenharmony_ci	return true;
7462306a36Sopenharmony_ci}
7562306a36Sopenharmony_ci#endif /* CONFIG_NETLABEL */
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci#endif /* _CALIPSO_H */
78