Coverage Report

Created: 2025-07-14 06:48

/src/frr/pimd/pim_oil.h
Line
Count
Source (jump to first uncovered line)
1
// SPDX-License-Identifier: GPL-2.0-or-later
2
/*
3
 * PIM for Quagga
4
 * Copyright (C) 2008  Everton da Silva Marques
5
 */
6
7
#ifndef PIM_OIL_H
8
#define PIM_OIL_H
9
10
struct pim_interface;
11
12
#include "pim_mroute.h"
13
14
/*
15
 * Where did we get this (S,G) from?
16
 *
17
 * GM - Learned from IGMP/MLD
18
 * PIM - Learned from PIM
19
 * SOURCE - Learned from Source multicast packet received
20
 * STAR - Inherited
21
 */
22
53.5k
#define PIM_OIF_FLAG_PROTO_GM     (1 << 0)
23
108k
#define PIM_OIF_FLAG_PROTO_PIM    (1 << 1)
24
117k
#define PIM_OIF_FLAG_PROTO_STAR   (1 << 2)
25
53.5k
#define PIM_OIF_FLAG_PROTO_VXLAN  (1 << 3)
26
#define PIM_OIF_FLAG_PROTO_ANY                                                 \
27
53.5k
  (PIM_OIF_FLAG_PROTO_GM | PIM_OIF_FLAG_PROTO_PIM |                      \
28
53.5k
   PIM_OIF_FLAG_PROTO_STAR | PIM_OIF_FLAG_PROTO_VXLAN)
29
30
/* OIF is present in the OIL but must not be used for forwarding traffic */
31
53.2k
#define PIM_OIF_FLAG_MUTE         (1 << 4)
32
/*
33
 * We need a pimreg vif id from the kernel.
34
 * Since ifindex == vif id for most cases and the number
35
 * of expected interfaces is at most 100, using MAXVIFS -1
36
 * is probably ok.
37
 * Don't come running to me if this assumption is bad,
38
 * fix it.
39
 */
