svn commit: r236261 - head/sys/net

Jung-uk Kim jkim at FreeBSD.org
Tue May 29 22:21:54 UTC 2012


Author: jkim
Date: Tue May 29 22:21:53 2012
New Revision: 236261
URL: http://svn.freebsd.org/changeset/base/236261

Log:
  - Save the previous filter right before we set new one.
  - Reduce duplicate code and make it little easier to read.
  
  MFC after:	2 weeks

Modified:
  head/sys/net/bpf.c

Modified: head/sys/net/bpf.c
==============================================================================
--- head/sys/net/bpf.c	Tue May 29 21:59:09 2012	(r236260)
+++ head/sys/net/bpf.c	Tue May 29 22:21:53 2012	(r236261)
@@ -1709,10 +1709,11 @@ static int
 bpf_setf(struct bpf_d *d, struct bpf_program *fp, u_long cmd)
 {
 	struct bpf_insn *fcode, *old;
-	u_int wfilter, flen, size;
 #ifdef BPF_JITTER
 	bpf_jit_filter *jfunc, *ofunc;
 #endif
+	size_t size;
+	u_int flen;
 	int need_upgrade;
 #ifdef COMPAT_FREEBSD32
 	struct bpf_program32 *fp32;
@@ -1737,6 +1738,12 @@ bpf_setf(struct bpf_d *d, struct bpf_pro
 		break;
 	}
 #endif
+
+	fcode = NULL;
+#ifdef BPF_JITTER
+	jfunc = ofunc = NULL;
+#endif
+
 	/*
 	 * Check new filter validness before acquiring any locks.
 	 * Allocate memory for new filter, if needed.
@@ -1755,63 +1762,14 @@ bpf_setf(struct bpf_d *d, struct bpf_pro
 			free(fcode, M_BPF);
 			return (EINVAL);
 		}
-		/* Filter is copied inside fcode and is perfectly valid */
-	} else
-		fcode = NULL; /* Make compiler happy */
-
 #ifdef BPF_JITTER
-	if (fcode != NULL)
+		/* Filter is copied inside fcode and is perfectly valid */
 		jfunc = bpf_jitter(fcode, flen);
-	else
-		jfunc = NULL; /* Make compiler happy */
 #endif
+	}
 
 	BPF_LOCK();
 
-	if (cmd == BIOCSETWF) {
-		old = d->bd_wfilter;
-		wfilter = 1;
-#ifdef BPF_JITTER
-		ofunc = NULL;
-#endif
-	} else {
-		wfilter = 0;
-		old = d->bd_rfilter;
-#ifdef BPF_JITTER
-		ofunc = d->bd_bfilter;
-#endif
-	}
-	if (fcode == NULL) {
-		/* 
-		 * Protect filter removal by interface lock.
-		 * Additionally, we are protected by global lock here.
-		 */
-		if (d->bd_bif != NULL)
-			BPFIF_WLOCK(d->bd_bif);
-		BPFD_LOCK(d);
-		if (wfilter)
-			d->bd_wfilter = NULL;
-		else {
-			d->bd_rfilter = NULL;
-#ifdef BPF_JITTER
-			d->bd_bfilter = NULL;
-#endif
-			if (cmd == BIOCSETF)
-				reset_d(d);
-		}
-		BPFD_UNLOCK(d);
-		if (d->bd_bif != NULL)
-			BPFIF_WUNLOCK(d->bd_bif);
-		if (old != NULL)
-			free((caddr_t)old, M_BPF);
-#ifdef BPF_JITTER
-		if (ofunc != NULL)
-			bpf_destroy_jit_filter(ofunc);
-#endif
-		BPF_UNLOCK();
-		return (0);
-	}
-
 	/* 
 	 * Set up new filter.
 	 * Protect filter change by interface lock
@@ -1820,25 +1778,30 @@ bpf_setf(struct bpf_d *d, struct bpf_pro
 	if (d->bd_bif != NULL)
 		BPFIF_WLOCK(d->bd_bif);
 	BPFD_LOCK(d);
-	if (wfilter)
+	if (cmd == BIOCSETWF) {
+		old = d->bd_wfilter;
 		d->bd_wfilter = fcode;
-	else {
+	} else {
+		old = d->bd_rfilter;
 		d->bd_rfilter = fcode;
 #ifdef BPF_JITTER
+		ofunc = d->bd_bfilter;
 		d->bd_bfilter = jfunc;
 #endif
 		if (cmd == BIOCSETF)
 			reset_d(d);
 
-		/*
-		 * Do not require upgrade by first BIOCSETF
-		 * (used to set snaplen) by pcap_open_live()
-		 */
-		if ((d->bd_writer != 0) && (--d->bd_writer == 0))
-			need_upgrade = 1;
-		CTR4(KTR_NET, "%s: filter function set by pid %d, "
-		    "bd_writer counter %d, need_upgrade %d",
-		    __func__, d->bd_pid, d->bd_writer, need_upgrade);
+		if (fcode != NULL) {
+			/*
+			 * Do not require upgrade by first BIOCSETF
+			 * (used to set snaplen) by pcap_open_live()
+			 */
+			if ((d->bd_writer != 0) && (--d->bd_writer == 0))
+				need_upgrade = 1;
+			CTR4(KTR_NET, "%s: filter function set by pid %d, "
+			    "bd_writer counter %d, need_upgrade %d",
+			    __func__, d->bd_pid, d->bd_writer, need_upgrade);
+		}
 	}
 	BPFD_UNLOCK(d);
 	if (d->bd_bif != NULL)


More information about the svn-src-head mailing list