From owner-FreeBSD-tech-jp@jp.freebsd.org  Tue Dec  9 00:30:53 1997
Received: by jaz.jp.freebsd.org (8.8.8+3.0Wbeta7/8.7.3) id AAA17342
	Tue, 9 Dec 1997 00:30:53 +0900 (JST)
Received: by jaz.jp.freebsd.org (8.8.8+3.0Wbeta7/8.7.3) with ESMTP id AAA17337
	for <FreeBSD-tech-jp@jp.freebsd.org>; Tue, 9 Dec 1997 00:30:50 +0900 (JST)
Received: from localhost by gear.csl.sony.co.jp (8.8.5+2.7Wbeta4/2.8Wb)
	id OAA00530; Mon, 8 Dec 1997 14:04:45 GMT
From: Noritoshi Demizu (=?ISO-2022-JP?B?GyRCPVA/ZUshPVMbKEI=?=) <demizu@csl.sony.co.jp>
To: FreeBSD-tech-jp@jp.freebsd.org
In-Reply-To: Your message of "Mon, 08 Dec 1997 11:31:05 +0900"
References: <199712080231.LAA26383@hotaka.csl.sony.co.jp>
X-Mailer: Mew version 1.69 on Emacs 19.28.1 / Mule 2.3
X-URL: http://www.csl.sony.co.jp/person/demizu/
Mime-Version: 1.0
Content-Type: Text/Plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit
Message-Id: <19971208230443Z.demizu@gear.csl.sony.co.jp>
Date: Mon, 08 Dec 1997 23:04:43 +0900
X-Dispatcher: impost version 0.99i (Apr. 6, 1997)
Lines: 112
Reply-To: FreeBSD-tech-jp@jp.freebsd.org
Precedence: bulk
X-Distribute: distribute [version 2.1 (Alpha) patchlevel=24]
X-Sequence: FreeBSD-tech-jp 960
Subject: [FreeBSD-tech-jp 960] Re: =?ISO-2022-JP?B?GyRCQy8kKyEqGyhCd3JpdGU=?==?ISO-2022-JP?B?IBskQiROO0gkJEp9Q04kaiReJDskcyEpGyhC?=
Errors-To: owner-FreeBSD-tech-jp@jp.freebsd.org
Sender: owner-FreeBSD-tech-jp@jp.freebsd.org

