]> git.proxmox.com Git - mirror_frr.git/blame - bgpd/rfapi/rfapi_descriptor_rfp_utils.c
Merge pull request #12798 from donaldsharp/rib_match_multicast
[mirror_frr.git] / bgpd / rfapi / rfapi_descriptor_rfp_utils.c
CommitLineData
acddc0ed 1// SPDX-License-Identifier: GPL-2.0-or-later
d62a17ae 2/*
65efcfce
LB
3 *
4 * Copyright 2009-2016, LabN Consulting, L.L.C.
5 *
65efcfce
LB
6 */
7
f8b6f499
LB
8#include "lib/zebra.h"
9#include "lib/prefix.h"
10#include "lib/table.h"
11#include "lib/vty.h"
12#include "lib/memory.h"
13#include "lib/log.h"
14
15#include "bgpd/bgpd.h"
16
17#include "bgpd/rfapi/rfapi.h"
18#include "bgpd/rfapi/rfapi_private.h"
19#include "bgpd/rfapi/rfapi_descriptor_rfp_utils.h"
a3b55c25 20#include "bgpd/rfapi/vnc_debug.h"
65efcfce
LB
21
22
d62a17ae 23void *rfapi_create_generic(struct rfapi_ip_addr *vn, struct rfapi_ip_addr *un)
65efcfce 24{
d62a17ae 25 struct rfapi_descriptor *rfd;
26 rfd = XCALLOC(MTYPE_RFAPI_DESC, sizeof(struct rfapi_descriptor));
27 vnc_zlog_debug_verbose("%s: rfd=%p", __func__, rfd);
28 rfd->vn_addr = *vn;
29 rfd->un_addr = *un;
30 return (void *)rfd;
65efcfce
LB
31}
32
33/*------------------------------------------
34 * rfapi_free_generic
35 *
36 * Compare two generic rfapi descriptors.
37 *
d62a17ae 38 * input:
65efcfce
LB
39 * grfd: rfapi descriptor returned by rfapi_open or rfapi_create_generic
40 *
41 * output:
42 *
d62a17ae 43 * return value:
65efcfce
LB
44 *
45 *------------------------------------------*/
d62a17ae 46void rfapi_free_generic(void *grfd)
65efcfce 47{
d62a17ae 48 struct rfapi_descriptor *rfd;
49 rfd = (struct rfapi_descriptor *)grfd;
50 XFREE(MTYPE_RFAPI_DESC, rfd);
65efcfce
LB
51}
52
53
54/*------------------------------------------
55 * rfapi_compare_rfds
56 *
57 * Compare two generic rfapi descriptors.
58 *
d62a17ae 59 * input:
65efcfce
LB
60 * rfd1: rfapi descriptor returned by rfapi_open or rfapi_create_generic
61 * rfd2: rfapi descriptor returned by rfapi_open or rfapi_create_generic
62 *
63 * output:
64 *
65 * return value:
66 * 0 Mismatch
67 * 1 Match
68 *------------------------------------------*/
d62a17ae 69int rfapi_compare_rfds(void *rfd1, void *rfd2)
65efcfce 70{
d62a17ae 71 struct rfapi_descriptor *rrfd1, *rrfd2;
72 int match = 0;
65efcfce 73
d62a17ae 74 rrfd1 = (struct rfapi_descriptor *)rfd1;
75 rrfd2 = (struct rfapi_descriptor *)rfd2;
65efcfce 76
d62a17ae 77 if (rrfd1->vn_addr.addr_family == rrfd2->vn_addr.addr_family) {
78 if (rrfd1->vn_addr.addr_family == AF_INET)
79 match = IPV4_ADDR_SAME(&(rrfd1->vn_addr.addr.v4),
80 &(rrfd2->vn_addr.addr.v4));
81 else
82 match = IPV6_ADDR_SAME(&(rrfd1->vn_addr.addr.v6),
83 &(rrfd2->vn_addr.addr.v6));
84 }
65efcfce 85
d62a17ae 86 /*
87 * If the VN addresses don't match in all forms,
88 * give up.
89 */
90 if (!match)
91 return 0;
65efcfce 92
d62a17ae 93 /*
94 * do the process again for the UN addresses.
95 */
96 match = 0;
97 if (rrfd1->un_addr.addr_family == rrfd2->un_addr.addr_family) {
98 /* VN addresses match
99 * UN address families match
100 * now check the actual UN addresses
101 */
102 if (rrfd1->un_addr.addr_family == AF_INET)
103 match = IPV4_ADDR_SAME(&(rrfd1->un_addr.addr.v4),
104 &(rrfd2->un_addr.addr.v4));
105 else
106 match = IPV6_ADDR_SAME(&(rrfd1->un_addr.addr.v6),
107 &(rrfd2->un_addr.addr.v6));
108 }
109 return match;
65efcfce 110}