linux/net/tipc/addr.h
<<
>>
Prefs
   1/*
   2 * net/tipc/addr.h: Include file for TIPC address utility routines
   3 *
   4 * Copyright (c) 2000-2006, 2018, Ericsson AB
   5 * Copyright (c) 2004-2005, Wind River Systems
   6 * Copyright (c) 2020-2021, Red Hat Inc
   7 * All rights reserved.
   8 *
   9 * Redistribution and use in source and binary forms, with or without
  10 * modification, are permitted provided that the following conditions are met:
  11 *
  12 * 1. Redistributions of source code must retain the above copyright
  13 *    notice, this list of conditions and the following disclaimer.
  14 * 2. Redistributions in binary form must reproduce the above copyright
  15 *    notice, this list of conditions and the following disclaimer in the
  16 *    documentation and/or other materials provided with the distribution.
  17 * 3. Neither the names of the copyright holders nor the names of its
  18 *    contributors may be used to endorse or promote products derived from
  19 *    this software without specific prior written permission.
  20 *
  21 * Alternatively, this software may be distributed under the terms of the
  22 * GNU General Public License ("GPL") version 2 as published by the Free
  23 * Software Foundation.
  24 *
  25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  26 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  28 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  29 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  30 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  31 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  32 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  33 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  34 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  35 * POSSIBILITY OF SUCH DAMAGE.
  36 */
  37
  38#ifndef _TIPC_ADDR_H
  39#define _TIPC_ADDR_H
  40
  41#include <linux/types.h>
  42#include <linux/tipc.h>
  43#include <net/net_namespace.h>
  44#include <net/netns/generic.h>
  45#include "core.h"
  46
  47/* Struct tipc_uaddr: internal version of struct sockaddr_tipc.
  48 * Must be kept aligned both regarding field positions and size.
  49 */
  50struct tipc_uaddr {
  51        unsigned short family;
  52        unsigned char addrtype;
  53        signed char scope;
  54        union {
  55                struct {
  56                        struct tipc_service_addr sa;
  57                        u32 lookup_node;
  58                };
  59                struct tipc_service_range sr;
  60                struct tipc_socket_addr sk;
  61        };
  62};
  63
  64static inline void tipc_uaddr(struct tipc_uaddr *ua, u32 atype, u32 scope,
  65                              u32 type, u32 lower, u32 upper)
  66{
  67        ua->family = AF_TIPC;
  68        ua->addrtype = atype;
  69        ua->scope = scope;
  70        ua->sr.type = type;
  71        ua->sr.lower = lower;
  72        ua->sr.upper = upper;
  73}
  74
  75static inline bool tipc_uaddr_valid(struct tipc_uaddr *ua, int len)
  76{
  77        u32 atype;
  78
  79        if (len < sizeof(struct sockaddr_tipc))
  80                return false;
  81        atype = ua->addrtype;
  82        if (ua->family != AF_TIPC)
  83                return false;
  84        if (atype == TIPC_SERVICE_ADDR || atype == TIPC_SOCKET_ADDR)
  85                return true;
  86        if (atype == TIPC_SERVICE_RANGE)
  87                return ua->sr.upper >= ua->sr.lower;
  88        return false;
  89}
  90
  91static inline u32 tipc_own_addr(struct net *net)
  92{
  93        return tipc_net(net)->node_addr;
  94}
  95
  96static inline u8 *tipc_own_id(struct net *net)
  97{
  98        struct tipc_net *tn = tipc_net(net);
  99
 100        if (!strlen(tn->node_id_string))
 101                return NULL;
 102        return tn->node_id;
 103}
 104
 105static inline char *tipc_own_id_string(struct net *net)
 106{
 107        return tipc_net(net)->node_id_string;
 108}
 109
 110static inline u32 tipc_cluster_mask(u32 addr)
 111{
 112        return addr & TIPC_ZONE_CLUSTER_MASK;
 113}
 114
 115static inline int tipc_node2scope(u32 node)
 116{
 117        return node ? TIPC_NODE_SCOPE : TIPC_CLUSTER_SCOPE;
 118}
 119
 120static inline int tipc_scope2node(struct net *net, int sc)
 121{
 122        return sc != TIPC_NODE_SCOPE ? 0 : tipc_own_addr(net);
 123}
 124
 125static inline int in_own_node(struct net *net, u32 addr)
 126{
 127        return addr == tipc_own_addr(net) || !addr;
 128}
 129
 130bool tipc_in_scope(bool legacy_format, u32 domain, u32 addr);
 131void tipc_set_node_id(struct net *net, u8 *id);
 132void tipc_set_node_addr(struct net *net, u32 addr);
 133char *tipc_nodeid2string(char *str, u8 *id);
 134u32 tipc_node_id2hash(u8 *id128);
 135
 136#endif
 137