Re: divert(4) manpage: add EXAMPLE section

2012-01-26 Thread Henning Brauer
* Lawrence Teo  [2012-01-25 03:49]:
> While working with divert(4), I found that there is a lack of
> documentation that describes how to actually use it.
> 
> This diff attempts to address that by adding an EXAMPLE section to the
> divert(4) manpage. The example consists of a PF rule and a simple
> program that uses the divert port. It is designed to be simple enough
> that someone can try this on their desktop.
> 
> Comments?

I like.

-- 
Henning Brauer, h...@bsws.de, henn...@openbsd.org
BS Web Services, http://bsws.de, Full-Service ISP
Secure Hosting, Mail and DNS Services. Dedicated Servers, Root to Fully Managed
Henning Brauer Consulting, http://henningbrauer.com/



Re: divert(4) manpage: add EXAMPLE section

2012-01-25 Thread Lawrence Teo
On Wed, Jan 25, 2012 at 04:36:00PM +, Jason McIntyre wrote:
> On Tue, Jan 24, 2012 at 09:48:48PM -0500, Lawrence Teo wrote:
> > While working with divert(4), I found that there is a lack of
> > documentation that describes how to actually use it.
> > 
> > This diff attempts to address that by adding an EXAMPLE section to the
> > divert(4) manpage. The example consists of a PF rule and a simple
> > program that uses the divert port. It is designed to be simple enough
> > that someone can try this on their desktop.
> > 
> > Comments?
> > 
> > Thanks,
> > Lawrence
> > 
> 
> committed, thanks. i did tweak the wording a little.
> 
> for future reference for man diffs - new sentences should begin on new
> lines. and the header name is EXAMPLES (plural), not EXAMPLE (singular).
> 
> thanks again,
> jmc

Thank you for committing. I'll keep your comments in mind for future
man diffs.

Lawrence



Re: divert(4) manpage: add EXAMPLE section

2012-01-25 Thread Jason McIntyre
On Tue, Jan 24, 2012 at 09:48:48PM -0500, Lawrence Teo wrote:
> While working with divert(4), I found that there is a lack of
> documentation that describes how to actually use it.
> 
> This diff attempts to address that by adding an EXAMPLE section to the
> divert(4) manpage. The example consists of a PF rule and a simple
> program that uses the divert port. It is designed to be simple enough
> that someone can try this on their desktop.
> 
> Comments?
> 
> Thanks,
> Lawrence
> 

committed, thanks. i did tweak the wording a little.

for future reference for man diffs - new sentences should begin on new
lines. and the header name is EXAMPLES (plural), not EXAMPLE (singular).

thanks again,
jmc

> 
> Index: divert.4
> ===
> RCS file: /cvs/src/share/man/man4/divert.4,v
> retrieving revision 1.6
> diff -u -p -r1.6 divert.4
> --- divert.4  6 Dec 2009 18:32:43 -   1.6
> +++ divert.4  25 Jan 2012 02:37:36 -
> @@ -77,6 +77,94 @@ Receive and send divert socket buffer sp
>  .Xr sysctl 8 .
>  .Xr netstat 1
>  shows information relevant to divert sockets.
> +.Sh EXAMPLE
> +The following PF rule queues outbound IPv4 packets to TCP port 80
> +(and the return traffic) on the em0 interface to divert port 700:
> +.Bd -literal -offset indent
> +pass out on em0 inet proto tcp to port 80 divert-packet port 700
> +.Ed
> +.Pp
> +The following program reads packets on divert port 700 and reinjects them
> +back into the kernel. This program does not perform any processing of the
> +packets, apart from discarding invalid IP packets.
> +.Bd -literal
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +
> +#define DIVERT_PORT 700
> +
> +int
> +main(int argc, char *argv[])
> +{
> + int fd, s;
> + struct sockaddr_in sin;
> + socklen_t sin_len;
> +
> + fd = socket(AF_INET, SOCK_RAW, IPPROTO_DIVERT);
> + if (fd == -1)
> + err(1, "socket");
> +
> + bzero(&sin, sizeof(sin));
> + sin.sin_family = AF_INET;
> + sin.sin_port = htons(DIVERT_PORT);
> + sin.sin_addr.s_addr = 0;
> +
> + sin_len = sizeof(struct sockaddr_in);
> +
> + s = bind(fd, (struct sockaddr *) &sin, sin_len);
> + if (s == -1)
> + err(1, "bind");
> +
> + for (;;) {
> + ssize_t n;
> + char packet[1];
> + struct ip *ip_hdr;
> + struct tcpiphdr *tcpip_hdr;
> + char srcip[40], dstip[40];
> +
> + bzero(packet, sizeof(packet));
> + n = recvfrom(fd, packet, sizeof(packet), 0, (struct sockaddr *) 
> &sin,
> + &sin_len);
> +
> + tcpip_hdr = (struct tcpiphdr *) packet;
> + ip_hdr = (struct ip *) packet;
> +
> + bzero(srcip, sizeof(srcip));
> + bzero(dstip, sizeof(dstip));
> +
> + if (inet_ntop(AF_INET, &ip_hdr->ip_src, srcip, sizeof(srcip)) 
> == NULL) {
> + fprintf(stderr, "Invalid IPv4 source packet\en");
> + continue;
> + }
> + if (inet_ntop(AF_INET, &ip_hdr->ip_dst, dstip, sizeof(dstip)) 
> == NULL) {
> + fprintf(stderr, "Invalid IPv4 destination packet\en");
> + continue;
> + }
> +
> + printf("%s:%u -> %s:%u\en",
> + srcip,
> + ntohs(tcpip_hdr->ti_sport),
> + dstip,
> + ntohs(tcpip_hdr->ti_dport)
> + );
> +
> + n = sendto(fd, packet, n, 0, (struct sockaddr *) &sin, sin_len);
> + }
> +
> + return 0;
> +}
> +.Ed
>  .Sh SEE ALSO
>  .Xr socket 2 ,
>  .Xr ip 4 ,



