Fifoq и altq

classic Classic list List threaded Threaded
10 messages Options
Reply | Threaded
Open this post in threaded view
|

Fifoq и altq

Dinar Talypov
Добрый день,

На днях поигрался с altq и добавил возможность создания fifo queue  в pf.

правило pf имеет вид:

altq on fxp0 fifoq bandwidth 120Kb queue test,

тем самым обрезает исходящий трафик до 128 Кб на интерфейсе fxp0.

патч конечно получился не совсем красивым, отстутвует функционал просмотра статистики по данной очереди,
но судя по http://www.speedguide.net/speedtest/ работает :)

Прошу сильно не пинать, если что-то не работает :))

Цель данного поста показать кому интересно, как можно интегрировать дополнительные виды очередей в PF/ALTQ.

ниже идут сами патчи, кому удобно через веб - http://dinar.yantel.ru/patches/openbsd/altq/fifoq/

--
Dinar Talypov

Index: sys/altq/altq_var.h
===================================================================
RCS file: /cvs/src/sys/altq/altq_var.h,v
retrieving revision 1.15
diff -u -r1.15 altq_var.h
--- sys/altq/altq_var.h 20 Apr 2008 07:05:52 -0000 1.15
+++ sys/altq/altq_var.h 25 Jun 2009 12:06:37 -0000
@@ -131,6 +131,11 @@
 int hfsc_add_queue(struct pf_altq *);
 int hfsc_remove_queue(struct pf_altq *);
 int hfsc_getqstats(struct pf_altq *, void *, int *);
-
+#ifdef ALTQ_FIFOQ
+int fifoq_pfattach(struct pf_altq *);
+int fifoq_getqstats(struct pf_altq *, void *, int *);
+int fifoq_add_altq(struct pf_altq *);
+int fifoq_remove_altq(struct pf_altq *);
+#endif /* ALTQ_FIFOQ */
 #endif /* _KERNEL */
 #endif /* _ALTQ_ALTQ_VAR_H_ */
Index: sys/altq/altq_subr.c
===================================================================
RCS file: /cvs/src/sys/altq/altq_subr.c,v
retrieving revision 1.26
diff -u -r1.26 altq_subr.c
--- sys/altq/altq_subr.c 9 May 2008 14:10:05 -0000 1.26
+++ sys/altq/altq_subr.c 25 Jun 2009 12:07:01 -0000
@@ -374,6 +374,12 @@
  error = hfsc_pfattach(a);
  break;
 #endif
+#ifdef ALTQ_FIFOQ
+ case ALTQT_FIFOQ:
+ error = fifoq_pfattach(a);
+ break;
+#endif
+
  default:
  error = ENXIO;
  }
@@ -441,6 +447,12 @@
  error = hfsc_add_altq(a);
  break;
 #endif
+#ifdef ALTQ_FIFOQ
+ case ALTQT_FIFOQ:
+ error = fifoq_add_altq(a);
+ break;
+#endif
+
  default:
  error = ENXIO;
  }
@@ -475,6 +487,12 @@
  error = hfsc_remove_altq(a);
  break;
 #endif
+#ifdef ALTQ_FIFOQ
+ case ALTQT_FIFOQ:
+ error = fifoq_remove_altq(a);
+ break;
+#endif
+
  default:
  error = ENXIO;
  }
@@ -568,6 +586,12 @@
  error = hfsc_getqstats(a, ubuf, nbytes);
  break;
 #endif
+#ifdef ALTQ_FIFOQ
+ case ALTQT_FIFOQ:
+ error = fifoq_getqstats(a, ubuf, nbytes);
+ break;
+#endif
+
  default:
  error = ENXIO;
  }
