Initial Release
[project/omcproxy.git] / src / mrib.h
1 /*
2 * Author: Steven Barth <steven at midlink.org>
3 *
4 * Copyright 2015 Deutsche Telekom AG
5 *
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 *
18 */
19
20 #pragma once
21
22 #include <netinet/in.h>
23 #include <libubox/list.h>
24 #include <sys/socket.h>
25
26 #include <netinet/icmp6.h>
27
28 #define icmp6_filter icmpv6_filter
29 #include <linux/igmp.h>
30 #include <linux/icmpv6.h>
31 #undef icmp6_filter
32
33 #define MRIB_DEFAULT_LIFETIME 125
34
35 #define IPV6_ALL_NODES_INIT { { { 0xff,0x02,0,0,0,0,0,0,0,0,0,0,0,0,0,0x1 } } }
36 #define INADDR_ALLIGMPV3RTRS_GROUP cpu_to_be32(0xe0000016U)
37
38 typedef uint32_t mrib_filter;
39 struct mrib_iface;
40 struct mrib_user;
41 struct mrib_querier;
42
43 typedef void(mrib_cb)(struct mrib_user *user, const struct in6_addr *group,
44 const struct in6_addr *source, mrib_filter *filter);
45
46 typedef void(mrib_igmp_cb)(struct mrib_querier *mrib, const struct igmphdr *igmp, size_t len,
47 const struct sockaddr_in *from);
48
49 typedef void(mrib_mld_cb)(struct mrib_querier *mrib, const struct mld_hdr *mld, size_t len,
50 const struct sockaddr_in6 *from);
51
52 struct mrib_user {
53 struct list_head head;
54 struct mrib_iface *iface;
55 mrib_cb *cb_newsource;
56 };
57
58 struct mrib_querier {
59 struct list_head head;
60 struct mrib_iface *iface;
61 mrib_igmp_cb *cb_igmp;
62 mrib_mld_cb *cb_mld;
63 };
64
65 // Register a new user to mrib
66 int mrib_attach_user(struct mrib_user *user, int ifindex, mrib_cb *cb_newsource);
67
68 // Deregister a user from mrib
69 void mrib_detach_user(struct mrib_user *user);
70
71 // Register a querier to mrib
72 int mrib_attach_querier(struct mrib_querier *querier, int ifindex, mrib_igmp_cb *cb_igmp, mrib_mld_cb *cb_mld);
73
74 // Deregister a querier from mrib
75 void mrib_detach_querier(struct mrib_querier *querier);
76
77 // Flush state for a multicast route
78 int mrib_flush(struct mrib_user *user, const struct in6_addr *group, uint8_t group_plen, const struct in6_addr *source);
79
80 // Add interface to filter
81 int mrib_filter_add(mrib_filter *filter, struct mrib_user *user);
82
83 // Send IGMP-packet
84 int mrib_send_igmp(struct mrib_querier *querier, struct igmpv3_query *igmp, size_t len,
85 const struct sockaddr_in *dest);
86
87 // Send MLD-packet
88 int mrib_send_mld(struct mrib_querier *querier, struct mld_hdr *mld, size_t len,
89 const struct sockaddr_in6 *dest);
90
91 // Get source address
92 int mrib_mld_source(struct mrib_querier *q, struct in6_addr *source);
93 int mrib_igmp_source(struct mrib_querier *q, struct in_addr *source);