2 * Author: Steven Barth <steven at midlink.org>
4 * Copyright 2015 Deutsche Telekom AG
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
10 * http://www.apache.org/licenses/LICENSE-2.0
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.
22 #include <netinet/in.h>
23 #include <libubox/list.h>
24 #include <sys/socket.h>
26 #include <netinet/icmp6.h>
28 #define icmp6_filter icmpv6_filter
29 #include <linux/igmp.h>
30 #include <linux/icmpv6.h>
33 #define MRIB_DEFAULT_LIFETIME 125
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)
38 typedef uint32_t mrib_filter
;
43 typedef void(mrib_cb
)(struct mrib_user
*user
, const struct in6_addr
*group
,
44 const struct in6_addr
*source
, mrib_filter
*filter
);
46 typedef void(mrib_igmp_cb
)(struct mrib_querier
*mrib
, const struct igmphdr
*igmp
, size_t len
,
47 const struct sockaddr_in
*from
);
49 typedef void(mrib_mld_cb
)(struct mrib_querier
*mrib
, const struct mld_hdr
*mld
, size_t len
,
50 const struct sockaddr_in6
*from
);
53 struct list_head head
;
54 struct mrib_iface
*iface
;
55 mrib_cb
*cb_newsource
;
59 struct list_head head
;
60 struct mrib_iface
*iface
;
61 mrib_igmp_cb
*cb_igmp
;
65 // Register a new user to mrib
66 int mrib_attach_user(struct mrib_user
*user
, int ifindex
, mrib_cb
*cb_newsource
);
68 // Deregister a user from mrib
69 void mrib_detach_user(struct mrib_user
*user
);
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
);
74 // Deregister a querier from mrib
75 void mrib_detach_querier(struct mrib_querier
*querier
);
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
);
80 // Add interface to filter
81 int mrib_filter_add(mrib_filter
*filter
, struct mrib_user
*user
);
84 int mrib_send_igmp(struct mrib_querier
*querier
, struct igmpv3_query
*igmp
, size_t len
,
85 const struct sockaddr_in
*dest
);
88 int mrib_send_mld(struct mrib_querier
*querier
, struct mld_hdr
*mld
, size_t len
,
89 const struct sockaddr_in6
*dest
);
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
);