40
7
#define PIM_OIF_PIM_REGISTER_VIF   0
41
0
#define PIM_MAX_USABLE_VIFS        (MAXVIFS - 1)
42
43
struct channel_counts {
44
  unsigned long long lastused;
45
  unsigned long origpktcnt;
46
  unsigned long pktcnt;
47
  unsigned long oldpktcnt;
48
  unsigned long origbytecnt;
49
  unsigned long bytecnt;
50
  unsigned long oldbytecnt;
51
  unsigned long origwrong_if;
52
  unsigned long wrong_if;
53
  unsigned long oldwrong_if;
54
};
55
56
/*
57
  qpim_channel_oil_list holds a list of struct channel_oil.
58
59
  Each channel_oil.oil is used to control an (S,G) entry in the Kernel
60
  Multicast Forwarding Cache.
61
62
  There is a case when we create a channel_oil but don't install in the kernel
63
64
  Case where (S, G) entry not installed in the kernel:
65
    FRR receives IGMP/PIM (*, G) join and RP is not configured or
66
    not-reachable, then create a channel_oil for the group G with the incoming
67
    interface(channel_oil.oil.mfcc_parent) as invalid i.e "MAXVIF" and populate
68
    the outgoing interface where join is received. Keep this entry in the stack,
69
    but don't install in the kernel(channel_oil.installed = 0).
70
71
  Case where (S, G) entry installed in the kernel:
72
    When RP is configured and is reachable for the group G, and receiving a
73
    join if channel_oil is already present then populate the incoming interface
74
    and install the entry in the kernel, if channel_oil not present, then create
75
    a new_channel oil(channel_oil.installed = 1).
76
77
  is_valid: indicate if this entry is valid to get installed in kernel.
78
  installed: indicate if this entry is installed in the kernel.
79
80
*/
81
PREDECL_RBTREE_UNIQ(rb_pim_oil);
82
83
struct channel_oil {
84
  struct pim_instance *pim;
85
86
  struct rb_pim_oil_item oil_rb;
87
88
#if PIM_IPV == 4
89
  struct mfcctl oil;
90
#else
91
  struct mf6cctl oil;
92
#endif
93
  int installed;
94
  int oil_inherited_rescan;
95
  int oil_size;
96
  int oil_ref_count;
97
  time_t oif_creation[MAXVIFS];
98
  uint32_t oif_flags[MAXVIFS];
99
  struct channel_counts cc;
100
  struct pim_upstream *up;
101
  time_t mroute_creation;
102
};
103
104
#if PIM_IPV == 4
105
static inline pim_addr *oil_origin(struct channel_oil *c_oil)
106
770k
{
107
770k
  return &c_oil->oil.mfcc_origin;
108
770k
}
Unexecuted instantiation: pim_assert.c:oil_origin
Unexecuted instantiation: pim_bfd.c:oil_origin
Unexecuted instantiation: pim_bsm.c:oil_origin
Unexecuted instantiation: pim_cmd_common.c:oil_origin
Unexecuted instantiation: pim_hello.c:oil_origin
Unexecuted instantiation: pim_iface.c:oil_origin
Unexecuted instantiation: pim_ifchannel.c:oil_origin
Unexecuted instantiation: pim_instance.c:oil_origin
Unexecuted instantiation: pim_join.c:oil_origin
Unexecuted instantiation: pim_jp_agg.c:oil_origin
Unexecuted instantiation: pim_macro.c:oil_origin
Unexecuted instantiation: pim_mroute.c:oil_origin
Unexecuted instantiation: pim_msg.c:oil_origin
Unexecuted instantiation: pim_nb_config.c:oil_origin
Unexecuted instantiation: pim_neighbor.c:oil_origin
Unexecuted instantiation: pim_nht.c:oil_origin
pim_oil.c:oil_origin
Line
Count
Source
106
770k
{
107
770k
  return &c_oil->oil.mfcc_origin;
108
770k
}
Unexecuted instantiation: pim_pim.c:oil_origin
Unexecuted instantiation: pim_rp.c:oil_origin
Unexecuted instantiation: pim_rpf.c:oil_origin
Unexecuted instantiation: pim_sock.c:oil_origin
Unexecuted instantiation: pim_ssm.c:oil_origin
Unexecuted instantiation: pim_ssmpingd.c:oil_origin
Unexecuted instantiation: pim_static.c:oil_origin
Unexecuted instantiation: pim_tib.c:oil_origin
Unexecuted instantiation: pim_tlv.c:oil_origin
Unexecuted instantiation: pim_upstream.c:oil_origin
Unexecuted instantiation: pim_vty.c:oil_origin
Unexecuted instantiation: pim_zebra.c:oil_origin
Unexecuted instantiation: pim_zlookup.c:oil_origin
Unexecuted instantiation: pim_vxlan.c:oil_origin
Unexecuted instantiation: pim_register.c:oil_origin
Unexecuted instantiation: pimd.c:oil_origin
Unexecuted instantiation: pim_cmd.c:oil_origin
Unexecuted instantiation: pim_igmp.c:oil_origin
Unexecuted instantiation: pim_igmp_mtrace.c:oil_origin
Unexecuted instantiation: pim_igmpv2.c:oil_origin
Unexecuted instantiation: pim_igmpv3.c:oil_origin
Unexecuted instantiation: pim_main.c:oil_origin
Unexecuted instantiation: pim_mlag.c:oil_origin
Unexecuted instantiation: pim_msdp.c:oil_origin
Unexecuted instantiation: pim_msdp_packet.c:oil_origin
Unexecuted instantiation: pim_msdp_socket.c:oil_origin
Unexecuted instantiation: pim_zpthread.c:oil_origin
109
110
static inline pim_addr *oil_mcastgrp(struct channel_oil *c_oil)
111
2.34M
{
112
2.34M
  return &c_oil->oil.mfcc_mcastgrp;
113
2.34M
}
Unexecuted instantiation: pim_assert.c:oil_mcastgrp
Unexecuted instantiation: pim_bfd.c:oil_mcastgrp
Unexecuted instantiation: pim_bsm.c:oil_mcastgrp
Unexecuted instantiation: pim_cmd_common.c:oil_mcastgrp
Unexecuted instantiation: pim_hello.c:oil_mcastgrp
Unexecuted instantiation: pim_iface.c:oil_mcastgrp
Unexecuted instantiation: pim_ifchannel.c:oil_mcastgrp
Unexecuted instantiation: pim_instance.c:oil_mcastgrp
Unexecuted instantiation: pim_join.c:oil_mcastgrp
Unexecuted instantiation: pim_jp_agg.c:oil_mcastgrp
Unexecuted instantiation: pim_macro.c:oil_mcastgrp
Unexecuted instantiation: pim_mroute.c:oil_mcastgrp
Unexecuted instantiation: pim_msg.c:oil_mcastgrp
Unexecuted instantiation: pim_nb_config.c:oil_mcastgrp
Unexecuted instantiation: pim_neighbor.c:oil_mcastgrp
Unexecuted instantiation: pim_nht.c:oil_mcastgrp
pim_oil.c:oil_mcastgrp
Line
Count
Source
111
2.34M
{
112
2.34M
  return &c_oil->oil.mfcc_mcastgrp;
113
2.34M
}
Unexecuted instantiation: pim_pim.c:oil_mcastgrp
Unexecuted instantiation: pim_rp.c:oil_mcastgrp
Unexecuted instantiation: pim_rpf.c:oil_mcastgrp
Unexecuted instantiation: pim_sock.c:oil_mcastgrp
Unexecuted instantiation: pim_ssm.c:oil_mcastgrp
Unexecuted instantiation: pim_ssmpingd.c:oil_mcastgrp
Unexecuted instantiation: pim_static.c:oil_mcastgrp
Unexecuted instantiation: pim_tib.c:oil_mcastgrp
Unexecuted instantiation: pim_tlv.c:oil_mcastgrp
Unexecuted instantiation: pim_upstream.c:oil_mcastgrp
Unexecuted instantiation: pim_vty.c:oil_mcastgrp
Unexecuted instantiation: pim_zebra.c:oil_mcastgrp
Unexecuted instantiation: pim_zlookup.c:oil_mcastgrp
Unexecuted instantiation: pim_vxlan.c:oil_mcastgrp
Unexecuted instantiation: pim_register.c:oil_mcastgrp
Unexecuted instantiation: pimd.c:oil_mcastgrp
Unexecuted instantiation: pim_cmd.c:oil_mcastgrp
Unexecuted instantiation: pim_igmp.c:oil_mcastgrp
Unexecuted instantiation: pim_igmp_mtrace.c:oil_mcastgrp
Unexecuted instantiation: pim_igmpv2.c:oil_mcastgrp
Unexecuted instantiation: pim_igmpv3.c:oil_mcastgrp
Unexecuted instantiation: pim_main.c:oil_mcastgrp
Unexecuted instantiation: pim_mlag.c:oil_mcastgrp
Unexecuted instantiation: pim_msdp.c:oil_mcastgrp
Unexecuted instantiation: pim_msdp_packet.c:oil_mcastgrp
Unexecuted instantiation: pim_msdp_socket.c:oil_mcastgrp
Unexecuted instantiation: pim_zpthread.c:oil_mcastgrp
114
115
static inline vifi_t *oil_parent(struct channel_oil *c_oil)
116
211k
{
117
211k
  return &c_oil->oil.mfcc_parent;
118
211k
}
Unexecuted instantiation: pim_assert.c:oil_parent
Unexecuted instantiation: pim_bfd.c:oil_parent
Unexecuted instantiation: pim_bsm.c:oil_parent
Unexecuted instantiation: pim_cmd_common.c:oil_parent
Unexecuted instantiation: pim_hello.c:oil_parent
Unexecuted instantiation: pim_iface.c:oil_parent
Unexecuted instantiation: pim_ifchannel.c:oil_parent
Unexecuted instantiation: pim_instance.c:oil_parent
Unexecuted instantiation: pim_join.c:oil_parent
Unexecuted instantiation: pim_jp_agg.c:oil_parent
Unexecuted instantiation: pim_macro.c:oil_parent
pim_mroute.c:oil_parent
Line
Count
Source
116
104k
{
117
104k
  return &c_oil->oil.mfcc_parent;
118
104k
}
Unexecuted instantiation: pim_msg.c:oil_parent
Unexecuted instantiation: pim_nb_config.c:oil_parent
Unexecuted instantiation: pim_neighbor.c:oil_parent
Unexecuted instantiation: pim_nht.c:oil_parent
pim_oil.c:oil_parent
Line
Count
Source
116
106k
{
117
106k
  return &c_oil->oil.mfcc_parent;
118
106k
}
Unexecuted instantiation: pim_pim.c:oil_parent
Unexecuted instantiation: pim_rp.c:oil_parent
Unexecuted instantiation: pim_rpf.c:oil_parent
Unexecuted instantiation: pim_sock.c:oil_parent
Unexecuted instantiation: pim_ssm.c:oil_parent
Unexecuted instantiation: pim_ssmpingd.c:oil_parent
Unexecuted instantiation: pim_static.c:oil_parent
Unexecuted instantiation: pim_tib.c:oil_parent
Unexecuted instantiation: pim_tlv.c:oil_parent
Unexecuted instantiation: pim_upstream.c:oil_parent
Unexecuted instantiation: pim_vty.c:oil_parent
Unexecuted instantiation: pim_zebra.c:oil_parent
Unexecuted instantiation: pim_zlookup.c:oil_parent
Unexecuted instantiation: pim_vxlan.c:oil_parent
Unexecuted instantiation: pim_register.c:oil_parent
Unexecuted instantiation: pimd.c:oil_parent
Unexecuted instantiation: pim_cmd.c:oil_parent
Unexecuted instantiation: pim_igmp.c:oil_parent
Unexecuted instantiation: pim_igmp_mtrace.c:oil_parent
Unexecuted instantiation: pim_igmpv2.c:oil_parent
Unexecuted instantiation: pim_igmpv3.c:oil_parent
Unexecuted instantiation: pim_main.c:oil_parent
Unexecuted instantiation: pim_mlag.c:oil_parent
Unexecuted instantiation: pim_msdp.c:oil_parent
Unexecuted instantiation: pim_msdp_packet.c:oil_parent
Unexecuted instantiation: pim_msdp_socket.c:oil_parent
Unexecuted instantiation: pim_zpthread.c:oil_parent
119
120
static inline bool oil_if_has(struct channel_oil *c_oil, vifi_t ifi)
121
122k
{
122
122k
  return !!c_oil->oil.mfcc_ttls[ifi];
123
122k
}
Unexecuted instantiation: pim_assert.c:oil_if_has
Unexecuted instantiation: pim_bfd.c:oil_if_has
Unexecuted instantiation: pim_bsm.c:oil_if_has
Unexecuted instantiation: pim_cmd_common.c:oil_if_has
Unexecuted instantiation: pim_hello.c:oil_if_has
Unexecuted instantiation: pim_iface.c:oil_if_has
Unexecuted instantiation: pim_ifchannel.c:oil_if_has
Unexecuted instantiation: pim_instance.c:oil_if_has
Unexecuted instantiation: pim_join.c:oil_if_has
Unexecuted instantiation: pim_jp_agg.c:oil_if_has
Unexecuted instantiation: pim_macro.c:oil_if_has
Unexecuted instantiation: pim_mroute.c:oil_if_has
Unexecuted instantiation: pim_msg.c:oil_if_has
Unexecuted instantiation: pim_nb_config.c:oil_if_has
Unexecuted instantiation: pim_neighbor.c:oil_if_has
Unexecuted instantiation: pim_nht.c:oil_if_has
pim_oil.c:oil_if_has
Line
Count
Source
121
122k
{
122
122k
  return !!c_oil->oil.mfcc_ttls[ifi];
123
122k
}
Unexecuted instantiation: pim_pim.c:oil_if_has
Unexecuted instantiation: pim_rp.c:oil_if_has
Unexecuted instantiation: pim_rpf.c:oil_if_has
Unexecuted instantiation: pim_sock.c:oil_if_has
Unexecuted instantiation: pim_ssm.c:oil_if_has
Unexecuted instantiation: pim_ssmpingd.c:oil_if_has
Unexecuted instantiation: pim_static.c:oil_if_has
Unexecuted instantiation: pim_tib.c:oil_if_has
Unexecuted instantiation: pim_tlv.c:oil_if_has
Unexecuted instantiation: pim_upstream.c:oil_if_has
Unexecuted instantiation: pim_vty.c:oil_if_has
Unexecuted instantiation: pim_zebra.c:oil_if_has
Unexecuted instantiation: pim_zlookup.c:oil_if_has
Unexecuted instantiation: pim_vxlan.c:oil_if_has
Unexecuted instantiation: pim_register.c:oil_if_has
Unexecuted instantiation: pimd.c:oil_if_has
Unexecuted instantiation: pim_cmd.c:oil_if_has
Unexecuted instantiation: pim_igmp.c:oil_if_has
Unexecuted instantiation: pim_igmp_mtrace.c:oil_if_has
Unexecuted instantiation: pim_igmpv2.c:oil_if_has
Unexecuted instantiation: pim_igmpv3.c:oil_if_has
Unexecuted instantiation: pim_main.c:oil_if_has
Unexecuted instantiation: pim_mlag.c:oil_if_has
Unexecuted instantiation: pim_msdp.c:oil_if_has
Unexecuted instantiation: pim_msdp_packet.c:oil_if_has
Unexecuted instantiation: pim_msdp_socket.c:oil_if_has
Unexecuted instantiation: pim_zpthread.c:oil_if_has
124
125
static inline void oil_if_set(struct channel_oil *c_oil, vifi_t ifi, uint8_t set)
126
122k
{
127
122k
  c_oil->oil.mfcc_ttls[ifi] = set;
128
122k
}
Unexecuted instantiation: pim_assert.c:oil_if_set
Unexecuted instantiation: pim_bfd.c:oil_if_set
Unexecuted instantiation: pim_bsm.c:oil_if_set
Unexecuted instantiation: pim_cmd_common.c:oil_if_set
Unexecuted instantiation: pim_hello.c:oil_if_set
Unexecuted instantiation: pim_iface.c:oil_if_set
Unexecuted instantiation: pim_ifchannel.c:oil_if_set
Unexecuted instantiation: pim_instance.c:oil_if_set
Unexecuted instantiation: pim_join.c:oil_if_set
Unexecuted instantiation: pim_jp_agg.c:oil_if_set
Unexecuted instantiation: pim_macro.c:oil_if_set
Unexecuted instantiation: pim_mroute.c:oil_if_set
Unexecuted instantiation: pim_msg.c:oil_if_set
Unexecuted instantiation: pim_nb_config.c:oil_if_set
Unexecuted instantiation: pim_neighbor.c:oil_if_set
Unexecuted instantiation: pim_nht.c:oil_if_set
pim_oil.c:oil_if_set
Line
Count
Source
126
122k
{
127
122k
  c_oil->oil.mfcc_ttls[ifi] = set;
128
122k
}
Unexecuted instantiation: pim_pim.c:oil_if_set
Unexecuted instantiation: pim_rp.c:oil_if_set
Unexecuted instantiation: pim_rpf.c:oil_if_set
Unexecuted instantiation: pim_sock.c:oil_if_set
Unexecuted instantiation: pim_ssm.c:oil_if_set
Unexecuted instantiation: pim_ssmpingd.c:oil_if_set
Unexecuted instantiation: pim_static.c:oil_if_set
Unexecuted instantiation: pim_tib.c:oil_if_set
Unexecuted instantiation: pim_tlv.c:oil_if_set
Unexecuted instantiation: pim_upstream.c:oil_if_set
Unexecuted instantiation: pim_vty.c:oil_if_set
Unexecuted instantiation: pim_zebra.c:oil_if_set
Unexecuted instantiation: pim_zlookup.c:oil_if_set
Unexecuted instantiation: pim_vxlan.c:oil_if_set
Unexecuted instantiation: pim_register.c:oil_if_set
Unexecuted instantiation: pimd.c:oil_if_set
Unexecuted instantiation: pim_cmd.c:oil_if_set
Unexecuted instantiation: pim_igmp.c:oil_if_set
Unexecuted instantiation: pim_igmp_mtrace.c:oil_if_set
Unexecuted instantiation: pim_igmpv2.c:oil_if_set
Unexecuted instantiation: pim_igmpv3.c:oil_if_set
Unexecuted instantiation: pim_main.c:oil_if_set
Unexecuted instantiation: pim_mlag.c:oil_if_set
Unexecuted instantiation: pim_msdp.c:oil_if_set
Unexecuted instantiation: pim_msdp_packet.c:oil_if_set
Unexecuted instantiation: pim_msdp_socket.c:oil_if_set
Unexecuted instantiation: pim_zpthread.c:oil_if_set
129
130
static inline int oil_if_cmp(struct mfcctl *oil1, struct mfcctl *oil2)
131
68.9k
{
132
68.9k
  return memcmp(&oil1->mfcc_ttls[0], &oil2->mfcc_ttls[0],
133
68.9k
          sizeof(oil1->mfcc_ttls));
134
68.9k
}
Unexecuted instantiation: pim_assert.c:oil_if_cmp
Unexecuted instantiation: pim_bfd.c:oil_if_cmp
Unexecuted instantiation: pim_bsm.c:oil_if_cmp
Unexecuted instantiation: pim_cmd_common.c:oil_if_cmp
Unexecuted instantiation: pim_hello.c:oil_if_cmp
Unexecuted instantiation: pim_iface.c:oil_if_cmp
Unexecuted instantiation: pim_ifchannel.c:oil_if_cmp
Unexecuted instantiation: pim_instance.c:oil_if_cmp
Unexecuted instantiation: pim_join.c:oil_if_cmp
Unexecuted instantiation: pim_jp_agg.c:oil_if_cmp
Unexecuted instantiation: pim_macro.c:oil_if_cmp
Unexecuted instantiation: pim_mroute.c:oil_if_cmp
Unexecuted instantiation: pim_msg.c:oil_if_cmp
Unexecuted instantiation: pim_nb_config.c:oil_if_cmp
Unexecuted instantiation: pim_neighbor.c:oil_if_cmp
Unexecuted instantiation: pim_nht.c:oil_if_cmp
pim_oil.c:oil_if_cmp
Line
Count
Source
131
68.9k
{
132
68.9k
  return memcmp(&oil1->mfcc_ttls[0], &oil2->mfcc_ttls[0],
133
68.9k
          sizeof(oil1->mfcc_ttls));
134
68.9k
}
Unexecuted instantiation: pim_pim.c:oil_if_cmp
Unexecuted instantiation: pim_rp.c:oil_if_cmp
Unexecuted instantiation: pim_rpf.c:oil_if_cmp
Unexecuted instantiation: pim_sock.c:oil_if_cmp
Unexecuted instantiation: pim_ssm.c:oil_if_cmp
Unexecuted instantiation: pim_ssmpingd.c:oil_if_cmp
Unexecuted instantiation: pim_static.c:oil_if_cmp
Unexecuted instantiation: pim_tib.c:oil_if_cmp
Unexecuted instantiation: pim_tlv.c:oil_if_cmp
Unexecuted instantiation: pim_upstream.c:oil_if_cmp
Unexecuted instantiation: pim_vty.c:oil_if_cmp
Unexecuted instantiation: pim_zebra.c:oil_if_cmp
Unexecuted instantiation: pim_zlookup.c:oil_if_cmp
Unexecuted instantiation: pim_vxlan.c:oil_if_cmp
Unexecuted instantiation: pim_register.c:oil_if_cmp
Unexecuted instantiation: pimd.c:oil_if_cmp
Unexecuted instantiation: pim_cmd.c:oil_if_cmp
Unexecuted instantiation: pim_igmp.c:oil_if_cmp
Unexecuted instantiation: pim_igmp_mtrace.c:oil_if_cmp
Unexecuted instantiation: pim_igmpv2.c:oil_if_cmp
Unexecuted instantiation: pim_igmpv3.c:oil_if_cmp
Unexecuted instantiation: pim_main.c:oil_if_cmp
Unexecuted instantiation: pim_mlag.c:oil_if_cmp
Unexecuted instantiation: pim_msdp.c:oil_if_cmp
Unexecuted instantiation: pim_msdp_packet.c:oil_if_cmp
Unexecuted instantiation: pim_msdp_socket.c:oil_if_cmp
Unexecuted instantiation: pim_zpthread.c:oil_if_cmp
135
#else
136
static inline pim_addr *oil_origin(struct channel_oil *c_oil)
137
{
138
  return &c_oil->oil.mf6cc_origin.sin6_addr;
139
}
140
141
static inline pim_addr *oil_mcastgrp(struct channel_oil *c_oil)
142
{
143
  return &c_oil->oil.mf6cc_mcastgrp.sin6_addr;
144
}
145
146
static inline mifi_t *oil_parent(struct channel_oil *c_oil)
147
{
148
  return &c_oil->oil.mf6cc_parent;
149
}
150
151
static inline bool oil_if_has(struct channel_oil *c_oil, mifi_t ifi)
152
{
153
  return !!IF_ISSET(ifi, &c_oil->oil.mf6cc_ifset);
154
}
155
156
static inline void oil_if_set(struct channel_oil *c_oil, mifi_t ifi,
157
            uint8_t set)
