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); 94
This page was automatically generated by LXR 0.3.1. • OpenWrt