--- /dev/null Thu Jun 25 16:07:42 2009
+++ sys/altq/altq_fifoq.c Thu Jun 25 15:40:08 2009
@@ -0,0 +1,437 @@
+/* $KAME: altq_fifoq.c,v 1.7 2000/12/14 08:12:45 thorpej Exp $ */
+
+/*
+ * Copyright (C) 1997-2000
+ * Sony Computer Science Laboratories Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY SONY CSL AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL SONY CSL OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+/*
+ * FIFOQ is an altq sample implementation.  There will be little
+ * need to use FIFOQ as an alternative queueing scheme.
+ * But this code is provided as a template for those who want to
+ * write their own queueing schemes.
+ */
+
+#include <sys/param.h>
+#include <sys/malloc.h>
+#include <sys/mbuf.h>
+#include <sys/socket.h>
+#include <sys/sockio.h>
+#include <sys/systm.h>
+#include <sys/proc.h>
+#include <sys/errno.h>
+#include <sys/kernel.h>
+
+#include <net/if.h>
+#include <net/if_types.h>
+#include <netinet/in.h>
+
+#include <net/pfvar.h>
+#include <altq/altq.h>
+#include <altq/altq_fifoq.h>
+
+#define FIFOQ_STATS /* collect statistics */
+
+/* fifoq_list keeps all fifoq_state_t's allocated. */
+static fifoq_state_t *fifoq_list = NULL;
+
+/* internal function prototypes */
+static int fifoq_enqueue __P((struct ifaltq *, struct mbuf *,
+   struct altq_pktattr *));
+static struct mbuf *fifoq_dequeue __P((struct ifaltq *, int));
+static int fifoq_detach __P((fifoq_state_t *));
+static int fifoq_request __P((struct ifaltq *, int, void *));
+static void fifoq_purge __P((fifoq_state_t *));
+int fifoq_pfattach(struct pf_altq *);
+typedef u_int32_t ioctlcmd_t;
+
+int fifoqioctl(dev_t, ioctlcmd_t, caddr_t addr, int flag, struct proc *);
+
+
+int
+fifoq_pfattach(struct pf_altq *a)
+{
+ struct ifnet *ifp;
+ int s, error;
+
+ printf("fifoq_attaching");
+
+ if ((ifp = ifunit(a->ifname)) == NULL || a->altq_disc == NULL)
+ return (EINVAL);
+ s = splnet();
+ error = altq_attach(&ifp->if_snd, ALTQT_FIFOQ, a->altq_disc,
+    fifoq_enqueue, fifoq_dequeue, fifoq_request, NULL, NULL);
+ splx(s);
+ if (!error)
+ printf("fifoq_attached");
+ return (error);
+}
+
+int
+fifoqioctl(dev, cmd, addr, flag, p)
+ dev_t dev;
+ ioctlcmd_t cmd;
+ caddr_t addr;
+ int flag;
+ struct proc *p;
+{
+ fifoq_state_t *q;
+ struct fifoq_interface *ifacep;
+ struct ifnet *ifp;
+ int error = 0;
+
+ /* check super-user privilege */
+ switch (cmd) {
+ case FIFOQ_GETSTATS:
+ break;
+ default:
+ if ((error = suser(p, 0)) != 0)
+ return (error);
+ break;
+ }
+    
+ switch (cmd) {
+ case FIFOQ_ENABLE:
+ ifacep = (struct fifoq_interface *)addr;
+ if ((q = altq_lookup(ifacep->fifoq_ifname, ALTQT_FIFOQ))
+    == NULL) {
+ error = EBADF;
+ break;
+ }
+ error = altq_enable(q->q_ifq);
+ break;
+
+ case FIFOQ_DISABLE:
+ ifacep = (struct fifoq_interface *)addr;
+ if ((q = altq_lookup(ifacep->fifoq_ifname, ALTQT_FIFOQ))
+    == NULL) {
+ error = EBADF;
+ break;
+ }
+ error = altq_disable(q->q_ifq);
+ break;
+
+ case FIFOQ_IF_ATTACH:
+ ifp = ifunit(((struct fifoq_interface *)addr)->fifoq_ifname);
+ if (ifp == NULL) {
+ error = ENXIO;
+ break;
+ }
+
+ /* allocate and initialize fifoq_state_t */
+ q = malloc( sizeof(fifoq_state_t), M_DEVBUF, M_WAITOK|M_ZERO);
+ if (q == NULL) {
+ error = ENOMEM;
+ break;
+ }
+ bzero(q, sizeof(fifoq_state_t));
+
+ q->q_ifq = &ifp->if_snd;
+ q->q_head = q->q_tail = NULL;
+ q->q_len = 0;
+ q->q_limit = FIFOQ_LIMIT;
+
+ /*
+ * set FIFOQ to this ifnet structure.
+ */
+ error = altq_attach(q->q_ifq, ALTQT_FIFOQ, q,
+    fifoq_enqueue, fifoq_dequeue, fifoq_request,
+    NULL, NULL);
+ if (error) {
+ free(q, M_DEVBUF);
+ break;
+ }
+
+ /* add this state to the fifoq list */
+ q->q_next = fifoq_list;
+ fifoq_list = q;
+ break;
+
+ case FIFOQ_IF_DETACH:
+ ifacep = (struct fifoq_interface *)addr;
+ if ((q = altq_lookup(ifacep->fifoq_ifname, ALTQT_FIFOQ))
+    == NULL) {
+ error = EBADF;
+ break;
+ }
+ error = fifoq_detach(q);
+ break;
+
+ case FIFOQ_GETSTATS:
+ do {
+ struct fifoq_getstats *q_stats;
+
+ q_stats = (struct fifoq_getstats *)addr;
+ if ((q = altq_lookup(q_stats->iface.fifoq_ifname,
+     ALTQT_FIFOQ)) == NULL) {
+ error = EBADF;
+ break;
+ }
+
+ q_stats->q_len = q->q_len;
+ q_stats->q_limit = q->q_limit;
+ q_stats->xmit_cnt = q->q_stats.xmit_cnt;
+ q_stats->drop_cnt = q->q_stats.drop_cnt;
+ q_stats->period   = q->q_stats.period;
+ } while (0);
+ break;
+
+ case FIFOQ_CONFIG:
+ do {
+ struct fifoq_conf *fc;
+ int limit;
+
+ fc = (struct fifoq_conf *)addr;
+ if ((q = altq_lookup(fc->iface.fifoq_ifname,
+     ALTQT_FIFOQ)) == NULL) {
+ error = EBADF;
+ break;
+ }
+ limit = fc->fifoq_limit;
+ if (limit < 0)
+ limit = 0;
+ q->q_limit = limit;
+ fc->fifoq_limit = limit;
+ } while (0);
+ break;
+
+ default:
+ error = EINVAL;
+ break;
+ }
+ return error;
+}
+
+/*
+ * fifoq support routines
+ */
+
+/*
+ * enqueue routine:
+ *
+ * returns: 0 when successfully queued.
+ * ENOBUFS when drop occurs.
+ */
+static int
+fifoq_enqueue(ifq, m, pktattr)
+ struct ifaltq *ifq;
+ struct mbuf *m;
+ struct altq_pktattr *pktattr;
+{
+ fifoq_state_t *q = (fifoq_state_t *)ifq->altq_disc;
+
+ /* if the queue is full, drop the incoming packet(drop-tail) */
+ if (q->q_len >= q->q_limit) {
+#ifdef FIFOQ_STATS
+ PKTCNTR_ADD(&q->q_stats.drop_cnt, m_pktlen(m));
+#endif
+ m_freem(m);
+ return (ENOBUFS);
+ }
+
+ /* enqueue the packet at the taile of the queue */
+ m->m_nextpkt = NULL;
+ if (q->q_tail == NULL)
+ q->q_head = m;
+ else
+ q->q_tail->m_nextpkt = m;
+ q->q_tail = m;
+ q->q_len++;
+ ifq->ifq_len++;
+ return 0;
+}
+
+/*
+ * dequeue routine:
+ * must be called in splimp.
+ *
+ * returns: mbuf dequeued.
+ * NULL when no packet is available in the queue.
+ */
+/*
+ * ALTDQ_PEEK is provided for drivers which need to know the next packet
+ * to send in advance.
+ * when ALTDQ_PEEK is specified, the next packet to be dequeued is
+ * returned without dequeueing the packet.
+ * when ALTDQ_DEQUEUE is called *immediately after* an ALTDQ_PEEK
+ * operation, the same packet should be returned.
+ */
+static struct mbuf *
+fifoq_dequeue(ifq, op)
+ struct ifaltq *ifq;
+ int op;
+{
+ fifoq_state_t *q = (fifoq_state_t *)ifq->altq_disc;
+ struct mbuf *m = NULL;
+
+ if (op == ALTDQ_POLL)
+ return (q->q_head);
+
+ if ((m = q->q_head) == NULL)
+ return (NULL);
+
+ if ((q->q_head = m->m_nextpkt) == NULL)
+ q->q_tail = NULL;
+ m->m_nextpkt = NULL;
+ q->q_len--;
+ ifq->ifq_len--;
+#ifdef FIFOQ_STATS
+ PKTCNTR_ADD(&q->q_stats.xmit_cnt, m_pktlen(m));
+ if (q->q_len == 0)
+ q->q_stats.period++;
+#endif
+ return (m);
+}
+
+static int
+fifoq_request(ifq, req, arg)
+ struct ifaltq *ifq;
+ int req;
+ void *arg;
+{
+ fifoq_state_t *q = (fifoq_state_t *)ifq->altq_disc;
+
+ switch (req) {
+ case ALTRQ_PURGE:
+ fifoq_purge(q);
+ break;
+ }
+ return (0);
+}
+
+
+static int fifoq_detach(q)
+ fifoq_state_t *q;
+{
+ fifoq_state_t *tmp;
+ int error = 0;
+
+ if (ALTQ_IS_ENABLED(q->q_ifq))
+ altq_disable(q->q_ifq);
+
+ fifoq_purge(q);
+
+ if ((error = altq_detach(q->q_ifq)))
+ return (error);
+
+ if (fifoq_list == q)
+ fifoq_list = q->q_next;
+ else {
+ for (tmp = fifoq_list; tmp != NULL; tmp = tmp->q_next)
+ if (tmp->q_next == q) {
+ tmp->q_next = q->q_next;
+ break;
+ }
+ if (tmp == NULL)
+ printf("fifoq_detach: no state in fifoq_list!\n");
+ }
+
+ free(q, M_DEVBUF);
+ return (error);
+}
+
+/*
+ * fifoq_purge
+ * should be called in splimp or after disabling the fifoq.
+ */
+static void fifoq_purge(q)
+ fifoq_state_t *q;
+{
+ struct mbuf *m;
+
+ while ((m = q->q_head) != NULL) {
+ q->q_head = m->m_nextpkt;
+ m_freem(m);
+ }
+ q->q_tail = NULL;
+ q->q_len = 0;
+ if (ALTQ_IS_ENABLED(q->q_ifq))
+ q->q_ifq->ifq_len = 0;
+}
+
+int
+fifoq_getqstats(struct pf_altq *a, void *ubuf, int *nbytes)
+{
+ struct fifoq_getstats *q_stats = (struct fifoq_getstats *)ubuf;
+ fifoq_state_t *q;
+ int error;
+
+ if ((q = altq_lookup(a->ifname, ALTQT_FIFOQ)) == NULL)
+ return(EBADF);
+
+ q_stats->q_len = q->q_len;
+ q_stats->q_limit = q->q_limit;
+ q_stats->xmit_cnt = q->q_stats.xmit_cnt;
+ q_stats->drop_cnt = q->q_stats.drop_cnt;
+ q_stats->period   = q->q_stats.period;
+
+ if ((error = copyout((caddr_t)&q_stats, ubuf, sizeof(q_stats))) != 0)
+ return (error);
+ *nbytes = sizeof(q_stats);
+
+ return(0);
+}
+
+int
+fifoq_add_altq(struct pf_altq *a)
+{
+ fifoq_state_t *fifoqp;
+ struct ifnet *ifp;
+
+ if ((ifp = ifunit(a->ifname)) == NULL)
+ return (EINVAL);
+ if (!ALTQ_IS_READY(&ifp->if_snd))
+ return (ENODEV);
+
+ /* allocate and initialize cbq_state_t */
+ fifoqp = malloc(sizeof(fifoq_state_t), M_DEVBUF, M_WAITOK|M_ZERO);
+ fifoqp->q_ifq = &ifp->if_snd;
+ fifoqp->q_head = fifoqp->q_tail = NULL;
+ fifoqp->q_len = 0;
+ fifoqp->q_limit = FIFOQ_LIMIT;
+
+ /* keep the state in pf_altq */
+ a->altq_disc = fifoqp;
+
+    return(0);
+}
+
+int
+fifoq_remove_altq(struct pf_altq *a)
+{
+ fifoq_state_t *fifoqp;
+
+ if ((fifoqp = a->altq_disc) == NULL)
+ return (EINVAL);
+ a->altq_disc = NULL;
+
+
+ /* deallocate cbq_state_t */
+ free(fifoqp, M_DEVBUF);
+
+ return (0);
+
+    return(0);
+}
--- /dev/null Thu Jun 25 16:07:47 2009
+++ sys/altq/altq_fifoq.h Wed Feb 20 07:30:11 2002
@@ -0,0 +1,79 @@
+/* $KAME: altq_fifoq.h,v 1.6 2000/12/14 08:12:45 thorpej Exp $ */
+
+/*
+ * Copyright (C) 1997-2000
+ * Sony Computer Science Laboratories Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY SONY CSL AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL SONY CSL OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _ALTQ_ALTQ_FIFOQ_H_
+#define _ALTQ_ALTQ_FIFOQ_H_
+
+typedef struct fifoq_state {
+ struct fifoq_state *q_next; /* next fifoq_state in the list */
+ struct ifaltq *q_ifq; /* backpointer to ifaltq */
+
+ struct mbuf *q_head; /* head of queue */
+ struct mbuf *q_tail; /* tail of queue */
+ int q_len; /* queue length */
+ int q_limit; /* max queue length */
+
+ /* statistics */
+ struct {
+ struct pktcntr xmit_cnt;
+ struct pktcntr drop_cnt;
+ u_int period;
+ } q_stats;
+} fifoq_state_t;
+
+struct fifoq_interface {
+ char fifoq_ifname[IFNAMSIZ];
+};
+
+struct fifoq_getstats {
+ struct fifoq_interface iface;
+ int q_len;
+ int q_limit;
+ struct pktcntr xmit_cnt;
+ struct pktcntr drop_cnt;
+ u_int period;
+};
+
+struct fifoq_conf {
+ struct fifoq_interface iface;
+ int fifoq_limit;
+};
+
+#define FIFOQ_LIMIT 50 /* default max queue lenght */
+
+/*
+ * IOCTLs for FIFOQ
+ */
+#define FIFOQ_IF_ATTACH _IOW('Q', 1, struct fifoq_interface)
+#define FIFOQ_IF_DETACH _IOW('Q', 2, struct fifoq_interface)
+#define FIFOQ_ENABLE _IOW('Q', 3, struct fifoq_interface)
+#define FIFOQ_DISABLE _IOW('Q', 4, struct fifoq_interface)
+#define FIFOQ_CONFIG _IOWR('Q', 6, struct fifoq_conf)
+#define FIFOQ_GETSTATS _IOWR('Q', 12, struct fifoq_getstats)
+
+#endif /* _ALTQ_ALTQ_FIFOQ_H_ */
Index: sys/net/pfvar.h
===================================================================
RCS file: /cvs/src/sys/net/pfvar.h,v
retrieving revision 1.289
diff -u -r1.289 pfvar.h
--- sys/net/pfvar.h 8 Jun 2009 02:39:15 -0000 1.289
+++ sys/net/pfvar.h 25 Jun 2009 12:09:33 -0000
@@ -1300,6 +1300,12 @@
  int flags;
 };
 
