FreeBSD kernel IPv4 code
|
#include <sys/cdefs.h>
#include "opt_inet.h"
#include <sys/param.h>
#include <sys/eventhandler.h>
#include <sys/systm.h>
#include <sys/sockio.h>
#include <sys/malloc.h>
#include <sys/priv.h>
#include <sys/socket.h>
#include <sys/jail.h>
#include <sys/kernel.h>
#include <sys/lock.h>
#include <sys/proc.h>
#include <sys/sysctl.h>
#include <sys/syslog.h>
#include <sys/sx.h>
#include <net/if.h>
#include <net/if_var.h>
#include <net/if_arp.h>
#include <net/if_dl.h>
#include <net/if_llatbl.h>
#include <net/if_types.h>
#include <net/route.h>
#include <net/route/nhop.h>
#include <net/route/route_ctl.h>
#include <net/vnet.h>
#include <netinet/if_ether.h>
#include <netinet/in.h>
#include <netinet/in_fib.h>
#include <netinet/in_var.h>
#include <netinet/in_pcb.h>
#include <netinet/ip_var.h>
#include <netinet/ip_carp.h>
#include <netinet/igmp_var.h>
#include <netinet/udp.h>
#include <netinet/udp_var.h>
Go to the source code of this file.
Data Structures | |
struct | in_llentry |
Macros | |
#define | IN_HISTORICAL_NETS /* include class masks */ |
#define | V_nosameprefix VNET(nosameprefix) |
#define | V_broadcast_lowest VNET(broadcast_lowest) |
#define | V_ripcbinfo VNET(ripcbinfo) |
#define | IN_LLTBL_DEFAULT_HSIZE 32 |
#define | IN_LLTBL_HASH(k, h) (((((((k >> 8) ^ k) >> 8) ^ k) >> 8) ^ k) & ((h) - 1)) |
#define | IN_ARE_MASKED_ADDR_EQUAL(d, a, m) |
Functions | |
__FBSDID ("$FreeBSD$") | |
static int | in_aifaddr_ioctl (u_long, caddr_t, struct ifnet *, struct thread *) |
static int | in_difaddr_ioctl (u_long, caddr_t, struct ifnet *, struct thread *) |
static int | in_gifaddr_ioctl (u_long, caddr_t, struct ifnet *, struct thread *) |
static void | in_socktrim (struct sockaddr_in *) |
static void | in_purgemaddrs (struct ifnet *) |
static bool | ia_need_loopback_route (const struct in_ifaddr *) |
VNET_DEFINE_STATIC (int, nosameprefix) | |
SYSCTL_INT (_net_inet_ip, OID_AUTO, no_same_prefix, CTLFLAG_VNET|CTLFLAG_RW, &VNET_NAME(nosameprefix), 0, "Refuse to create same prefixes on different interfaces") | |
VNET_DEFINE_STATIC (bool, broadcast_lowest) | |
SYSCTL_BOOL (_net_inet_ip, OID_AUTO, broadcast_lowest, CTLFLAG_VNET|CTLFLAG_RW, &VNET_NAME(broadcast_lowest), 0, "Treat lowest address on a subnet (host 0) as broadcast") | |
VNET_DECLARE (struct inpcbinfo, ripcbinfo) | |
SX_SYSINIT (in_control_sx, &in_control_sx, "in_control") | |
int | in_localaddr (struct in_addr in) |
bool | in_localip (struct in_addr in) |
bool | in_localip_fib (struct in_addr in, uint16_t fib) |
int | in_ifhasaddr (struct ifnet *ifp, struct in_addr in) |
static struct in_ifaddr * | in_localip_more (struct in_ifaddr *original_ia) |
struct in_ifaddr * | in_findlocal (uint32_t fibnum, bool loopback_ok) |
int | in_canforward (struct in_addr in) |
int | in_control (struct socket *so, u_long cmd, caddr_t data, struct ifnet *ifp, struct thread *td) |
static int | in_match_ifaddr (const struct rtentry *rt, const struct nhop_object *nh, void *arg) |
static int | in_handle_prefix_route (uint32_t fibnum, int cmd, struct sockaddr_in *dst, struct sockaddr_in *netmask, struct ifaddr *ifa, struct ifnet *ifp) |
static void | ia_getrtprefix (const struct in_ifaddr *ia, struct in_addr *prefix, struct in_addr *mask) |
int | in_handle_ifaddr_route (int cmd, struct in_ifaddr *ia) |
static bool | in_hasrtprefix (struct in_ifaddr *target) |
int | in_addprefix (struct in_ifaddr *target) |
static void | in_scrubprefixlle (struct in_ifaddr *ia, int all, u_int flags) |
int | in_scrubprefix (struct in_ifaddr *target, u_int flags) |
void | in_ifscrub_all (void) |
int | in_ifaddr_broadcast (struct in_addr in, struct in_ifaddr *ia) |
int | in_broadcast (struct in_addr in, struct ifnet *ifp) |
void | in_ifdetach (struct ifnet *ifp) |
static void | in_lltable_destroy_lle_unlocked (epoch_context_t ctx) |
static void | in_lltable_destroy_lle (struct llentry *lle) |
static struct llentry * | in_lltable_new (struct in_addr addr4, u_int flags) |
static int | in_lltable_match_prefix (const struct sockaddr *saddr, const struct sockaddr *smask, u_int flags, struct llentry *lle) |
static void | in_lltable_free_entry (struct lltable *llt, struct llentry *lle) |
static int | in_lltable_rtcheck (struct ifnet *ifp, u_int flags, const struct sockaddr *l3addr) |
static uint32_t | in_lltable_hash_dst (const struct in_addr dst, uint32_t hsize) |
static uint32_t | in_lltable_hash (const struct llentry *lle, uint32_t hsize) |
static void | in_lltable_fill_sa_entry (const struct llentry *lle, struct sockaddr *sa) |
static struct llentry * | in_lltable_find_dst (struct lltable *llt, struct in_addr dst) |
static void | in_lltable_delete_entry (struct lltable *llt, struct llentry *lle) |
static struct llentry * | in_lltable_alloc (struct lltable *llt, u_int flags, const struct sockaddr *l3addr) |
static struct llentry * | in_lltable_lookup (struct lltable *llt, u_int flags, const struct sockaddr *l3addr) |
static int | in_lltable_dump_entry (struct lltable *llt, struct llentry *lle, struct sysctl_req *wr) |
static struct lltable * | in_lltattach (struct ifnet *ifp) |
struct lltable * | in_lltable_get (struct ifnet *ifp) |
void * | in_domifattach (struct ifnet *ifp) |
void | in_domifdetach (struct ifnet *ifp, void *aux) |
Variables | |
static struct sx | in_control_sx |
#define IN_ARE_MASKED_ADDR_EQUAL | ( | d, | |
a, | |||
m | |||
) |
#define IN_LLTBL_HASH | ( | k, | |
h | |||
) | (((((((k >> 8) ^ k) >> 8) ^ k) >> 8) ^ k) & ((h) - 1)) |
__FBSDID | ( | "$FreeBSD$" | ) |
|
static |
Definition at line 888 of file in.c.
References in_ifaddr::ia_addr, in_ifaddr::ia_dstaddr, in_ifaddr::ia_sockmask, INADDR_BROADCAST, in_addr::s_addr, and sockaddr_in::sin_addr.
Referenced by in_handle_ifaddr_route(), in_hasrtprefix(), and in_scrubprefix().
|
static |
Definition at line 862 of file in.c.
References in_ifaddr::ia_addr, in_ifaddr::ia_dstaddr, in_ifaddr::ia_sockmask, INADDR_ANY, INADDR_BROADCAST, in_addr::s_addr, and sockaddr_in::sin_addr.
Referenced by in_aifaddr_ioctl(), and in_scrubprefix().
int in_addprefix | ( | struct in_ifaddr * | target | ) |
Definition at line 992 of file in.c.
References in_ifaddr::ia_ifa, in_handle_ifaddr_route(), in_hasrtprefix(), and V_nosameprefix.
Referenced by carp_ifa_addroute(), and in_aifaddr_ioctl().
|
static |
Definition at line 396 of file in.c.
References carp_attach_p, in_ifaddr::ia_addr, in_ifaddr::ia_ifa, ia_need_loopback_route(), in_aliasreq::ifra_addr, in_aliasreq::ifra_broadaddr, in_aliasreq::ifra_mask, in_aliasreq::ifra_vhid, in_ifinfo::ii_allhosts, in_addprefix(), in_control_sx, in_difaddr_ioctl(), in_joingroup(), in_localip_more(), in_scrubprefix(), in_socktrim(), INADDR_ANY, INADDR_BROADCAST, INADDR_HASH, prison_check_ip4(), in_addr::s_addr, s_addr, sockaddr_in::sin_addr, sockaddr_in::sin_family, sockaddr_in::sin_len, and V_in_ifaddrhead.
Referenced by in_control().
int in_broadcast | ( | struct in_addr | in, |
struct ifnet * | ifp | ||
) |
Definition at line 1213 of file in.c.
References in_ifaddr_broadcast(), INADDR_ANY, INADDR_BROADCAST, and in_addr::s_addr.
Referenced by div_output_inbound(), rib4_preadd(), tcp_dropwithreset(), and tcp_input_with_port().
int in_canforward | ( | struct in_addr | in | ) |
Definition at line 250 of file in.c.
References in_addr::s_addr.
Referenced by ip_forward().
int in_control | ( | struct socket * | so, |
u_long | cmd, | ||
caddr_t | data, | ||
struct ifnet * | ifp, | ||
struct thread * | td | ||
) |
Definition at line 281 of file in.c.
References in_aifaddr_ioctl(), in_control_sx, in_difaddr_ioctl(), in_gifaddr_ioctl(), INADDR_ANY, prison_check_ip4(), in_addr::s_addr, and sockaddr_in::sin_addr.
Referenced by in_ifscrub_all().
|
static |
Definition at line 611 of file in.c.
References in_ifaddr::ia_addr, in_ifinfo::ii_allhosts, in_control_sx, in_ifadown(), in_leavegroup(), in_scrubprefix(), prison_check_ip4(), in_addr::s_addr, sockaddr_in::sin_addr, sockaddr_in::sin_family, sockaddr_in::sin_len, and V_in_ifaddrhead.
Referenced by in_aifaddr_ioctl(), and in_control().
void * in_domifattach | ( | struct ifnet * | ifp | ) |
Definition at line 1719 of file in.c.
References igmp_domifattach(), in_ifinfo::ii_igmp, in_ifinfo::ii_llt, and in_lltattach().
void in_domifdetach | ( | struct ifnet * | ifp, |
void * | aux | ||
) |
Definition at line 1732 of file in.c.
References igmp_domifdetach(), and in_ifinfo::ii_llt.
Definition at line 221 of file in.c.
References in_ifaddr::ia_ifa, IA_SIN, and V_in_ifaddrhead.
|
static |
Definition at line 714 of file in.c.
References in_ifaddr::ia_addr, in_ifaddr::ia_dstaddr, in_ifaddr::ia_sockmask, in_aliasreq::ifra_addr, in_aliasreq::ifra_broadaddr, in_aliasreq::ifra_mask, prison_check_ip4(), in_addr::s_addr, sockaddr_in::sin_addr, sockaddr_in::sin_family, and sockaddr_in::sin_len.
Referenced by in_control().
int in_handle_ifaddr_route | ( | int | cmd, |
struct in_ifaddr * | ia | ||
) |
Definition at line 912 of file in.c.
References ia_getrtprefix(), in_ifaddr::ia_ifa, in_handle_prefix_route(), INADDR_BROADCAST, in_addr::s_addr, s_addr, sockaddr_in::sin_addr, and sockaddr_in::sin_family.
Referenced by in_addprefix(), and in_scrubprefix().
|
static |
Definition at line 778 of file in.c.
References in_match_ifaddr().
Referenced by in_handle_ifaddr_route().
|
static |
Definition at line 956 of file in.c.
References ia_getrtprefix(), in_addr::s_addr, and V_in_ifaddrhead.
Referenced by in_addprefix().
Definition at line 1191 of file in.c.
References in_ifaddr::ia_subnet, in_ifaddr::ia_subnetmask, in_addr::s_addr, and V_broadcast_lowest.
Referenced by in_broadcast(), and ip_output().
void in_ifdetach | ( | struct ifnet * | ifp | ) |
Definition at line 1243 of file in.c.
References IN_MULTI_LOCK, IN_MULTI_UNLOCK, in_pcbpurgeif0(), in_purgemaddrs(), inm_release_wait(), V_ripcbinfo, V_udbinfo, and V_ulitecbinfo.
int in_ifhasaddr | ( | struct ifnet * | ifp, |
struct in_addr | in | ||
) |
Definition at line 166 of file in.c.
References in_ifaddr::ia_addr, in_addr::s_addr, and sockaddr_in::sin_addr.
void in_ifscrub_all | ( | void | ) |
Definition at line 1158 of file in.c.
References igmp_domifdetach(), in_control(), and in_purgemaddrs().
|
static |
Definition at line 1533 of file in.c.
References in_lltable_destroy_lle_unlocked(), in_lltable_new(), in_lltable_rtcheck(), and sockaddr_in::sin_addr.
Referenced by in_lltattach().
|
static |
Definition at line 1521 of file in.c.
Referenced by in_lltattach().
|
static |
Definition at line 1330 of file in.c.
References in_lltable_destroy_lle_unlocked().
Referenced by in_lltable_new().
|
static |
Definition at line 1315 of file in.c.
Referenced by in_lltable_alloc(), and in_lltable_destroy_lle().
|
static |
Definition at line 1621 of file in.c.
References RTF_ANNOUNCE.
Referenced by in_lltattach().
|
static |
Definition at line 1490 of file in.c.
References sockaddr_in::sin_addr, sockaddr_in::sin_family, and sockaddr_in::sin_len.
Referenced by in_lltattach().
|
inlinestatic |
Definition at line 1502 of file in.c.
References in_lltable_hash_dst(), and in_addr::s_addr.
Referenced by in_lltable_lookup().
|
static |
Definition at line 1398 of file in.c.
Referenced by in_lltattach().
Definition at line 1483 of file in.c.
References in_lltable_hash_dst().
Referenced by in_lltattach().
Definition at line 1476 of file in.c.
References IN_LLTBL_HASH, and in_addr::s_addr.
Referenced by in_lltable_find_dst(), and in_lltable_hash().
|
static |
Definition at line 1583 of file in.c.
References in_lltable_find_dst(), and sockaddr_in::sin_addr.
Referenced by in_lltattach().
|
static |
Definition at line 1365 of file in.c.
References IN_ARE_MASKED_ADDR_EQUAL, and in_addr::s_addr.
Referenced by in_lltattach().
|
static |
Definition at line 1338 of file in.c.
References in_llentry::base, and in_lltable_destroy_lle().
Referenced by in_lltable_alloc().
|
static |
Definition at line 1417 of file in.c.
References fib4_lookup(), IA_SIN, in_ifaddr::ia_subnetmask, IN_ARE_MASKED_ADDR_EQUAL, and in_addr::s_addr.
Referenced by in_lltable_alloc().
|
static |
Definition at line 1685 of file in.c.
References in_lltable_alloc(), in_lltable_delete_entry(), in_lltable_dump_entry(), in_lltable_fill_sa_entry(), in_lltable_free_entry(), in_lltable_hash(), in_lltable_lookup(), in_lltable_match_prefix(), and IN_LLTBL_DEFAULT_HSIZE.
Referenced by in_domifattach().
int in_localaddr | ( | struct in_addr | in | ) |
Definition at line 111 of file in.c.
References in_ifaddr::ia_subnet, in_ifaddr::ia_subnetmask, in_addr::s_addr, and V_in_ifaddrhead.
Referenced by tcp_mss_update().
bool in_localip | ( | struct in_addr | in | ) |
Definition at line 131 of file in.c.
References IA_SIN, INADDR_HASH, and in_addr::s_addr.
Referenced by in_gif_set_running(), in_gre_set_running(), ip_output_pfil(), ip_tryforward(), tcp_input_with_port(), and tcp_twstart().
Definition at line 148 of file in.c.
References in_ifaddr::ia_ifa, IA_SIN, INADDR_HASH, and in_addr::s_addr.
Referenced by ip_input().
Definition at line 189 of file in.c.
References in_ifaddr::ia_ifa, IA_SIN, and INADDR_HASH.
Referenced by in_aifaddr_ioctl(), and in_scrubprefix().
|
static |
Definition at line 768 of file in.c.
Referenced by in_handle_prefix_route().
|
static |
Definition at line 1268 of file in.c.
References ifma_restart, igmp_ifdetach(), IN_MULTI_LIST_LOCK, IN_MULTI_LIST_UNLOCK, inm_rele_locked(), inm_release_list_deferred(), and next.
Referenced by in_ifdetach(), and in_ifscrub_all().
int in_scrubprefix | ( | struct in_ifaddr * | target, |
u_int | flags | ||
) |
Definition at line 1060 of file in.c.
References in_ifaddr::ia_addr, ia_getrtprefix(), in_ifaddr::ia_ifa, ia_need_loopback_route(), in_handle_ifaddr_route(), in_localip_more(), in_scrubprefixlle(), in_addr::s_addr, and V_in_ifaddrhead.
Referenced by carp_ifa_delroute(), in_aifaddr_ioctl(), and in_difaddr_ioctl().
|
static |
Definition at line 1021 of file in.c.
References in_ifaddr::ia_addr, in_ifaddr::ia_subnetmask, LLTABLE, in_addr::s_addr, sockaddr_in::sin_addr, sockaddr_in::sin_family, and sockaddr_in::sin_len.
Referenced by in_scrubprefix().
|
static |
Definition at line 264 of file in.c.
References sockaddr_in::sin_addr, and sockaddr_in::sin_len.
Referenced by in_aifaddr_ioctl().
SX_SYSINIT | ( | in_control_sx | , |
& | in_control_sx, | ||
"in_control" | |||
) |
SYSCTL_BOOL | ( | _net_inet_ip | , |
OID_AUTO | , | ||
broadcast_lowest | , | ||
CTLFLAG_VNET| | CTLFLAG_RW, | ||
& | VNET_NAMEbroadcast_lowest, | ||
0 | , | ||
"Treat lowest address on a subnet (host 0) as broadcast" | |||
) |
SYSCTL_INT | ( | _net_inet_ip | , |
OID_AUTO | , | ||
no_same_prefix | , | ||
CTLFLAG_VNET| | CTLFLAG_RW, | ||
& | VNET_NAMEnosameprefix, | ||
0 | , | ||
"Refuse to create same prefixes on different interfaces" | |||
) |
VNET_DECLARE | ( | struct inpcbinfo | , |
ripcbinfo | |||
) |
VNET_DEFINE_STATIC | ( | bool | , |
broadcast_lowest | |||
) |
VNET_DEFINE_STATIC | ( | int | , |
nosameprefix | |||
) |
|
static |
Definition at line 103 of file in.c.
Referenced by in_aifaddr_ioctl(), in_control(), and in_difaddr_ioctl().