linux/net/ipv6/ila/ila.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-or-later */
   2/*
   3 * Copyright (c) 2015 Tom Herbert <tom@herbertland.com>
   4 */
   5
   6#ifndef __ILA_H
   7#define __ILA_H
   8
   9#include <linux/errno.h>
  10#include <linux/ip.h>
  11#include <linux/kernel.h>
  12#include <linux/module.h>
  13#include <linux/socket.h>
  14#include <linux/skbuff.h>
  15#include <linux/types.h>
  16#include <net/checksum.h>
  17#include <net/genetlink.h>
  18#include <net/ip.h>
  19#include <net/protocol.h>
  20#include <uapi/linux/ila.h>
  21
  22struct ila_locator {
  23        union {
  24                __u8            v8[8];
  25                __be16          v16[4];
  26                __be32          v32[2];
  27                __be64          v64;
  28        };
  29};
  30
  31struct ila_identifier {
  32        union {
  33                struct {
  34#if defined(__LITTLE_ENDIAN_BITFIELD)
  35                        u8 __space:4;
  36                        u8 csum_neutral:1;
  37                        u8 type:3;
  38#elif defined(__BIG_ENDIAN_BITFIELD)
  39                        u8 type:3;
  40                        u8 csum_neutral:1;
  41                        u8 __space:4;
  42#else
  43#error  "Adjust your <asm/byteorder.h> defines"
  44#endif
  45                        u8 __space2[7];
  46                };
  47                __u8            v8[8];
  48                __be16          v16[4];
  49                __be32          v32[2];
  50                __be64          v64;
  51        };
  52};
  53
  54#define CSUM_NEUTRAL_FLAG       htonl(0x10000000)
  55
  56struct ila_addr {
  57        union {
  58                struct in6_addr addr;
  59                struct {
  60                        struct ila_locator loc;
  61                        struct ila_identifier ident;
  62                };
  63        };
  64};
  65
  66static inline struct ila_addr *ila_a2i(struct in6_addr *addr)
  67{
  68        return (struct ila_addr *)addr;
  69}
  70
  71static inline bool ila_addr_is_ila(struct ila_addr *iaddr)
  72{
  73        return (iaddr->ident.type != ILA_ATYPE_IID);
  74}
  75
  76struct ila_params {
  77        struct ila_locator locator;
  78        struct ila_locator locator_match;
  79        __wsum csum_diff;
  80        u8 csum_mode;
  81        u8 ident_type;
  82};
  83
  84static inline __wsum compute_csum_diff8(const __be32 *from, const __be32 *to)
  85{
  86        __be32 diff[] = {
  87                ~from[0], ~from[1], to[0], to[1],
  88        };
  89
  90        return csum_partial(diff, sizeof(diff), 0);
  91}
  92
  93static inline bool ila_csum_neutral_set(struct ila_identifier ident)
  94{
  95        return !!(ident.csum_neutral);
  96}
  97
  98void ila_update_ipv6_locator(struct sk_buff *skb, struct ila_params *p,
  99                             bool set_csum_neutral);
 100
 101void ila_init_saved_csum(struct ila_params *p);
 102
 103struct ila_net {
 104        struct {
 105                struct rhashtable rhash_table;
 106                spinlock_t *locks; /* Bucket locks for entry manipulation */
 107                unsigned int locks_mask;
 108                bool hooks_registered;
 109        } xlat;
 110};
 111
 112int ila_lwt_init(void);
 113void ila_lwt_fini(void);
 114
 115int ila_xlat_init_net(struct net *net);
 116void ila_xlat_exit_net(struct net *net);
 117
 118int ila_xlat_nl_cmd_add_mapping(struct sk_buff *skb, struct genl_info *info);
 119int ila_xlat_nl_cmd_del_mapping(struct sk_buff *skb, struct genl_info *info);
 120int ila_xlat_nl_cmd_get_mapping(struct sk_buff *skb, struct genl_info *info);
 121int ila_xlat_nl_cmd_flush(struct sk_buff *skb, struct genl_info *info);
 122int ila_xlat_nl_dump_start(struct netlink_callback *cb);
 123int ila_xlat_nl_dump_done(struct netlink_callback *cb);
 124int ila_xlat_nl_dump(struct sk_buff *skb, struct netlink_callback *cb);
 125
 126extern unsigned int ila_net_id;
 127
 128extern struct genl_family ila_nl_family;
 129
 130#endif /* __ILA_H */
 131