158
{
159
  if (set)
160
    IF_SET(ifi, &c_oil->oil.mf6cc_ifset);
161
  else
162
    IF_CLR(ifi, &c_oil->oil.mf6cc_ifset);
163
}
164
165
static inline int oil_if_cmp(struct mf6cctl *oil1, struct mf6cctl *oil2)
166
{
167
  return memcmp(&oil1->mf6cc_ifset, &oil2->mf6cc_ifset,
168
          sizeof(oil1->mf6cc_ifset));
169
}
170
#endif
171
172
extern int pim_channel_oil_compare(const struct channel_oil *c1,
173
           const struct channel_oil *c2);
174
DECLARE_RBTREE_UNIQ(rb_pim_oil, struct channel_oil, oil_rb,
175
                    pim_channel_oil_compare);
176
177
void pim_oil_init(struct pim_instance *pim);
178
void pim_oil_terminate(struct pim_instance *pim);
179
180
void pim_channel_oil_free(struct channel_oil *c_oil);
181
struct channel_oil *pim_find_channel_oil(struct pim_instance *pim,
182
           pim_sgaddr *sg);
183
struct channel_oil *pim_channel_oil_add(struct pim_instance *pim,
184
          pim_sgaddr *sg, const char *name);
185
void pim_clear_nocache_state(struct pim_interface *pim_ifp);
186
struct channel_oil *pim_channel_oil_del(struct channel_oil *c_oil,
187
          const char *name);
188
189
int pim_channel_add_oif(struct channel_oil *c_oil, struct interface *oif,
190
      uint32_t proto_mask, const char *caller);
191
int pim_channel_del_oif(struct channel_oil *c_oil, struct interface *oif,
192
      uint32_t proto_mask, const char *caller);
193
194
int pim_channel_oil_empty(struct channel_oil *c_oil);
195
196
char *pim_channel_oil_dump(struct channel_oil *c_oil, char *buf, size_t size);
197
198
void pim_channel_update_oif_mute(struct channel_oil *c_oil,
199
    struct pim_interface *pim_ifp);
200
201
void pim_channel_oil_upstream_deref(struct channel_oil *c_oil);
202
void pim_channel_del_inherited_oif(struct channel_oil *c_oil,
203
           struct interface *oif, const char *caller);
204
205
#endif /* PIM_OIL_H */