See below.  I'd fixed this problem but forgot about the patch.

Sigh.  Sorry to those who care, but I'm just going to reroll 3.4.30
with this too.  I'm sick of postponing for annoying things like this.

The first two chunks of this patch may fail meaning you'll have to
do the 2nd have of the first chunk yourself (remove "static").

Darren

*** ip6_output.c.orig   Tue Sep 24 09:03:31 2002
--- ip6_output.c        Fri Nov 15 16:04:38 2002
***************
*** 120,132 ****
  
  static int ip6_pcbopts(struct ip6_pktopts **, struct mbuf *, struct socket *);
  static int ip6_setmoptions(int, struct ip6_moptions **, struct mbuf *);
  static int ip6_getmoptions(int, struct ip6_moptions *, struct mbuf **);
  static int ip6_copyexthdr(struct mbuf **, caddr_t, int);
  static int ip6_insertfraghdr(struct mbuf *, struct mbuf *, int,
        struct ip6_frag **);
  static int ip6_insert_jumboopt(struct ip6_exthdrs *, u_int32_t);
  static int ip6_splithdr(struct mbuf *, struct ip6_exthdrs *);
! static int ip6_getpmtu(struct route_in6 *, struct route_in6 *,
        struct ifnet *, struct in6_addr *, u_long *);
  
  /*
--- 120,135 ----
  
  static int ip6_pcbopts(struct ip6_pktopts **, struct mbuf *, struct socket *);
  static int ip6_setmoptions(int, struct ip6_moptions **, struct mbuf *);
+ #if defined(IPFILTER) || defined(IPFILTER_LKM)
+ extern int (*fr_checkp) __P((struct ip *, int, struct ifnet *, int, struct mbuf **));
+ #endif
  static int ip6_getmoptions(int, struct ip6_moptions *, struct mbuf **);
  static int ip6_copyexthdr(struct mbuf **, caddr_t, int);
  static int ip6_insertfraghdr(struct mbuf *, struct mbuf *, int,
        struct ip6_frag **);
  static int ip6_insert_jumboopt(struct ip6_exthdrs *, u_int32_t);
  static int ip6_splithdr(struct mbuf *, struct ip6_exthdrs *);
! int ip6_getpmtu(struct route_in6 *, struct route_in6 *,
        struct ifnet *, struct in6_addr *, u_long *);
  
  /*
***************
*** 796,801 ****
--- 799,823 ----
                goto done;
        ip6 = mtod(m, struct ip6_hdr *);
  #endif
+  
+ #if defined(IPFILTER) || defined(IPFILTER_LKM)     
+       /* 
+        * looks like most checking has been done now...do a filter check
+        */
+       if (fr_checkp != NULL) {
+               struct mbuf *m1 = m;
+               if ((*fr_checkp)((struct ip *)ip6, sizeof(*ip6), ifp, 1, &m1)) {
+                       error = EHOSTUNREACH;
+                       goto done;
+               }
+               m = m1;
+               if (m1 == 0) { /* in case of 'fastroute' */
+                       error = 0;
+                       goto done;
+               }
+               ip6 = mtod(m, struct ip6_hdr *);
+       }
+ #endif
  
        /*
         * Send the packet to the outgoing interface.
***************
*** 1120,1126 ****
        return (0);
  }
  
! static int
  ip6_getpmtu(ro_pmtu, ro, ifp, dst, mtup)
        struct route_in6 *ro_pmtu, *ro;
        struct ifnet *ifp;
--- 1142,1148 ----
        return (0);
  }
  
! int
  ip6_getpmtu(ro_pmtu, ro, ifp, dst, mtup)
        struct route_in6 *ro_pmtu, *ro;
        struct ifnet *ifp;

Reply via email to