+#ifdef ALTQ_FIFOQ
+struct fifoq_opts {
+ int queue_limit;
+};
+
+#endif /* ALTQ_FIFOQ*/
 struct hfsc_opts {
  /* real-time service curve */
  u_int rtsc_m1; /* slope of the 1st segment in bps */
@@ -1339,6 +1345,7 @@
  struct cbq_opts cbq_opts;
  struct priq_opts priq_opts;
  struct hfsc_opts hfsc_opts;
+ struct fifoq_opts fifoq_opts;
  } pq_u;
 
  u_int32_t qid; /* return value */

Index: sbin/pfctl/pfctl_parser.h
===================================================================
RCS file: /cvs/src/sbin/pfctl/pfctl_parser.h,v
retrieving revision 1.88
diff -u -r1.88 pfctl_parser.h
--- sbin/pfctl/pfctl_parser.h 6 Apr 2009 12:05:55 -0000 1.88
+++ sbin/pfctl/pfctl_parser.h 25 Jun 2009 12:12:24 -0000
@@ -156,6 +156,7 @@
  struct cbq_opts cbq_opts;
  struct priq_opts priq_opts;
  struct node_hfsc_opts hfsc_opts;
+ struct fifoq_opts fifoq_opts;
  } data;
 };
 
Index: sbin/pfctl/pfctl_altq.c
===================================================================
RCS file: /cvs/src/sbin/pfctl/pfctl_altq.c,v
retrieving revision 1.94
diff -u -r1.94 pfctl_altq.c
--- sbin/pfctl/pfctl_altq.c 25 Jul 2008 17:43:44 -0000 1.94
+++ sbin/pfctl/pfctl_altq.c 25 Jun 2009 12:13:11 -0000
@@ -161,6 +161,9 @@
  if (!print_hfsc_opts(a, qopts))
  printf("hfsc ");
  break;