$B85%a!<%k$r$J$/$7$F$7$^$C$N$GA4A38!F$$O$:$l$J$3$H$r=q$$$F$$$k$+$b$7$l$^(B
$B$;$s$,!"!"(B

$B$H$j$"$($:$$$^$O(B ATM (en0) $B$O(B bpf $BE*$K$O(B DLT_NULL $B$K8+$($k$h$&$K$J$C$F(B
$B$$$k$H;W$$$^$9!#$G$b(B bpf.c $B$O(B DLT_NULL $B$J$b$N$KBP$9$k(B write(2) $B$r%5%]!<(B
$B%H$7$F$$$J$$$N$G!"<!$N$I$A$i$+$,I,MW$G$O$J$$$+$H;W$$$^$9!#(B
  1) ATM $B$N%G%P%$%9%I%i%$%P$r(B DLT_NULL $B$8$c$J$$$b$N$K$9$k!#(B
	- DLT_AAL5 $B$K$9$Y$-$+(B DLT_LLC $B$K$9$Y$-$+G:$_$=$&$G$9$,!#!#(B
  2) bpf.c $B$G(B DLT_NULL $B$J$H$-$KBP$9$k(B write(2) $B$r$J$s$H$+F0$/$h$&$K$9$k(B

$B$\$/$N8D?ME*$J<B834D6-$G$O(B bpf.c $B$KBP$7$F(B 2) $B$N%3!<%I$rF~$l$F$$$^$9!#(B
DLT_NULL $B$GFI$_=P$7$?$H$-$K!"@hF,$K(B4$B%P%$%H$N(B Address Family $B$,(B machine
byte order $B$G$D$/$3$H$+$i!"Aw$j=P$9;~$K$bF1MM$K(B 4$B%P%$%H$N(B Addr Family 
$B$r(Bmachine byte order $B$GF~$l$J$/$F$O$$$1$J$$%3!<%I$K$7$F$"$j$^$9!#$=$l(B
$B$r(B $B8+$F!"%W%m%H%3%k$rCN$j!"(BIPv4 $B$J$i(B ip_dst$B$r<h$j=P$7$F(B if_output() $B$K(B
$BEO$9$H$$$&!"!"H~$7$/$J$5$2!#$H$$$&$o$1$G!"(BAAL5 $B$K$I$&:\$k$+!"(BLLC/SNAP 
$B$r$D$1$k$+$I$&$+$J$I!"(BATM $B0MB8!"$b$7$/$O(B AAL5 $B0MB8$J(B bit pattern $B$r;X(B
$BDj$9$k$3$H$O$G$-$^$;$s$,!"(B255.255.255.255$B08$N%Q%1%C%H$r(B write(2) $B$9$k(B
$BDxEY$K$O;H$($k$H;W$$$^$9!#(B

en0 $B0J30$G$NF0:n$r3NG'$7$F$$$^$;$s$,!"$H$j$"$($:<!DxEY$N%Q%C%A$GF0$/$3(B
$B$H$OF0$$$F$^$9!#(B($B$?$V$s$3$l$@$1$@$C$?$H;W$&(B)



--- bpf.c-ORG	Thu Oct 23 11:05:25 1997
+++ bpf.c	Tue Oct 28 18:12:31 1997
@@ -94,6 +94,10 @@
 
 #include <netinet/in.h>
 #include <netinet/if_ether.h>
+#ifdef AF_INET
+#include <netinet/in_systm.h>
+#include <netinet/ip.h>
+#endif
 #include <sys/kernel.h>
 #include <sys/sysctl.h>
 #include <sys/conf.h>
@@ -148,6 +152,7 @@
 		    u_int, void (*)(const void *, void *, u_int)));
 static void	reset_d __P((struct bpf_d *));
 static int	 bpf_setf __P((struct bpf_d *, struct bpf_program *));
+static void	bpf_null __P((struct mbuf **, struct sockaddr *, int *));
 
 static	d_open_t	bpfopen;
 static	d_close_t	bpfclose;
@@ -256,8 +261,11 @@
 			goto bad;
 	}
 	error = UIOMOVE(mtod(m, caddr_t), len - hlen, UIO_WRITE, uio);
-	if (!error)
+	if (!error) {
+		if (linktype == DLT_NULL)
+			bpf_null(mp, sockp, datlen);
 		return (0);
+	}
  bad:
 	m_freem(m);
 	return (error);
@@ -1346,6 +1354,52 @@
 		}
 #endif
     	}
+}
+
+
+static void
+bpf_null(mp, sockp, datlen)
+	register struct mbuf **mp;
+	register struct sockaddr *sockp;
+	int *datlen;
+{
+	struct mbuf *m = *mp;
+	u_long af;
+	int decap = 0;
+
+	/* First 4 bytes of DLT_NULL-type data represents
+	 * an address family of a packet in the data in host-order. */
+	af = *mtod(m, u_long*);
+
+	switch (af) {
+#ifdef AF_INET
+	  case AF_INET:
+		{
+		struct ip* iphdr = mtod(m, struct ip*);
+		struct sockaddr_in* sinp = (struct sockaddr_in*)sockp;
+
+		bzero(sinp, sizeof(struct sockaddr_in));
+		sinp->sin_family = AF_INET;
+		sinp->sin_len = sizeof(struct sockaddr_in);
+		sinp->sin_addr = iphdr->ip_dst;
+		decap = 1;
+		}
+		break;
+#endif
+	  default:
+		break;
+	}
+
+	if (decap) {
+		m->m_pkthdr.len -= 4;
+		m->m_len -= 4;
+#if BSD >= 199103
+		m->m_data += 4; /* XXX */
+#else
+		m->m_off += 4;
+#endif
+		*datlen -= 4;
+	}
 }
 
 SYSINIT(bpfdev,SI_SUB_DRIVERS,SI_ORDER_MIDDLE+CDEV_MAJOR,bpf_drvinit,NULL)
