1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef _IPV6_STUBS_H 3*4882a593Smuzhiyun #define _IPV6_STUBS_H 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #include <linux/in6.h> 6*4882a593Smuzhiyun #include <linux/netdevice.h> 7*4882a593Smuzhiyun #include <linux/skbuff.h> 8*4882a593Smuzhiyun #include <net/dst.h> 9*4882a593Smuzhiyun #include <net/flow.h> 10*4882a593Smuzhiyun #include <net/neighbour.h> 11*4882a593Smuzhiyun #include <net/sock.h> 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun /* structs from net/ip6_fib.h */ 14*4882a593Smuzhiyun struct fib6_info; 15*4882a593Smuzhiyun struct fib6_nh; 16*4882a593Smuzhiyun struct fib6_config; 17*4882a593Smuzhiyun struct fib6_result; 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun /* This is ugly, ideally these symbols should be built 20*4882a593Smuzhiyun * into the core kernel. 21*4882a593Smuzhiyun */ 22*4882a593Smuzhiyun struct ipv6_stub { 23*4882a593Smuzhiyun int (*ipv6_sock_mc_join)(struct sock *sk, int ifindex, 24*4882a593Smuzhiyun const struct in6_addr *addr); 25*4882a593Smuzhiyun int (*ipv6_sock_mc_drop)(struct sock *sk, int ifindex, 26*4882a593Smuzhiyun const struct in6_addr *addr); 27*4882a593Smuzhiyun struct dst_entry *(*ipv6_dst_lookup_flow)(struct net *net, 28*4882a593Smuzhiyun const struct sock *sk, 29*4882a593Smuzhiyun struct flowi6 *fl6, 30*4882a593Smuzhiyun const struct in6_addr *final_dst); 31*4882a593Smuzhiyun int (*ipv6_route_input)(struct sk_buff *skb); 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun struct fib6_table *(*fib6_get_table)(struct net *net, u32 id); 34*4882a593Smuzhiyun int (*fib6_lookup)(struct net *net, int oif, struct flowi6 *fl6, 35*4882a593Smuzhiyun struct fib6_result *res, int flags); 36*4882a593Smuzhiyun int (*fib6_table_lookup)(struct net *net, struct fib6_table *table, 37*4882a593Smuzhiyun int oif, struct flowi6 *fl6, 38*4882a593Smuzhiyun struct fib6_result *res, int flags); 39*4882a593Smuzhiyun void (*fib6_select_path)(const struct net *net, struct fib6_result *res, 40*4882a593Smuzhiyun struct flowi6 *fl6, int oif, bool oif_match, 41*4882a593Smuzhiyun const struct sk_buff *skb, int strict); 42*4882a593Smuzhiyun u32 (*ip6_mtu_from_fib6)(const struct fib6_result *res, 43*4882a593Smuzhiyun const struct in6_addr *daddr, 44*4882a593Smuzhiyun const struct in6_addr *saddr); 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun int (*fib6_nh_init)(struct net *net, struct fib6_nh *fib6_nh, 47*4882a593Smuzhiyun struct fib6_config *cfg, gfp_t gfp_flags, 48*4882a593Smuzhiyun struct netlink_ext_ack *extack); 49*4882a593Smuzhiyun void (*fib6_nh_release)(struct fib6_nh *fib6_nh); 50*4882a593Smuzhiyun void (*fib6_update_sernum)(struct net *net, struct fib6_info *rt); 51*4882a593Smuzhiyun int (*ip6_del_rt)(struct net *net, struct fib6_info *rt, bool skip_notify); 52*4882a593Smuzhiyun void (*fib6_rt_update)(struct net *net, struct fib6_info *rt, 53*4882a593Smuzhiyun struct nl_info *info); 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun void (*udpv6_encap_enable)(void); 56*4882a593Smuzhiyun void (*ndisc_send_na)(struct net_device *dev, const struct in6_addr *daddr, 57*4882a593Smuzhiyun const struct in6_addr *solicited_addr, 58*4882a593Smuzhiyun bool router, bool solicited, bool override, bool inc_opt); 59*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_XFRM) 60*4882a593Smuzhiyun void (*xfrm6_local_rxpmtu)(struct sk_buff *skb, u32 mtu); 61*4882a593Smuzhiyun int (*xfrm6_udp_encap_rcv)(struct sock *sk, struct sk_buff *skb); 62*4882a593Smuzhiyun int (*xfrm6_rcv_encap)(struct sk_buff *skb, int nexthdr, __be32 spi, 63*4882a593Smuzhiyun int encap_type); 64*4882a593Smuzhiyun #endif 65*4882a593Smuzhiyun struct neigh_table *nd_tbl; 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun int (*ipv6_fragment)(struct net *net, struct sock *sk, struct sk_buff *skb, 68*4882a593Smuzhiyun int (*output)(struct net *, struct sock *, struct sk_buff *)); 69*4882a593Smuzhiyun }; 70*4882a593Smuzhiyun extern const struct ipv6_stub *ipv6_stub __read_mostly; 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun /* A stub used by bpf helpers. Similarly ugly as ipv6_stub */ 73*4882a593Smuzhiyun struct ipv6_bpf_stub { 74*4882a593Smuzhiyun int (*inet6_bind)(struct sock *sk, struct sockaddr *uaddr, int addr_len, 75*4882a593Smuzhiyun u32 flags); 76*4882a593Smuzhiyun struct sock *(*udp6_lib_lookup)(struct net *net, 77*4882a593Smuzhiyun const struct in6_addr *saddr, __be16 sport, 78*4882a593Smuzhiyun const struct in6_addr *daddr, __be16 dport, 79*4882a593Smuzhiyun int dif, int sdif, struct udp_table *tbl, 80*4882a593Smuzhiyun struct sk_buff *skb); 81*4882a593Smuzhiyun }; 82*4882a593Smuzhiyun extern const struct ipv6_bpf_stub *ipv6_bpf_stub __read_mostly; 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun #endif 85