SCCS-vsn: sys/netinet/in_pcb.h 4.3
SCCS-vsn: sys/netinet/in_pcb.c 4.18
SCCS-vsn: sys/netinet/tcp_input.c 1.56
SCCS-vsn: sys/netinet/udp_usrreq.c 4.21
-/* in_pcb.c 4.17 82/02/27 */
+/* in_pcb.c 4.18 82/03/03 */
#include "../h/param.h"
#include "../h/systm.h"
#include "../h/param.h"
#include "../h/systm.h"
ifp = if_ifonnetof(sin->sin_addr.s_addr);
if (ifp == 0)
ifp = ifnet;
ifp = if_ifonnetof(sin->sin_addr.s_addr);
if (ifp == 0)
ifp = ifnet;
- inp->inp_laddr = ifp->if_addr;
}
if (in_pcblookup(inp->inp_head,
sin->sin_addr, sin->sin_port, inp->inp_laddr, inp->inp_lport, 0))
return (EADDRINUSE);
}
if (in_pcblookup(inp->inp_head,
sin->sin_addr, sin->sin_port, inp->inp_laddr, inp->inp_lport, 0))
return (EADDRINUSE);
+ if (inp->inp_laddr.s_addr == 0)
+ inp->inp_laddr = ifp->if_addr;
inp->inp_faddr = sin->sin_addr;
inp->inp_fport = sin->sin_port;
return (0);
inp->inp_faddr = sin->sin_addr;
inp->inp_fport = sin->sin_port;
return (0);
COUNT(IN_PCBDISCONNECT);
inp->inp_faddr.s_addr = 0;
COUNT(IN_PCBDISCONNECT);
inp->inp_faddr.s_addr = 0;
if (inp->inp_socket->so_state & SS_USERGONE)
in_pcbdetach(inp);
}
if (inp->inp_socket->so_state & SS_USERGONE)
in_pcbdetach(inp);
}
* SHOULD ALLOW MATCH ON MULTI-HOMING ONLY
*/
struct inpcb *
* SHOULD ALLOW MATCH ON MULTI-HOMING ONLY
*/
struct inpcb *
-in_pcblookup(head, faddr, fport, laddr, lport, enter)
+in_pcblookup(head, faddr, fport, laddr, lport, flags)
struct inpcb *head;
struct in_addr faddr, laddr;
u_short fport, lport;
struct inpcb *head;
struct in_addr faddr, laddr;
u_short fport, lport;
{
register struct inpcb *inp, *match = 0;
int matchwild = 3, wildcard;
{
register struct inpcb *inp, *match = 0;
int matchwild = 3, wildcard;
wildcard++;
}
if (inp->inp_faddr.s_addr != 0) {
wildcard++;
}
if (inp->inp_faddr.s_addr != 0) {
- if (inp->inp_faddr.s_addr != faddr.s_addr)
+ if (inp->inp_faddr.s_addr != faddr.s_addr ||
+ inp->inp_fport != fport)
continue;
} else {
if (faddr.s_addr != 0)
wildcard++;
}
continue;
} else {
if (faddr.s_addr != 0)
wildcard++;
}
- if (enter == 0 && wildcard)
+ if (wildcard && (flags & INPLOOKUP_WILDCARD) == 0)
continue;
if (wildcard < matchwild) {
match = inp;
continue;
if (wildcard < matchwild) {
match = inp;
- if (match && enter) {
- match->inp_laddr = laddr;
- in_setsockaddr(match);
- }
-/* in_pcb.h 4.2 81/12/03 */
+/* in_pcb.h 4.3 82/03/03 */
/*
* Common structure pcb for internet protocol implementation.
/*
* Common structure pcb for internet protocol implementation.
caddr_t inp_ppcb; /* pointer to per-protocol pcb */
};
caddr_t inp_ppcb; /* pointer to per-protocol pcb */
};
+#define INPLOOKUP_WILDCARD 1
+#define INPLOOKUP_SETLOCAL 2
+
#define sotoinpcb(so) ((struct inpcb *)(so)->so_pcb)
#ifdef KERNEL
#define sotoinpcb(so) ((struct inpcb *)(so)->so_pcb)
#ifdef KERNEL
-/* tcp_input.c 1.55 82/02/27 */
+/* tcp_input.c 1.56 82/03/03 */
#include "../h/param.h"
#include "../h/systm.h"
#include "../h/param.h"
#include "../h/systm.h"
struct socket *so;
int todrop, acked;
short ostate;
struct socket *so;
int todrop, acked;
short ostate;
* address stored in the block to reflect anchoring.
*/
inp = in_pcblookup
* address stored in the block to reflect anchoring.
*/
inp = in_pcblookup
- (&tcb, ti->ti_src, ti->ti_sport, ti->ti_dst, ti->ti_dport, 1);
+ (&tcb, ti->ti_src, ti->ti_sport, ti->ti_dst, ti->ti_dport,
+ INPLOOKUP_WILDCARD);
/*
* If the state is CLOSED (i.e., TCB does not exist) then
/*
* If the state is CLOSED (i.e., TCB does not exist) then
goto drop;
tcp_in.sin_addr = ti->ti_src;
tcp_in.sin_port = ti->ti_sport;
goto drop;
tcp_in.sin_addr = ti->ti_src;
tcp_in.sin_port = ti->ti_sport;
- if (in_pcbconnect(inp, (struct sockaddr *)&tcp_in))
+ laddr = inp->inp_laddr;
+ if (inp->inp_laddr.s_addr == 0)
+ inp->inp_laddr = ti->ti_dst;
+ if (in_pcbconnect(inp, (struct sockaddr *)&tcp_in)) {
+ inp->inp_laddr = laddr;
tp->t_template = tcp_template(tp);
if (tp->t_template == 0) {
in_pcbdisconnect(inp);
tp->t_template = tcp_template(tp);
if (tp->t_template == 0) {
in_pcbdisconnect(inp);
+ inp->inp_laddr = laddr;
tp->iss = tcp_iss; tcp_iss += TCP_ISSINCR/2;
tp->irs = ti->ti_seq;
tcp_sendseqinit(tp);
tp->iss = tcp_iss; tcp_iss += TCP_ISSINCR/2;
tp->irs = ti->ti_seq;
tcp_sendseqinit(tp);
inp->inp_ppcb = 0;
tp = tcp_newtcpcb(inp);
tp->t_state = TCPS_LISTEN;
inp->inp_ppcb = 0;
tp = tcp_newtcpcb(inp);
tp->t_state = TCPS_LISTEN;
+ inp->inp_faddr.s_addr = 0;
+ inp->inp_fport = 0;
+ inp->inp_laddr.s_addr = 0; /* not quite right */
goto drop;
}
tcp_drop(tp, ECONNREFUSED);
goto drop;
}
tcp_drop(tp, ECONNREFUSED);
-/* udp_usrreq.c 4.20 82/02/27 */
+/* udp_usrreq.c 4.21 82/03/03 */
#include "../h/param.h"
#include "../h/dir.h"
#include "../h/param.h"
#include "../h/dir.h"
* control block to anchor network and host address.
*/
inp = in_pcblookup(&udb,
* control block to anchor network and host address.
*/
inp = in_pcblookup(&udb,
- ui->ui_src, ui->ui_sport, ui->ui_dst, ui->ui_dport, 1);
+ ui->ui_src, ui->ui_sport, ui->ui_dst, ui->ui_dport,
+ INPLOOKUP_WILDCARD);
if (addr) {
in_pcbdisconnect(inp);
inp->inp_laddr = laddr;
if (addr) {
in_pcbdisconnect(inp);
inp->inp_laddr = laddr;