+ case ALTQT_FIFOQ:
+ printf("fifoq ");
+ break;
  }
 
  if (bw != NULL && bw->bw_percent > 0) {
@@ -208,6 +211,8 @@
  case ALTQT_HFSC:
  print_hfsc_opts(a, qopts);
  break;
+ case ALTQT_FIFOQ:
+ break;
  }
 }
 
@@ -646,6 +651,7 @@
  return (0);
 }
 
+
 /*
  * HFSC support functions
  */
@@ -1132,6 +1138,9 @@
  break;
  case ALTQT_PRIQ:
  pa->pq_u.priq_opts = opts->data.priq_opts;
+ break;
+ case ALTQT_FIFOQ:
+ pa->pq_u.fifoq_opts = opts->data.fifoq_opts;
  break;
  case ALTQT_HFSC:
  pa->pq_u.hfsc_opts.flags = opts->data.hfsc_opts.flags;
Index: sbin/pfctl/parse.y
===================================================================
RCS file: /cvs/src/sbin/pfctl/parse.y,v
retrieving revision 1.559
diff -u -r1.559 parse.y
--- sbin/pfctl/parse.y 14 May 2009 22:56:11 -0000 1.559
+++ sbin/pfctl/parse.y 25 Jun 2009 12:13:59 -0000
@@ -42,6 +42,7 @@
 #include <altq/altq_cbq.h>
 #include <altq/altq_priq.h>
 #include <altq/altq_hfsc.h>
