Some time ago I proposed a diff to allow pflow(4) to determine the src IP
address based on the route table if flowsrc was not specified. That diff
was not accepted because having multiple places look up route tables is
undesirable.

Since then henning@ moved UDP checksum calcs into ip_output. That makes
it very simple to allow the pflow flowsrc parameter to be optional. This
diff permits the flowsrc parameter to be unspecified, as was permitted
prior to version 1.35 of if_flow.c, except that now, thanks to henning@,
it works.

Nathanael


Index: sbin/ifconfig/ifconfig.8
===================================================================
RCS file: /cvs/src/sbin/ifconfig/ifconfig.8,v
retrieving revision 1.237
diff -u -p -u -p -r1.237 ifconfig.8
--- sbin/ifconfig/ifconfig.8    13 Oct 2013 10:45:34 -0000      1.237
+++ sbin/ifconfig/ifconfig.8    15 Jan 2014 18:20:18 -0000
@@ -1224,12 +1224,11 @@ Pflow data will be sent to this address/
 Unset the receiver address and stop sending pflow data.
 .It Cm flowsrc Ar addr
 Set the source IP address for pflow packets.
-Must be defined to export pflow data.
 .Ar addr
 is the IP address used as sender of the UDP packets and may be used to
 identify the source of the data on the pflow collector.
 .It Fl flowsrc
-Unset the source address and stop sending pflow data.
+Unset the source address.
 .It Cm pflowproto Ar n
 Set the protocol version.
 The default is version 5.
Index: sbin/ifconfig/ifconfig.c
===================================================================
RCS file: /cvs/src/sbin/ifconfig/ifconfig.c,v
retrieving revision 1.280
diff -u -p -u -p -r1.280 ifconfig.c
--- sbin/ifconfig/ifconfig.c    1 Dec 2013 10:05:29 -0000       1.280
+++ sbin/ifconfig/ifconfig.c    15 Jan 2014 18:20:18 -0000
@@ -3879,8 +3879,9 @@ pflow_status(void)
        if (ioctl(s, SIOCGETPFLOW, (caddr_t)&ifr) == -1)
                 return;
 
-       printf("\tpflow: sender: %s ", preq.sender_ip.s_addr != INADDR_ANY ?
-           inet_ntoa(preq.sender_ip) : "INVALID");
+       printf("\tpflow: ");
+       if (preq.sender_ip.s_addr != INADDR_ANY)
+               printf("sender: %s ", inet_ntoa(preq.sender_ip));
        printf("receiver: %s:", preq.receiver_ip.s_addr != INADDR_ANY ?
            inet_ntoa(preq.receiver_ip) : "INVALID");
        if (preq.receiver_port == 0)
Index: share/man/man4/pflow.4
===================================================================
RCS file: /cvs/src/share/man/man4/pflow.4,v
retrieving revision 1.16
diff -u -p -u -p -r1.16 pflow.4
--- share/man/man4/pflow.4      14 Sep 2013 14:54:30 -0000      1.16
+++ share/man/man4/pflow.4      15 Jan 2014 18:20:18 -0000
@@ -42,8 +42,7 @@ Multiple
 interfaces can be created at runtime using the
 .Ic ifconfig pflow Ns Ar N Ic create
 command.
-Each interface must be configured with a flow sender IP address,
-a flow receiver IP address,
+Each interface must be configured with a flow receiver IP address
 and a flow receiver port number.
 .Pp
 Only states created by a rule marked with the
@@ -92,8 +91,6 @@ collector.
 .Cm flowdst
 defines the collector IP address and the port.
 The
-.Cm flowsrc
-IP address and
 .Cm flowdst
 IP address and port must be defined to enable the export of flows.
 .Pp
Index: sys/net/if_pflow.c
===================================================================
RCS file: /cvs/src/sys/net/if_pflow.c,v
retrieving revision 1.38
diff -u -p -u -p -r1.38 if_pflow.c
--- sys/net/if_pflow.c  1 Nov 2013 14:34:27 -0000       1.38
+++ sys/net/if_pflow.c  15 Jan 2014 18:20:23 -0000
@@ -426,7 +426,6 @@ pflowioctl(struct ifnet *ifp, u_long cmd
                if ((ifp->if_flags & IFF_UP) &&
                    sc->sc_receiver_ip.s_addr != INADDR_ANY &&
                    sc->sc_receiver_port != 0 &&
-                   sc->sc_sender_ip.s_addr != INADDR_ANY &&
                    sc->sc_sender_port != 0) {
                        ifp->if_flags |= IFF_RUNNING;
                        sc->sc_gcounter=pflowstats.pflow_flows;
@@ -506,7 +505,6 @@ pflowioctl(struct ifnet *ifp, u_long cmd
                if ((ifp->if_flags & IFF_UP) &&
                    sc->sc_receiver_ip.s_addr != INADDR_ANY &&
                    sc->sc_receiver_port != 0 &&
-                   sc->sc_sender_ip.s_addr != INADDR_ANY &&
                    sc->sc_sender_port != 0) {
                        ifp->if_flags |= IFF_RUNNING;
                        sc->sc_gcounter=pflowstats.pflow_flows;

Reply via email to