Lines Matching refs:inp
203 struct inpcb *inp;
210 inp = pool_cache_get(in4pcb_pool_cache, PR_NOWAIT);
212 inp = pool_cache_get(in6pcb_pool_cache, PR_NOWAIT);
215 inp = pool_cache_get(in4pcb_pool_cache, PR_NOWAIT);
217 if (inp == NULL)
220 memset(inp, 0, sizeof(struct in4pcb));
223 memset(inp, 0, sizeof(struct in6pcb));
225 inp->inp_af = soaf(so);
226 inp->inp_table = table;
227 inp->inp_socket = so;
228 inp->inp_portalgo = PORTALGO_DEFAULT;
229 inp->inp_bindportonsend = false;
231 if (inp->inp_af == AF_INET) {
232 in4p_errormtu(inp) = -1;
233 in4p_prefsrcip(inp).s_addr = INADDR_ANY;
237 in6p_hops6(inp) = -1; /* use kernel default */
239 inp->inp_flags |= IN6P_IPV6_V6ONLY;
244 int error = ipsec_init_pcbpolicy(so, &inp->inp_sp);
247 if (inp->inp_af == AF_INET)
248 pool_cache_put(in4pcb_pool_cache, inp);
250 pool_cache_put(in6pcb_pool_cache, inp);
252 KASSERT(inp->inp_af == AF_INET);
253 pool_cache_put(in4pcb_pool_cache, inp);
257 inp->inp_sp->sp_inp = inp;
260 so->so_pcb = inp;
262 TAILQ_INSERT_HEAD(&table->inpt_queue, inp, inp_queue);
263 LIST_INSERT_HEAD(INPCBHASH_PORT(table, inp->inp_lport), inp,
265 inpcb_set_state(inp, INP_ATTACHED);
271 inpcb_set_port(struct sockaddr_in *sin, struct inpcb *inp, kauth_cred_t cred)
273 struct inpcbtable *table = inp->inp_table;
274 struct socket *so = inp->inp_socket;
280 if (inp->inp_flags & INP_LOWPORT) {
303 error = portalgo_randport(&lport, inp, cred);
307 inp->inp_flags |= INP_ANONPORT;
310 inp->inp_lport = lport;
311 inpcb_set_state(inp, INP_BOUND);
317 inpcb_bindableaddr(const struct inpcb *inp, struct sockaddr_in *sin,
339 else if ((inp->inp_flags & INP_BINDANY) != 0) {
356 inpcb_bind_addr(struct inpcb *inp, struct sockaddr_in *sin, kauth_cred_t cred)
360 error = inpcb_bindableaddr(inp, sin, cred);
362 in4p_laddr(inp) = sin->sin_addr;
367 inpcb_bind_port(struct inpcb *inp, struct sockaddr_in *sin, kauth_cred_t cred)
369 struct inpcbtable *table = inp->inp_table;
370 struct socket *so = inp->inp_socket;
387 error = inpcb_set_port(sin, inp, cred);
458 inp->inp_lport = sin->sin_port;
459 inpcb_set_state(inp, INP_BOUND);
462 LIST_REMOVE(inp, inp_lhash);
463 LIST_INSERT_HEAD(INPCBHASH_PORT(table, inp->inp_lport), inp,
480 struct inpcb *inp = v;
484 if (inp->inp_af != AF_INET)
487 if (inp->inp_lport || !in_nullhost(in4p_laddr(inp)))
495 inp->inp_socket->so_proto->pr_domain->dom_sa_any);
500 error = inpcb_bind_addr(inp, sin, l->l_cred);
505 error = inpcb_bind_port(inp, sin, l->l_cred);
507 in4p_laddr(inp).s_addr = INADDR_ANY;
525 struct inpcb *inp = v;
530 if (inp->inp_af != AF_INET)
541 inp->inp_socket->so_type == SOCK_STREAM)
582 if (in_nullhost(in4p_laddr(inp))) {
590 ia = in_selectsrc(sin, &inp->inp_route,
591 inp->inp_socket->so_options, inp->inp_moptions, &xerror,
601 if (_ia == NULL && (inp->inp_flags & INP_BINDANY) == 0) {
612 laddr = in4p_laddr(inp);
613 if (inpcb_lookup(inp->inp_table, sin->sin_addr, sin->sin_port,
614 laddr, inp->inp_lport, &vestige) != NULL ||
618 if (in_nullhost(in4p_laddr(inp))) {
619 if (inp->inp_lport == 0) {
620 error = inpcb_bind(inp, NULL, l);
630 in4p_laddr(inp) = laddr;
632 in4p_faddr(inp) = sin->sin_addr;
633 inp->inp_fport = sin->sin_port;
636 if (inp->inp_bindportonsend) {
638 inp->inp_socket->so_proto->pr_domain->dom_sa_any);
639 lsin.sin_addr = in4p_laddr(inp);
642 if ((error = inpcb_bind_port(inp, &lsin, l->l_cred)) != 0)
646 inpcb_set_state(inp, INP_CONNECTED);
648 if (ipsec_enabled && inp->inp_socket->so_type == SOCK_STREAM)
649 ipsec_pcbconn(inp->inp_sp);
662 struct inpcb *inp = v;
664 if (inp->inp_af != AF_INET)
667 in4p_faddr(inp) = zeroin_addr;
668 inp->inp_fport = 0;
669 inpcb_set_state(inp, INP_BOUND);
672 ipsec_pcbdisconn(inp->inp_sp);
674 if (inp->inp_socket->so_state & SS_NOFDREF)
675 inpcb_destroy(inp);
684 struct inpcb *inp = v;
685 struct socket *so = inp->inp_socket;
688 KASSERT(inp->inp_af == AF_INET || inp->inp_af == AF_INET6);
692 ipsec_delete_pcbpolicy(inp);
697 inpcb_set_state(inp, INP_ATTACHED);
698 LIST_REMOVE(inp, inp_lhash);
699 TAILQ_REMOVE(&inp->inp_table->inpt_queue, inp, inp_queue);
702 if (inp->inp_options) {
703 m_free(inp->inp_options);
705 rtcache_free(&inp->inp_route);
706 ip_freemoptions(inp->inp_moptions);
708 if (inp->inp_af == AF_INET6) {
709 if (in6p_outputopts(inp) != NULL) {
710 ip6_clearpktopts(in6p_outputopts(inp), -1);
711 free(in6p_outputopts(inp), M_IP6OPT);
713 ip6_freemoptions(in6p_moptions(inp));
719 if (inp->inp_af == AF_INET)
720 pool_cache_put(in4pcb_pool_cache, inp);
722 pool_cache_put(in6pcb_pool_cache, inp);
724 KASSERT(inp->inp_af == AF_INET);
725 pool_cache_put(in4pcb_pool_cache, inp);
734 inpcb_fetch_sockaddr(struct inpcb *inp, struct sockaddr_in *sin)
737 if (inp->inp_af != AF_INET)
740 sockaddr_in_init(sin, &in4p_laddr(inp), inp->inp_lport);
747 inpcb_fetch_peeraddr(struct inpcb *inp, struct sockaddr_in *sin)
750 if (inp->inp_af != AF_INET)
753 sockaddr_in_init(sin, &in4p_faddr(inp), inp->inp_fport);
774 struct inpcb *inp;
783 LIST_FOREACH(inp, head, inp_hash) {
784 if (inp->inp_af != AF_INET)
787 if (in_hosteq(in4p_faddr(inp), faddr) &&
788 inp->inp_fport == fport &&
789 inp->inp_lport == lport &&
790 in_hosteq(in4p_laddr(inp), laddr)) {
791 (*notify)(inp, errno);
802 struct inpcb *inp;
807 TAILQ_FOREACH(inp, &table->inpt_queue, inp_queue) {
808 if (inp->inp_af != AF_INET)
810 if (in_hosteq(in4p_faddr(inp), faddr))
811 (*notify)(inp, errno);
850 struct inpcb *inp;
852 TAILQ_FOREACH(inp, &table->inpt_queue, inp_queue) {
855 if (inp->inp_af != AF_INET)
859 if (!inp_locked(inp)) {
860 inp_lock(inp);
864 in_purgeifmcast(inp->inp_moptions, ifp);
867 inp_unlock(inp);
875 struct inpcb *inp;
877 TAILQ_FOREACH(inp, &table->inpt_queue, inp_queue) {
878 if (inp->inp_af != AF_INET)
880 if ((rt = rtcache_validate(&inp->inp_route)) != NULL &&
882 rtcache_unref(rt, &inp->inp_route);
883 inpcb_rtchange(inp, 0);
885 rtcache_unref(rt, &inp->inp_route);
896 inpcb_losing(struct inpcb *inp)
901 if (inp->inp_af != AF_INET)
904 if ((rt = rtcache_validate(&inp->inp_route)) == NULL)
908 info.rti_info[RTAX_DST] = rtcache_getdst(&inp->inp_route);
918 rtcache_unref(rt, &inp->inp_route);
924 rtcache_unref(rt, &inp->inp_route);
929 rtcache_free(&inp->inp_route);
937 inpcb_rtchange(struct inpcb *inp, int errno)
940 if (inp->inp_af != AF_INET)
943 rtcache_free(&inp->inp_route);
958 struct inpcb *inp;
968 LIST_FOREACH(inp, head, inp_lhash) {
969 if (inp->inp_af != AF_INET)
971 if (inp->inp_lport != lport)
974 * check if inp's faddr and laddr match with ours.
985 if (!in_nullhost(in4p_faddr(inp)))
987 if (in_nullhost(in4p_laddr(inp))) {
994 if (!in_hosteq(in4p_laddr(inp), laddr))
1004 match = inp;
1072 struct inpcb *inp;
1079 LIST_FOREACH(inp, head, inp_hash) {
1080 if (inp->inp_af != AF_INET)
1083 if (in_hosteq(in4p_faddr(inp), faddr) &&
1084 inp->inp_fport == fport &&
1085 inp->inp_lport == lport &&
1086 in_hosteq(in4p_laddr(inp), laddr))
1106 if (inp != LIST_FIRST(head)) {
1107 LIST_REMOVE(inp, inp_hash);
1108 LIST_INSERT_HEAD(head, inp, inp_hash);
1110 return inp;
1122 struct inpcb *inp;
1126 LIST_FOREACH(inp, head, inp_hash) {
1127 if (inp->inp_af != AF_INET)
1130 if (inp->inp_lport == lport &&
1131 in_hosteq(in4p_laddr(inp), laddr))
1135 LIST_FOREACH(inp, head, inp_hash) {
1136 if (inp->inp_af != AF_INET)
1139 if (inp->inp_lport == lport &&
1140 in_hosteq(in4p_laddr(inp), zeroin_addr))
1153 if (inp != LIST_FIRST(head)) {
1154 LIST_REMOVE(inp, inp_hash);
1155 LIST_INSERT_HEAD(head, inp, inp_hash);
1157 return inp;
1161 inpcb_set_state(struct inpcb *inp, int state)
1165 if (inp->inp_af == AF_INET6) {
1166 in6pcb_set_state(inp, state);
1170 if (inp->inp_af != AF_INET)
1174 if (inp->inp_state > INP_ATTACHED)
1175 LIST_REMOVE(inp, inp_hash);
1179 LIST_INSERT_HEAD(INPCBHASH_BIND(inp->inp_table,
1180 in4p_laddr(inp), inp->inp_lport), inp,
1184 LIST_INSERT_HEAD(INPCBHASH_CONNECT(inp->inp_table,
1185 in4p_faddr(inp), inp->inp_fport,
1186 in4p_laddr(inp), inp->inp_lport), inp,
1191 inp->inp_state = state;
1195 inpcb_rtentry(struct inpcb *inp)
1204 if (inp->inp_af == AF_INET6)
1205 return in6pcb_rtentry(inp);
1207 if (inp->inp_af != AF_INET)
1210 ro = &inp->inp_route;
1212 sockaddr_in_init(&u.dst4, &in4p_faddr(inp), 0);
1217 inpcb_rtentry_unref(struct rtentry *rt, struct inpcb *inp)
1220 rtcache_unref(rt, &inp->inp_route);