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 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 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 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 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 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 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 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 */ |