+#include <altq/altq_fifoq.h>
 
 #include <stdio.h>
 #include <unistd.h>
@@ -443,6 +444,7 @@
 %token ANTISPOOF FOR INCLUDE
 %token BITMASK RANDOM SOURCEHASH ROUNDROBIN STATICPORT PROBABILITY
 %token ALTQ CBQ PRIQ HFSC BANDWIDTH TBRSIZE LINKSHARE REALTIME UPPERLIMIT
+%token FIFOQ
 %token QUEUE PRIORITY QLIMIT RTABLE
 %token LOAD RULESET_OPTIMIZATION
 %token STICKYADDRESS MAXSRCSTATES MAXSRCNODES SOURCETRACK GLOBAL RULE
@@ -1566,6 +1568,16 @@
  $$.qtype = ALTQT_HFSC;
  $$.data.hfsc_opts = $3;
  }
+ | FIFOQ {
+ $$.qtype = ALTQT_FIFOQ;
+ $$.data.fifoq_opts.queue_limit = FIFOQ_LIMIT;
+ }
+/* | FIFOQ '(' fifoqflags_list ')' {
+ $$.qtype = ALTQT_FIFIQ;
+ $$.data.fifoq_opts.flags = $3;
+
+ }
+*/
  ;
 
 cbqflags_list : cbqflags_item { $$ |= $1; }
