1 1.9 joerg /* $NetBSD: ldp_peer.h,v 1.9 2020/04/22 23:53:27 joerg Exp $ */ 2 1.1 kefren 3 1.1 kefren /*- 4 1.1 kefren * Copyright (c) 2010 The NetBSD Foundation, Inc. 5 1.1 kefren * All rights reserved. 6 1.1 kefren * 7 1.1 kefren * This code is derived from software contributed to The NetBSD Foundation 8 1.1 kefren * by Mihai Chelaru <kefren (at) NetBSD.org> 9 1.1 kefren * 10 1.1 kefren * Redistribution and use in source and binary forms, with or without 11 1.1 kefren * modification, are permitted provided that the following conditions 12 1.1 kefren * are met: 13 1.1 kefren * 1. Redistributions of source code must retain the above copyright 14 1.1 kefren * notice, this list of conditions and the following disclaimer. 15 1.1 kefren * 2. Redistributions in binary form must reproduce the above copyright 16 1.1 kefren * notice, this list of conditions and the following disclaimer in the 17 1.1 kefren * documentation and/or other materials provided with the distribution. 18 1.1 kefren * 19 1.1 kefren * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.1 kefren * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.1 kefren * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.1 kefren * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.1 kefren * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.1 kefren * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.1 kefren * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.1 kefren * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.1 kefren * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.1 kefren * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.1 kefren * POSSIBILITY OF SUCH DAMAGE. 30 1.1 kefren */ 31 1.1 kefren 32 1.1 kefren #ifndef _LDP_PEER_H_ 33 1.1 kefren #define _LDP_PEER_H_ 34 1.1 kefren 35 1.1 kefren #include "sys/types.h" 36 1.8 kefren #include "sys/rbtree.h" 37 1.1 kefren #include "sys/queue.h" 38 1.1 kefren #include "netinet/in.h" 39 1.1 kefren 40 1.3 kefren #include "mpls_routes.h" 41 1.1 kefren #include "tlv.h" 42 1.1 kefren 43 1.1 kefren struct ldp_peer_address { 44 1.3 kefren union sockunion address; 45 1.1 kefren SLIST_ENTRY(ldp_peer_address) addresses; 46 1.1 kefren }; 47 1.1 kefren 48 1.1 kefren struct label_mapping { 49 1.3 kefren union sockunion address; 50 1.3 kefren uint prefix; 51 1.3 kefren uint label; 52 1.8 kefren rb_node_t mappings_node; 53 1.1 kefren }; 54 1.1 kefren 55 1.1 kefren struct ldp_peer { 56 1.1 kefren /* 57 1.1 kefren * I add routes to address. 58 1.1 kefren * I maintain LDP TCP connection on transport_address. 59 1.1 kefren * I use ldp_id as peer identificator. 60 1.1 kefren */ 61 1.3 kefren struct sockaddr *address, *transport_address; 62 1.3 kefren /* According to draft-ietf-mpls-ldp-ipv6-07 ID is IPv4 only for now */ 63 1.3 kefren struct in_addr ldp_id; 64 1.1 kefren /* TCP socket */ 65 1.1 kefren int socket; 66 1.3 kefren /* Rest of the peer parameters */ 67 1.1 kefren uint16_t holdtime, timeout; 68 1.1 kefren int master; /* 0 if we're passive */ 69 1.1 kefren int state; /* see below for possible states */ 70 1.3 kefren time_t established_t; /* time when it did connect */ 71 1.1 kefren /* Here I maintain all the addresses announced by a peer */ 72 1.1 kefren SLIST_HEAD(,ldp_peer_address) ldp_peer_address_head; 73 1.8 kefren rb_tree_t label_mapping_tree; 74 1.1 kefren 75 1.1 kefren SLIST_ENTRY(ldp_peer) peers; 76 1.1 kefren }; 77 1.9 joerg extern SLIST_HEAD(ldp_peer_head,ldp_peer) ldp_peer_head; 78 1.1 kefren 79 1.1 kefren struct peer_map { 80 1.1 kefren struct ldp_peer *peer; 81 1.1 kefren struct label_mapping *lm; 82 1.1 kefren }; 83 1.1 kefren 84 1.1 kefren /* LDP Peers States */ 85 1.1 kefren #define LDP_PEER_CONNECTING 0 86 1.1 kefren #define LDP_PEER_CONNECTED 1 87 1.1 kefren #define LDP_PEER_ESTABLISHED 2 88 1.1 kefren #define LDP_PEER_HOLDDOWN 3 89 1.1 kefren 90 1.4 kefren int sockaddr_cmp(const struct sockaddr *, const struct sockaddr *); 91 1.1 kefren void ldp_peer_init(void); 92 1.5 kefren struct ldp_peer * ldp_peer_new(const struct in_addr *, const struct sockaddr *, 93 1.5 kefren const struct sockaddr *, uint16_t, int); 94 1.1 kefren void ldp_peer_holddown(struct ldp_peer *); 95 1.1 kefren void ldp_peer_delete(struct ldp_peer *); 96 1.3 kefren struct ldp_peer * get_ldp_peer(const struct sockaddr *); 97 1.3 kefren struct ldp_peer * get_ldp_peer_by_id(const struct in_addr *); 98 1.3 kefren struct ldp_peer * get_ldp_peer_by_socket(int); 99 1.5 kefren int add_ifaddresses(struct ldp_peer *, const struct al_tlv *); 100 1.5 kefren int add_ifaddr(struct ldp_peer *, const struct sockaddr *); 101 1.5 kefren int del_ifaddr(struct ldp_peer *, const struct sockaddr *); 102 1.5 kefren struct ldp_peer_address * check_ifaddr(const struct ldp_peer *, 103 1.3 kefren const struct sockaddr *); 104 1.5 kefren void print_bounded_addresses(const struct ldp_peer *); 105 1.3 kefren void del_all_ifaddr(struct ldp_peer *); 106 1.5 kefren int del_ifaddresses(struct ldp_peer *, const struct al_tlv *); 107 1.3 kefren 108 1.5 kefren int ldp_peer_add_mapping(struct ldp_peer *, const struct sockaddr *, int, int); 109 1.5 kefren int ldp_peer_delete_mapping(struct ldp_peer *, const struct sockaddr *, int); 110 1.7 kefren void ldp_peer_delete_all_mappings(struct ldp_peer *); 111 1.3 kefren void ldp_peer_holddown_all(void); 112 1.1 kefren 113 1.5 kefren struct peer_map * ldp_test_mapping(const struct sockaddr *, int, 114 1.5 kefren const struct sockaddr *); 115 1.8 kefren struct label_mapping * ldp_peer_lm_right(struct ldp_peer *, 116 1.8 kefren struct label_mapping *); 117 1.1 kefren 118 1.5 kefren const char * ldp_state_to_name(int); 119 1.1 kefren 120 1.1 kefren #endif /* !_LDP_PEER_H_ */ 121