Date: Mon, 6 Mar 2000 18:15:06 +0100 (CET) From: Ludo Koren <lk@tempest.sk> To: robert+freebsd@cyrus.watson.org Cc: luigi@info.iet.unipi.it, ipfw@FreeBSD.ORG Subject: Re: ipdivert and ethernet bridging Message-ID: <200003061715.SAA35436@lk.tempest.sk> In-Reply-To: <Pine.NEB.3.96L.1000306105208.8352D-100000@fledge.watson.org> (message from Robert Watson on Mon, 6 Mar 2000 10:53:28 -0500 (EST))
next in thread | previous in thread | raw e-mail | index | archive | help
> Ludo, > I would be very interested in this code. While I probably > could develop it myself, I'd really rather not :-). > Presumably you pull the same tricks that the normal ip_input > code does for reassembly appropriate-looking packets, etc, etc. The patch follows. Comments are welcomed. ludo Index: src/sys/net/bridge.c =================================================================== RCS file: /home/ncvs/src/sys/net/bridge.c,v retrieving revision 1.4.2.6 diff -c -r1.4.2.6 bridge.c *** bridge.c 2000/01/18 14:07:13 1.4.2.6 --- bridge.c 2000/03/06 17:04:54 *************** *** 645,650 **** --- 645,651 ---- struct ip_fw_chain *rule = NULL ; int off; struct ip *ip ; + extern struct sockaddr_in *ip_fw_fwd_addr; m = *m0 ; #ifdef DUMMYNET *************** *** 708,714 **** * The third parameter to the firewall code is the dst. interface. * Since we apply checks only on input pkts we use NULL. */ ! off = (*ip_fw_chk_ptr)(NULL, 0, NULL, &dummy, &m, &rule, NULL) ; if (m == NULL) { /* pkt discarded by firewall */ /* --- 709,715 ---- * The third parameter to the firewall code is the dst. interface. * Since we apply checks only on input pkts we use NULL. */ ! off = (*ip_fw_chk_ptr)(NULL, 0, NULL, &dummy, &m, &rule, &ip_fw_fwd_addr) ; if (m == NULL) { /* pkt discarded by firewall */ /* *************** *** 719,724 **** --- 720,747 ---- if (canfree) *m0 = NULL ; return 0 ; + } + + if (ip_fw_fwd_addr != NULL) { + eh = mtod(m, struct ether_header *); + ip = (struct ip *)(eh + 1); + + HTONS(ip->ip_len); + HTONS(ip->ip_id); + HTONS(ip->ip_off); + + m_adj(m, sizeof(struct ether_header)); + ip_input(m); + ip_fw_fwd_addr = NULL; + + /* cleanup any mbuf leftover. */ + if (m == *m0) + *m0 = NULL ; + if (canfree && *m0) { + m_freem(*m0); + *m0 = NULL ; + } + return 0; } /* To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-ipfw" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200003061715.SAA35436>