@@ -5191,6 +5203,7 @@
  { "drop-ovl", FRAGDROP},
  { "dup-to", DUPTO},
  { "fastroute", FASTROUTE},
+ { "fifoq", FIFOQ},
  { "file", FILENAME},
  { "fingerprints", FINGERPRINTS},
  { "flags", FLAGS},


Reply | Threaded
Open this post in threaded view
|

Re: Fifoq и altq

irix
Hello Dinar,

Thursday, June 25, 2009, 3:44:41 PM, you wrote:

DT> Добрый день,

DT> На днях поигрался с altq и добавил возможность создания fifo queue  в pf.

DT> правило pf имеет вид:

DT> altq on fxp0 fifoq bandwidth 120Kb queue test,

DT> тем самым обрезает исходящий трафик до 128 Кб на интерфейсе fxp0.

DT> патч конечно получился не совсем красивым, отстутвует функционал
DT> просмотра статистики по данной очереди,
DT> но судя по http://www.speedguide.net/speedtest/ работает :)

DT> Прошу сильно не пинать, если что-то не работает :))

DT> Цель данного поста показать кому интересно, как можно
DT> интегрировать дополнительные виды очередей в PF/ALTQ.

DT> ниже идут сами патчи, кому удобно через веб -
DT> http://dinar.yantel.ru/patches/openbsd/altq/fifoq/


