From owner-svn-src-head@FreeBSD.ORG Tue May 29 22:21:54 2012 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id D28AD106564A; Tue, 29 May 2012 22:21:54 +0000 (UTC) (envelope-from jkim@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 6AD618FC0A; Tue, 29 May 2012 22:21:54 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q4TMLs3P006467; Tue, 29 May 2012 22:21:54 GMT (envelope-from jkim@svn.freebsd.org) Received: (from jkim@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q4TMLsTA006465; Tue, 29 May 2012 22:21:54 GMT (envelope-from jkim@svn.freebsd.org) Message-Id: <201205292221.q4TMLsTA006465@svn.freebsd.org> From: Jung-uk Kim Date: Tue, 29 May 2012 22:21:54 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r236261 - head/sys/net X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 29 May 2012 22:21:54 -0000 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)