4 * sock.c (C) 1995-1998 Darren Reed
6 * See the IPFILTER.LICENCE file for details on licencing.
10 static const char sccsid
[] = "@(#)sock.c 1.2 1/11/96 (C)1995 Darren Reed";
11 static const char rcsid
[] = "@(#)Id: sock.c,v 2.8.4.8 2008/07/24 09:30:34 darrenr Exp";
13 #include <sys/param.h>
14 #include <sys/types.h>
18 #if defined(__NetBSD__) && defined(__vax__)
20 * XXX need to declare boolean_t for _KERNEL <sys/files.h>
21 * which ends up including <sys/device.h> for vax. See PR#32907
22 * for further details.
24 typedef int boolean_t
;
29 #if (__FreeBSD_version >= 300000)
30 # include <sys/dirent.h>
36 # include <machine/lock.h>
37 # include <sys/mutex.h>
43 # include <sys/smp_lock.h>
45 # include <sys/file.h>
51 #include <sys/socket.h>
52 #include <sys/socketvar.h>
54 #if !defined(ultrix) && !defined(hpux) && !defined(__osf__)
58 #include <sys/systm.h>
59 #include <sys/session.h>
62 #include <sys/sysctl.h>
63 #include <sys/filedesc.h>
67 #include <netinet/in.h>
68 #include <netinet/in_systm.h>
69 #include <netinet/ip.h>
70 #include <netinet/tcp.h>
72 #if defined(__FreeBSD__)
73 # include "radix_ipf.h"
76 # include <net/route.h>
78 #include <netinet/ip_var.h>
79 #include <netinet/in_pcb.h>
80 #include <netinet/tcp_timer.h>
81 #include <netinet/tcp_var.h>
96 # define KMEM _PATH_KMEM
101 # define KERNEL _PATH_UNIX
105 # define KMEM "/dev/kmem"
108 # define KERNEL "/vmunix"
113 static struct proc
*getproc
__P((void));
115 static struct kinfo_proc
*getproc
__P((void));
119 int kmemcpy(buf
, pos
, n
)
125 off_t offset
= (u_long
)pos
;
128 kfd
= open(KMEM
, O_RDONLY
);
130 if (lseek(kfd
, offset
, SEEK_SET
) == -1)
135 if (read(kfd
, buf
, n
) == -1)
143 struct nlist names
[4] = {
155 static struct proc
*getproc()
158 pid_t pid
= getpid();
161 n
= nlist(KERNEL
, names
);
164 fprintf(stderr
, "nlist(%#x) == %d\n", names
, n
);
167 if (KMCPY(&nproc
, names
[1].n_value
, sizeof(nproc
)) == -1)
169 fprintf(stderr
, "read nproc (%#x)\n", names
[1].n_value
);
172 siz
= nproc
* sizeof(struct proc
);
173 if (KMCPY(&p
, names
[0].n_value
, sizeof(p
)) == -1)
175 fprintf(stderr
, "read(%#x,%#x,%d) proc\n",
176 names
[0].n_value
, &p
, sizeof(p
));
179 proc
= (struct proc
*)malloc(siz
);
180 if (KMCPY(proc
, p
, siz
) == -1)
182 fprintf(stderr
, "read(%#x,%#x,%d) proc\n",
189 for (n
= nproc
; n
; n
--, p
++)
199 struct tcpcb
*find_tcp(fd
, ti
)
210 if (!(p
= getproc()))
212 up
= (struct user
*)malloc(sizeof(*up
));
214 if (KMCPY(up
, p
->p_uarea
, sizeof(*up
)) == -1)
216 fprintf(stderr
, "read(%#x,%#x) failed\n", p
, p
->p_uarea
);
220 if (KMCPY(up
, names
[2].n_value
, sizeof(*up
)) == -1)
222 fprintf(stderr
, "read(%#x,%#x) failed\n", p
, names
[2].n_value
);
227 o
= (struct file
**)calloc(1, sizeof(*o
) * (up
->u_lastfile
+ 1));
228 if (KMCPY(o
, up
->u_ofile
, (up
->u_lastfile
+ 1) * sizeof(*o
)) == -1)
230 fprintf(stderr
, "read(%#x,%#x,%d) - u_ofile - failed\n",
231 up
->u_ofile
, o
, sizeof(*o
));
234 f
= (struct file
*)calloc(1, sizeof(*f
));
235 if (KMCPY(f
, o
[fd
], sizeof(*f
)) == -1)
237 fprintf(stderr
, "read(%#x,%#x,%d) - o[fd] - failed\n",
238 up
->u_ofile
[fd
], f
, sizeof(*f
));
242 s
= (struct socket
*)calloc(1, sizeof(*s
));
243 if (KMCPY(s
, f
->f_data
, sizeof(*s
)) == -1)
245 fprintf(stderr
, "read(%#x,%#x,%d) - f_data - failed\n",
246 o
[fd
], s
, sizeof(*s
));
250 i
= (struct inpcb
*)calloc(1, sizeof(*i
));
251 if (KMCPY(i
, s
->so_pcb
, sizeof(*i
)) == -1)
253 fprintf(stderr
, "kvm_read(%#x,%#x,%d) - so_pcb - failed\n",
254 s
->so_pcb
, i
, sizeof(*i
));
258 t
= (struct tcpcb
*)calloc(1, sizeof(*t
));
259 if (KMCPY(t
, i
->inp_ppcb
, sizeof(*t
)) == -1)
261 fprintf(stderr
, "read(%#x,%#x,%d) - inp_ppcb - failed\n",
262 i
->inp_ppcb
, t
, sizeof(*t
));
265 return (struct tcpcb
*)i
->inp_ppcb
;
268 static struct kinfo_proc
*getproc()
270 static struct kinfo_proc kp
;
271 pid_t pid
= getpid();
277 mib
[2] = KERN_PROC_PID
;
281 if (sysctl(mib
, 4, &kp
, &n
, NULL
, 0) == -1)
290 struct tcpcb
*find_tcp(tfd
, ti
)
298 struct kinfo_proc
*p
;
301 if (!(p
= getproc()))
304 fd
= (struct filedesc
*)malloc(sizeof(*fd
));
307 #if defined( __FreeBSD_version) && __FreeBSD_version >= 500013
308 if (KMCPY(fd
, p
->ki_fd
, sizeof(*fd
)) == -1)
310 fprintf(stderr
, "read(%#lx,%#lx) failed\n",
311 (u_long
)p
, (u_long
)p
->ki_fd
);
316 if (KMCPY(fd
, p
->kp_proc
.p_fd
, sizeof(*fd
)) == -1)
318 fprintf(stderr
, "read(%#lx,%#lx) failed\n",
319 (u_long
)p
, (u_long
)p
->kp_proc
.p_fd
);
331 o
= (struct file
**)calloc(1, sizeof(*o
) * (fd
->fd_lastfile
+ 1));
332 #if defined(__NetBSD_Version__) && __NetBSD_Version__ < 599001200
333 if (KMCPY(o
, fd
->fd_ofiles
, (fd
->fd_lastfile
+ 1) * sizeof(*o
)) == -1)
335 fprintf(stderr
, "read(%#lx,%#lx,%lu) - u_ofile - failed\n",
336 (u_long
)fd
->fd_ofiles
, (u_long
)o
, (u_long
)sizeof(*o
));
340 if (KMCPY(o
, &fd
->fd_dt
->dt_ff
, (fd
->fd_lastfile
+ 1) * sizeof(*o
)) == -1)
342 fprintf(stderr
, "read(%#lx,%#lx,%lu) - u_ofile - failed\n",
343 (u_long
)fd
->fd_dt
->dt_ff
, (u_long
)o
, (u_long
)sizeof(*o
));
347 f
= (struct file
*)calloc(1, sizeof(*f
));
348 if (KMCPY(f
, o
[tfd
], sizeof(*f
)) == -1)
350 fprintf(stderr
, "read(%#lx,%#lx,%lu) - o[tfd] - failed\n",
351 (u_long
)o
[tfd
], (u_long
)f
, (u_long
)sizeof(*f
));
355 s
= (struct socket
*)calloc(1, sizeof(*s
));
356 if (KMCPY(s
, f
->f_data
, sizeof(*s
)) == -1)
358 fprintf(stderr
, "read(%#lx,%#lx,%lu) - f_data - failed\n",
359 (u_long
)f
->f_data
, (u_long
)s
, (u_long
)sizeof(*s
));
363 i
= (struct inpcb
*)calloc(1, sizeof(*i
));
364 if (KMCPY(i
, s
->so_pcb
, sizeof(*i
)) == -1)
366 fprintf(stderr
, "kvm_read(%#lx,%#lx,%lu) - so_pcb - failed\n",
367 (u_long
)s
->so_pcb
, (u_long
)i
, (u_long
)sizeof(*i
));
371 t
= (struct tcpcb
*)calloc(1, sizeof(*t
));
372 if (KMCPY(t
, i
->inp_ppcb
, sizeof(*t
)) == -1)
374 fprintf(stderr
, "read(%#lx,%#lx,%lu) - inp_ppcb - failed\n",
375 (u_long
)i
->inp_ppcb
, (u_long
)t
, (u_long
)sizeof(*t
));
378 return (struct tcpcb
*)i
->inp_ppcb
;
393 #endif /* BSD < 199301 */
395 int do_socket(dev
, mtu
, ti
, gwip
)
401 struct sockaddr_in rsin
, lsin
;
402 struct tcpcb
*t
, tcb
;
406 printf("Dest. Port: %d\n", ti
->ti_dport
);
408 fd
= socket(AF_INET
, SOCK_STREAM
, 0);
415 if (fcntl(fd
, F_SETFL
, FNDELAY
) == -1)
421 bzero((char *)&lsin
, sizeof(lsin
));
422 lsin
.sin_family
= AF_INET
;
423 bcopy((char *)&ti
->ti_src
, (char *)&lsin
.sin_addr
,
424 sizeof(struct in_addr
));
425 if (bind(fd
, (struct sockaddr
*)&lsin
, sizeof(lsin
)) == -1)
431 (void) getsockname(fd
, (struct sockaddr
*)&lsin
, &len
);
432 ti
->ti_sport
= lsin
.sin_port
;
433 printf("sport %d\n", ntohs(lsin
.sin_port
));
435 nfd
= initdevice(dev
, 1);
439 if (!(t
= find_tcp(fd
, ti
)))
442 bzero((char *)&rsin
, sizeof(rsin
));
443 rsin
.sin_family
= AF_INET
;
444 bcopy((char *)&ti
->ti_dst
, (char *)&rsin
.sin_addr
,
445 sizeof(struct in_addr
));
446 rsin
.sin_port
= ti
->ti_dport
;
447 if (connect(fd
, (struct sockaddr
*)&rsin
, sizeof(rsin
)) == -1 &&
448 errno
!= EINPROGRESS
)
453 KMCPY(&tcb
, t
, sizeof(tcb
));
454 ti
->ti_win
= tcb
.rcv_adv
;
455 ti
->ti_seq
= tcb
.snd_nxt
- 1;
456 ti
->ti_ack
= tcb
.rcv_nxt
;
458 if (send_tcp(nfd
, mtu
, (ip_t
*)ti
, gwip
) == -1)
460 (void)write(fd
, "Hello World\n", 12);