Кондиционеру быть :-)
Может быть ещё Blue и Jobs будут :))

--
Best regards,
 irix                            mailto:[hidden email]


Reply | Threaded
Open this post in threaded view
|

Re: Fifoq и altq

Anton Maksimenkov-2
In reply to this post by Dinar Talypov
25 июня 2009 г. 18:44 пользователь Dinar Talypov ([hidden email]) написал:
> На днях поигрался с altq и добавил возможность создания fifo queue  в pf.

Впечатляет. А можно узнать зачем fifo? Разве остальные (в частности
CBQ) не fifo? В рамках отдельной очереди имеется ввиду.
--
antonvm
Reply | Threaded
Open this post in threaded view
|

Re: Fifoq и altq

Dinar Talypov
On Mon, 29 Jun 2009 14:16:19 +0600
Anton Maksimenkov <[hidden email]> wrote:

> 25 июня 2009 г. 18:44 пользователь Dinar Talypov ([hidden email]) написал:
> > На днях поигрался с altq и добавил возможность создания fifo queue  в pf.
>
> Впечатляет. А можно узнать зачем fifo? Разве остальные (в частности
> CBQ) не fifo? В рамках отдельной очереди имеется ввиду.
> --
> antonvm
чтобы добиться эффекта pipe как в FreeBSD
--
Dinar Talypov


Reply | Threaded
Open this post in threaded view
|

Re: Fifoq и altq

Anton Maksimenkov-2
>> > На днях поигрался с altq и добавил возможность создания fifo queue  в pf.
>> Впечатляет. А можно узнать зачем fifo? Разве остальные (в частности
>> CBQ) не fifo? В рамках отдельной очереди имеется ввиду.
> чтобы добиться эффекта pipe как в FreeBSD

Спрошу по-другому. Чем это дело:
altq on fxp0 fifoq bandwidth 120Kb queue test,

отличается от чего-то типа такого:
altq on fxp0 cbq bandwidth 120Кb queue test
--
antonvm
Reply | Threaded
Open this post in threaded view
|

Re: Fifoq и altq

irix
In reply to this post by Dinar Talypov
Hello Dinar,

Monday, June 29, 2009, 11:36:31 AM, you wrote:

DT> On Mon, 29 Jun 2009 14:16:19 +0600
DT> Anton Maksimenkov <[hidden email]> wrote:

>> 25 июня 2009 г. 18:44 пользователь Dinar Talypov ([hidden email]) написал:
>> > На днях поигрался с altq и добавил возможность создания fifo queue  в pf.
>>
>> Впечатляет. А можно узнать зачем fifo? Разве остальные (в частности
>> CBQ) не fifo? В рамках отдельной очереди имеется ввиду.
>> --
>> antonvm
DT> чтобы добиться эффекта pipe как в FreeBSD

А может быть ещё кондиционер (ALTQ_CDNR) в pfctl добавите ?

что-бы было на подобие этого

altq on fxp0 cbq bandwidth 9M queue { test, test1 } conditioner { test_cond1, test_cond2}
queue test bandwidth 3% cbq (default red)
queue test1 bandwidth 50% cbq (red)
conditioner test_cond1 <tbmeter 6M 64K <pass><drop>>  
conditioner test_cond2 <tbmeter 1M 128K <pass><drop>>

кондициоенр без дефолта

теперь всё заворациваем

pass in on fxp0 from <bad_host> queue test1 conditioner test_cond1

Это уже будет круче чем во фре :)

--
Best regards,
 irix                            mailto:[hidden email]