divert(4) manpage: add EXAMPLE section

2012-01-24 Thread Lawrence Teo
While working with divert(4), I found that there is a lack of
documentation that describes how to actually use it.

This diff attempts to address that by adding an EXAMPLE section to the
divert(4) manpage. The example consists of a PF rule and a simple
program that uses the divert port. It is designed to be simple enough
that someone can try this on their desktop.

Comments?

Thanks,
Lawrence


Index: divert.4
===
RCS file: /cvs/src/share/man/man4/divert.4,v
retrieving revision 1.6
diff -u -p -r1.6 divert.4
--- divert.46 Dec 2009 18:32:43 -   1.6
+++ divert.425 Jan 2012 02:37:36 -
@@ -77,6 +77,94 @@ Receive and send divert socket buffer sp
 .Xr sysctl 8 .
 .Xr netstat 1
 shows information relevant to divert sockets.
+.Sh EXAMPLE
+The following PF rule queues outbound IPv4 packets to TCP port 80
+(and the return traffic) on the em0 interface to divert port 700:
+.Bd -literal -offset indent
+pass out on em0 inet proto tcp to port 80 divert-packet port 700
+.Ed
+.Pp
+The following program reads packets on divert port 700 and reinjects them
+back into the kernel. This program does not perform any processing of the
+packets, apart from discarding invalid IP packets.
+.Bd -literal
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#define DIVERT_PORT 700
+
+int
+main(int argc, char *argv[])
+{
+   int fd, s;
+   struct sockaddr_in sin;
+   socklen_t sin_len;
+
+   fd = socket(AF_INET, SOCK_RAW, IPPROTO_DIVERT);
+   if (fd == -1)
+   err(1, "socket");
+
+   bzero(&sin, sizeof(sin));
+   sin.sin_family = AF_INET;
+   sin.sin_port = htons(DIVERT_PORT);
+   sin.sin_addr.s_addr = 0;
+
+   sin_len = sizeof(struct sockaddr_in);
+
+   s = bind(fd, (struct sockaddr *) &sin, sin_len);
+   if (s == -1)
+   err(1, "bind");
+
+   for (;;) {
+   ssize_t n;
+   char packet[1];
+   struct ip *ip_hdr;
+   struct tcpiphdr *tcpip_hdr;
+   char srcip[40], dstip[40];
+
+   bzero(packet, sizeof(packet));
+   n = recvfrom(fd, packet, sizeof(packet), 0, (struct sockaddr *) 
&sin,
+   &sin_len);
+
+   tcpip_hdr = (struct tcpiphdr *) packet;
+   ip_hdr = (struct ip *) packet;
+
+   bzero(srcip, sizeof(srcip));
+   bzero(dstip, sizeof(dstip));
+
+   if (inet_ntop(AF_INET, &ip_hdr->ip_src, srcip, sizeof(srcip)) 
== NULL) {
+   fprintf(stderr, "Invalid IPv4 source packet\en");
+   continue;
+   }
+   if (inet_ntop(AF_INET, &ip_hdr->ip_dst, dstip, sizeof(dstip)) 
== NULL) {
+   fprintf(stderr, "Invalid IPv4 destination packet\en");
+   continue;
+   }
+
+   printf("%s:%u -> %s:%u\en",
+   srcip,
+   ntohs(tcpip_hdr->ti_sport),
+   dstip,
+   ntohs(tcpip_hdr->ti_dport)
+   );
+
+   n = sendto(fd, packet, n, 0, (struct sockaddr *) &sin, sin_len);
+   }
+
+   return 0;
+}
+.Ed
 .Sh SEE ALSO
 .Xr socket 2 ,
 .Xr ip 4 ,