cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

peer.h (2249B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2/*
      3 * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
      4 */
      5
      6#ifndef _WG_PEER_H
      7#define _WG_PEER_H
      8
      9#include "device.h"
     10#include "noise.h"
     11#include "cookie.h"
     12
     13#include <linux/types.h>
     14#include <linux/netfilter.h>
     15#include <linux/spinlock.h>
     16#include <linux/kref.h>
     17#include <net/dst_cache.h>
     18
     19struct wg_device;
     20
     21struct endpoint {
     22	union {
     23		struct sockaddr addr;
     24		struct sockaddr_in addr4;
     25		struct sockaddr_in6 addr6;
     26	};
     27	union {
     28		struct {
     29			struct in_addr src4;
     30			/* Essentially the same as addr6->scope_id */
     31			int src_if4;
     32		};
     33		struct in6_addr src6;
     34	};
     35};
     36
     37struct wg_peer {
     38	struct wg_device *device;
     39	struct prev_queue tx_queue, rx_queue;
     40	struct sk_buff_head staged_packet_queue;
     41	int serial_work_cpu;
     42	bool is_dead;
     43	struct noise_keypairs keypairs;
     44	struct endpoint endpoint;
     45	struct dst_cache endpoint_cache;
     46	rwlock_t endpoint_lock;
     47	struct noise_handshake handshake;
     48	atomic64_t last_sent_handshake;
     49	struct work_struct transmit_handshake_work, clear_peer_work, transmit_packet_work;
     50	struct cookie latest_cookie;
     51	struct hlist_node pubkey_hash;
     52	u64 rx_bytes, tx_bytes;
     53	struct timer_list timer_retransmit_handshake, timer_send_keepalive;
     54	struct timer_list timer_new_handshake, timer_zero_key_material;
     55	struct timer_list timer_persistent_keepalive;
     56	unsigned int timer_handshake_attempts;
     57	u16 persistent_keepalive_interval;
     58	bool timer_need_another_keepalive;
     59	bool sent_lastminute_handshake;
     60	struct timespec64 walltime_last_handshake;
     61	struct kref refcount;
     62	struct rcu_head rcu;
     63	struct list_head peer_list;
     64	struct list_head allowedips_list;
     65	struct napi_struct napi;
     66	u64 internal_id;
     67};
     68
     69struct wg_peer *wg_peer_create(struct wg_device *wg,
     70			       const u8 public_key[NOISE_PUBLIC_KEY_LEN],
     71			       const u8 preshared_key[NOISE_SYMMETRIC_KEY_LEN]);
     72
     73struct wg_peer *__must_check wg_peer_get_maybe_zero(struct wg_peer *peer);
     74static inline struct wg_peer *wg_peer_get(struct wg_peer *peer)
     75{
     76	kref_get(&peer->refcount);
     77	return peer;
     78}
     79void wg_peer_put(struct wg_peer *peer);
     80void wg_peer_remove(struct wg_peer *peer);
     81void wg_peer_remove_all(struct wg_device *wg);
     82
     83int wg_peer_init(void);
     84void wg_peer_uninit(void);
     85
     86#endif /* _WG_PEER_H */