Lines Matching defs:inp

232 	struct inpcb *inp;
234 inp = pool_get(&inpcb_pool, (wait == M_WAIT ? PR_WAITOK : PR_NOWAIT) |
236 if (inp == NULL)
238 inp->inp_table = table;
239 inp->inp_socket = so;
240 mtx_init(&inp->inp_sofree_mtx, IPL_SOFTNET);
241 refcnt_init_trace(&inp->inp_refcnt, DT_REFCNT_IDX_INPCB);
242 inp->inp_seclevel.sl_auth = IPSEC_AUTH_LEVEL_DEFAULT;
243 inp->inp_seclevel.sl_esp_trans = IPSEC_ESP_TRANS_LEVEL_DEFAULT;
244 inp->inp_seclevel.sl_esp_network = IPSEC_ESP_NETWORK_LEVEL_DEFAULT;
245 inp->inp_seclevel.sl_ipcomp = IPSEC_IPCOMP_LEVEL_DEFAULT;
246 inp->inp_rtableid = curproc->p_p->ps_rtableid;
247 inp->inp_hops = -1;
251 inp->inp_flags = INP_IPV6;
254 /* inp->inp_flags is initialized to 0 */
259 inp->inp_cksum6 = -1;
265 TAILQ_INSERT_HEAD(&table->inpt_queue, inp, inp_queue);
266 in_pcbhash_insert(inp);
269 so->so_pcb = inp;
275 in_pcbbind_locked(struct inpcb *inp, struct mbuf *nam, const void *laddr,
278 struct socket *so = inp->inp_socket;
283 if (inp->inp_lport)
292 if (ISSET(inp->inp_flags, INP_IPV6)) {
293 if (!IN6_IS_ADDR_UNSPECIFIED(&inp->inp_laddr6))
302 if ((error = in6_pcbaddrisavail_lock(inp, sin6, wild,
311 if (inp->inp_laddr.s_addr != INADDR_ANY)
319 if ((error = in_pcbaddrisavail_lock(inp, sin, wild,
328 if ((error = in_pcbpickport(&lport, laddr, wild, inp, p)))
337 if (ISSET(inp->inp_flags, INP_IPV6))
338 inp->inp_laddr6 = *(struct in6_addr *)laddr;
341 inp->inp_laddr = *(struct in_addr *)laddr;
343 inp->inp_lport = lport;
344 in_pcbrehash(inp);
350 in_pcbbind(struct inpcb *inp, struct mbuf *nam, struct proc *p)
352 struct inpcbtable *table = inp->inp_table;
357 error = in_pcbbind_locked(inp, nam, &zeroin46_addr, p);
364 in_pcbaddrisavail_lock(const struct inpcb *inp, struct sockaddr_in *sin,
367 struct socket *so = inp->inp_socket;
368 struct inpcbtable *table = inp->inp_table;
395 in_broadcast(sin->sin_addr, inp->inp_rtableid))) {
400 ia = ifa_ifwithaddr(sintosa(sin), inp->inp_rtableid);
413 lport, INPLOOKUP_WILDCARD, inp->inp_rtableid, lock);
422 wild, inp->inp_rtableid, lock);
435 in_pcbaddrisavail(const struct inpcb *inp, struct sockaddr_in *sin,
438 return in_pcbaddrisavail_lock(inp, sin, wild, p, IN_PCBLOCK_GRAB);
443 const struct inpcb *inp, struct proc *p)
445 struct socket *so = inp->inp_socket;
446 struct inpcbtable *table = inp->inp_table;
453 if (inp->inp_flags & INP_HIGHPORT) {
456 } else if (inp->inp_flags & INP_LOWPORT) {
491 inp->inp_rtableid, IN_PCBLOCK_HOLD);
505 in_pcbconnect(struct inpcb *inp, struct mbuf *nam)
507 struct inpcbtable *table = inp->inp_table;
514 if (ISSET(inp->inp_flags, INP_IPV6))
515 return (in6_pcbconnect(inp, nam));
522 error = in_pcbselsrc(&ina, sin, inp);
529 t = in_pcblookup_lock(inp->inp_table, sin->sin_addr, sin->sin_port,
530 ina, inp->inp_lport, inp->inp_rtableid, IN_PCBLOCK_HOLD);
536 KASSERT(inp->inp_laddr.s_addr == INADDR_ANY || inp->inp_lport);
538 if (inp->inp_laddr.s_addr == INADDR_ANY) {
539 if (inp->inp_lport == 0) {
540 error = in_pcbbind_locked(inp, NULL, &ina, curproc);
545 t = in_pcblookup_lock(inp->inp_table, sin->sin_addr,
546 sin->sin_port, ina, inp->inp_lport,
547 inp->inp_rtableid, IN_PCBLOCK_HOLD);
549 inp->inp_lport = 0;
554 inp->inp_laddr = ina;
556 inp->inp_faddr = sin->sin_addr;
557 inp->inp_fport = sin->sin_port;
558 in_pcbrehash(inp);
563 inp->inp_flowid = stoeplitz_ip4port(inp->inp_faddr.s_addr,
564 inp->inp_laddr.s_addr, inp->inp_fport, inp->inp_lport);
570 in_pcbdisconnect(struct inpcb *inp)
573 pf_remove_divert_state(inp);
574 pf_inp_unlink(inp);
576 inp->inp_flowid = 0;
577 if (inp->inp_socket->so_state & SS_NOFDREF)
578 in_pcbdetach(inp);
582 in_pcbdetach(struct inpcb *inp)
584 struct socket *so = inp->inp_socket;
585 struct inpcbtable *table = inp->inp_table;
588 mtx_enter(&inp->inp_sofree_mtx);
589 inp->inp_socket = NULL;
590 mtx_leave(&inp->inp_sofree_mtx);
597 if (inp->inp_route.ro_rt) {
598 rtfree(inp->inp_route.ro_rt);
599 inp->inp_route.ro_rt = NULL;
602 if (ISSET(inp->inp_flags, INP_IPV6)) {
603 ip6_freepcbopts(inp->inp_outputopts6);
604 ip6_freemoptions(inp->inp_moptions6);
608 m_freem(inp->inp_options);
609 ip_freemoptions(inp->inp_moptions);
612 pf_remove_divert_state(inp);
613 pf_inp_unlink(inp);
616 LIST_REMOVE(inp, inp_lhash);
617 LIST_REMOVE(inp, inp_hash);
618 TAILQ_REMOVE(&table->inpt_queue, inp, inp_queue);
622 in_pcbunref(inp);
626 in_pcbsolock_ref(struct inpcb *inp)
632 mtx_enter(&inp->inp_sofree_mtx);
633 so = soref(inp->inp_socket);
634 mtx_leave(&inp->inp_sofree_mtx);
642 in_pcbsounlock_rele(struct inpcb *inp, struct socket *so)
646 KASSERT(inp->inp_socket == NULL || inp->inp_socket == so);
652 in_pcbref(struct inpcb *inp)
654 if (inp == NULL)
656 refcnt_take(&inp->inp_refcnt);
657 return inp;
661 in_pcbunref(struct inpcb *inp)
663 if (inp == NULL)
665 if (refcnt_rele(&inp->inp_refcnt) == 0)
667 KASSERT((LIST_NEXT(inp, inp_hash) == NULL) ||
668 (LIST_NEXT(inp, inp_hash) == _Q_INVALID));
669 KASSERT((LIST_NEXT(inp, inp_lhash) == NULL) ||
670 (LIST_NEXT(inp, inp_lhash) == _Q_INVALID));
671 KASSERT((TAILQ_NEXT(inp, inp_queue) == NULL) ||
672 (TAILQ_NEXT(inp, inp_queue) == _Q_INVALID));
673 pool_put(&inpcb_pool, inp);
677 in_pcb_iterator(struct inpcbtable *table, struct inpcb *inp,
684 if (inp)
692 if (inp) {
695 in_pcbunref(inp);
707 in_pcb_iterator_abort(struct inpcbtable *table, struct inpcb *inp,
712 if (inp) {
715 in_pcbunref(inp);
720 in_setsockaddr(struct inpcb *inp, struct mbuf *nam)
725 if (ISSET(inp->inp_flags, INP_IPV6)) {
726 in6_setsockaddr(inp, nam);
736 sin->sin_port = inp->inp_lport;
737 sin->sin_addr = inp->inp_laddr;
741 in_setpeeraddr(struct inpcb *inp, struct mbuf *nam)
746 if (ISSET(inp->inp_flags, INP_IPV6)) {
747 in6_setpeeraddr(inp, nam);
757 sin->sin_port = inp->inp_fport;
758 sin->sin_addr = inp->inp_faddr;
764 struct inpcb *inp;
766 inp = sotoinpcb(so);
767 in_setsockaddr(inp, nam);
775 struct inpcb *inp;
777 inp = sotoinpcb(so);
778 in_setpeeraddr(inp, nam);
796 struct inpcb *inp = NULL;
806 while ((inp = in_pcb_iterator(table, inp, &iter)) != NULL) {
807 KASSERT(!ISSET(inp->inp_flags, INP_IPV6));
809 if (inp->inp_faddr.s_addr != dst->sin_addr.s_addr ||
810 rtable_l2(inp->inp_rtableid) != rdomain) {
814 (*notify)(inp, errno);
827 in_losing(struct inpcb *inp)
829 struct rtentry *rt = inp->inp_route.ro_rt;
832 inp->inp_route.ro_rt = NULL;
845 rtdeletemsg(rt, ifp, inp->inp_rtableid);
851 * rtfree() needs to be called in anycase because the inp
863 in_rtchange(struct inpcb *inp, int errno)
865 if (inp->inp_route.ro_rt) {
866 rtfree(inp->inp_route.ro_rt);
867 inp->inp_route.ro_rt = NULL;
879 struct inpcb *inp, *match = NULL;
900 LIST_FOREACH(inp, head, inp_lhash) {
901 if (rtable_l2(inp->inp_rtableid) != rdomain)
903 if (inp->inp_lport != lport)
908 KASSERT(ISSET(inp->inp_flags, INP_IPV6));
910 if (!IN6_IS_ADDR_UNSPECIFIED(&inp->inp_faddr6))
913 if (!IN6_ARE_ADDR_EQUAL(&inp->inp_laddr6, laddr6)) {
914 if (IN6_IS_ADDR_UNSPECIFIED(&inp->inp_laddr6) ||
924 KASSERT(!ISSET(inp->inp_flags, INP_IPV6));
926 if (inp->inp_faddr.s_addr != INADDR_ANY)
929 if (inp->inp_laddr.s_addr != laddr.s_addr) {
930 if (inp->inp_laddr.s_addr == INADDR_ANY ||
940 match = inp;
954 in_pcbrtentry(struct inpcb *inp)
956 soassertlocked(inp->inp_socket);
959 if (ISSET(inp->inp_flags, INP_IPV6))
960 return in6_pcbrtentry(inp);
963 if (inp->inp_faddr.s_addr == INADDR_ANY)
965 return (route_mpath(&inp->inp_route, &inp->inp_faddr, &inp->inp_laddr,
966 inp->inp_rtableid));
977 struct inpcb *inp)
979 struct ip_moptions *mopts = inp->inp_moptions;
981 const struct in_addr *laddr = &inp->inp_laddr;
982 u_int rtableid = inp->inp_rtableid;
1025 rt = route_mpath(&inp->inp_route, &sin->sin_addr, NULL, rtableid);
1061 in_pcbrehash(struct inpcb *inp)
1063 LIST_REMOVE(inp, inp_lhash);
1064 LIST_REMOVE(inp, inp_hash);
1065 in_pcbhash_insert(inp);
1069 in_pcbhash_insert(struct inpcb *inp)
1071 struct inpcbtable *table = inp->inp_table;
1077 lhash = in_pcblhash(table, inp->inp_rtableid, inp->inp_lport);
1079 LIST_INSERT_HEAD(head, inp, inp_lhash);
1081 if (ISSET(inp->inp_flags, INP_IPV6))
1082 hash = in6_pcbhash(table, rtable_l2(inp->inp_rtableid),
1083 &inp->inp_faddr6, inp->inp_fport,
1084 &inp->inp_laddr6, inp->inp_lport);
1087 hash = in_pcbhash(table, rtable_l2(inp->inp_rtableid),
1088 &inp->inp_faddr, inp->inp_fport,
1089 &inp->inp_laddr, inp->inp_lport);
1091 LIST_INSERT_HEAD(head, inp, inp_hash);
1100 struct inpcb *inp;
1105 LIST_FOREACH(inp, head, inp_hash) {
1106 KASSERT(!ISSET(inp->inp_flags, INP_IPV6));
1108 if (inp->inp_fport == fport && inp->inp_lport == lport &&
1109 inp->inp_faddr.s_addr == faddr->s_addr &&
1110 inp->inp_laddr.s_addr == laddr->s_addr &&
1111 rtable_l2(inp->inp_rtableid) == rdomain) {
1115 if (inp != NULL) {
1121 if (inp != LIST_FIRST(head)) {
1122 LIST_REMOVE(inp, inp_hash);
1123 LIST_INSERT_HEAD(head, inp, inp_hash);
1126 return (inp);
1135 struct inpcb *inp;
1157 TAILQ_FOREACH(inp, &table->inpt_queue, inp_queue) {
1158 if (in_pcb_is_iterator(inp))
1160 LIST_REMOVE(inp, inp_lhash);
1161 LIST_REMOVE(inp, inp_hash);
1162 in_pcbhash_insert(inp);
1187 struct inpcb *inp;
1200 inp = in_pcbhash_lookup(table, hash, rdomain,
1203 in_pcbref(inp);
1208 if (inp == NULL && in_pcbnotifymiss) {
1214 return (inp);
1237 struct inpcb *inp;
1279 inp = in_pcbhash_lookup(table, hash, rdomain,
1281 if (inp == NULL && key1->s_addr != key2->s_addr) {
1284 inp = in_pcbhash_lookup(table, hash, rdomain,
1287 in_pcbref(inp);
1291 if (inp == NULL && in_pcbnotifymiss) {
1296 return (inp);
1300 in_pcbset_rtableid(struct inpcb *inp, u_int rtableid)
1302 struct inpcbtable *table = inp->inp_table;
1309 if (inp->inp_lport) {
1313 inp->inp_rtableid = rtableid;
1314 in_pcbrehash(inp);
1321 in_pcbset_laddr(struct inpcb *inp, const struct sockaddr *sa, u_int rtableid)
1323 struct inpcbtable *table = inp->inp_table;
1326 inp->inp_rtableid = rtableid;
1328 if (ISSET(inp->inp_flags, INP_IPV6)) {
1333 inp->inp_lport = sin6->sin6_port;
1334 inp->inp_laddr6 = sin6->sin6_addr;
1342 inp->inp_lport = sin->sin_port;
1343 inp->inp_laddr = sin->sin_addr;
1345 in_pcbrehash(inp);
1350 in_pcbunset_faddr(struct inpcb *inp)
1352 struct inpcbtable *table = inp->inp_table;
1356 if (ISSET(inp->inp_flags, INP_IPV6))
1357 inp->inp_faddr6 = in6addr_any;
1360 inp->inp_faddr.s_addr = INADDR_ANY;
1361 inp->inp_fport = 0;
1362 in_pcbrehash(inp);
1367 in_pcbunset_laddr(struct inpcb *inp)
1369 struct inpcbtable *table = inp->inp_table;
1373 if (ISSET(inp->inp_flags, INP_IPV6)) {
1374 inp->inp_faddr6 = in6addr_any;
1375 inp->inp_laddr6 = in6addr_any;
1379 inp->inp_faddr.s_addr = INADDR_ANY;
1380 inp->inp_laddr.s_addr = INADDR_ANY;
1382 inp->inp_fport = 0;
1383 in_pcbrehash(inp);