Reply | Threaded
Open this post in threaded view
|

Re: Fifoq и altq

Dinar Talypov
On Mon, 29 Jun 2009 12:06:34 +0300
irix <[hidden email]> wrote:

> Hello Dinar,
>
> Monday, June 29, 2009, 11:36:31 AM, you wrote:
>
> DT> On Mon, 29 Jun 2009 14:16:19 +0600
> DT> Anton Maksimenkov <[hidden email]> wrote:
>
> >> 25 июня 2009 г. 18:44 пользователь Dinar Talypov ([hidden email]) написал:
> >> > На днях поигрался с altq и добавил возможность создания fifo queue  в pf.
> >>
> >> Впечатляет. А можно узнать зачем fifo? Разве остальные (в частности
> >> CBQ) не fifo? В рамках отдельной очереди имеется ввиду.
> >> --
> >> antonvm
> DT> чтобы добиться эффекта pipe как в FreeBSD
>
> А может быть ещё кондиционер (ALTQ_CDNR) в pfctl добавите ?
>
не за что :))

для меня пока не понятно, что есть кондиционер и чем он отличается от TBR(tocken bucket regulator)


--
Dinar Talypov


Reply | Threaded
Open this post in threaded view
|

Re: Fifoq и altq

Dinar Talypov
In reply to this post by Anton Maksimenkov-2
On Mon, 29 Jun 2009 14:48:09 +0600
Anton Maksimenkov <[hidden email]> wrote:

> >> > На днях поигрался с altq и добавил возможность создания fifo queue  в pf.
> >> Впечатляет. А можно узнать зачем fifo? Разве остальные (в частности
> >> CBQ) не fifo? В рамках отдельной очереди имеется ввиду.
> > чтобы добиться эффекта pipe как в FreeBSD
>
> Спрошу по-другому. Чем это дело:
> altq on fxp0 fifoq bandwidth 120Kb queue test,
>
> отличается от чего-то типа такого:
> altq on fxp0 cbq bandwidth 120Кb queue test

отличается тем, что понятия очереди совсем нет, весь трафик на интерфейсе шейпится

--
Dinar Talypov


Reply | Threaded
Open this post in threaded view
|

Re: Fifoq и altq

irix
In reply to this post by Dinar Talypov
Hello Dinar,

Monday, June 29, 2009, 12:13:24 PM, you wrote:

DT> On Mon, 29 Jun 2009 12:06:34 +0300
DT> irix <[hidden email]> wrote:

>> Hello Dinar,
>>
>> Monday, June 29, 2009, 11:36:31 AM, you wrote:
>>
>> DT> On Mon, 29 Jun 2009 14:16:19 +0600
>> DT> Anton Maksimenkov <[hidden email]> wrote:
>>
>> >> 25 июня 2009 г. 18:44 пользователь Dinar Talypov ([hidden email]) написал:
>> >> > На днях поигрался с altq и добавил возможность создания fifo queue  в pf.
>> >>
>> >> Впечатляет. А можно узнать зачем fifo? Разве остальные (в частности
>> >> CBQ) не fifo? В рамках отдельной очереди имеется ввиду.
>> >> --
>> >> antonvm
>> DT> чтобы добиться эффекта pipe как в FreeBSD
>>
>> А может быть ещё кондиционер (ALTQ_CDNR) в pfctl добавите ?
>>
DT> не за что :))

DT> для меня пока не понятно, что есть кондиционер и чем он
DT> отличается от TBR(tocken bucket regulator)



Э то похоже одно и тоже вот что говорит производитель

A traffic conditioner isn't a queue and doesn't shape traffic.
It simply drops incoming packets exceeding the configured rate,
and this behavior is called policing.
Policing is used as a protective measure againt contract violation of
the other side.
TCP is likely to show poor performacne with simple policing.

To lean more about the token bucket meter mechanism, you should try
"token bucket" on search engines.

-Kenjiro


--
Best regards,
 irix                            mailto:[hidden email]


Reply | Threaded
Open this post in threaded view
|

Re: Fifoq и altq

irix
In reply to this post by Dinar Talypov
Hello Dinar,

Mo У тебя аська есть ?


--
Best regards,
 irix                            mailto:[hidden email]