diff options
author | 2002-11-23 18:47:28 +0000 | |
---|---|---|
committer | 2002-11-23 18:47:28 +0000 | |
commit | 7233553306b360fb4d0132e9084638d9d1372e93 (patch) | |
tree | b012623c6992d73751c86b4dd89f75d2b14625d4 | |
parent | sync (diff) | |
download | wireguard-openbsd-7233553306b360fb4d0132e9084638d9d1372e93.tar.xz wireguard-openbsd-7233553306b360fb4d0132e9084638d9d1372e93.zip |
bye bye
71 files changed, 2 insertions, 14557 deletions
diff --git a/usr.sbin/Makefile b/usr.sbin/Makefile index 0e41059649f..9bb3bc91609 100644 --- a/usr.sbin/Makefile +++ b/usr.sbin/Makefile @@ -1,10 +1,10 @@ -# $OpenBSD: Makefile,v 1.90 2002/06/21 06:22:20 deraadt Exp $ +# $OpenBSD: Makefile,v 1.91 2002/11/23 18:47:28 deraadt Exp $ # not yet done: catman .include <bsd.own.mk> -SUBDIR= ac accton adduser altq amd arp authpf \ +SUBDIR= ac accton adduser amd arp authpf \ bootpd bootpgw bootpef bootptest \ chroot config cron dev_mkdb dhcp \ edquota gspa httpd inetd iostat \ diff --git a/usr.sbin/altq/Makefile b/usr.sbin/altq/Makefile deleted file mode 100644 index a07540d6907..00000000000 --- a/usr.sbin/altq/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -# $OpenBSD: Makefile,v 1.1.1.1 2001/06/27 18:23:16 kjc Exp $ -# $NetBSD: Makefile,v 1.2 2001/01/09 03:13:41 lukem Exp $ - -SUBDIR= libaltq altqd altqstat tbrconfig - -.include <bsd.subdir.mk> diff --git a/usr.sbin/altq/Makefile.inc b/usr.sbin/altq/Makefile.inc deleted file mode 100644 index 3835c659558..00000000000 --- a/usr.sbin/altq/Makefile.inc +++ /dev/null @@ -1,6 +0,0 @@ -# $OpenBSD: Makefile.inc,v 1.1.1.1 2001/06/27 18:23:16 kjc Exp $ -# $NetBSD: Makefile.inc,v 1.1 2000/12/16 18:57:34 thorpej Exp $ - -.if exists(${.CURDIR}/../../Makefile.inc) -.include "${.CURDIR}/../../Makefile.inc" -.endif diff --git a/usr.sbin/altq/altqd/Makefile b/usr.sbin/altq/altqd/Makefile deleted file mode 100644 index 6fb4cb9da4a..00000000000 --- a/usr.sbin/altq/altqd/Makefile +++ /dev/null @@ -1,27 +0,0 @@ -# $OpenBSD: Makefile,v 1.5 2002/02/07 23:13:53 art Exp $ -# $NetBSD: Makefile,v 1.3 2001/01/11 13:15:06 enami Exp $ - -SUBDIR=altq.conf.samples - -.include <bsd.own.mk> -.include <bsd.obj.mk> - -PROG= altqd -MAN= altqd.8 altq.conf.5 - -SRCS= altqd.c libaltq2.c - -CPPFLAGS+= -DALTQ -I${.CURDIR}/../libaltq - -.if exists(${.CURDIR}/../libaltq/${__objdir}) -LDADD+= -L${.CURDIR}/../libaltq/${__objdir} -laltq -DPADD+= ${.CURDIR}/../libaltq/${__objdir}/libaltq.a -.else -LDADD+= -L${.CURDIR}/../libaltq -laltq -DPADD+= ${.CURDIR}/../libaltq/libaltq.a -.endif - -LDADD+= -lm -lutil -DPADD+= ${LIBM} ${LIBUTIL} - -.include <bsd.prog.mk> diff --git a/usr.sbin/altq/altqd/altq.conf.5 b/usr.sbin/altq/altqd/altq.conf.5 deleted file mode 100644 index 54567246506..00000000000 --- a/usr.sbin/altq/altqd/altq.conf.5 +++ /dev/null @@ -1,1191 +0,0 @@ -.\" $OpenBSD: altq.conf.5,v 1.8 2002/11/17 02:46:30 kjc Exp $ -.\" $KAME: altq.conf.5,v 1.11 2001/07/25 10:40:15 kjc Exp $ -.\" -.\" Copyright (C) 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. -.\" -.Dd September 28, 1999 -.Dt ALTQ.CONF 5 -.Os -.\" -.Sh NAME -.Nm altq.conf -.Nd ALTQ configuration file -.\" -.Sh DESCRIPTION -The -.Nm -file contains a number of lines specifying the behavior of queueing -disciplines. -Comments start with a # and extend to the end of the line. -.Pp -The -.Xr altqd 8 -program reads -.Pa /etc/altq.conf -at startup and sets up queueing disciplines. -BLUE, CBQ (Class-Based Queueing), FIFOQ (First-In First-Out Queue), -HFSC (Hierarchical Fair Service Curve), PRIQ (Priority Queueing), -RED (Random Early Detection), RIO (RED with IN/OUT), -WFQ (Weighted Fair Queueing), -and CDNR (Diffserv Traffic Conditioner) can be configured in this file. -.Ss Interface Commands -.Bl -tag -width interface -offset indent -.It Cm interface -.Ar if_name -.Op Cm bandwidth Ar bps -.Op Cm tbrsize Ar bytes -.Op Ar sched_type -.Op Ar discipline-specific-options -.El -.Pp -The -.Cm interface -command specifies a network interface to be under control of ALTQ. -One interface specification is provided for each network interface -under control of ALTQ. -A system configured as a router may have multiple interface -specifications. -.Bl -tag -width 8n -offset indent -.It Ar if_name -specifies the name of a network interface (e.g., fxp0). -.It Cm bandwidth -specifies the interface bandwidth in bits per second. -This is the maximum rate that the queueing discipline will allow on this -interface. -.It Cm tbrsize -specifies the bucket size of a token bucket regulator in bytes. -When -.Cm tbrsize -is omitted, the system automatically sets the bucket size -using heuristics. -The token rate is set to the interface bandwidth specified by the -.Cm interface -command. -.It Ar sched_type -Type of a queueing discipline. -It must be either -.Cm blue , -.Cm cbq , -.Cm fifoq , -.Cm hfsc , -.Cm priq , -.Cm red , -.Cm rio , -or -.Cm wfq . -If the interface has only traffic conditioners and no queueing -discipline, -.Ar sched_type -can be omitted. -.El -.Ss Class Command -.Bl -tag -width class -offset indent -.It Cm class -.Ar sched_type -.Ar if_name -.Ar class_name -.Ar parent_name -.Op Cm red|rio -.Op Cm ecn -.Op Cm cleardscp -.Op Ar discipline-specific-options -.El -.Pp -The -.Cm class -command specifies a packet scheduling class for CBQ, HFSC, or PRIQ. -A class specifier must be provided for each packet scheduling class. -.Bl -tag -width 8n -offset indent -.It Ar sched_type -Type of queueing discipline. -Must correspond to the discipline name in interface specification. -.It Ar if_name -Interface name. -Must correspond to name in interface specification. -.It Ar class_name -Arbitrary name for this class. -Must be unique for this interface. -.It Ar parent_name -The name of the parent class for this class (for CBQ or HFSC). -Parent class must have been previously defined. -PRIQ does not have class hierarchy and parent_name must be -.Dv NULL -for PRIQ classes. -.It Cm red -Use RED (Random Early Detection) on this class queue. -RED drops packets with the probability proportional to the average -queue length. -.It Cm rio -Use RIO (RED with In/Out bit) on this class queue. -RIO runs triple RED algorithms at the same time. -.It Cm ecn -Use RED/ECN (Explicit Congestion Notification) on this -class queue (experimental implementation). -ECN implies RED. -.It Cm cleardscp -Clear diffserv codepoint in the IP header. -.El -.Ss Filter Commands -.Bl -tag -width filter -offset indent -.It Cm filter -.Ar if_name -.Ar class_name -.Op Cm name Ar fltr_name -.Op Cm ruleno Ar num -.Ar filter_values -.El -.Pp -The -.Cm filter -command specifies a filter to classify packets into -a scheduling class. -A filter specifier determines any statically-defined packet -classification rules. -.Bl -tag -width 10n -offset indent -.It Ar if_name -Name of a network interface (e.g., fxp0). -.It Ar class_name -Name of a class or a conditioner to which matching packets are directed. -.It Cm name -Add an arbitrary name to the filter for a future refenece. -.It Cm ruleno -Specifies explicit order of filter matching. -Filter matching is performed from a filter with a larger ruleno. -Default is 0. -.El -.Pp -.Ar filter_value -should be in the following format: -.Bl -tag -width filter -offset indent -.Ar filter_values : -.Ad dst_addr Op Cm netmask Ar mask -.Ar dport -.Ad src_addr Op Cm netmask Ar mask -.Ar sport -.Ar proto -.Oo -.Cm tos -.Ar value -.Op Cm tosmask Ar value -.Oc -.Op Cm gpi Ar value -.El -.Pp -Here -.Ad dst_addr -and -.Ad src_addr -are dotted-decimal addresses of -the destination and the source respectively. -An address may be followed by -.Cm netmask -keyword. -.Ar dport -and -.Ar sport -are port numbers of the destination and the source respectively. -.Ar proto -is a protocol number defined for IP packets (e.g. 6 for TCP). -.Cm tos -keyword can be used to specify the type of service field value. -.Cm gpi -keyword can be used to specify the Security Parameter Index value for -IPsec. -.Pp -When filter value 0 is used, it is taken as a wildcard. -.Bl -tag -width filter6 -offset indent -.It Cm filter6 -.Ar if_name -.Ar class_name -.Op Cm name Ar fltr_name -.Op Cm ruleno Ar num -.Ar filter6_values -.El -.Pp -The -.Cm filter6 -command is for IPv6. -.Ar filter6_value -should be in the following format: -.Bl -tag -width filter6 -offset indent -.It filter6_values : -.Ad dst_addr Ns Op /prefix_len -.Ar dport -.Ad src_addr Ns Op /prefix_len -.Ar sport -.Ar proto -.Op Cm flowlabel Ar value -.Oo -.Cm tclass -.Ar value -.Op Cm tclassmask Ar value -.Oc -.Op Cm gpi Ar value -.El -.Pp -Here -.Ad dst_addr -and -.Ad src_addr -are IPv6 addresses of the destination and the source respectively. -An address may be followed by an optional address prefix length. -.Ar dport -and -.Ar sport -are port numbers of the destination and the source respectively. -.Ar proto -is a protocol number defined for IPv6 packets (e.g. 6 for TCP). -.Cm flowlabel -keyword can be used to specify the flowlabel field value. -.Cm tclass -keyword can be used to specify the traffic class field value. -.Cm gpi -keyword can be used to specify the Security Parameter Index value for -IPsec. -.Pp -When filter value 0 is used, it is taken as a wildcard. -.Ss CBQ Commands -CBQ (Class Based Queueing) achieves both partitioning and sharing of -link bandwidth by hierarchically structured classes. -Each class has its own queue and is assigned its share of bandwidth. -A child class can borrow bandwidth from its parent class as long as -excess bandwidth is available. -.Bl -tag -width interface -offset indent -.It Cm interface -.Ar if_name -.Op Cm bandwidth Ar bps -.Op Cm tbrsize Ar bytes -.Op Ar sched_type -.Op Cm efficient -.El -.Pp -.Bl -tag -width 8n -offset indent -.It Ar if_name -specifies the name of a network interface (e.g., fxp0). -.It Cm bandwidth -specifies the interface bandwidth in bits per second. -.It Cm tbrsize -specifies the bucket size of a token bucket regulator in bytes. -.It Ar sched_type -must be either -.Cm cbq , -.Cm cbq-wrr -(weighted-round robin) or -.Cm cbq-prr -(packet-by-packet round robin). -.Cm cbq -is equivalent to -.Cm cbq-wrr . -.It Cm efficient -Enables CBQ's link efficiency mode. -This means that the scheduler will send a packet from the first -overlimit class it encounters of all classes of the link-sharing -structure when all classes are overlimit. -This will also cause the scheduler to use greater than it's assigned -bandwidth, if the link is capable of more than the assigned bandwidth. -By default, this mode is turned off. -By adding the keyword -.Cm efficient -to the interface specification line, enables this mode. -.El -.Pp -.Bl -tag -width class -offset indent -.It Cm class -.Ar sched_type -.Ar if_name -.Ar class_name -.Ar parent_name -.Op Cm admission cntlload|none -.Op Cm priority Ar pri -.Op Cm pbandwidth Ar percent -.Op Cm exactbandwidth Ar bps -.Op Cm borrow -.Op Cm default -.Op Cm control -.Op Cm maxburst Ar count -.Op Cm minburst Ar count -.Bk -words -.Op Cm maxdelay Ar msec -.Ek -.Op Cm packetsize Ar bytes -.Op Cm maxpacketsize Ar bytes -.Op Cm red|rio -.Op Cm ecn -.Op Cm flowvalve -.Op Cm cleardscp -.El -.Pp -The -.Cm class -command specifies a CBQ class. -The classes are organized as a hierarchy, and every class, except -for the root class, has a parent. -.Bl -tag -width 8n -offset indent -.It Ar sched_type -must be -.Cm cbq -for a CBQ class. -.It Ar if_name -Interface name. -Must correspond to name in interface specification. -.It Ar class_name -Arbitrary name for this class. -Must be unique within the class -hierarchy for this interface. -The name -.Cm ctl_class -is a reserved class name. -.It Cm parent_name -The name of the parent class for this class or -.Dv NULL -if this is the root class. -Parent class must have been previously defined. -.It Cm admission -The type of admission control and QoS type. -.Cm cntlload -is controlled load service for RSVP, otherwise, it should be -.Cm none . -The default is -.Cm none . -.It Cm priority -High numbers are higher priority. -Max value is 7 and Min value is 0. -Default is 1. -.It Cm pbandwidth -The percentage of the interface bandwidth allocated to this class. -Generally should add up to 100 percent at each level of the class -hierarchy, although other amounts can be specified for purposes of -experimentation. -.It Cm exactbandwidth -Specify the bandwidth in bits-per-second instead of -.Cm pbandwidth . -Note that the bandwidth allocation of CBQ is not so precise but this -is just a way to pass a parameter to CBQ; the user is supposed to know -the detailed internals of CBQ. -.Cm pbandwidth -is a preferred way to specify the bandwidth of a class. -.It Cm borrow -The class can borrow bandwidth from its parent class when this class -is overlimit. -If this keyword is not present, then no borrowing is done, and the -packet is delayed or dropped when the class is overlimit. -.It Cm default -Specify the default class. -When this keyword is present, all packets that do not match some -classification criteria are assigned to this class. -Must be exactly one class on each interface defined as the default -class. -.It Cm control -Specify the control class. -When this keyword is present, the predefined control class packets -(RSVP, IGMP, and ICMP) are assigned to this class. -Note that when the control class is not specified by the time the -default class is created, one is automatically created with default -parameters. -Thus, if the control class is specified, it must be listed before the -default class. -Must be exactly one class on each interface defined as the control -class. -.It Cm maxburst -The maximum burst of back-to-back packets allowed in this class. -Default is 16 but the default value is automatically reduced to 4 when -the class bandwidth is small (about less than 1Mbps). -.It Cm minburst -The minimum burst is used to obtain the steady state burst size. -It's the parameter to help compute offtime for the class. -Offtime is the amount of time a class is to wait between packets. -Default is 2. -.It Cm maxdelay -The maxdelay is specified in millisecond and used to obtain the max -queue size of the class. -If not specified, the default max queue size (30 packets) is used. -.It Cm packetsize -The average packet size in bytes to be used in CBQ over-/under-limit -computations. -Default value is MTU of the interface. -.It Cm maxpacketsize -The maximum packet size in bytes for the class. -Default value is MTU of the interface. -.It Cm red -enables RED on this class queue. -.It Cm rio -enables RIO on this class queue. -.It Cm ecn -enables RED/ECN on this class queue. -.It Cm flowvalve -enables RED/flow-valve (a.k.a. red-penalty-box) on this class queue. -.It Cm cleardscp -clears diffserv codepoint in the IP header. -.El -.Ss HFSC Commands -HFSC (Hierarchical Fair Service Curve) supports both link-sharing and -guaranteed real-time services. -H-FSC employs a service curve based QoS model, and its unique feature -is an ability to decouple delay and bandwidth allocation. -HFSC has 2 independent scheduling mechanisms. -Real-time scheduling is used to guarantee the delay and the -bandwidth allocation at the same time. -Hierarchical link-sharing is used to distribute the excess -bandwidth. -When dequeueing a packet, HFSC always tries real-time scheduling -first. -If no packet is eligible for real-time scheduling, link-sharing -scheduling is performed. -HFSC does not use class hierarchy for real-time scheduling. -.Bl -tag -width interface -offset indent -.It Cm interface -.Ar if_name -.Op Cm bandwidth Ar bps -.Op Cm tbrsize Ar bytes -.Op Ar sched_type -.El -.Pp -.Bl -tag -width 8n -offset indent -.It Ar if_name -specifies the name of a network interface (e.g., fxp0). -.It Cm bandwidth -specifies the interface bandwidth in bits per second. -.It Cm tbrsize -specifies the bucket size of a token bucket regulator in bytes. -.It Ar sched_type -must be -.Cm hfsc -for HFSC. -.El -.Pp -.Bl -tag -width class -offset indent -.It Cm class -.Ar sched_type -.Ar if_name -.Ar class_name -.Ar parent_name -.Op Cm admission cntlload|none -.Op Bq Cm sc Ar m1 d m2 -.Op Bq Cm rt Ar m1 d m2 -.Op Bq Cm ls Ar m1 d m2 -.Op Cm pshare Ar percent -.Op Cm grate Ar bps -.Op Cm default -.Op Cm qlimit Ar count -.Op Cm red|rio -.Op Cm ecn -.Op Cm cleardscp -.El -.Pp -The -.Cm class -command specifies a HFSC class. -The classes are organized as a hierarchy, and every class, except -for the root class, has a parent. -.Pp -Each HFSC class has 2 service curves, the real-time service curve and -the link-sharing service curve. -Service curves are specified by -.Bq Ar type Ar m1 d m2 . -.Ar type -should be either -.Cm sc, rt -or -.Cm ls . -.Cm sc -(service curve) is used to set the same values to both service curves. -.Cm rt -(real-time) is used to specify the real-time service curve. -.Cm ls -(link-sharing) is used to specify the link-sharing service curve. -.Ar m1 -is the slope of the first segment specified in bits-per-second. -.Ar d -is the x-projection of the intersection point of the 2 segments -specified in milli-second. -.Ar m2 -is the slope of the second segment specified in bits-per-second. -.Bl -tag -width 8n -offset indent -.It Ar sched_type -must be -.Cm hfsc -for a HFSC class. -.It Ar if_name -Interface name. -Must correspond to name in interface specification. -.It Ar class_name -Arbitrary name for this class. -Must be unique within the class hierarchy for this interface. -The name -.Cm root -is a reserved class name for the root class. -The root class for the interface is automatically created by the -.Cm interface -command. -.It Ar parent_name -The name of the parent class for this class. -Keyword -.Cm root -is used when the parent is the root class. -Parent class must have been previously defined. -.It Cm admission -The type of admission control and QoS type. -.Cm cntlload -is controlled load service for RSVP, otherwise, it should be -.Cm none . -The default is -.Cm none . -.It Cm pshare -Percent of the link share. -This specifies a linear link-sharing service curve as a fraction of -the link bandwidth. -It is a short hand of -.Li [ls 0 0 (link-bandwidth * percent / 100)] . -.It Cm grate -Guaranteed rate. -This specifies a linear real-time service curve. -It is a short hand of -.Li [rt 0 0 bps] . -.It Cm default -Specify the default class. -When this keyword is present, all packets that do not match some -classification criteria are assigned to this class. -Must be exactly one class on each interface defined as the default -class. -.It Cm qlimit -The maximum queue size in number of packets. -Default value is 50. -.It Cm red -enables RED on this class queue. -.It Cm rio -enables RIO on this class queue. -.It Cm ecn -enables RED/ECN on this class queue. -.It Cm cleardscp -clears diffserv codepoint in the IP header. -.El -.Ss PRIQ Commands -PRIQ (Priority Queueing) implements a simple priority-based queueing. -A higher priority class is always served first. -Up to 16 priorities can be used with PRIQ. -.Bl -tag -width interface -offset indent -.It Cm interface -.Ar if_name -.Op Cm bandwidth Ar bps -.Op Cm tbrsize Ar bytes -.Op Ar sched_type -.El -.Pp -.Bl -tag -width 8n -offset indent -.It Ar if_name -specifies the name of a network interface (e.g., fxp0). -.It Cm bandwidth -specifies the interface bandwidth in bits per second. -.It Cm tbrsize -specifies the bucket size of a token bucket regulator in bytes. -.It Ar sched_type -must be -.Cm priq -for PRIQ. -.El -.Pp -.Bl -tag -width class -offset indent -.It Cm class -.Ar sched_type -.Ar if_name -.Ar class_name -.Ar parent_name -.Op Cm priority Ar pri -.Op Cm default -.Op Cm qlimit Ar count -.Op Cm red|rio -.Op Cm ecn -.Op Cm cleardscp -.El -.Pp -.Bl -tag -width 8n -offset indent -.It Ar sched_type -must be -.Cm priq -for a PRIQ class. -.It Ar if_name -Interface name. -Must correspond to name in interface specification. -.It Ar class_name -Arbitrary name for this class. -Must be unique for this interface. -.It Ar parent_name -Parent class must be -.Dv NULL -for PRIQ. -.It Cm priority -High numbers are higher priority. -Max value is 15 and Min value is 0. -Default is 0. -A higher priority class is always served first in PRIQ. -Priority must be unique for the interface. -.It Cm default -Specify the default class. -When this keyword is present, all packets that do not match some -classification criteria are assigned to this class. -Must be exactly one class on each interface defined as the default -class. -.It Cm qlimit -The maximum queue size in number of packets. -Default value is 50. -.It Cm red -enables RED on this class queue. -.It Cm rio -enables RIO on this class queue. -.It Cm ecn -enables RED/ECN on this class queue. -.It Cm cleardscp -clears diffserv codepoint in the IP header. -.El -.Ss WFQ Commands -WFQ (Weighted Fair Queueing) implements a weighted-round robin -scheduler for a set of queue. -A weight can be assigned to each queue to give a -different proportion of the link capacity. -A hash function is used to map a flow to one of a set of queues, and -thus, it is possible for two different flows to be mapped into the same -queue. -.Bl -tag -width interface -offset indent -.It Cm interface -.Ar if_name -.Op Cm bandwidth Ar bps -.Op Cm tbrsize Ar bytes -.Op Ar sched_type -.Op Cm nqueues Ar count -.Op Cm qsize Ar bytes -.Op Cm hash Ar policy -.El -.Pp -.Bl -tag -width 8n -offset indent -.It Cm if_name -specifies the name of a network interface (e.g., fxp0). -.It Cm bandwidth -specifies the interface bandwidth in bits per second. -.It Cm tbrsize -specifies the bucket size of a token bucket regulator in bytes. -.It Ar sched_type -must be -.Cm wfq -for WFQ. -.It Cm nqueues -The number of queues in WFQ. Default value is 256. -.It Cm qsize -The size of each queue in number of bytes. -Default value is 64K bytes. -.It Cm hash -Type of hash policy to select a queue. -.Cm dstaddr -specifies a hashing policy by IP destination address. -.Cm full -specifies a hashing policy by IP addresses and ports. -.Cm srcport -specifies a hashing policy by IP source port number. -Default is -.Cm dstaddr -.El -.Ss FIFOQ Commands -FIFOQ (First-In First-Out Queueing) is a simple tail-drop FIFO queue. -FIFOQ is the simplest possible implementation of a queueing discipline -in ALTQ, and can be used to compare with other queueing disciplines. -FIFOQ can be also used as a template for those who want to write their -own queueing disciplines. -.Bl -tag -width interface -offset indent -.It Cm interface -.Ar if_name -.Op Cm bandwidth Ar bps -.Op Cm tbrsize Ar bytes -.Op Ar sched_type -.Op Cm qlimit Ar count -.El -.Pp -.Bl -tag -width 8n -offset indent -.It Ar if_name -specifies the name of a network interface (e.g., fxp0). -.It Cm bandwidth -specifies the interface bandwidth in bits per second. -.It Cm tbrsize -specifies the bucket size of a token bucket regulator in bytes. -.It Ar sched_type -must be -.Cm fifoq -for FIFOQ. -.It Cm qlimit -The maximum queue size in number of packets. -Default value is 50. -.El -.Ss RED Commands -RED (Random Early Detection) is an implicit congestion notification -mechanism that exercises packet dropping or packet marking -stochastically according to the average queue length. -RED can be viewed as a buffer management mechanism -and can be integrated into other packet scheduling schemes. -.Bl -tag -width red -offset indent -.It Cm red -.Ar min_th -.Ar max_th -.Ar inv_pmax -.El -.Pp -The -.Cm red -command sets the default RED paramters. -.Ar min_th -and -.Ar max_th -are the minimum and the maximum threshold values. -.Ar inv_pmax -is the inverse (reciprocal) of the maximum drop probability. -For example, 10 means the maximum drop probability of 1/10. -.Bl -tag -width interface -offset indent -.It Cm interface -.Ar if_name -.Op Cm bandwidth Ar bps -.Op Cm tbrsize Ar bytes -.Op Ar sched_type -.Op Cm qlimit Ar count -.Op Cm packetsize Ar bytes -.Op Cm weight Ar n -.Op Cm thmin Ar n -.Op Cm thmax Ar n -.Op Cm invpmax Ar n -.Op Cm ecn -.Op Cm flowvalve -.El -.Pp -.Bl -tag -width 8n -offset indent -.It Ar if_name -specifies the name of a network interface (e.g., fxp0). -.It Cm bandwidth -specifies the interface bandwidth in bits per second. -.It Cm tbrsize -specifies the bucket size of a token bucket regulator in bytes. -.It Ar sched_type -must be -.Cm red -for RED. -.It Cm qlimit -The maximum queue size in number of packets. -Default value is 60. -.It Cm packetsize -The average packet size in number of bytes. -This parameter is used to calibrate the idle period. -Default value is 1000. -.It Cm weight -The inverse of the weight of EWMA (exponentially weighted moving average). -.It Cm thmin -The minimum threshold. -.It Cm thmax -The maximum threshold. -.It Cm invpmax -The inverse of the maximum drop probability. -.It Cm ecn -enables ECN. -.It Cm flowvalve -enables flowvalve. -.El -.Ss RIO Commands -ALTQ/RIO has 3 drop precedence levels defined for the Assured -Forwarding of DiffServ (RFC2597). -Since adaptive flows are likely to stay under the medium drop -precedence level under congestion, the medium drop precedence would -protect adaptive flows from unadaptive flows. -.Pp -The original RIO has 2 sets of RED parameters; one for in-profile -packets and the other for out-of-profile packets. -At the ingress of the network, profile meters tag packets as IN -or OUT based on contracted profiles for customers. -Inside the network, IN packets receive preferential treatment by -the RIO dropper. -It is possible to provision the network not to drop IN packets -at all by providing enough capacity for the total volume of IN -packets. -Thus, RIO can be used to provide a service that statistically assures -capacity allocated for users. -This mechanism can be extended to support an arbitrary number of drop -precedence levels. ALTQ supports 3 drop precedence levels. -.Bl -tag -width rio -offset indent -.It Cm rio -.Ar low_min_th -.Ar low_max_th -.Ar low_inv_pmax -.Ar medium_min_th -.Ar medium_max_th -.Ar medium_inv_pmax -.Ar high_min_th -.Ar high_max_th -.Ar high_inv_pmax -.El -.Pp -The -.Cm rio -command sets the default RIO paramters. -The parameters are RED parameters for 3 (low, medium, high) drop -precedence. -.Bl -tag -width interface -offset indent -.It Cm interface -.Ar if_name -.Op Cm bandwidth Ar bps -.Op Cm tbrsize Ar bytes -.Op Ar sched_type -.Op Cm qlimit Ar count -.Op Cm packetsize Ar bytes -.Op Cm weight Ar n -.Op Cm lo_thmin Ar n -.Op Cm lo_thmax Ar n -.Op Cm lo_invpmax Ar n -.Op Cm med_thmin Ar n -.Op Cm med_thmax Ar n -.Op Cm med_invpmax Ar n -.Op Cm hi_thmin Ar n -.Op Cm hi_thmax Ar n -.Op Cm hi_invpmax Ar n -.Op Cm ecn -.El -.Pp -.Bl -tag -width 8n -offset indent -.It Ar if_name -specifies the name of a network interface (e.g., fxp0). -.It Cm bandwidth -specifies the interface bandwidth in bits per second. -.It Cm tbrsize -specifies the bucket size of a token bucket regulator in bytes. -.It Ar sched_type -must be -.Cm rio -for RIO. -.It Cm qlimit -The maximum queue size in number of packets. -Default value is 60. -.It Cm packetsize -The average packet size in number of bytes. -This parameter is used to calibrate the idle period. -Default value is 1000. -.It Cm weight -The inverse of the weight of EWMA (exponentially weighted moving average). -.It Cm lo_thmin -The minimum threshold for low drop precedence. -.It Cm lo_thmax -The maximum threshold for low drop precedence. -.It Cm lo_invpmax -The inverse of the maximum drop probability for low drop precedence. -.It Cm med_thmin -The minimum threshold for medium drop precedence. -.It Cm med_thmax -The maximum threshold for medium drop precedence. -.It Cm med_invpmax -The inverse of the maximum drop probability for medium drop precedence. -.It Cm hi_thmin -The minimum threshold for high drop precedence. -.It Cm hi_thmax -The maximum threshold for high drop precedence. -.It Cm hi_invpmax -The inverse of the maximum drop probability for high drop precedence. -.It Cm ecn -enables ECN. -.El -.Ss BLUE Commands -.Bl -tag -width interface -offset indent -.It Cm interface -.Ar if_name -.Op Cm bandwidth Ar bps -.Op Cm tbrsize Ar bytes -.Op Ar sched_type -.Op Cm qlimit Ar count -.Op Cm packetsize Ar bytes -.Op Cm maxpmark Ar n -.Op Cm holdtime Ar usec -.Op Cm ecn -.El -.Pp -.Bl -tag -width 8n -offset indent -.It Ar if_name -specifies the name of a network interface (e.g., fxp0). -.It Cm bandwidth -specifies the interface bandwidth in bits per second. -.It Cm tbrsize -specifies the bucket size of a token bucket regulator in bytes. -.It Ar sched_type -must be -.Cm blue -for BLUE. -.It Cm qlimit -The maximum queue size in number of packets. -Default value is 60. -.It Cm packetsize -The average packet size in number of bytes. Default value is 1000. -.It Cm maxpmark -specifies the precision of marking probability. -.It Cm holdtime -specifies the hold time in usec. -.It Cm ecn -enables ECN. -.El -.Ss CDNR Commands -The -.Cm conditioner -command specifies a diffserv traffic conditioner. -A traffic conditioner is not a queueing discipline but a component to -meter, mark or drop incoming packets according to some rules. -.Pp -As opposed to a queueing discipline, a traffic conditioner handles -incoming packets at an input interface. -If no queueing discipline (e.g., CBQ) is used for the interface, -a null interface command should be used to specify an input network -interface. -.Bl -tag -width interface -offset indent -.It Cm interface -.Ar if_name -.Op Cm bandwidth Ar bps -.Op Cm tbrsize Ar bytes -.El -.Pp -The -.Cm conditioner -command has the following syntax. -.Bl -tag -width conditioner -offset indent -.It Cm conditioner -.Ar if_name -.Ar cdnr_name -.Aq action -.El -.Pp -.Bl -tag -width 10n -offset indent -.It Ar if_name -Interface name. Must correspond to name in interface specification. -.It Ar cdnr_name -Arbitrary name for this conditioner. -Must be unique for this interface. -.It Ar action -Action of the conditioner. -.El -.Pp -An action can be a recursively defined action. -The following actions are defined. -.Bl -tag -width pass -offset indent -.It Cm pass -.Bl -inset -offset indent -.It Cm pass -allows the packet to go through without any modification to the packet. -.El -.El -.Pp -.Bl -tag -width drop -offset indent -.It Cm drop -.Bl -inset -offset indent -.It Cm drop -rejects the packet. -The packet is immediately discarded. -.El -.El -.Pp -.Bl -tag -width mark -offset indent -.It Cm mark -.Ar value -.Bl -inset -offset indent -.It Cm mark -sets the specified value to the ds field in the IP header. -Then, the packet is allowed to go through. -.El -.El -.Pp -.Bl -tag -width tbmeter -offset indent -.It Cm tbmeter -.Ar rate depth -.Aq in_action -.Aq out_action -.Pp -.Bl -inset -offset indent -.It Cm tbmeter -is a token bucket meter configured with rate and depth parameters. -Rate is token rate in bits-per-second. -Depth is bucket depth in KB. -When an incoming packet is in profile (available token is more than -the packet size), tbmeter takes in_action. -Otherwise, tbmeter takes out_action. -.El -.El -.Pp -.Bl -tag -width trtcm -offset indent -.It Cm trtcm -.Ar cmtd_rate cmtd_depth peak_rate peak_depth -.Aq green_action -.Aq yellow_action -.Aq red_action -.Op Cm coloraware|colorblind -.Bl -inset -offset indent -.It Cm trtcm -is a 2-rate 3 color marker for Assured Forwarding. -A trtcm consists of 2 token buckets, one for a committed rate and the -other for a peak rate. -When an incoming packet is in the committed profile, trtcm takes -green_action. -When the packet is out of the committed profile but in the peak -profile, trtcm takes yellow_action. -Otherwise, tbtcm takes red_action. -A trtcm is either color-aware or color-blind. -A color-aware trtcm do not raise the color (ds field value), that is, -a yellow packet can be yellow or red but can not be blue. -Default is color-blind. -.El -.El -.Pp -.Bl -tag -width tswtcm -offset indent -.It Cm tswtcm -.Ar cmtd_rate peak_rate avg_interval -.Aq green_action -.Aq yellow_action -.Aq red_action -.Bl -inset -offset indent -.It Cm tswtcm -is a time sliding window 3 color marker for Assured Forwarding. -A tswtcm differs from trtcm in that a tswtcm probabilistically marks -packets. -A tswtcm consists of 2 rates, one for a committed rate and the -other for a peak rate. -When an incoming packet is in the committed profile, tswtcm takes -green_action. -When the packet is out of the committed profile but in the peak -profile, tswtcm takes yellow_action. -Otherwise, tswtcm takes red_action. -cmtd_rate and peak_rate are specified in bits per second. -avg_interval provides the size of time window for averaging incoming -rate, and is specified in milli-second. -500 msec is ok for normal settings. -.El -.El -.Sh EXAMPLES -.Ss CBQ Example -.Bd -literal -# -# cbq configuration for vx0 (10Mbps ether) -# give at least 40% to TCP -# limit HTTP from network 133.138.1.0 up to 10%, use RED. -# other traffic goes into default class -# -interface vx0 bandwidth 10M cbq -# -class cbq vx0 root_class NULL priority 0 pbandwidth 100 -class cbq vx0 def_class root_class borrow pbandwidth 95 default -class cbq vx0 tcp_class def_class borrow pbandwidth 40 - filter vx0 tcp_class 0 0 0 0 6 -class cbq vx0 csl_class tcp_class pbandwidth 10 red - filter vx0 csl_class 0 0 133.138.1.0 netmask 0xffffff00 80 6 - filter vx0 csl_class 133.138.1.0 netmask 0xffffff00 0 0 80 6 -# -# sample filter6 command -# - filter6 vx0 csl_class ::0 0 d000:a:0:123::/64 80 6 -.Ed -.Ss HFSC Example -.Bd -literal -# -# hfsc configuration for hierachical sharing -# -interface pvc0 bandwidth 45M hfsc -# -# (10% of the bandwidth share goes to the default class) -class hfsc pvc0 def_class root pshare 10 default -# -# bandwidth share guaranteed rate -# CMU: 45% 15Mbps -# PITT: 45% 15Mbps -# -class hfsc pvc0 cmu root pshare 45 grate 15M -class hfsc pvc0 pitt root pshare 45 grate 15M -# -# CMU bandwidth share guaranteed rate -# CS: 20% 10Mbps -# other: 20% 5Mbps -# -class hfsc pvc0 cmu_other cmu pshare 20 grate 10M - filter pvc0 cmu_other 0 0 128.2.0.0 netmask 0xffff0000 0 0 -class hfsc pvc0 cmu_cs cmu pshare 20 grate 5M - filter pvc0 cmu_cs 0 0 128.2.242.0 netmask 0xffffff00 0 0 -# -# PITT bandwidth share guaranteed rate -# CS: 20% 10Mbps -# other: 20% 5Mbps -# -class hfsc pvc0 pitt_other pitt pshare 20 grate 10M - filter pvc0 pitt_other 0 0 136.142.0.0 netmask 0xffff0000 0 0 -class hfsc pvc0 pitt_cs pitt pshare 20 grate 5M - filter pvc0 pitt_cs 0 0 136.142.79.0 netmask 0xffffff00 0 0 -.Ed -.Ss PRIQ Example -.Bd -literal -# -# priq configuration for fxp0 (100Mbps ether) -# icmp: high priority -# tcp: medium priority -# others: low priority -# -interface fxp0 bandwidth 100M priq -# -class priq fxp0 high_class NULL priority 2 - filter fxp0 high_class 0 0 0 0 1 -class priq fxp0 med_class NULL priority 1 - filter fxp0 med_class 0 0 0 0 6 -class priq fxp0 low_class NULL priority 0 default -.Ed -.Ss WFQ Example -.Bd -literal -interface pvc0 bandwidth 134000000 wfq -.Ed -.Ss FIFOQ Example -.Bd -literal -interface rl0 bandwidth 10M fifoq -.Ed -.Ss Conditioner Example -.Bd -literal -# -interface fxp0 -# -# a simple dropper -# discard all packets from 192.168.0.83 -# -conditioner fxp0 dropper <drop> - filter fxp0 dropper 0 0 192.168.0.83 0 0 - -# -# EF conditioner -# mark EF to all packets from 192.168.0.117 -# -conditioner pvc1 ef_cdnr <tbmeter 6M 64K <mark 0xb8><drop>> - filter fxp0 ef_cdnr 0 0 192.168.0.117 0 0 - -# -# AF1x conditioner -# mark AF1x to packets from 192.168.0.178 -# AF11 (low drop precedence): less than 3Mbps -# AF12 (medium drop precedence): more than 3Mbps and less than 10Mbps -# AF13 (high drop precedence): more than 10Mbps -# -conditioner fxp0 af1x_cdnr <trtcm 3M 32K 10M 64K <mark 0x28><mark 0x30><mark 0x38>> - filter fxp0 af1x_cdnr 0 0 192.168.0.178 0 0 -.Ed -.Sh SEE ALSO -.Xr altqd 8 -.Sh BUGS -This man page is incomplete. For more information read the source. diff --git a/usr.sbin/altq/altqd/altq.conf.samples/Makefile b/usr.sbin/altq/altqd/altq.conf.samples/Makefile deleted file mode 100644 index 4a28e1d96a9..00000000000 --- a/usr.sbin/altq/altqd/altq.conf.samples/Makefile +++ /dev/null @@ -1,16 +0,0 @@ -# $OpenBSD: Makefile,v 1.2 2002/02/07 23:15:34 art Exp $ - -FILES = cbq.bandwidthtest cbq.diffedge cbq.lo0 cbq.sample0 cbq.sample1 -FILES+= cbq.sample2 cbq.sharing cbq.v6 cbq.widecamp cdnr.sample -FILES+= hfsc.diffedge hfsc.grate hfsc.lo0 hfsc.pvc0 hfsc.share -FILES+= cbq.ssh_tos - -BINDIR?= /usr/share - -obj all clean cleandir depend lint obj tags: - -install: - cd ${.CURDIR}; install -c -o ${BINOWN} -g ${BINGRP} -m 444 ${FILES} \ - ${DESTDIR}${BINDIR}/altq - -.include <bsd.prog.mk> diff --git a/usr.sbin/altq/altqd/altq.conf.samples/cbq.bandwidthtest b/usr.sbin/altq/altqd/altq.conf.samples/cbq.bandwidthtest deleted file mode 100644 index 678de54b830..00000000000 --- a/usr.sbin/altq/altqd/altq.conf.samples/cbq.bandwidthtest +++ /dev/null @@ -1,17 +0,0 @@ -# -# this is the setting used for the bandwidth guarantee test (Fig. 7) -# in the ALTQ paper -# -interface en0 bandwidth 134M cbq -class cbq en0 root_class NULL priority 0 admission none pbandwidth 100 -class cbq en0 def_class root_class borrow priority 2 pbandwidth 95 default -# -class cbq en0 tcp_class0 def_class priority 3 pbandwidth 8 -filter en0 tcp_class0 0 0 0 6790 6 -class cbq en0 tcp_class1 def_class priority 3 pbandwidth 16 -filter en0 tcp_class1 0 0 0 6791 6 -class cbq en0 tcp_class2 def_class priority 3 pbandwidth 24 -filter en0 tcp_class2 0 0 0 6792 6 -class cbq en0 tcp_class3 def_class priority 3 pbandwidth 32 -filter en0 tcp_class3 0 0 0 6793 6 - diff --git a/usr.sbin/altq/altqd/altq.conf.samples/cbq.diffedge b/usr.sbin/altq/altqd/altq.conf.samples/cbq.diffedge deleted file mode 100644 index adea91ccb49..00000000000 --- a/usr.sbin/altq/altqd/altq.conf.samples/cbq.diffedge +++ /dev/null @@ -1,57 +0,0 @@ -# -# sample diffedge configuration using CBQ -# - -# -# input interface -# -interface pvc1 -# -# EF conditioner -# -conditioner pvc1 ef_cdnr <tbmeter 6M 64K <mark 0xb8><drop>> - filter pvc1 ef_cdnr 0 0 172.16.4.174 0 0 -# -# AF conditioners -# -conditioner pvc1 af1x_cdnr \ - <trtcm 3M 32K 10M 64K <mark 0x28><mark 0x30><mark 0x38> colorblind> -conditioner pvc1 af2x_cdnr \ - <trtcm 3M 32K 10M 64K <mark 0x48><mark 0x50><mark 0x58> colorblind> -conditioner pvc1 af3x_cdnr \ - <trtcm 3M 32K 10M 64K <mark 0x68><mark 0x70><mark 0x78> colorblind> -# tswtcm -conditioner pvc1 af4x_cdnr \ - <tswtcm 3M 10M 500 <mark 0x88><mark 0x90><mark 0x98>> - - filter pvc1 af1x_cdnr 0 0 172.16.4.176 0 0 - filter pvc1 af2x_cdnr 0 0 172.16.4.177 0 0 - filter pvc1 af3x_cdnr 0 0 172.16.4.178 0 0 - filter pvc1 af4x_cdnr 0 0 172.16.4.179 0 0 - -# -# output interface -# -interface pvc0 bandwidth 45M cbq -class cbq pvc0 root_class NULL pbandwidth 100 -class cbq pvc0 def_class root_class borrow pbandwidth 86 default -# -# EF class -# -class cbq pvc0 ef_class root_class pbandwidth 14 priority 5 - filter pvc0 ef_class 0 0 0 0 0 tos 0xb8 tosmask 0xfc -# -# AF classes -# -# rio threshold values -rio 40 50 10 20 30 10 5 15 10 -# -class cbq pvc0 af1x_class def_class borrow pbandwidth 20 rio -class cbq pvc0 af2x_class def_class borrow pbandwidth 20 rio -class cbq pvc0 af3x_class def_class borrow pbandwidth 20 rio cleardscp -class cbq pvc0 af4x_class def_class borrow pbandwidth 20 rio - - filter pvc0 af1x_class 0 0 0 0 0 tos 0x20 tosmask 0xe4 - filter pvc0 af2x_class 0 0 0 0 0 tos 0x40 tosmask 0xe4 - filter pvc0 af3x_class 0 0 0 0 0 tos 0x60 tosmask 0xe4 - filter pvc0 af4x_class 0 0 0 0 0 tos 0x80 tosmask 0xe4 diff --git a/usr.sbin/altq/altqd/altq.conf.samples/cbq.lo0 b/usr.sbin/altq/altqd/altq.conf.samples/cbq.lo0 deleted file mode 100644 index ba519ee1fa9..00000000000 --- a/usr.sbin/altq/altqd/altq.conf.samples/cbq.lo0 +++ /dev/null @@ -1,12 +0,0 @@ -interface lo0 bandwidth 300M cbq -class cbq lo0 root_class NULL pbandwidth 100 -class cbq lo0 def_class root_class borrow pbandwidth 95 default -class cbq lo0 tcp_class def_class pbandwidth 10 - filter lo0 tcp_class 0 0 0 0 6 -class cbq lo0 udp_class def_class pbandwidth 10 - filter lo0 udp_class 0 0 0 0 17 - -# filters for ipv6 -# filter6 lo0 tcp_class ::0 0 ::0 0 6 -# filter6 lo0 udp_class ::0 0 ::0 0 17 -#
\ No newline at end of file diff --git a/usr.sbin/altq/altqd/altq.conf.samples/cbq.sample0 b/usr.sbin/altq/altqd/altq.conf.samples/cbq.sample0 deleted file mode 100644 index ec662265aa3..00000000000 --- a/usr.sbin/altq/altqd/altq.conf.samples/cbq.sample0 +++ /dev/null @@ -1,57 +0,0 @@ -# -# sample configuration file for 1Mbps link -# -interface sr0 bandwidth 1M cbq -class cbq sr0 root NULL pbandwidth 100 -# -# meta classes -# -class cbq sr0 ctl_class root pbandwidth 4 control -class cbq sr0 def_class root borrow pbandwidth 95 default -# -class cbq sr0 bulk def_class borrow pbandwidth 30 -class cbq sr0 misc def_class borrow pbandwidth 30 -class cbq sr0 intr def_class borrow pbandwidth 30 - -# -# leaf classes -# - -# -# bulk data classes -# -class cbq sr0 tcp bulk borrow pbandwidth 5 red - filter sr0 tcp 0 0 0 0 6 # other tcp -class cbq sr0 ftp bulk borrow pbandwidth 5 red - filter sr0 ftp 0 0 0 20 6 # ftp-data - filter sr0 ftp 0 20 0 0 6 # ftp-data -class cbq sr0 http bulk borrow pbandwidth 5 red - filter sr0 http 0 0 0 80 6 # http - filter sr0 http 0 80 0 0 6 # http -class cbq sr0 pop3 bulk borrow pbandwidth 5 red - filter sr0 pop3 0 0 0 110 6 # pop3 - filter sr0 pop3 0 110 0 0 6 # pop3 -class cbq sr0 imap bulk borrow pbandwidth 5 red - filter sr0 imap 0 0 0 143 6 # imap - filter sr0 imap 0 143 0 0 6 # imap -# -# misc (udp) classes -# -class cbq sr0 udp misc borrow pbandwidth 5 red - filter sr0 udp 0 0 0 0 17 # other udp -class cbq sr0 rip misc borrow pbandwidth 5 red - filter sr0 rip 0 520 0 0 17 # rip -# -# interactive classes -# -class cbq sr0 dns intr borrow pbandwidth 5 red - filter sr0 dns 0 0 0 53 17 - filter sr0 dns 0 0 0 53 6 -class cbq sr0 telnet intr borrow pbandwidth 5 red - filter sr0 telnet 0 0 0 23 6 # telnet - filter sr0 telnet 0 23 0 0 6 # telnet - filter sr0 telnet 0 0 0 513 6 # rlogin - filter sr0 telnet 0 513 0 0 6 # rlogin -class cbq sr0 ssh intr borrow pbandwidth 5 red - filter sr0 ssh 0 0 0 22 6 # ssh - filter sr0 ssh 0 22 0 0 6 # ssh diff --git a/usr.sbin/altq/altqd/altq.conf.samples/cbq.sample1 b/usr.sbin/altq/altqd/altq.conf.samples/cbq.sample1 deleted file mode 100644 index a1a2c61e17c..00000000000 --- a/usr.sbin/altq/altqd/altq.conf.samples/cbq.sample1 +++ /dev/null @@ -1,18 +0,0 @@ -interface en0 bandwidth 135M cbq -class cbq en0 root_class NULL pbandwidth 100 -class cbq en0 def_class root_class borrow pbandwidth 95 default -# tcp, udp, mcast -class cbq en0 tcp_class def_class borrow pbandwidth 40 - filter en0 tcp_class 0 0 0 0 6 -class cbq en0 udp_class def_class borrow pbandwidth 40 - filter en0 udp_class 0 0 0 0 17 -class cbq en0 mcast_class def_class pbandwidth 10 - filter en0 mcast_class 224.0.0.0 netmask 0xf0000000 0 0 0 17 -# http ftp -class cbq en0 http_class tcp_class borrow pbandwidth 10 - filter en0 http_class 0 0 0 80 6 -class cbq en0 ftp_class tcp_class borrow pbandwidth 10 - filter en0 ftp_class 0 0 0 20 6 - filter en0 ftp_class 0 20 0 0 6 - - diff --git a/usr.sbin/altq/altqd/altq.conf.samples/cbq.sample2 b/usr.sbin/altq/altqd/altq.conf.samples/cbq.sample2 deleted file mode 100644 index a7c913257e7..00000000000 --- a/usr.sbin/altq/altqd/altq.conf.samples/cbq.sample2 +++ /dev/null @@ -1,13 +0,0 @@ -# cbq configuration for vx0 (10Mbps ether) -# give at least 40% to TCP -# limit HTTP from network 133.138.1.0 up to 10% -# other traffic goes into default class -interface vx0 bandwidth 10M cbq -class cbq vx0 root_class NULL pbandwidth 100 -class cbq vx0 def_class root_class borrow pbandwidth 95 default -class cbq vx0 tcp_class def_class borrow pbandwidth 40 - filter vx0 tcp_class 0 0 0 0 6 -class cbq vx0 csl_class tcp_class pbandwidth 10 - filter vx0 csl_class 0 0 133.138.1.0 netmask 0xffffff00 80 6 - filter vx0 csl_class 133.138.1.0 netmask 0xffffff00 0 0 80 6 - diff --git a/usr.sbin/altq/altqd/altq.conf.samples/cbq.sharing b/usr.sbin/altq/altqd/altq.conf.samples/cbq.sharing deleted file mode 100644 index adaf008d757..00000000000 --- a/usr.sbin/altq/altqd/altq.conf.samples/cbq.sharing +++ /dev/null @@ -1,36 +0,0 @@ -# -# this is the setting used for the link-sharing test (Fig. 10, 11) -# in the ALTQ paper -# -# -# WRR for cbq two Agency link sharing test -# -interface pvc0 bandwidth 134M cbq -class cbq pvc0 root_class NULL priority 0 pbandwidth 100 -class cbq pvc0 ctl_class root_class pbandwidth 0 -# -# Create Agency A classes -# -class cbq pvc0 agencyA root_class priority 2 pbandwidth 70 borrow default -class cbq pvc0 dataA_class agencyA priority 3 pbandwidth 40 borrow -class cbq pvc0 vidA_class agencyA priority 4 pbandwidth 30 borrow -# -# Create Agency B class -# -class cbq pvc0 agencyB root_class priority 2 pbandwidth 30 borrow -class cbq pvc0 dataB_class agencyB priority 3 pbandwidth 20 borrow -class cbq pvc0 vidB_class agencyB priority 4 pbandwidth 10 borrow -# -# Filters -# -# dataA - 172.16.4.176/6760 -# vidA - 172.16.4.176/6761 -# -filter pvc0 dataA_class 0 0 172.16.3.178 6760 6 -filter pvc0 vidA_class 0 0 172.16.3.178 6761 6 -# -# data B - 172.16.3.178/6762 -# vid B - 172.16.3.178/6763 -# -filter pvc0 dataB_class 0 0 172.16.4.176 6760 6 -filter pvc0 vidB_class 0 0 172.16.4.176 6761 6 diff --git a/usr.sbin/altq/altqd/altq.conf.samples/cbq.ssh_tos b/usr.sbin/altq/altqd/altq.conf.samples/cbq.ssh_tos deleted file mode 100644 index f81f4cf6f31..00000000000 --- a/usr.sbin/altq/altqd/altq.conf.samples/cbq.ssh_tos +++ /dev/null @@ -1,29 +0,0 @@ -# $OpenBSD: cbq.ssh_tos,v 1.2 2002/02/07 10:22:02 wilfried Exp $ -# -# Artur Grabowski <art@openbsd.org> 2002 Public Domain -# -# Sample configuration that puts ssh traffic into different classes depending -# on if it's a bulk transfer or interactive session. -# - -# We have a 10Mbps link on de0 -interface de0 bandwidth 10M cbq - -# Create the root class. Everything. -class cbq de0 root NULL pbandwidth 100 - -class cbq de0 ctl_class root pbandwidth 5 control -class cbq de0 def_class root borrow pbandwidth 95 default - -class cbq de0 bulk def_class borrow pbandwidth 40 -class cbq de0 interactive def_class borrow pbandwidth 40 - -class cbq de0 inter_ssh interactive borrow pbandwidth 35 red -# TOS 0x10 is IPTOS_LOWDELAY, set in ssh for interactive sessions. - filter de0 inter_ssh 0 22 0 0 6 tos 0x10 - filter de0 inter_ssh 0 0 0 22 6 tos 0x10 - -class cbq de0 bulk_ssh bulk borrow pbandwidth 20 red -# TOS 0x08 is IPTOS_THROUGHPUT, set in ssh for bulk sessions. - filter de0 bulk_ssh 0 22 0 0 6 tos 0x08 - filter de0 bulk_ssh 0 0 0 22 6 tos 0x08 diff --git a/usr.sbin/altq/altqd/altq.conf.samples/cbq.v6 b/usr.sbin/altq/altqd/altq.conf.samples/cbq.v6 deleted file mode 100644 index 894a26984a5..00000000000 --- a/usr.sbin/altq/altqd/altq.conf.samples/cbq.v6 +++ /dev/null @@ -1,68 +0,0 @@ -# -# CBQ (for IPv6) configuration for the WIDE Camp'98 Fall -# -interface sr0 bandwidth 128K cbq -class cbq sr0 root NULL pbandwidth 100 -# -# meta classes -# -class cbq sr0 ctl_class root pbandwidth 4 control -class cbq sr0 def_class root borrow pbandwidth 95 default -# -class cbq sr0 bulk def_class borrow pbandwidth 40 -class cbq sr0 misc def_class borrow pbandwidth 25 -class cbq sr0 intr def_class borrow pbandwidth 25 - -# -# leaf classes -# - -# -# bulk data classes -# -class cbq sr0 tcp bulk borrow pbandwidth 10 red - filter6 sr0 tcp ::0 0 ::0 0 6 # other tcp -class cbq sr0 ftp bulk borrow pbandwidth 10 red - filter6 sr0 ftp ::0 0 ::0 20 6 # ftp-data - filter6 sr0 ftp ::0 20 ::0 0 6 # ftp-data -class cbq sr0 http bulk borrow pbandwidth 10 red - filter6 sr0 http ::0 0 ::0 80 6 # http - filter6 sr0 http ::0 80 ::0 0 6 # http - filter6 sr0 http ::0 0 ::0 8080 6 # http proxy - filter6 sr0 http ::0 8080 ::0 0 6 # http proxy - filter6 sr0 http ::0 0 ::0 3128 6 # squid - filter6 sr0 http ::0 3128 ::0 0 6 # squid -class cbq sr0 pop3 bulk borrow pbandwidth 10 red - filter6 sr0 pop3 ::0 0 ::0 110 6 # pop3 - filter6 sr0 pop3 ::0 110 ::0 0 6 # pop3 - -# -# misc (udp, ipv4) classes -# -class cbq sr0 udp misc borrow pbandwidth 5 red - filter6 sr0 udp ::0 0 ::0 0 17 # other udp -class cbq sr0 cbq misc borrow pbandwidth 5 red - filter6 sr0 cbq ::0 7289 ::0 0 17 # cbq monitor - filter6 sr0 cbq ::0 7291 ::0 0 17 # cbq monitor -class cbq sr0 rip misc borrow pbandwidth 5 red - filter6 sr0 rip ::0 520 ::0 0 17 # rip - filter6 sr0 rip ::0 0 ::0 520 17 # rip -class cbq sr0 ipv4 misc borrow pbandwidth 10 red - filter sr0 ipv4 0 0 0 0 0 # ipv4 - -# -# interactive classes -# -class cbq sr0 dns intr borrow pbandwidth 5 red - filter6 sr0 dns ::0 0 ::0 53 17 # dns (udp) - filter6 sr0 dns ::0 53 ::0 0 17 # dns (udp) - filter6 sr0 dns ::0 0 ::0 53 6 # dns (tcp) - filter6 sr0 dns ::0 53 ::0 0 6 # dns (tcp) -class cbq sr0 telnet intr borrow pbandwidth 10 red - filter6 sr0 telnet ::0 0 ::0 23 6 # telnet - filter6 sr0 telnet ::0 23 ::0 0 6 # telnet - filter6 sr0 telnet ::0 0 ::0 513 6 # rlogin - filter6 sr0 telnet ::0 513 ::0 0 6 # rlogin -class cbq sr0 ssh intr borrow pbandwidth 10 red - filter6 sr0 ssh ::0 0 ::0 22 6 # ssh - filter6 sr0 ssh ::0 22 ::0 0 6 # ssh diff --git a/usr.sbin/altq/altqd/altq.conf.samples/cbq.widecamp b/usr.sbin/altq/altqd/altq.conf.samples/cbq.widecamp deleted file mode 100644 index 206cd58b1fe..00000000000 --- a/usr.sbin/altq/altqd/altq.conf.samples/cbq.widecamp +++ /dev/null @@ -1,94 +0,0 @@ -# -# cbq config for wide-camp (98 spring) -# 384kbps line for more than 250 people -# -interface sr0 bandwidth 384000 cbq -class cbq sr0 root NULL priority 0 pbandwidth 100 -# -# meta classes -# -class cbq sr0 ctl_class root priority 3 pbandwidth 4 maxburst 4 control -class cbq sr0 def_class root borrow priority 2 pbandwidth 60 default -# -class cbq sr0 bulk def_class borrow priority 0 pbandwidth 20 -class cbq sr0 misc def_class borrow priority 0 pbandwidth 12 -class cbq sr0 intr def_class borrow priority 0 pbandwidth 24 - -# -# leaf classes -# - -# -# bulk data classes -# -class cbq sr0 tcp bulk borrow priority 3 pbandwidth 4 maxburst 8 red - filter sr0 tcp 0 0 0 0 6 # other tcp -class cbq sr0 ftp bulk borrow priority 3 pbandwidth 4 maxburst 8 red - filter sr0 ftp 0 0 0 20 6 # ftp-data - filter sr0 ftp 0 20 0 0 6 # ftp-data -class cbq sr0 http bulk borrow priority 3 pbandwidth 4 maxburst 8 red - filter sr0 http 0 0 0 80 6 # http - filter sr0 http 0 80 0 0 6 # http - filter sr0 http 0 0 0 8080 6 # cache - filter sr0 http 0 8080 0 0 6 # cache - filter sr0 http 0 0 0 443 6 # https - filter sr0 http 0 443 0 0 6 # https -class cbq sr0 pop3 bulk borrow priority 3 pbandwidth 4 maxburst 8 red - filter sr0 pop3 0 0 0 110 6 # pop3 - filter sr0 pop3 0 110 0 0 6 # pop3 -class cbq sr0 imap bulk borrow priority 3 pbandwidth 4 maxburst 8 red - filter sr0 imap 0 0 0 143 6 # imap - filter sr0 imap 0 143 0 0 6 # imap -# -# misc (udp) classes -# -class cbq sr0 udp misc borrow priority 3 pbandwidth 4 maxburst 8 red - filter sr0 udp 0 0 0 0 17 # other udp -class cbq sr0 cbq misc borrow priority 3 pbandwidth 4 maxburst 8 red - filter sr0 cbq 224.8.8.0 0 0 0 17 # cbq traffic monitor -class cbq sr0 rip misc borrow priority 3 pbandwidth 4 maxburst 8 red - filter sr0 rip 0 520 0 0 17 # rip -# -# interactive classes -# -class cbq sr0 dns intr borrow priority 5 pbandwidth 4 maxburst 8 red - filter sr0 dns 0 0 0 53 17 - filter sr0 dns 0 0 0 53 6 -class cbq sr0 telnet intr borrow priority 4 pbandwidth 4 maxburst 8 red ecn - filter sr0 telnet 0 0 0 23 6 # telnet - filter sr0 telnet 0 23 0 0 6 # telnet - filter sr0 telnet 0 0 0 513 6 # rlogin - filter sr0 telnet 0 513 0 0 6 # rlogin -class cbq sr0 ssh intr borrow priority 4 pbandwidth 4 maxburst 8 red ecn - filter sr0 ssh 0 0 0 22 6 # ssh - filter sr0 ssh 0 22 0 0 6 # ssh -class cbq sr0 ipv6 intr borrow priority 4 pbandwidth 4 maxburst 8 red ecn - filter sr0 ipv6 0 0 0 0 41 # ipv6 -class cbq sr0 ipsec intr borrow priority 4 pbandwidth 4 maxburst 8 red ecn - filter sr0 ipsec 0 0 0 0 50 # ipsec (ah) - filter sr0 ipsec 0 0 0 0 51 # ipsec (esp) - -## irc for soi staff -class cbq sr0 irc intr borrow priority 4 pbandwidth 4 maxburst 8 red - filter sr0 irc 0 6667 0 0 6 # soi irc - filter sr0 irc 0 0 0 6667 6 # soi irc -# -# fec -# -class cbq sr0 fec root borrow priority 0 pbandwidth 0 maxburst 8 # red - filter sr0 fec 0 0 0 0 200 # fec -# -# soi video live -# -class cbq sr0 soi root priority 0 pbandwidth 32 -# -class cbq sr0 video soi borrow priority 3 pbandwidth 16 maxburst 8 red - filter sr0 video 0 7070 0 0 17 # soi video -class cbq sr0 voice soi borrow priority 3 pbandwidth 16 maxburst 8 red - filter sr0 voice 0 40034 0 0 17 # soi i-phone - -# -# protection against tunnel (including mbone tunnel) -# -class cbq sr0 ipip root borrow priority 0 pbandwidth 0 - filter sr0 ipip 0 0 0 0 4 # ip-ip diff --git a/usr.sbin/altq/altqd/altq.conf.samples/cdnr.sample b/usr.sbin/altq/altqd/altq.conf.samples/cdnr.sample deleted file mode 100644 index fe8f8e4b448..00000000000 --- a/usr.sbin/altq/altqd/altq.conf.samples/cdnr.sample +++ /dev/null @@ -1,36 +0,0 @@ -# -# null interface command -# -interface pvc1 - -# -# simple dropper -# -conditioner pvc1 dropper <drop> - filter pvc1 dropper 0 0 172.16.4.173 0 0 - -# -# simple marker to clear dscp -# -conditioner pvc1 clear_marker <mark 0x0> - filter pvc1 clear_marker 0 0 172.16.4.174 0 0 - -# -# EF style conditioner (a simple token bucket) -# -conditioner pvc1 ef_cdnr <tbmeter 6M 64K <pass><drop>> - filter pvc1 ef_cdnr 0 0 172.16.4.176 0 0 - -# -# AF style conditioners (trTCM) -# -conditioner pvc1 af1x_cdnr \ - <trtcm 3M 32K 10M 64K <mark 0x28><mark 0x30><mark 0x38> colorblind> - filter pvc1 af1x_cdnr 0 0 172.16.4.177 0 0 - -# -# color-blind trTCM is equivalent to a dual tokenbucket meter -# -conditioner pvc1 dual_tb \ - <tbmeter 10M 64K <tbmeter 3M 32K <mark 0x28><mark 0x30>><mark 0x38>> - filter pvc1 dual_tb 0 0 172.16.4.178 0 0 diff --git a/usr.sbin/altq/altqd/altq.conf.samples/hfsc.diffedge b/usr.sbin/altq/altqd/altq.conf.samples/hfsc.diffedge deleted file mode 100644 index cdebb8bfef9..00000000000 --- a/usr.sbin/altq/altqd/altq.conf.samples/hfsc.diffedge +++ /dev/null @@ -1,59 +0,0 @@ -# -# sample diffedge configuration using HFSC -# - -# input interface -# -interface pvc1 -# -# EF conditioner -# -conditioner pvc1 ef_cdnr <tbmeter 6M 64K <mark 0xb8><drop>> - filter pvc1 ef_cdnr 0 0 172.16.4.174 0 0 -# -# AF conditioners -# -conditioner pvc1 af1x_cdnr \ - <trtcm 3M 32K 10M 64K <mark 0x28><mark 0x30><mark 0x38> colorblind> -conditioner pvc1 af2x_cdnr \ - <trtcm 3M 32K 10M 64K <mark 0x48><mark 0x50><mark 0x58> colorblind> -conditioner pvc1 af3x_cdnr \ - <trtcm 3M 32K 10M 64K <mark 0x68><mark 0x70><mark 0x78> colorblind> -# tswtcm -conditioner pvc1 af4x_cdnr \ - <tswtcm 3M 10M 500 <mark 0x88><mark 0x90><mark 0x98>> - - filter pvc1 af1x_cdnr 0 0 172.16.4.176 0 0 - filter pvc1 af2x_cdnr 0 0 172.16.4.177 0 0 - filter pvc1 af3x_cdnr 0 0 172.16.4.178 0 0 - filter pvc1 af4x_cdnr 0 0 172.16.4.179 0 0 - -# -# output interface -# -interface pvc0 bandwidth 45M hfsc -class hfsc pvc0 def_class root pshare 10 default -# -# EF class -# real-time: 6Mbps -# link-sharing: 0% -# -class hfsc pvc0 ef_class root grate 6M - filter pvc0 ef_class 0 0 0 0 0 tos 0xb8 tosmask 0xfc -# -# AF classes -# real-time: 3Mbps -# link-sharing: 10% (4.5Mbps) -# -# rio threshold values -rio 40 50 10 20 30 10 5 15 10 -# -class hfsc pvc0 af1x_class root grate 3M pshare 10 rio -class hfsc pvc0 af2x_class root grate 3M pshare 10 rio -class hfsc pvc0 af3x_class root grate 3M pshare 10 rio cleardscp -class hfsc pvc0 af4x_class root grate 3M pshare 10 rio - - filter pvc0 af1x_class 0 0 0 0 0 tos 0x20 tosmask 0xe4 - filter pvc0 af2x_class 0 0 0 0 0 tos 0x40 tosmask 0xe4 - filter pvc0 af3x_class 0 0 0 0 0 tos 0x60 tosmask 0xe4 - filter pvc0 af4x_class 0 0 0 0 0 tos 0x80 tosmask 0xe4 diff --git a/usr.sbin/altq/altqd/altq.conf.samples/hfsc.grate b/usr.sbin/altq/altqd/altq.conf.samples/hfsc.grate deleted file mode 100644 index 67f3ebef2f5..00000000000 --- a/usr.sbin/altq/altqd/altq.conf.samples/hfsc.grate +++ /dev/null @@ -1,23 +0,0 @@ -# -# a simple test config for loopback -# - -# -# interface bandwidth 45Mbps is arbitrary (it doesn't matter as long as -# it is bigger than the total guaranteed bandwidth) -# -interface pvc0 bandwidth 45M hfsc -# -# 50% of the excess bandwidth goes to the default class -# -class hfsc pvc0 def_class root pshare 50 default -# -# TCP 10Mbps guaranteed rate (no excess bandwidth assigned) -# -class hfsc pvc0 tcp_class root grate 10M - filter pvc0 tcp_class 0 0 0 0 6 -# -# UDP 5Mbps guaranteed rate (no excess bandwidth assigned) -# -class hfsc pvc0 udp_class root grate 5M - filter pvc0 udp_class 0 0 0 0 17 diff --git a/usr.sbin/altq/altqd/altq.conf.samples/hfsc.lo0 b/usr.sbin/altq/altqd/altq.conf.samples/hfsc.lo0 deleted file mode 100644 index 789b3baadb8..00000000000 --- a/usr.sbin/altq/altqd/altq.conf.samples/hfsc.lo0 +++ /dev/null @@ -1,23 +0,0 @@ -# -# a simple test config for loopback -# - -# -# interface bandwidth 300Mbps is arbitrary (it doesn't matter as long as -# it is bigger than the total guaranteed bandwidth) -# -interface lo0 bandwidth 300M hfsc -# -# 50% of the excess bandwidth goes to the default class -# -class hfsc lo0 def_class root pshare 50 default -# -# TCP 10Mbps guaranteed rate (no excess bandwidth assigned) -# -class hfsc lo0 tcp_class root grate 10M - filter lo0 tcp_class 0 0 0 0 6 -# -# UDP 5Mbps guaranteed rate (no excess bandwidth assigned) -# -class hfsc lo0 udp_class root grate 5M - filter lo0 udp_class 0 0 0 0 17 diff --git a/usr.sbin/altq/altqd/altq.conf.samples/hfsc.pvc0 b/usr.sbin/altq/altqd/altq.conf.samples/hfsc.pvc0 deleted file mode 100644 index 05c73333781..00000000000 --- a/usr.sbin/altq/altqd/altq.conf.samples/hfsc.pvc0 +++ /dev/null @@ -1,14 +0,0 @@ -# -# simple test config for pvc0 -# - -# -interface pvc0 bandwidth 45M hfsc -# -class hfsc pvc0 def_class root pshare 60 default -class hfsc pvc0 shared_class root pshare 40 -class hfsc pvc0 tcp_class shared_class pshare 30 - filter pvc0 tcp_class 0 0 0 0 6 -class hfsc pvc0 csl_class shared_class pshare 10 - filter pvc0 csl_class 0 0 172.16.4.176 0 6 - diff --git a/usr.sbin/altq/altqd/altq.conf.samples/hfsc.share b/usr.sbin/altq/altqd/altq.conf.samples/hfsc.share deleted file mode 100644 index 2086553f9c0..00000000000 --- a/usr.sbin/altq/altqd/altq.conf.samples/hfsc.share +++ /dev/null @@ -1,34 +0,0 @@ -# -# a config for hierachical sharing -# - -interface pvc0 bandwidth 45M hfsc -# -# 10% of the bandwidth share goes to the default class -# -class hfsc pvc0 def_class root pshare 10 default -# -# bandwidth share guaranteed rate -# CMU: 45% 15Mbps -# MIT: 45% 15Mbps -# -class hfsc pvc0 cmu root grate 15M pshare 45 -class hfsc pvc0 mit root grate 15M pshare 45 -# -# CMU bandwidth share guaranteed rate -# CS: 20% 10Mbps -# other: 20% 5Mbps -# -class hfsc pvc0 cmu_other cmu grate 10M pshare 20 - filter pvc0 cmu_other 0 0 0 0 6 -class hfsc pvc0 cmu_cs cmu grate 5M pshare 20 - filter pvc0 cmu_cs 0 0 172.16.4.176 0 6 -# -# MIT bandwidth share guaranteed rate -# CS: 20% 10Mbps -# other: 20% 5Mbps -# -class hfsc pvc0 mit_other mit grate 10M pshare 20 - filter pvc0 mit_other 0 0 0 0 17 -class hfsc pvc0 mit_cs mit grate 5M pshare 20 - filter pvc0 mit_cs 0 0 172.16.4.176 0 17 diff --git a/usr.sbin/altq/altqd/altqd.8 b/usr.sbin/altq/altqd/altqd.8 deleted file mode 100644 index 71ec6aefed8..00000000000 --- a/usr.sbin/altq/altqd/altqd.8 +++ /dev/null @@ -1,109 +0,0 @@ -.\" $OpenBSD: altqd.8,v 1.7 2002/03/01 11:07:25 kjc Exp $ -.\" $KAME: altqd.8,v 1.5 2001/07/19 11:07:33 kjc Exp $ -.\" -.\" Copyright (C) 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. -.\" -.Dd September 28, 1999 -.Dt ALTQD 8 -.Os -.Sh NAME -.Nm altqd -.Nd ALTQ daemon -.Sh SYNOPSIS -.Nm altqd -.Op Fl dvD -.Op Fl f Ar conf_file -.Sh DESCRIPTION -.Nm -is a daemon program that reads a configuration file and then sets up -the ALTQ state of network interfaces. -After configuring the ALTQ state, -.Nm -will detach and become a daemon. -.Pp -The signal SIGINT or SIGTERM will shutdown -.Nm Ns , -and the signal SIGHUP will restart -.Nm Ns . -.Pp -The following options are available: -.Bl -tag -width Fl -.It Fl f -Specify a configuration file to read instead of the default. -The default file is -.Pa /etc/altq.conf . -.It Fl d -Debug mode. -.Nm -does not detach and goes into the command mode. -.It Fl v -Print debugging information. -This option implies -.Fl d . -.It Fl D -Dummy mode. -.Nm -does not issue altq system calls. -.El -.Sh COMMANDS -When -.Fl d -option is provided, -.Nm -goes into the command mode after reading the configuration file and -setting up the ALTQ state. -Each command is a single line, starting with the command verb. -.Pp -The basic commands are as follows: -.Bl -tag -width help -.It Cm help | ? -Display a complete list of commands and their syntax. -.It Cm quit -Exit. -.It Cm altq Ar reload -Reload the configuration file and reinitialize ALTQ. -.It Cm altq Ar interface Op enable|disable -Enables or disables ALTQ on the interface named -.Em interface . -When -.Nm -enters the command mode, ALTQ is enabled on all the -interfaces listed in the configuration file. -.El -.Sh FILES -.Bl -tag -width /var/run/altqd.pid -compact -.It Pa /etc/altq.conf -configuration file -.It Pa /var/run/altqd.pid -pid of the running -.Nm -.It Pa /var/run/altq_quip -Unix domain socket for communicating with -.Xr altqstat 1 -.El -.Sh SEE ALSO -.Xr altqstat 1 , -.Xr altq.conf 5 , -.Xr altq 9 diff --git a/usr.sbin/altq/altqd/altqd.c b/usr.sbin/altq/altqd/altqd.c deleted file mode 100644 index e43cfa7409b..00000000000 --- a/usr.sbin/altq/altqd/altqd.c +++ /dev/null @@ -1,308 +0,0 @@ -/* $OpenBSD: altqd.c,v 1.8 2002/02/20 10:54:24 kjc Exp $ */ -/* $KAME: altqd.c,v 1.9 2002/02/12 10:12:15 kjc Exp $ */ -/* - * Copyright (c) 2001 Theo de Raadt - * 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 THE AUTHOR ``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 THE AUTHOR 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. - * - * Copyright (C) 1997-2002 - * 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. - */ - -#include <sys/param.h> -#include <sys/socket.h> -#include <sys/un.h> -#include <sys/stat.h> -#include <net/if.h> - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <string.h> -#include <errno.h> -#include <signal.h> -#include <fcntl.h> -#include <syslog.h> -#include <err.h> -#ifndef __FreeBSD__ -#include <util.h> -#endif - -#include <altq/altq.h> -#include "altq_qop.h" -#include "quip_server.h" - -#define MAX_CLIENT 10 - -static volatile sig_atomic_t gotsig_hup, gotsig_int, gotsig_term; - -static void usage(void); -static void sig_handler(int); - -static void -usage(void) -{ - fprintf(stderr, "usage: altqd [-vd] [-f config]\n"); - exit(1); -} - -static void -sig_handler(int sig) -{ - switch (sig) { - case SIGHUP: - gotsig_hup = 1; - break; - case SIGINT: - gotsig_int = 1; - break; - case SIGTERM: - gotsig_term = 1; - break; - case SIGPIPE: - /* - * we have lost an API connection. - * a subsequent output operation will catch EPIPE. - */ - break; - } -} - -int -main(int argc, char **argv) -{ - int i, c, maxfd, rval, qpsock; - fd_set fds, rfds; - FILE *fp, *client[MAX_CLIENT]; - - m_debug = 0; - l_debug = LOG_INFO; - fp = NULL; - for (i = 0; i < MAX_CLIENT; i++) - client[i] = NULL; - - while ((c = getopt(argc, argv, "f:vDdl:")) != -1) { - switch (c) { - case 'f': - altqconfigfile = optarg; - break; - case 'D': /* -D => dummy mode */ - Debug_mode = 1; - printf("Debug mode set.\n"); - break; - case 'v': - l_debug = LOG_DEBUG; - m_debug |= DEBUG_ALTQ; - daemonize = 0; - break; - case 'd': - daemonize = 0; - break; - case 'l': - l_debug = atoi(optarg); - break; - default: - usage(); - } - } - - signal(SIGINT, sig_handler); - signal(SIGTERM, sig_handler); - signal(SIGHUP, sig_handler); - signal(SIGPIPE, sig_handler); - - if (daemonize) - openlog("altqd", LOG_PID, LOG_DAEMON); - - if (qcmd_init() != 0) { - if (daemonize) - closelog(); - exit(1); - } - - /* - * open a unix domain socket for altqd clients - */ - if ((qpsock = socket(AF_LOCAL, SOCK_STREAM, 0)) < 0) - LOG(LOG_ERR, errno, "can't open unix domain socket"); - else { - struct sockaddr_un addr; - - bzero(&addr, sizeof(addr)); - addr.sun_family = AF_LOCAL; - strlcpy(addr.sun_path, QUIP_PATH, sizeof(addr.sun_path)); - unlink(QUIP_PATH); - if (bind(qpsock, (struct sockaddr *)&addr, - sizeof(addr)) < 0) { - LOG(LOG_ERR, errno, "can't bind to %s", QUIP_PATH); - close(qpsock); - qpsock = -1; - } - chmod(QUIP_PATH, 0666); - if (listen(qpsock, SOMAXCONN) < 0) { - LOG(LOG_ERR, errno, "can't listen to %s", QUIP_PATH); - close(qpsock); - qpsock = -1; - } - } - - if (daemonize) { - daemon(0, 0); - - /* save pid to the pid file (/var/tmp/altqd.pid) */ - if (pidfile(NULL)) - LOG(LOG_WARNING, errno, "can't open pid file"); - } else { - /* interactive mode */ - fp = stdin; - printf("\nEnter ? or command:\n"); - printf("altqd %s> ", cur_ifname()); - fflush(stdout); - } - - /* - * go into the command mode. - */ - FD_ZERO(&fds); - maxfd = 0; - if (fp != NULL) { - FD_SET(fileno(fp), &fds); - maxfd = MAX(maxfd, fileno(fp) + 1); - } - if (qpsock >= 0) { - FD_SET(qpsock, &fds); - maxfd = MAX(maxfd, qpsock + 1); - } - - rval = 1; - while (rval) { - if (gotsig_hup) { - qcmd_destroyall(); - gotsig_hup = 0; - LOG(LOG_INFO, 0, "reinitializing altqd..."); - if (qcmd_init() != 0) { - LOG(LOG_INFO, 0, "reinitialization failed"); - break; - } - } - if (gotsig_term || gotsig_int) { - LOG(LOG_INFO, 0, "Exiting on signal %d", - gotsig_term ? SIGTERM : SIGINT); - break; - } - - FD_COPY(&fds, &rfds); - if (select(maxfd, &rfds, NULL, NULL, NULL) < 0) { - if (errno != EINTR) - err(1, "select"); - continue; - } - - /* - * if there is command input, read the input line, - * parse it, and execute. - */ - if (fp && FD_ISSET(fileno(fp), &rfds)) { - rval = do_command(fp); - if (rval == 0) { - /* quit command or eof on input */ - LOG(LOG_INFO, 0, "Exiting."); - } else if (fp == stdin) - printf("altqd %s> ", cur_ifname()); - fflush(stdout); - } else if (qpsock >= 0 && FD_ISSET(qpsock, &rfds)) { - /* - * quip connection request from client via unix - * domain socket; get a new socket for this - * connection and add it to the select list. - */ - int newsock = accept(qpsock, NULL, NULL); - - if (newsock == -1) { - LOG(LOG_ERR, errno, "accept"); - continue; - } - FD_SET(newsock, &fds); - for (i = 0; i < MAX_CLIENT; i++) - if (client[i] == NULL) { - client[i] = fdopen(newsock, "r+"); - break; - } - maxfd = MAX(maxfd, newsock + 1); - } else { - /* - * check input from a client via unix domain socket - */ - for (i = 0; i < MAX_CLIENT; i++) { - int fd; - - if (client[i] == NULL) - continue; - fd = fileno(client[i]); - if (FD_ISSET(fd, &rfds)) { - if (quip_input(client[i]) != 0 || - fflush(client[i]) != 0) { - /* connection closed */ - fclose(client[i]); - client[i] = NULL; - FD_CLR(fd, &fds); - } - } - } - } - } - - /* cleanup and exit */ - qcmd_destroyall(); - if (qpsock >= 0) - (void)close(qpsock); - unlink(QUIP_PATH); - - for (i = 0; i < MAX_CLIENT; i++) - if (client[i] != NULL) - (void)fclose(client[i]); - if (daemonize) { - closelog(); - } - exit(0); -} diff --git a/usr.sbin/altq/altqd/libaltq2.c b/usr.sbin/altq/altqd/libaltq2.c deleted file mode 100644 index 1ff3a2da2c8..00000000000 --- a/usr.sbin/altq/altqd/libaltq2.c +++ /dev/null @@ -1,83 +0,0 @@ -/* $KAME: libaltq2.c,v 1.3 2001/08/16 10:39:16 kjc 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. - */ - -/* - * this file contains functions and variables needed to use libaltq. - * since these are defined in rsvpd, they should be separated in order - * to link libaltq to rsvpd. - */ -#include <sys/param.h> - -#include <altq/altq.h> - -#include <stdio.h> -#include <errno.h> -#include <string.h> -#include <syslog.h> -#include <stdarg.h> - -#include "altq_qop.h" - -/* from rsvp_main.c */ -char *altqconfigfile = "/etc/altq.conf"; - -/* from rsvp_global.h */ -int if_num; /* number of phyints */ -int m_debug; /* Debug output control bits */ -int l_debug; /* Logging severity level */ - -int daemonize = 1; - -/* taken from rsvp_debug.c and modified. */ -void -log_write(int severity, int syserr, const char *format, ...) -{ - va_list ap; - - va_start(ap, format); - - if (severity <= l_debug) { - if (!daemonize) { - vfprintf(stderr, format, ap); - if (syserr != 0) - fprintf(stderr, ": %s", strerror(syserr)); - fprintf(stderr, "\n"); - } else { - if (syserr == 0) - vsyslog(severity, format, ap); - else { - char buf[512]; - - strlcpy(buf, format, sizeof(buf)); - strlcat(buf, ": %m", sizeof(buf)); - vsyslog(severity, buf, ap); - } - } - } - - va_end(ap); -} diff --git a/usr.sbin/altq/altqstat/Makefile b/usr.sbin/altq/altqstat/Makefile deleted file mode 100644 index 71aea044c67..00000000000 --- a/usr.sbin/altq/altqstat/Makefile +++ /dev/null @@ -1,16 +0,0 @@ -# $OpenBSD: Makefile,v 1.1.1.1 2001/06/27 18:23:19 kjc Exp $ -# $NetBSD: Makefile,v 1.2 2000/12/16 18:57:35 thorpej Exp $ - -BINDIR=/usr/bin - -PROG= altqstat -SRCS= altqstat.c quip_client.c qdisc_conf.c qdisc_cbq.c qdisc_hfsc.c \ - qdisc_cdnr.c qdisc_wfq.c qdisc_fifoq.c qdisc_red.c qdisc_rio.c \ - qdisc_blue.c qdisc_priq.c - -CPPFLAGS+= -DALTQ -I${.CURDIR}/../libaltq - -DPADD+= ${LIBCURSES} -LDADD+= -lcurses - -.include <bsd.prog.mk> diff --git a/usr.sbin/altq/altqstat/altqstat.1 b/usr.sbin/altq/altqstat/altqstat.1 deleted file mode 100644 index 224f3354cd9..00000000000 --- a/usr.sbin/altq/altqstat/altqstat.1 +++ /dev/null @@ -1,102 +0,0 @@ -.\" $OpenBSD: altqstat.1,v 1.4 2002/03/01 11:07:25 kjc Exp $ -.\" $KAME: altqstat.1,v 1.3 2001/04/09 16:26:29 thorpej Exp $ -.\" -.\" Copyright (C) 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. -.\" -.Dd December 24, 1999 -.Dt ALTQSTAT 1 -.Os -.Sh NAME -.Nm altqstat -.Nd show altq status -.Sh SYNOPSIS -.Nm altqstat -.Op Fl enrs -.Op Fl c Ar count -.Op Fl w Ar wait -.Op Fl i Ar interface -.Op Fl I Ar input_interface -.Sh DESCRIPTION -The -.Nm altqstat -command displays the status of a queueing discipline. The contents -displayed by -.Nm -is specific to each queueing discipline. -.Pp -The options are as follows: -.Bl -tag -width Fl -.It Fl e -Echo communication with -.Xr altqd 8 -to standard output. This option is for debugging. -.It Fl n -Disable communication with -.Xr altqd 8 . -The interface should be explicitly specified. -.It Fl r -Enter the raw console mode to talk to -.Xr altqd 8 . -This option is for debugging queue information exchange between -.Nm -and -.Xr altqd 8 . -.It Fl s -List all interfaces, classes and filters currently installed. -.It Fl c Ar count -.Nm -exits after displaying -.Ar count -times. If no repeat -.Ar count -is specified, the default is infinity. -.It Fl w Ar wait -Pause -.Ar wait -seconds between each display. If no repeat -.Ar wait -interval is specified, the default is 5 seconds. -.It Fl i Ar interface -Show information about the specified interface. If no -.Ar interface -is specified, the default interface is the first interface returned -from -.Xr altqd 8 . -.It Fl I Ar input_interface -Show information about the specified input interface. This option is -used to specify -.Em traffic conditioner -at an input interface. -.El -.Sh FILES -.Bl -tag -width /var/run/altqd.pid -compact -.It Pa /var/run/altq_quip -Unix domain socket for communicating with -.Xr altqd 8 -.El -.Sh SEE ALSO -.Xr altq.conf 5 , -.Xr altqd 8 , -.Xr altq 9 diff --git a/usr.sbin/altq/altqstat/altqstat.c b/usr.sbin/altq/altqstat/altqstat.c deleted file mode 100644 index 08e8ce89ee3..00000000000 --- a/usr.sbin/altq/altqstat/altqstat.c +++ /dev/null @@ -1,228 +0,0 @@ -/* $OpenBSD: altqstat.c,v 1.3 2001/11/14 20:07:17 deraadt Exp $ */ -/* $KAME: altqstat.c,v 1.6 2001/08/16 07:43:14 itojun Exp $ */ -/* - * Copyright (C) 1999-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. - */ - -#include <sys/param.h> -#include <sys/time.h> -#include <sys/fcntl.h> - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <string.h> -#include <signal.h> -#include <errno.h> -#include <err.h> -#ifndef NO_CURSES -#include <curses.h> -#endif - -#include "quip_client.h" -#include "altqstat.h" - -#define DEV_PATH "/dev/altq" - -int qdiscfd = -1; -int show_config = 0; -int interval = 5; -int no_server = 0; -char *interface = NULL; -char *qdisc_name = NULL; - -stat_loop_t *stat_loop; - -static void sig_handler(int); -static void usage(void); - -static void -sig_handler(int sig) -{ - char buf[8192]; - - snprintf(buf, sizeof buf, "Exiting on signal %d\n", sig); - write(STDERR_FILENO, buf, strlen(buf)); - -#ifndef NO_CURSES - /* XXX signal race */ - if (qdisc_name != NULL && strcmp(qdisc_name, "wfq") == 0) - endwin(); /* wfqstat uses curses */ -#endif - _exit(0); -} - -static void -usage(void) -{ - fprintf(stderr, "usage: altqstat [-enrs] [-c count] [-w wait] [-i interface|-I input_interface]\n"); - exit(1); -} - -int -main (int argc, char **argv) -{ - int ch, raw_mode = 0; - int qtype; - int count = 0; - char device[64], qname[64], input[32]; - - while ((ch = getopt(argc, argv, "I:c:ei:nrsw:")) != -1) { - switch (ch) { - case 'I': - snprintf(input, sizeof(input), "_%s", optarg); - interface = input; - break; - case 'c': - count = atoi(optarg); - break; - case 'e': - quip_echo = 1; - break; - case 'i': - interface = optarg; - break; - case 'n': - no_server = 1; - break; - case 'r': - raw_mode = 1; - quip_echo = 1; - break; - case 's': - show_config = 1; - break; - case 'w': - interval = atoi(optarg); - break; - default: - usage(); - break; - } - } - - signal(SIGINT, sig_handler); - signal(SIGTERM, sig_handler); - signal(SIGPIPE, sig_handler); - - if (no_server == 0) { - if (quip_openserver() < 0 && interface == NULL) - errx(1, "you have to specify interface!"); - } - - if (raw_mode == 1) { - quip_rawmode(); - quip_closeserver(); - exit(0); - } - - if (show_config) { - if (no_server) - errx(1, "no server (-n) can't be set for show config (-s)!"); - quip_printconfig(); - quip_closeserver(); - exit(0); - } - - interface = quip_selectinterface(interface); - if (interface == NULL) - errx(1, "no interface found!"); - - qtype = ifname2qdisc(interface, qname); - if (qtype == 0) - errx(1, "altq is not attached on %s!", interface); - - qdisc_name = qname; - - stat_loop = qdisc2stat_loop(qdisc_name); - if (stat_loop == NULL) - errx(1, "qdisc %s is not supported!", qdisc_name); - - printf("%s: %s on interface %s\n", - argv[0], qdisc_name, interface); - - snprintf(device, sizeof(device), "%s/%s", DEV_PATH, qdisc_name); - if ((qdiscfd = open(device, O_RDONLY)) < 0) - err(1, "can't open %s", device); - - (*stat_loop)(qdiscfd, interface, count, interval); - /* never returns */ - - exit(0); -} - -/* calculate interval in sec */ -double -calc_interval(struct timeval *cur_time, struct timeval *last_time) -{ - double sec; - - sec = (double)(cur_time->tv_sec - last_time->tv_sec) + - (double)(cur_time->tv_usec - last_time->tv_usec) / 1000000; - return (sec); -} - - -/* calculate rate in bps */ -double -calc_rate(u_int64_t new_bytes, u_int64_t last_bytes, double interval) -{ - double rate; - - rate = (double)(new_bytes - last_bytes) * 8 / interval; - return (rate); -} - -/* calculate packets in second */ -double -calc_pps(u_int64_t new_pkts, u_int64_t last_pkts, double interval) -{ - double pps; - - pps = (double)(new_pkts - last_pkts) / interval; - return (pps); -} - -#define R2S_BUFS 8 -#define RATESTR_MAX 16 -char * -rate2str(double rate) -{ - char *buf; - static char r2sbuf[R2S_BUFS][RATESTR_MAX]; /* ring bufer */ - static int idx = 0; - - buf = r2sbuf[idx++]; - if (idx == R2S_BUFS) - idx = 0; - - if (rate == 0.0) - snprintf(buf, RATESTR_MAX, "0"); - else if (rate >= 1000000.0) - snprintf(buf, RATESTR_MAX, "%.2fM", rate / 1000000.0); - else - snprintf(buf, RATESTR_MAX, "%.2fK", rate / 1000.0); - return (buf); -} diff --git a/usr.sbin/altq/altqstat/altqstat.h b/usr.sbin/altq/altqstat/altqstat.h deleted file mode 100644 index c33ea599560..00000000000 --- a/usr.sbin/altq/altqstat/altqstat.h +++ /dev/null @@ -1,67 +0,0 @@ -/* $OpenBSD: altqstat.h,v 1.2 2001/08/16 12:59:43 kjc Exp $ */ -/* $KAME: altqstat.h,v 1.4 2001/08/16 07:43:14 itojun Exp $ */ -/* - * Copyright (C) 1999-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. - */ - -typedef void (stat_loop_t)(int fd, const char *ifname, - int count, int interval); - -struct qdisc_conf { - const char *qdisc_name; /* e.g., cbq */ - int altqtype; /* e.g., ALTQT_CBQ */ - stat_loop_t *stat_loop; -}; - -/* - * cast u_int64_t to ull for printf, since type of u_int64_t - * is architecture dependent - */ -typedef unsigned long long ull; - -stat_loop_t cbq_stat_loop; -stat_loop_t hfsc_stat_loop; -stat_loop_t cdnr_stat_loop; -stat_loop_t wfq_stat_loop; -stat_loop_t fifoq_stat_loop; -stat_loop_t red_stat_loop; -stat_loop_t rio_stat_loop; -stat_loop_t blue_stat_loop; -stat_loop_t priq_stat_loop; - -struct redstats; - -void chandle2name(const char *, u_long, char *, size_t); -stat_loop_t *qdisc2stat_loop(const char *); -int ifname2qdisc(const char *, char *); -double calc_interval(struct timeval *, struct timeval *); -double calc_rate(u_int64_t, u_int64_t, double); -double calc_pps(u_int64_t, u_int64_t, double); -char *rate2str(double); -int print_redstats(struct redstats *); -int print_riostats(struct redstats *); - - - diff --git a/usr.sbin/altq/altqstat/qdisc_blue.c b/usr.sbin/altq/altqstat/qdisc_blue.c deleted file mode 100644 index 611ae52f8a9..00000000000 --- a/usr.sbin/altq/altqstat/qdisc_blue.c +++ /dev/null @@ -1,91 +0,0 @@ -/* $OpenBSD: qdisc_blue.c,v 1.2 2001/08/16 12:59:43 kjc Exp $ */ -/* $KAME: qdisc_blue.c,v 1.3 2001/08/15 12:51:58 kjc Exp $ */ -/* - * Copyright (C) 1999-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. - */ - -#include <sys/param.h> -#include <sys/ioctl.h> -#include <sys/time.h> -#include <sys/socket.h> -#include <net/if.h> -#include <netinet/in.h> -#include <altq/altq.h> -#include <altq/altq_blue.h> - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <string.h> -#include <math.h> -#include <errno.h> -#include <err.h> - -#include "altqstat.h" - -void -blue_stat_loop(int fd, const char *ifname, int count, int interval) -{ - struct blue_stats blue_stats; - struct timeval cur_time, last_time; - u_int64_t last_bytes; - double sec; - int cnt = count; - - strlcpy(blue_stats.iface.blue_ifname, ifname, - sizeof(blue_stats.iface.blue_ifname)); - - gettimeofday(&last_time, NULL); - last_time.tv_sec -= interval; - last_bytes = 0; - - while (count == 0 || cnt-- > 0) { - - if (ioctl(fd, BLUE_GETSTATS, &blue_stats) < 0) - err(1, "ioctl BLUE_GETSTATS"); - - gettimeofday(&cur_time, NULL); - sec = calc_interval(&cur_time, &last_time); - - printf(" q_len:%d , q_limit:%d, q_pmark: %d\n", - blue_stats.q_len, blue_stats.q_limit, - blue_stats.q_pmark); - printf(" xmit: %llu pkts, drop: %llu pkts (forced: %llu, early: %llu)\n", - (ull)blue_stats.xmit_packets, - (ull)blue_stats.drop_packets, - (ull)blue_stats.drop_forced, - (ull)blue_stats.drop_unforced); - if (blue_stats.marked_packets != 0) - printf(" marked: %llu\n", - (ull)blue_stats.marked_packets); - printf(" throughput: %sbps\n", - rate2str(calc_rate(blue_stats.xmit_bytes, - last_bytes, sec))); - - last_bytes = blue_stats.xmit_bytes; - last_time = cur_time; - sleep(interval); - } -} diff --git a/usr.sbin/altq/altqstat/qdisc_cbq.c b/usr.sbin/altq/altqstat/qdisc_cbq.c deleted file mode 100644 index 2ae7f06735d..00000000000 --- a/usr.sbin/altq/altqstat/qdisc_cbq.c +++ /dev/null @@ -1,161 +0,0 @@ -/* $OpenBSD: qdisc_cbq.c,v 1.3 2001/11/07 05:05:00 kjc Exp $ */ -/* $KAME: qdisc_cbq.c,v 1.4 2001/08/15 12:51:58 kjc Exp $ */ -/* - * Copyright (C) 1999-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. - */ - -#include <sys/param.h> -#include <sys/ioctl.h> -#include <sys/time.h> -#include <sys/socket.h> -#include <net/if.h> -#include <netinet/in.h> -#include <altq/altq.h> -#include <altq/altq_cbq.h> - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <string.h> -#include <math.h> -#include <errno.h> -#include <err.h> - -#include "quip_client.h" -#include "altqstat.h" - -#define NCLASSES 64 - -#ifndef RM_FILTER_GAIN -#define RM_FILTER_GAIN 5 /* log2 of gain, e.g., 5 => 31/32 */ -#endif -#ifndef RM_POWER -#define RM_POWER (1 << RM_FILTER_GAIN) -#endif - -void -cbq_stat_loop(int fd, const char *ifname, int count, int interval) -{ - class_stats_t stats1[NCLASSES], stats2[NCLASSES]; - char clnames[NCLASSES][128]; - u_long clhandles[NCLASSES]; - struct cbq_getstats get_stats; - class_stats_t *sp, *lp, *new, *last, *tmp; - struct timeval cur_time, last_time; - int i; - double flow_bps, sec; - int cnt = count; - - strlcpy(get_stats.iface.cbq_ifacename, ifname, - sizeof(get_stats.iface.cbq_ifacename)); - new = &stats1[0]; - last = &stats2[0]; - - for (i = 0; i < NCLASSES; i++) - clhandles[i] = NULL_CLASS_HANDLE; - - while (count == 0 || cnt-- > 0) { - get_stats.nclasses = NCLASSES; - get_stats.stats = new; - if (ioctl(fd, CBQ_GETSTATS, &get_stats) < 0) - err(1, "ioctl CBQ_GETSTATS"); - - gettimeofday(&cur_time, NULL); - sec = calc_interval(&cur_time, &last_time); - - for (i=0; i<get_stats.nclasses; i++) { - sp = &new[i]; - lp = &last[i]; - - if (sp->handle != clhandles[i]) { - quip_chandle2name(ifname, sp->handle, - clnames[i], sizeof(clnames[0])); - clhandles[i] = sp->handle; - continue; - } - - switch (sp->handle) { - case ROOT_CLASS_HANDLE: - printf("Root Class for Interface %s: %s\n", - ifname, clnames[i]); - break; - case DEFAULT_CLASS_HANDLE: - printf("Default Class for Interface %s: %s\n", - ifname, clnames[i]); - break; - case CTL_CLASS_HANDLE: - printf("Ctl Class for Interface %s: %s\n", - ifname, clnames[i]); - break; - default: - printf("Class %d on Interface %s: %s\n", - sp->handle, ifname, clnames[i]); - break; - } - - flow_bps = 8.0 / (double)sp->ns_per_byte - * 1000*1000*1000; - - printf("\tpriority: %d depth: %d", - sp->priority, sp->depth); - printf(" offtime: %d [us] wrr_allot: %d bytes\n", - sp->offtime, sp->wrr_allot); - printf("\tnsPerByte: %d", sp->ns_per_byte); - printf("\t(%sbps),", rate2str(flow_bps)); - printf("\tMeasured: %s [bps]\n", - rate2str(calc_rate(sp->xmit_cnt.bytes, - lp->xmit_cnt.bytes, sec))); - printf("\tpkts: %llu,\tbytes: %llu\n", - (ull)sp->xmit_cnt.packets, - (ull)sp->xmit_cnt.bytes); - printf("\tovers: %u,\toveractions: %u\n", - sp->over, sp->overactions); - printf("\tborrows: %u,\tdelays: %u\n", - sp->borrows, sp->delays); - printf("\tdrops: %llu,\tdrop_bytes: %llu\n", - (ull)sp->drop_cnt.packets, - (ull)sp->drop_cnt.bytes); - if (sp->qtype == Q_RED) - print_redstats(sp->red); - else if (sp->qtype == Q_RIO) - print_riostats(sp->red); - - printf("\tQCount: %d,\t(qmax: %d)\n", - sp->qcnt, sp->qmax); - printf("\tAvgIdle: %d [us],\t(maxidle: %d minidle: %d [us])\n", - sp->avgidle >> RM_FILTER_GAIN, - sp->maxidle >> RM_FILTER_GAIN, - sp->minidle / RM_POWER); - } - - /* swap the buffer pointers */ - tmp = last; - last = new; - new = tmp; - - last_time = cur_time; - sleep(interval); - } -} diff --git a/usr.sbin/altq/altqstat/qdisc_cdnr.c b/usr.sbin/altq/altqstat/qdisc_cdnr.c deleted file mode 100644 index f2ebf23ed5f..00000000000 --- a/usr.sbin/altq/altqstat/qdisc_cdnr.c +++ /dev/null @@ -1,154 +0,0 @@ -/* $OpenBSD: qdisc_cdnr.c,v 1.2 2001/08/16 12:59:43 kjc Exp $ */ -/* $KAME: qdisc_cdnr.c,v 1.4 2001/08/15 12:51:58 kjc Exp $ */ -/* - * Copyright (C) 1999-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. - */ - -#include <sys/param.h> -#include <sys/ioctl.h> -#include <sys/time.h> -#include <sys/socket.h> -#include <net/if.h> -#include <netinet/in.h> -#include <altq/altq.h> -#include <altq/altq_cdnr.h> - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <string.h> -#include <math.h> -#include <errno.h> -#include <err.h> - -#include "quip_client.h" -#include "altqstat.h" - -#define NELEMENTS 64 -#define MAX_PROB (128*1024) - -static char *element_names[] = { "none", "top", "element", "tbmeter", "trtcm", - "tswtcm" }; -static char *tbmprof_names[] = { "in: ", "out: " }; -static char *tcmprof_names[] = { "green: ", "yellow:", "red: " }; - -void -cdnr_stat_loop(int fd, const char *ifname, int count, int interval) -{ - struct tce_stats stats1[NELEMENTS], stats2[NELEMENTS]; - char cdnrnames[NELEMENTS][128]; - struct cdnr_get_stats get_stats; - struct tce_stats *sp, *lp, *new, *last, *tmp; - struct timeval cur_time, last_time; - double sec; - char **profile_names, _ifname[32]; - int i, j, nprofile; - int cnt = count; - - if (ifname[0] == '_') - ifname++; - snprintf(_ifname, sizeof(_ifname), "_%s", ifname); - - strlcpy(get_stats.iface.cdnr_ifname, ifname, - sizeof(get_stats.iface.cdnr_ifname)); - new = &stats1[0]; - last = &stats2[0]; - - for (i = 0; i < NELEMENTS; i++) - stats1[i].tce_handle = stats2[i].tce_handle = CDNR_NULL_HANDLE; - - while (count == 0 || cnt-- > 0) { - get_stats.nskip = 0; - get_stats.nelements = NELEMENTS; - get_stats.tce_stats = new; - - if (ioctl(fd, CDNR_GETSTATS, &get_stats) < 0) - err(1, "ioctl CDNR_GETSTATS"); - - gettimeofday(&cur_time, NULL); - sec = calc_interval(&cur_time, &last_time); - - printf("actions:\n"); - printf(" pass:%llu drop:%llu mark:%llu next:%llu return:%llu none:%llu\n", - (ull)get_stats.cnts[TCACODE_PASS].packets, - (ull)get_stats.cnts[TCACODE_DROP].packets, - (ull)get_stats.cnts[TCACODE_MARK].packets, - (ull)get_stats.cnts[TCACODE_NEXT].packets, - (ull)get_stats.cnts[TCACODE_RETURN].packets, - (ull)get_stats.cnts[TCACODE_NONE].packets); - - for (i = 0; i < get_stats.nelements; i++) { - sp = &new[i]; - lp = &last[i]; - - if (sp->tce_handle != lp->tce_handle) { - quip_chandle2name(_ifname, sp->tce_handle, - cdnrnames[i], sizeof(cdnrnames[0])); - continue; - } - - switch (sp->tce_type) { - case TCETYPE_TBMETER: - nprofile = 2; - profile_names = tbmprof_names; - break; - case TCETYPE_TRTCM: - case TCETYPE_TSWTCM: - nprofile = 3; - profile_names = tcmprof_names; - break; - default: - profile_names = tbmprof_names; /* silence cc */ - nprofile = 0; - } - - if (nprofile == 0) - continue; - - printf("[%s: %s] handle:%#lx\n", - element_names[sp->tce_type], cdnrnames[i], - sp->tce_handle); - for (j = 0; j < nprofile; j++) { - printf(" %s %10llu pkts %16llu bytes (%sbps)\n", - profile_names[j], - (ull)sp->tce_cnts[j].packets, - (ull)sp->tce_cnts[j].bytes, - rate2str( - calc_rate(sp->tce_cnts[j].bytes, - lp->tce_cnts[j].bytes, - sec))); - } - } - printf("\n"); - - /* swap the buffer pointers */ - tmp = last; - last = new; - new = tmp; - - last_time = cur_time; - sleep(interval); - } -} diff --git a/usr.sbin/altq/altqstat/qdisc_conf.c b/usr.sbin/altq/altqstat/qdisc_conf.c deleted file mode 100644 index 96331950dd8..00000000000 --- a/usr.sbin/altq/altqstat/qdisc_conf.c +++ /dev/null @@ -1,107 +0,0 @@ -/* $KAME: qdisc_conf.c,v 1.4 2001/08/15 12:51:59 kjc Exp $ */ -/* - * Copyright (C) 1999-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. - */ - -#include <sys/param.h> -#include <sys/socket.h> -#if defined(__NetBSD__) || defined(__OpenBSD__) -#include <sys/ioctl.h> -#endif -#include <sys/fcntl.h> -#include <net/if.h> -#include <netinet/in.h> -#include <altq/altq.h> - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <string.h> -#include <err.h> - -#include "altqstat.h" - -#define ALTQ_DEVICE "/dev/altq/altq" - -struct qdisc_conf qdisc_table[] = { - {"cbq", ALTQT_CBQ, cbq_stat_loop}, - {"hfsc", ALTQT_HFSC, hfsc_stat_loop}, - {"cdnr", ALTQT_CDNR, cdnr_stat_loop}, - {"wfq", ALTQT_WFQ, wfq_stat_loop}, - {"fifoq", ALTQT_FIFOQ, fifoq_stat_loop}, - {"red", ALTQT_RED, red_stat_loop}, - {"rio", ALTQT_RIO, rio_stat_loop}, - {"blue", ALTQT_BLUE, blue_stat_loop}, - {"priq", ALTQT_PRIQ, priq_stat_loop}, - {NULL, 0, NULL} -}; - -stat_loop_t * -qdisc2stat_loop(const char *qdisc_name) -{ - struct qdisc_conf *stat; - - for (stat = qdisc_table; stat->qdisc_name != NULL; stat++) - if (strcmp(stat->qdisc_name, qdisc_name) == 0) - return (stat->stat_loop); - return (NULL); -} - -int -ifname2qdisc(const char *ifname, char *qname) -{ - struct altqreq qtypereq; - int fd, qtype = 0; - - if (ifname[0] == '_') { - /* input interface */ - if (qname != NULL) - strlcpy(qname, "cdnr", 64); - return (ALTQT_CDNR); - } - - strlcpy(qtypereq.ifname, ifname, sizeof(qtypereq.ifname)); - if ((fd = open(ALTQ_DEVICE, O_RDONLY)) < 0) { - warn("can't open %s", ALTQ_DEVICE); - return (0); - } - if (ioctl(fd, ALTQGTYPE, &qtypereq) < 0) { - warn("ALTQGQTYPE"); - return (0); - } - close(fd); - - if (qname != NULL) { - struct qdisc_conf *stat; - - qtype = qtypereq.arg; - for (stat = qdisc_table; stat->qdisc_name != NULL; stat++) - if (stat->altqtype == qtype) - strlcpy(qname, stat->qdisc_name, 64); - } - - return (qtype); -} - diff --git a/usr.sbin/altq/altqstat/qdisc_fifoq.c b/usr.sbin/altq/altqstat/qdisc_fifoq.c deleted file mode 100644 index 69bbd5f452f..00000000000 --- a/usr.sbin/altq/altqstat/qdisc_fifoq.c +++ /dev/null @@ -1,86 +0,0 @@ -/* $KAME: qdisc_fifoq.c,v 1.4 2001/08/15 12:51:59 kjc Exp $ */ -/* - * Copyright (C) 1999-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. - */ - -#include <sys/param.h> -#include <sys/ioctl.h> -#include <sys/time.h> -#include <sys/socket.h> -#include <net/if.h> -#include <netinet/in.h> -#include <altq/altq.h> -#include <altq/altq_fifoq.h> - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <string.h> -#include <math.h> -#include <errno.h> -#include <err.h> - -#include "altqstat.h" - -void -fifoq_stat_loop(int fd, const char *ifname, int count, int interval) -{ - struct fifoq_getstats get_stats; - struct timeval cur_time, last_time; - u_int64_t last_bytes; - double sec; - int cnt = count; - - strlcpy(get_stats.iface.fifoq_ifname, ifname, - sizeof(get_stats.iface.fifoq_ifname)); - - gettimeofday(&last_time, NULL); - last_time.tv_sec -= interval; - last_bytes = 0; - - while (count == 0 || cnt-- > 0) { - - if (ioctl(fd, FIFOQ_GETSTATS, &get_stats) < 0) - err(1, "ioctl FIFOQ_GETSTATS"); - - gettimeofday(&cur_time, NULL); - sec = calc_interval(&cur_time, &last_time); - - printf(" q_len:%d q_limit:%d period:%u\n", - get_stats.q_len, get_stats.q_limit, get_stats.period); - printf(" xmit:%llu pkts (%llu bytes) drop:%llu pkts (%llu bytes)\n", - (ull)get_stats.xmit_cnt.packets, - (ull)get_stats.xmit_cnt.bytes, - (ull)get_stats.drop_cnt.packets, - (ull)get_stats.drop_cnt.bytes); - printf(" throughput: %sbps\n", - rate2str(calc_rate(get_stats.xmit_cnt.bytes, - last_bytes, sec))); - - last_bytes = get_stats.xmit_cnt.bytes; - last_time = cur_time; - sleep(interval); - } -} diff --git a/usr.sbin/altq/altqstat/qdisc_hfsc.c b/usr.sbin/altq/altqstat/qdisc_hfsc.c deleted file mode 100644 index 7bf19e4e790..00000000000 --- a/usr.sbin/altq/altqstat/qdisc_hfsc.c +++ /dev/null @@ -1,131 +0,0 @@ -/* $OpenBSD: qdisc_hfsc.c,v 1.2 2001/08/16 12:59:43 kjc Exp $ */ -/* $KAME: qdisc_hfsc.c,v 1.4 2001/08/15 12:51:59 kjc Exp $ */ -/* - * Copyright (C) 1999-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. - */ - -#include <sys/param.h> -#include <sys/ioctl.h> -#include <sys/time.h> -#include <sys/socket.h> -#include <net/if.h> -#include <netinet/in.h> -#include <altq/altq.h> -#include <altq/altq_hfsc.h> - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <string.h> -#include <math.h> -#include <errno.h> -#include <err.h> - -#include "quip_client.h" -#include "altqstat.h" - -#define NCLASSES 64 - -void -hfsc_stat_loop(int fd, const char *ifname, int count, int interval) -{ - struct class_stats stats1[NCLASSES], stats2[NCLASSES]; - char clnames[NCLASSES][128]; - struct hfsc_class_stats get_stats; - struct class_stats *sp, *lp, *new, *last, *tmp; - struct timeval cur_time, last_time; - int i; - double sec; - int cnt = count; - - strlcpy(get_stats.iface.hfsc_ifname, ifname, - sizeof(get_stats.iface.hfsc_ifname)); - new = &stats1[0]; - last = &stats2[0]; - - /* invalidate class ids */ - for (i=0; i<NCLASSES; i++) - last[i].class_id = 999999; /* XXX */ - - while (count == 0 || cnt-- > 0) { - get_stats.nskip = 0; - get_stats.nclasses = NCLASSES; - get_stats.stats = new; - - if (ioctl(fd, HFSC_GETSTATS, &get_stats) < 0) - err(1, "ioctl HFSC_GETSTATS"); - - gettimeofday(&cur_time, NULL); - sec = calc_interval(&cur_time, &last_time); - - printf("\ncur_time:%#llx %u classes %u packets in the tree\n", - (ull)get_stats.cur_time, - get_stats.hif_classes, get_stats.hif_packets); - - for (i=0; i<get_stats.nclasses; i++) { - sp = &new[i]; - lp = &last[i]; - - if (sp->class_id != lp->class_id) { - quip_chandle2name(ifname, sp->class_handle, - clnames[i], sizeof(clnames[0])); - continue; - } - - printf("[%2d %s] handle:%#lx [rt %s %ums %s][ls %s %ums %s]\n", - sp->class_id, clnames[i], sp->class_handle, - rate2str((double)sp->rsc.m1), sp->rsc.d, - rate2str((double)sp->rsc.m2), - rate2str((double)sp->fsc.m1), sp->fsc.d, - rate2str((double)sp->fsc.m2)); - printf(" measured: %sbps [rt:%s ls:%s] qlen:%2d period:%u\n", - rate2str(calc_rate(sp->total, lp->total, sec)), - rate2str(calc_rate(sp->cumul, lp->cumul, sec)), - rate2str(calc_rate(sp->total - sp->cumul, - lp->total - lp->cumul, sec)), - sp->qlength, sp->period); - printf(" packets:%llu (%llu bytes) drops:%llu\n", - (ull)sp->xmit_cnt.packets, - (ull)sp->xmit_cnt.bytes, - (ull)sp->drop_cnt.packets); - printf(" cumul:%#llx total:%#llx\n", - (ull)sp->cumul, (ull)sp->total); - printf(" vt:%#llx d:%#llx e:%#llx\n", - (ull)sp->vt, (ull)sp->d, (ull)sp->e); - if (sp->qtype == Q_RED) - print_redstats(sp->red); - else if (sp->qtype == Q_RIO) - print_riostats(sp->red); - } - - /* swap the buffer pointers */ - tmp = last; - last = new; - new = tmp; - - last_time = cur_time; - sleep(interval); - } -} diff --git a/usr.sbin/altq/altqstat/qdisc_priq.c b/usr.sbin/altq/altqstat/qdisc_priq.c deleted file mode 100644 index db4a2f55279..00000000000 --- a/usr.sbin/altq/altqstat/qdisc_priq.c +++ /dev/null @@ -1,118 +0,0 @@ -/* $OpenBSD: qdisc_priq.c,v 1.2 2001/08/16 12:59:43 kjc Exp $ */ -/* $KAME: qdisc_priq.c,v 1.2 2001/08/15 12:51:59 kjc Exp $ */ -/* - * Copyright (C) 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. - */ - -#include <sys/param.h> -#include <sys/ioctl.h> -#include <sys/time.h> -#include <sys/socket.h> -#include <net/if.h> -#include <netinet/in.h> -#include <altq/altq.h> -#include <altq/altq_priq.h> - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <string.h> -#include <math.h> -#include <errno.h> -#include <err.h> - -#include "quip_client.h" -#include "altqstat.h" - -void -priq_stat_loop(int fd, const char *ifname, int count, int interval) -{ - struct class_stats stats1[PRIQ_MAXPRI], stats2[PRIQ_MAXPRI]; - char clnames[PRIQ_MAXPRI][128]; - struct priq_class_stats get_stats; - struct class_stats *sp, *lp, *new, *last, *tmp; - struct timeval cur_time, last_time; - int i; - double sec; - int cnt = count; - - strlcpy(get_stats.iface.ifname, ifname, - sizeof(get_stats.iface.ifname)); - new = &stats1[0]; - last = &stats2[0]; - - /* invalidate class handles */ - for (i=0; i<PRIQ_MAXPRI; i++) - last[i].class_handle = PRIQ_NULLCLASS_HANDLE; - - while (count == 0 || cnt-- > 0) { - get_stats.stats = new; - get_stats.maxpri = PRIQ_MAXPRI; - if (ioctl(fd, PRIQ_GETSTATS, &get_stats) < 0) - err(1, "ioctl PRIQ_GETSTATS"); - - gettimeofday(&cur_time, NULL); - sec = calc_interval(&cur_time, &last_time); - - printf("\n%s:\n", ifname); - - for (i = get_stats.maxpri; i >= 0; i--) { - sp = &new[i]; - lp = &last[i]; - - if (sp->class_handle == PRIQ_NULLCLASS_HANDLE) - continue; - - if (sp->class_handle != lp->class_handle) { - quip_chandle2name(ifname, sp->class_handle, - clnames[i], sizeof(clnames[0])); - continue; - } - - printf("[%s] handle:%#lx pri:%d\n", - clnames[i], sp->class_handle, i); - printf(" measured: %sbps qlen:%2d period:%u\n", - rate2str(calc_rate(sp->xmitcnt.bytes, - lp->xmitcnt.bytes, sec)), - sp->qlength, sp->period); - printf(" packets:%llu (%llu bytes) drops:%llu\n", - (ull)sp->xmitcnt.packets, - (ull)sp->xmitcnt.bytes, - (ull)sp->dropcnt.packets); - if (sp->qtype == Q_RED) - print_redstats(sp->red); - else if (sp->qtype == Q_RIO) - print_riostats(sp->red); - } - - /* swap the buffer pointers */ - tmp = last; - last = new; - new = tmp; - - last_time = cur_time; - sleep(interval); - } -} diff --git a/usr.sbin/altq/altqstat/qdisc_red.c b/usr.sbin/altq/altqstat/qdisc_red.c deleted file mode 100644 index 87dd9795a91..00000000000 --- a/usr.sbin/altq/altqstat/qdisc_red.c +++ /dev/null @@ -1,115 +0,0 @@ -/* $OpenBSD: qdisc_red.c,v 1.2 2001/08/16 12:59:43 kjc Exp $ */ -/* $KAME: qdisc_red.c,v 1.3 2001/08/15 12:51:59 kjc Exp $ */ -/* - * Copyright (C) 1999-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. - */ - -#include <sys/param.h> -#include <sys/ioctl.h> -#include <sys/time.h> -#include <sys/socket.h> -#include <net/if.h> -#include <netinet/in.h> -#include <altq/altq.h> -#include <altq/altq_red.h> - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <string.h> -#include <math.h> -#include <errno.h> -#include <err.h> - -#include "altqstat.h" - -static int avg_scale = 4096; /* default fixed-point scale */ - -void -red_stat_loop(int fd, const char *ifname, int count, int interval) -{ - struct red_stats red_stats; - struct timeval cur_time, last_time; - u_int64_t last_bytes; - double sec; - int cnt = count; - - strlcpy(red_stats.iface.red_ifname, ifname, - sizeof(red_stats.iface.red_ifname)); - - gettimeofday(&last_time, NULL); - last_time.tv_sec -= interval; - last_bytes = 0; - - while (count == 0 || cnt-- > 0) { - - if (ioctl(fd, RED_GETSTATS, &red_stats) < 0) - err(1, "ioctl RED_GETSTATS"); - - gettimeofday(&cur_time, NULL); - sec = calc_interval(&cur_time, &last_time); - - printf(" weight:%d inv_pmax:%d qthresh:(%d,%d)\n", - red_stats.weight, red_stats.inv_pmax, - red_stats.th_min, red_stats.th_max); - printf(" q_len:%d (avg: %.2f), q_limit:%d\n", - red_stats.q_len, - ((double)red_stats.q_avg)/(double)avg_scale, - red_stats.q_limit); - printf(" xmit:%llu pkts, drop:%llu pkts (forced: %u, early: %u)\n", - (ull)red_stats.xmit_cnt.packets, - (ull)red_stats.drop_cnt.packets, - red_stats.drop_forced, red_stats.drop_unforced); - if (red_stats.marked_packets != 0) - printf(" marked: %u\n", red_stats.marked_packets); - printf(" throughput: %sbps\n", - rate2str(calc_rate(red_stats.xmit_cnt.bytes, - last_bytes, sec))); - if (red_stats.fv_alloc > 0) { - printf(" flowvalve: alloc:%u flows:%u\n", - red_stats.fv_alloc, red_stats.fv_flows); - printf(" predrop:%u pass:%u escape:%u\n", - red_stats.fv_predrop, red_stats.fv_pass, - red_stats.fv_escape); - } - printf("\n"); - - last_bytes = red_stats.xmit_cnt.bytes; - last_time = cur_time; - sleep(interval); - } -} - -int -print_redstats(struct redstats *rp) -{ - printf(" RED q_avg:%.2f xmit:%llu (forced:%u early:%u marked:%u)\n", - ((double)rp->q_avg)/(double)avg_scale, - (ull)rp->xmit_cnt.packets, - rp->drop_forced, - rp->drop_unforced, - rp->marked_packets); - return 0; -} diff --git a/usr.sbin/altq/altqstat/qdisc_rio.c b/usr.sbin/altq/altqstat/qdisc_rio.c deleted file mode 100644 index 01d07d57b10..00000000000 --- a/usr.sbin/altq/altqstat/qdisc_rio.c +++ /dev/null @@ -1,148 +0,0 @@ -/* $OpenBSD: qdisc_rio.c,v 1.2 2001/08/16 12:59:43 kjc Exp $ */ -/* $KAME: qdisc_rio.c,v 1.4 2001/08/15 12:51:59 kjc Exp $ */ -/* - * Copyright (C) 1999-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. - */ - -#include <sys/param.h> -#include <sys/ioctl.h> -#include <sys/time.h> -#include <sys/socket.h> -#include <net/if.h> -#include <netinet/in.h> -#include <altq/altq.h> -#include <altq/altq_red.h> -#include <altq/altq_rio.h> - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <string.h> -#include <math.h> -#include <errno.h> -#include <err.h> - -#include "altqstat.h" - -static int avg_scale = 4096; /* default fixed-point scale */ - -void -rio_stat_loop(int fd, const char *ifname, int count, int interval) -{ - struct rio_stats rio_stats; - struct timeval cur_time, last_time; - u_int64_t last_bytes[3]; - double sec; - int cnt = count; - - bzero(&rio_stats, sizeof(rio_stats)); - strlcpy(rio_stats.iface.rio_ifname, ifname, - sizeof(rio_stats.iface.rio_ifname)); - - gettimeofday(&last_time, NULL); - last_time.tv_sec -= interval; - - while (count == 0 || cnt-- > 0) { - - if (ioctl(fd, RIO_GETSTATS, &rio_stats) < 0) - err(1, "ioctl RIO_GETSTATS"); - - gettimeofday(&cur_time, NULL); - sec = calc_interval(&cur_time, &last_time); - - printf("weight:%d q_limit:%d\n", - rio_stats.weight, rio_stats.q_limit); - - printf("\t\t\tLOW DP\t\tMEDIUM DP\t\tHIGH DP\n"); - - printf("thresh (prob):\t\t[%d,%d](1/%d)\t[%d,%d](1/%d)\t\t[%d,%d](%d)\n", - rio_stats.q_params[0].th_min, - rio_stats.q_params[0].th_max, - rio_stats.q_params[0].inv_pmax, - rio_stats.q_params[1].th_min, - rio_stats.q_params[1].th_max, - rio_stats.q_params[1].inv_pmax, - rio_stats.q_params[2].th_min, - rio_stats.q_params[2].th_max, - rio_stats.q_params[2].inv_pmax); - printf("qlen (avg):\t\t%d (%.2f)\t%d (%.2f)\t\t%d (%.2f)\n", - rio_stats.q_len[0], - ((double)rio_stats.q_stats[0].q_avg)/(double)avg_scale, - rio_stats.q_len[1], - ((double)rio_stats.q_stats[1].q_avg)/(double)avg_scale, - rio_stats.q_len[2], - ((double)rio_stats.q_stats[2].q_avg)/(double)avg_scale); - printf("xmit (drop) pkts:\t%llu (%llu)\t\t%llu (%llu)\t\t\t%llu (%llu)\n", - (ull)rio_stats.q_stats[0].xmit_cnt.packets, - (ull)rio_stats.q_stats[0].drop_cnt.packets, - (ull)rio_stats.q_stats[1].xmit_cnt.packets, - (ull)rio_stats.q_stats[1].drop_cnt.packets, - (ull)rio_stats.q_stats[2].xmit_cnt.packets, - (ull)rio_stats.q_stats[2].drop_cnt.packets); - printf("(forced:early):\t\t(%u:%u)\t\t(%u:%u)\t\t\t(%u:%u)\n", - rio_stats.q_stats[0].drop_forced, - rio_stats.q_stats[0].drop_unforced, - rio_stats.q_stats[1].drop_forced, - rio_stats.q_stats[1].drop_unforced, - rio_stats.q_stats[2].drop_forced, - rio_stats.q_stats[2].drop_unforced); - if (rio_stats.q_stats[0].marked_packets != 0 - || rio_stats.q_stats[1].marked_packets != 0 - || rio_stats.q_stats[2].marked_packets != 0) - printf("marked:\t\t\t%u\t\t%u\t\t\t%u\n", - rio_stats.q_stats[0].marked_packets, - rio_stats.q_stats[1].marked_packets, - rio_stats.q_stats[2].marked_packets); - printf("throughput:\t\t%sbps\t%sbps\t\t%sbps\n\n", - rate2str(calc_rate(rio_stats.q_stats[0].xmit_cnt.bytes, - last_bytes[0], sec)), - rate2str(calc_rate(rio_stats.q_stats[1].xmit_cnt.bytes, - last_bytes[1], sec)), - rate2str(calc_rate(rio_stats.q_stats[2].xmit_cnt.bytes, - last_bytes[2], sec))); - - last_bytes[0] = rio_stats.q_stats[0].xmit_cnt.bytes; - last_bytes[1] = rio_stats.q_stats[1].xmit_cnt.bytes; - last_bytes[2] = rio_stats.q_stats[2].xmit_cnt.bytes; - last_time = cur_time; - sleep(interval); - } -} - -int -print_riostats(struct redstats *rp) -{ - int dp; - - for (dp = 0; dp < RIO_NDROPPREC; dp++) - printf(" RIO[%d] q_avg:%.2f xmit:%llu (forced: %u early:%u marked:%u)\n", - dp, - ((double)rp[dp].q_avg)/(double)avg_scale, - (ull)rp[dp].xmit_cnt.packets, - rp[dp].drop_forced, - rp[dp].drop_unforced, - rp[dp].marked_packets); - return 0; -} diff --git a/usr.sbin/altq/altqstat/qdisc_wfq.c b/usr.sbin/altq/altqstat/qdisc_wfq.c deleted file mode 100644 index c8a16a6942c..00000000000 --- a/usr.sbin/altq/altqstat/qdisc_wfq.c +++ /dev/null @@ -1,168 +0,0 @@ -/* $KAME: qdisc_wfq.c,v 1.3 2001/08/15 12:51:59 kjc Exp $ */ -/* - * Copyright (C) 1999-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. - */ - -#include <sys/param.h> -#include <sys/ioctl.h> -#include <sys/time.h> -#include <sys/socket.h> -#include <net/if.h> -#include <netinet/in.h> -#include <altq/altq.h> -#include <altq/altq_wfq.h> - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <string.h> -#include <math.h> -#include <errno.h> -#include <err.h> -#ifndef NO_CURSES -#include <curses.h> -#endif - -#include "altqstat.h" - -struct wfqinfo { - int qid; - queue_stats stats; - u_quad_t last_bytes; - double bps; -}; - -#define NTOP 10 -static int ntop = NTOP; - -void -wfq_stat_loop(int fd, const char *ifname, int count, int interval) -{ - struct wfq_getstats wfq_stats; - struct timeval cur_time, last_time; - int i, j, k, nqueues; - double sec; - struct wfqinfo *qinfo, **top; - int cnt = count; - - strlcpy(wfq_stats.iface.wfq_ifacename, ifname, - sizeof(wfq_stats.iface.wfq_ifacename)); - - /* - * first, find out how many queues are available - */ - for (i = 0; i < MAX_QSIZE; i++) { - wfq_stats.qid = i; - if (ioctl(fd, WFQ_GET_STATS, &wfq_stats) < 0) - break; - } - nqueues = i; - printf("wfq on %s: %d queues are used\n", ifname, nqueues); - - if ((qinfo = malloc(nqueues * sizeof(struct wfqinfo))) == NULL) - err(1, "malloc failed!"); - if ((top = malloc(ntop * sizeof(struct wfqinfo *))) == NULL) - err(1, "malloc failed!"); - -#ifndef NO_CURSES - sleep(2); /* wait a bit before clearing the screen */ - - initscr(); -#endif - - gettimeofday(&last_time, NULL); - last_time.tv_sec -= interval; - - while (count == 0 || cnt-- > 0) { - - for (j = 0; j < ntop; j++) - top[j] = NULL; - - for (i = 0; i < nqueues; i++) { - wfq_stats.qid = i; - if (ioctl(fd, WFQ_GET_STATS, &wfq_stats) < 0) - err(1, "ioctl WFQ_GET_STATS"); - - qinfo[i].qid = i; - qinfo[i].stats = wfq_stats.stats; - } - - gettimeofday(&cur_time, NULL); - sec = calc_interval(&cur_time, &last_time); - - /* - * calculate the throughput of each queue - */ - for (i = 0; i < nqueues; i++) { - qinfo[i].bps = calc_rate(qinfo[i].stats.xmit_cnt.bytes, - qinfo[i].last_bytes, sec); - qinfo[i].last_bytes = qinfo[i].stats.xmit_cnt.bytes; - - for (j = 0; j < ntop; j++) { - if (top[j] == NULL) { - top[j] = &qinfo[i]; - break; - } - if (top[j]->bps < qinfo[i].bps || - (top[j]->bps == qinfo[i].bps && - top[j]->stats.xmit_cnt.packets < - qinfo[i].stats.xmit_cnt.packets)) { - for (k = ntop-1; k > j; k--) - top[k] = top[k-1]; - top[j] = &qinfo[i]; - break; - } - } - } - - /* - * display top - */ - printf("[QID] WEIGHT QSIZE(KB) SENT(pkts) (KB) DROP(pkts) (KB) bps\n\r"); - - for (j = 0; j < ntop; j++) { - if (top[j] != NULL) - printf("[%4d] %4d %4d %10llu %14llu %10llu %14llu %9s\n\r", - top[j]->qid, - top[j]->stats.weight, - top[j]->stats.bytes / 1024, - (ull)top[j]->stats.xmit_cnt.packets, - (ull)top[j]->stats.xmit_cnt.bytes /1024, - (ull)top[j]->stats.drop_cnt.packets, - (ull)top[j]->stats.drop_cnt.bytes /1024, - rate2str(top[j]->bps)); - else - printf("\n"); - } -#ifndef NO_CURSES - refresh(); - mvcur(ntop+1, 0, 0, 0); -#endif - - last_time = cur_time; - sleep(interval); - } - -} diff --git a/usr.sbin/altq/altqstat/quip_client.c b/usr.sbin/altq/altqstat/quip_client.c deleted file mode 100644 index aa8052539b0..00000000000 --- a/usr.sbin/altq/altqstat/quip_client.c +++ /dev/null @@ -1,521 +0,0 @@ -/* $OpenBSD: quip_client.c,v 1.6 2002/11/07 09:33:21 kjc Exp $ */ -/* $KAME: quip_client.c,v 1.4 2001/08/16 07:43:15 itojun Exp $ */ -/* - * Copyright (C) 1999-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. - */ - -#include <sys/param.h> -#include <sys/socket.h> -#include <sys/un.h> - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <string.h> -#include <errno.h> -#include <err.h> - -#include "quip_client.h" -#include "altqstat.h" - -/* - * quip (queue information protocol) is a http-like protocol - * in order to retrieve information from the server. - * a unix domain TCP socket "/var/run/altq_quip" is used for - * client-server style communication. - * - * there are 2 quip message types: request and response. - * request format: (only single-line request message is used at this moment) - * request-line - * - * request-line = <method> <operation>[?<query>] <quip-version> - * <method> = GET (only GET is defined at this moment) - * <operation> = list | handle-to-name | qdisc | filter - * query format is operation dependent but most query takes - * <interface> or <class> or <filter>. - * <interface> = <if_name> - * <class> = <if_name>:<class_path>/<class_name> - * <filter> = <if_name>:<class_path>/<class_name>:<filter_name> - * "list" operation accepts "*" as a wildcard. - * - * response format: - * status-line - * response-headers (0 or more) - * <blank line> - * body - * - * status-line = <quip-version> <status-code> <reason phrase> - * response-header = Content-Length:<value> - * - * "Content-Length" specifies the length of the message body. - * - * example: - * to retrieve a list of classes (handle and name) on interface "fxp0": - * a request message looks like, - * GET list?fxp0:* QUIP/1.0<cr> - * a response message looks like, - * QUIP/1.0 200 OK<cr> - * Content-Length:86<cr> - * <cr> - * 0000000000 fxp0:/root<cr> - * 0xc0d1be00 fxp0:/root/parent<cr> - * 0xc0d1ba00 fxp0:/root/parent/child<cr> - * - * other examples: - * list all interfaces, classes, and filters: - * GET list QUIP/1.0<cr> - * list all interfaces: - * GET list?* QUIP/1.0<cr> - * list all classes: - * GET list?*:* QUIP/1.0<cr> - * list all filters: - * GET list?*:*:* QUIP/1.0<cr> - * convert class handle to class name: - * GET handle-to-name?fxp0:0xc0d1be00 QUIP/1.0<cr> - * convert filter handle to filter name: - * GET handle-to-name?fxp0::0x1000000a QUIP/1.0<cr> - */ - -#define MAXLINESIZE 1024 - -enum nametype { INTERFACE, CLASS, FILTER, CONDITIONER }; - -static FILE *server = NULL; -int quip_echo = 0; - -static char *extract_ifname(const char *); - -int -quip_openserver(void) -{ - struct sockaddr_un addr; - int fd; - - if ((fd = socket(AF_LOCAL, SOCK_STREAM, 0)) < 0) - err(1, "can't open socket"); - - bzero(&addr, sizeof(addr)); - addr.sun_family = AF_LOCAL; - strlcpy(addr.sun_path, QUIP_PATH,sizeof(addr.sun_path)); - - if (connect(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) { - fprintf(stderr, "can't talk to altqd!\n" - "probably, altqd is not running\n"); - return (-1); - } - - if ((server = fdopen(fd, "r+")) == NULL) { - warn("fdopen: can't open stream to the quip server"); - return (-1); - } - return (0); -} - -int -quip_closeserver(void) -{ - if (server != NULL) - return fclose(server); - return (0); -} - -void -quip_sendrequest(FILE *fp, const char *request) -{ - char buf[QUIPMSG_MAXSIZE], *cp; - int n; - - if ((cp = strstr(request, "QUIP")) == NULL) { - cp = strchr(request, '\n'); - n = cp - request; - if (cp == NULL || n > REQ_MAXSIZE - 10) - return; - strncpy(buf, request, n); - snprintf(buf + n, REQ_MAXSIZE - n, " QUIP/1.0"); - strlcat(buf, cp, REQ_MAXSIZE); - } - else - strlcpy(buf, request, REQ_MAXSIZE); - - if (fputs(buf, fp) != 0) - err(1, "fputs"); - if (fflush(fp) != 0) - err(1, "fflush"); - if (quip_echo) { - fputs("<< ", stdout); - fputs(buf, stdout); - } -} - -/* - * recv_response receives a response message from the server - * and returns status_code. - */ -int -quip_recvresponse(FILE *fp, char *header, char *body, int *blen) -{ - char buf[MAXLINESIZE], version[MAXLINESIZE]; - int code, resid, len, buflen; - int end_of_header = 0; - - if (blen != NULL) - *blen = 0; - code = 0; - resid = 0; - buflen = RES_MAXSIZE; - while (fgets(buf, sizeof(buf), fp) != 0) { - if (quip_echo) { - fputs("> ", stdout); - fputs(buf, stdout); - } - - if (!end_of_header) { - /* process message header */ - if (header != NULL) { - len = strlcpy(header, buf, buflen); - if (len >= buflen) { - /* header too long */ - fpurge(fp); - return (-1); - } - header += len; - buflen -= len; - } - - if (code == 0) { - /* status line expected */ - if (buf[0] == '\n') { - /* ignore blank lines */ - } - else if (sscanf(buf, "%s %d", - version, &code) != 2) { - /* can't get result code */ - fpurge(fp); - return (-1); - } - } - else { - /* entity header expected */ - char *field, *cp; - - if (buf[0] == '\n') { - /* end of header */ - end_of_header = 1; - buflen = BODY_MAXSIZE; - if (resid == 0) - /* no message body */ - return (code); - } - - cp = buf; - field = strsep(&cp, ":"); - if (strcmp(field, "Content-Length") == 0) { - if (sscanf(cp, "%d", &resid) != 1) { - fpurge(fp); - return (-1); - } - if (blen != NULL) - *blen = resid; - } - } - } - else { - /* process message body */ - if (body != NULL) { - len = strlcpy(body, buf, buflen); - if (len >= buflen) { - /* body too long */ - fpurge(fp); - return (-1); - } - body += len; - buflen -= len; - } - else - len = strlen(buf); - resid -= len; - if (resid <= 0) - return (code); - } - } - return (-1); -} - -void -quip_rawmode(void) -{ - char line[MAXLINESIZE]; - int result_code; - - printf(">>>Entering the raw interactive mode to the server:\n\n"); - if (server == NULL) { - printf("No server available!\n"); - return; - } - - while (1) { - printf("%% "); fflush(stdout); - /* read a line from stdin */ - if (fgets(line, sizeof(line), stdin) == NULL) - break; - - if (line[0] == '\n') { - /* if a blank line, echo locally */ - fputs(line, stdout); - continue; - } - if (line[0] == 'q') { - printf("Exit\n"); - break; - } - - /* send the input line to the server */ - quip_sendrequest(server, line); - - /* get a response message from the server */ - result_code = quip_recvresponse(server, NULL, NULL, NULL); - } -} - -char * -quip_selectinterface(char *ifname) -{ - char buf[BODY_MAXSIZE], *cp; - int result_code, len; - u_int if_index; - static char interface[64]; - - if (server == NULL) - return (ifname); - - /* get an inferface list from the server */ - quip_sendrequest(server, "GET list?*\n"); - - result_code = quip_recvresponse(server, NULL, buf, &len); - if (result_code != 200) - errx(1, "can't get interface list"); - - cp = buf; - while (1) { - if (sscanf(cp, "%x %s", &if_index, interface) != 2) - break; - if (ifname == NULL) { - /* if name isn't specified, return the 1st entry */ - return (interface); - } - if (strcmp(ifname, interface) == 0) - /* found the matching entry */ - return (interface); - if ((cp = strchr(cp+1, '\n')) == NULL) - break; - } - errx(1, "can't get interface"); - return (NULL); -} - -char * -quip_selectqdisc(char *ifname, char *qdisc_name) -{ - char buf[BODY_MAXSIZE], req[REQ_MAXSIZE]; - int result_code, len; - static char qdisc[64]; - - if (server == NULL) { - if (ifname == NULL || qdisc_name == NULL) - errx(1, "when disabling server communication,\n" - "specify both interface (-i) and qdisc (-q)!"); - return (qdisc_name); - } - - /* get qdisc info from the server */ - snprintf(req, sizeof(req), "GET qdisc?%s\n", ifname); - quip_sendrequest(server, req); - - result_code = quip_recvresponse(server, NULL, buf, &len); - if (result_code != 200) - errx(1, "can't get qdisc info"); - - if (sscanf(buf, "%s", qdisc) != 1) - errx(1, "can't get qdisc name"); - - if (qdisc_name != NULL && strcmp(qdisc, qdisc_name) != 0) - errx(1, "qdisc %s on %s doesn't match specified qdisc %s", - qdisc, ifname, qdisc_name); - - return (qdisc); -} - -void -quip_chandle2name(const char *ifname, u_long handle, char *name, size_t size) -{ - char buf[BODY_MAXSIZE], req[REQ_MAXSIZE], *cp; - int result_code, len; - - name[0] = '\0'; - if (server == NULL) - return; - - /* get class name from the server */ - snprintf(req, sizeof(req), "GET handle-to-name?%s:%#lx\n", ifname, handle); - quip_sendrequest(server, req); - - result_code = quip_recvresponse(server, NULL, buf, &len); - if (result_code != 200) - errx(1, "can't get class name"); - - if ((cp = strchr(buf, '\n')) != NULL) - *cp = '\0'; - if ((cp = strrchr(buf, '/')) != NULL) - strlcpy(name, cp+1, size); -} - -void -quip_printqdisc(const char *ifname) -{ - char buf[BODY_MAXSIZE], req[REQ_MAXSIZE], *cp; - int result_code, len; - - if (server == NULL) { - printf("No server available!\n"); - return; - } - - /* get qdisc info from the server */ - snprintf(req, sizeof(req), "GET qdisc?%s\n", ifname); - quip_sendrequest(server, req); - - result_code = quip_recvresponse(server, NULL, buf, &len); - if (result_code != 200) - errx(1, "can't get qdisc info"); - - /* replace newline by space */ - cp = buf; - while ((cp = strchr(cp, '\n')) != NULL) - *cp = ' '; - - printf(" qdisc:%s\n", buf); -} - -void -quip_printfilter(const char *ifname, const u_long handle) -{ - char buf[BODY_MAXSIZE], req[REQ_MAXSIZE], *cp; - int result_code, len; - - if (server == NULL) { - printf("No server available!\n"); - return; - } - - /* get qdisc info from the server */ - snprintf(req, sizeof(req), "GET filter?%s::%#lx\n", ifname, handle); - quip_sendrequest(server, req); - - result_code = quip_recvresponse(server, NULL, buf, &len); - if (result_code != 200) - errx(1, "can't get filter info"); - - if ((cp = strchr(buf, '\n')) != NULL) - *cp = '\0'; - printf("%s", buf); -} - -static char * -extract_ifname(const char *name) -{ - char *cp; - int len; - static char ifname[64]; - - if ((cp = strchr(name, ':')) != NULL) - len = cp - name; - else - len = strlen(name); - len = MIN(len, 63); - strncpy(ifname, name, len); - ifname[len] = '\0'; - return (ifname); -} - -void -quip_printconfig(void) -{ - char buf[BODY_MAXSIZE], name[256], *cp, *p, *flname; - int result_code, len; - enum nametype type; - u_long handle; - - if (server == NULL) { - printf("No server available!\n"); - return; - } - - /* get a total list from the server */ - quip_sendrequest(server, "GET list\n"); - - result_code = quip_recvresponse(server, NULL, buf, &len); - if (result_code != 200) - errx(1, "can't get total list"); - - printf("------------ current configuration ------------"); - - cp = buf; - while (1) { - if (sscanf(cp, "%lx %s", &handle, name) != 2) - break; - - if ((p = strchr(name, ':')) == NULL) - type = INTERFACE; - else if (strchr(p+1, ':') == NULL) - type = CLASS; - else - type = FILTER; - - switch (type) { - case INTERFACE: - printf("\ninterface: %s (index:%lu)\n", - name, handle); - quip_printqdisc(name); - break; - case CLASS: - printf("class: %s (handle:%#lx)\n", - name, handle); - break; - case FILTER: - flname = strrchr(name, ':') + 1; - printf(" filter: name:%s [", flname); - quip_printfilter(extract_ifname(name), handle); - printf("] (handle:%#lx)\n", handle); - break; - case CONDITIONER: - break; - } - - if ((cp = strchr(cp+1, '\n')) == NULL) - break; - } - printf("-----------------------------------------------\n\n"); -} - diff --git a/usr.sbin/altq/altqstat/quip_client.h b/usr.sbin/altq/altqstat/quip_client.h deleted file mode 100644 index 038be02fe5c..00000000000 --- a/usr.sbin/altq/altqstat/quip_client.h +++ /dev/null @@ -1,54 +0,0 @@ -/* $OpenBSD: quip_client.h,v 1.2 2001/08/16 12:59:43 kjc Exp $ */ -/* $KAME: quip_client.h,v 1.4 2001/08/16 07:43:15 itojun Exp $ */ -/* - * Copyright (C) 1999-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 _QUIP_CLIENT_H_ -#define _QUIP_CLIENT_H_ - -/* unix domain socket for quip */ -#define QUIP_PATH "/var/run/altq_quip" - -#define REQ_MAXSIZE 256 /* max request size */ -#define RES_MAXSIZE 256 /* max reply header size */ -#define BODY_MAXSIZE 8192 /* max reply body size */ -#define QUIPMSG_MAXSIZE (RES_MAXSIZE+BODY_MAXSIZE) /* max message size */ - -extern int quip_echo; - -int quip_openserver(void); -int quip_closeserver(void); -void quip_sendrequest(FILE *, const char *); -int quip_recvresponse(FILE *, char *, char *, int *); -void quip_rawmode(void); -char *quip_selectinterface(char *); -char *quip_selectqdisc(char *, char *); -void quip_chandle2name(const char *, u_long, char *, size_t); -void quip_printqdisc(const char *); -void quip_printfilter(const char *, const u_long); -void quip_printconfig(void); - -#endif /* _QUIP_CLIENT_H_ */ diff --git a/usr.sbin/altq/libaltq/Makefile b/usr.sbin/altq/libaltq/Makefile deleted file mode 100644 index 8bd044b7546..00000000000 --- a/usr.sbin/altq/libaltq/Makefile +++ /dev/null @@ -1,18 +0,0 @@ -# $OpenBSD: Makefile,v 1.2 2001/07/13 09:28:47 kjc Exp $ -# $NetBSD: Makefile,v 1.2 2000/12/16 18:57:35 thorpej Exp $ - -LIB= altq -SRCS= parser.c qop.c qop_blue.c qop_cbq.c qop_cdnr.c qop_conf.c \ - qop_dummy.c qop_errlist.c qop_fifoq.c qop_hfsc.c qop_priq.c \ - qop_red.c qop_rio.c qop_wfq.c quip_server.c - -CPPFLAGS+= -DALTQ -DINET6 - -# we don't build the other copies of this library -NOPIC= yes -NOPROFILE= yes - -# only needed during build -install: - -.include <bsd.lib.mk> diff --git a/usr.sbin/altq/libaltq/altq_qop.h b/usr.sbin/altq/libaltq/altq_qop.h deleted file mode 100644 index 708a984e3d8..00000000000 --- a/usr.sbin/altq/libaltq/altq_qop.h +++ /dev/null @@ -1,254 +0,0 @@ -/* $OpenBSD: altq_qop.h,v 1.2 2002/02/13 08:21:45 kjc Exp $ */ -/* $KAME: altq_qop.h,v 1.4 2000/10/18 09:15:18 kjc Exp $ */ -/* - * Copyright (C) 1999-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_QOP_H_ -#define _ALTQ_QOP_H_ - -#include <sys/queue.h> -#include <altq/altq.h> -#include <altq/altq_red.h> - -struct ifinfo; -struct classinfo; -struct fltrinfo; - -/* queueing discipline specific command parsers */ -struct qdisc_parser { - char *qname; - int (*interface_parser)(const char *ifname, int argc, char **argv); - int (*class_parser)(const char *ifname, const char *clname, - const char *parent, int argc, char **argv); -}; - -/* queueing discipline specific operations */ -struct qdisc_ops { - int qdisc_type; /* discipline type (e.g., ALTQT_CBQ) */ - char *qname; /* discipline name (e.g., cbq) */ - - /* interface operations */ - int (*attach)(struct ifinfo *); - int (*detach)(struct ifinfo *); - int (*clear)(struct ifinfo *); - int (*enable)(struct ifinfo *); - int (*disable)(struct ifinfo *); - - /* class operations (optional) */ - int (*add_class)(struct classinfo *); - int (*modify_class)(struct classinfo *, void *); - int (*delete_class)(struct classinfo *); - - /* filter operations (optional) */ - int (*add_filter)(struct fltrinfo *); - int (*delete_filter)(struct fltrinfo *); -}; - -/* - * interface info - */ -struct ifinfo { - LIST_ENTRY(ifinfo) next; /* next entry on iflist */ - char *ifname; /* interface name */ - u_int bandwidth; /* bandwidth in bps */ - u_int ifmtu; /* mtu of the interface */ - u_int ifindex; /* interface index */ - int enabled; /* hfsc on/off state */ - LIST_HEAD(, classinfo) cllist; /* class list */ - LIST_HEAD(, fltrinfo) fltr_rules; /* filter rule list */ - - struct classinfo *resv_class; /* special class for rsvp */ - - /* discipline info */ - struct qdisc_ops *qdisc; /* qdisc system interface */ - void *private; /* discipline specific data */ - int (*enable_hook)(struct ifinfo *); - int (*delete_hook)(struct ifinfo *); -}; - -/* - * class info - */ -struct classinfo { - LIST_ENTRY(classinfo) next; /* next entry on cllist - of ifinfo */ - u_long handle; /* class handle */ - char *clname; /* class name */ - struct ifinfo *ifinfo; /* back pointer to ifinfo */ - struct classinfo *parent; /* parent class */ - struct classinfo *sibling; /* sibling class */ - struct classinfo *child; /* child class */ - LIST_HEAD(, fltrinfo) fltrlist; /* filters for this class */ - - void *private; /* discipline specific data */ - int (*delete_hook)(struct classinfo *); -}; - -/* - * filter info - */ -struct fltrinfo { - LIST_ENTRY(fltrinfo) next; /* next entry on fltrlist - of classinfo */ - LIST_ENTRY(fltrinfo) nextrule; /* next entry on fltr_rules - of ifinfo */ - u_long handle; /* filter handle */ - char *flname; /* filter name, if specified */ - struct flow_filter fltr; /* filter value */ - struct classinfo *clinfo; /* back pointer to classinfo */ - - /* for consistency check */ - int line_no; /* config file line number */ - int dontwarn; /* supress warning msg */ -}; - -int do_command(FILE *infp); -int qcmd_enable(const char *ifname); -int qcmd_disable(const char *ifname); -int qcmd_delete_if(const char *ifname); -int qcmd_clear_hierarchy(const char *ifname); -int qcmd_enableall(void); -int qcmd_disableall(void); -int qcmd_config(void); -int qcmd_init(void); -int qcmd_clear(const char *ifname); -int qcmd_destroyall(void); -int qcmd_restart(void); -int qcmd_delete_class(const char *ifname, const char *clname); -int qcmd_add_filter(const char *ifname, const char *clname, const char *flname, - const struct flow_filter *fltr); -int qcmd_delete_filter(const char *ifname, const char *clname, - const char *flname); -int qcmd_tbr_register(const char *ifname, u_int rate, u_int size); -int qop_enable(struct ifinfo *ifinfo); -int qop_disable(struct ifinfo *ifinfo); -int qop_delete_if(struct ifinfo *ifinfo); -int qop_clear(struct ifinfo *ifinfo); - -int qop_add_if(struct ifinfo **rp, const char *ifname, u_int bandwidth, - struct qdisc_ops *qdisc_ops, void *if_private); -int qop_delete_if(struct ifinfo *ifinfo); - -int qop_add_class(struct classinfo **rp, const char *clname, - struct ifinfo *ifinfo, struct classinfo *parent, - void *class_private); -int qop_modify_class(struct classinfo *clinfo, void *arg); -int qop_delete_class(struct classinfo *clinfo); - -int qop_add_filter(struct fltrinfo **rp, - struct classinfo *clinfo, - const char *flname, - const struct flow_filter *fltr, - struct fltrinfo **conflict); -int qop_delete_filter(struct fltrinfo *fltr); - -int is_q_enabled(const char *ifname); -struct ifinfo *ifname2ifinfo(const char *ifname); -struct ifinfo *input_ifname2ifinfo(const char *ifname); -struct classinfo *clname2clinfo(const struct ifinfo *ifinfo, - const char *clname); -struct classinfo * clhandle2clinfo(struct ifinfo *ifinfo, u_long handle); -struct fltrinfo *flname2flinfo(const struct classinfo *clinfo, - const char *flname); -struct fltrinfo *flhandle2fltrinfo(struct ifinfo *ifinfo, u_long handle); -void print_filter(const struct flow_filter *filt); -const char *qoperror(int qoperrno); -u_int get_ifindex(const char *ifname); -struct classinfo *get_rootclass(struct ifinfo *ifinfo); -struct classinfo *get_nextclass(struct classinfo *clinfo); -u_long atobps(const char *s); -u_long atobytes(const char *s); -int qop_red_set_defaults(int th_min, int th_max, int inv_pmax); -int qop_rio_set_defaults(struct redparams *params); -int open_module(const char *devname, int flags); -int client_input(FILE *fp); - -/* misc system errors */ -#define QOPERR_OK 0 /* no error */ -#define QOPERR_SYSCALL 1 /* syscall err; see errno */ -#define QOPERR_NOMEM 2 /* not enough memory */ -#define QOPERR_INVAL 3 /* invalid parameter */ -#define QOPERR_RANGE 4 /* out of range */ -#define QOPERR_BADIF 5 /* bad interface name */ -#define QOPERR_BADCLASS 6 /* bad class name */ -#define QOPERR_BADFILTER 7 /* bad filter name */ - -/* class errors */ -#define QOPERR_CLASS 8 /* class failure */ -#define QOPERR_CLASS_INVAL 9 /* bad class value */ -#define QOPERR_CLASS_PERM 10 /* class operation not permitted */ - -/* filter errors */ -#define QOPERR_FILTER 11 /* filter failure */ -#define QOPERR_FILTER_INVAL 12 /* bad filter value */ -#define QOPERR_FILTER_SHADOW 13 /* shadows an existing filter */ - -/* addmission errors */ -#define QOPERR_ADMISSION 14 /* admission control failure */ -#define QOPERR_ADMISSION_NOBW 15 /* insufficient bandwidth */ -#define QOPERR_ADMISSION_DELAY 16 /* cannot meet delay bound req */ -#define QOPERR_ADMISSION_NOSVC 17 /* no service available */ - -/* policy errors */ -#define QOPERR_POLICY 18 /* policy control failure */ - -#define QOPERR_MAX 18 - -extern int filter_dontwarn;/* supress warning for the current filter */ -extern char *altqconfigfile; /* config file name */ -extern const char *qop_errlist[]; /* error string list */ -extern struct qdisc_ops nop_qdisc; -extern char *cur_ifname(void); -extern struct qdisc_parser qdisc_parser[]; -extern int Debug_mode; - -#ifndef RSVPD -/* rename LOG() to log_write() */ -#define LOG log_write -void log_write(int, int, const char *, ...); - -/* stuff defined in rsvp headers */ -#define IsDebug(type) (l_debug >= LOG_DEBUG && (m_debug & (type))) -#define DEBUG_ALTQ 0x40 - -#define ntoh16(x) ((u_int16_t)ntohs((u_int16_t)(x))) -#define ntoh32(x) ((u_int32_t)ntohl((u_int32_t)(x))) -#define hton16(x) ((u_int16_t)htons((u_int16_t)(x))) -#define hton32(x) ((u_int32_t)htonl((u_int32_t)(x))) - -extern int if_num; /* number of phyints */ -extern int m_debug; /* Debug output control bits */ -extern int l_debug; /* Logging severity level */ -extern int line_no; /* current line number in config file */ -extern int daemonize; /* log_write uses stderr if daemonize is 0 */ - -#endif /* !RSVPD */ - -#ifdef INET6 -/* a macro to handle v6 address in 32-bit fields */ -#define IN6ADDR32(a, i) (*(u_int32_t *)(&(a)->s6_addr[(i)<<2])) -#endif - -#endif /* _ALTQ_QOP_H_ */ diff --git a/usr.sbin/altq/libaltq/parser.c b/usr.sbin/altq/libaltq/parser.c deleted file mode 100644 index 0cd7ff7f96e..00000000000 --- a/usr.sbin/altq/libaltq/parser.c +++ /dev/null @@ -1,1194 +0,0 @@ -/* $OpenBSD: parser.c,v 1.7 2002/02/20 10:52:23 kjc Exp $ */ -/* $KAME: parser.c,v 1.13 2002/02/12 10:14:01 kjc Exp $ */ -/* - * Copyright (C) 1999-2002 - * 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. - */ - -#include <sys/param.h> -#include <sys/socket.h> -#include <net/if.h> -#include <netinet/in.h> -#include <arpa/inet.h> - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <stddef.h> -#include <string.h> -#include <ctype.h> -#include <errno.h> -#include <syslog.h> -#include <netdb.h> -#include <err.h> - -#include <altq/altq.h> -#include <altq/altq_cdnr.h> -#include <altq/altq_red.h> -#include <altq/altq_rio.h> -#include "altq_qop.h" -#include "qop_cdnr.h" - -static int is_qdisc_name(const char *); -static int qdisc_interface_parser(const char *, const char *, int, char **); -static int qdisc_class_parser(const char *, const char *, const char *, - const char *, int, char **); -static int next_word(char **, char *); - -static int get_ifname(char **, char **); -static int get_addr(char **, struct in_addr *, struct in_addr *); -static int get_port(const char *, u_int16_t *); -static int get_proto(const char *, int *); -static int get_fltr_opts(char **, char *, size_t, int *); -static int interface_parser(char *); -static int class_parser(char *) ; -static int filter_parser(char *); -#ifdef INET6 -static int filter6_parser(char *); -static int get_ip6addr(char **, struct in6_addr *, struct in6_addr *); -#endif -static int ctl_parser(char *); -static int delete_parser(char *); -static int red_parser(char *); -static int rio_parser(char *); -static int conditioner_parser(char *); -static int tc_action_parser(char *, char **, struct tc_action *); - -#define MAX_LINE 1024 -#define MAX_WORD 64 -#define MAX_ARGS 64 -#define MAX_ACTIONS 16 - -#ifndef MAX -#define MAX(a,b) (((a)>(b))?(a):(b)) -#endif -#ifndef MIN -#define MIN(a,b) (((a)<(b))?(a):(b)) -#endif -#define EQUAL(s1, s2) (strcmp((s1), (s2)) == 0) - -int line_no = 0; -int filter_dontwarn; - -static char curifname[IFNAMSIZ]; -static struct if_nameindex *if_namelist = NULL; - -struct cmd_tab { - const char *cmd; - int (*parser)(char *); - const char *help; -} cmd_tab[] = { - {"help", NULL, "help | ?"}, - {"quit", NULL, "quit"}, - {"interface", interface_parser, "interface if_name [bandwidth bps] [cbq|hfsc]"}, - {"class", class_parser, "class discipline if_name class_name [parent]"}, - {"filter", filter_parser, "filter if_name class_name [name filt_name] dst [netmask #] dport src [netmask #] sport proto [tos # [tosmask #] [gpi #] [dontwarn]"}, - {"altq", ctl_parser, "altq if_name {enable|disable}"}, - {"delete", delete_parser, "delete if_name class_name [filter_name]"}, -#ifdef INET6 - {"filter6", filter6_parser, "filter6 if_name class_name [name filt_name] dst[/prefix] dport src[/prefix] sport proto [flowlabel #][tclass # [tclassmask #]][gpi #] [dontwarn]"}, -#endif - {"red", red_parser, "red th_min th_max inv_pmax"}, - {"rio", rio_parser, "rio low_th_min low_th_max low_inv_pmax med_th_min med_th_max med_inv_pmax high_th_min high_th_max high_inv_pmax"}, - {"conditioner", conditioner_parser, "conditioner if_name cdnr_name <tc_action>"}, - {"debug", NULL, "debug"}, - {NULL, NULL, NULL} /* termination */ -}; - -/* - * read one line from the specified stream. if it's a command, - * execute the command. - * returns 1 if OK, 0 if error or EOF. - */ -int -do_command(FILE *fp) -{ - char cmd_line[MAX_LINE], cmd[MAX_WORD], *cp; - struct cmd_tab *tp; - int len, rval; - - /* - * read a line from the stream and make it a null-terminated string - */ - cp = cmd_line; -read_line: - if (fgets(cp, &cmd_line[MAX_LINE] - cp, fp) == NULL) - /* EOF or error */ - return(0); - line_no++; - - /* null-terminate the line */ - if ((len = strlen(cmd_line)) > 0) { - cp = cmd_line + len - 1; - if (*cp == '\n') { - /* if escaped newline, read next line */ - if (len > 1 && *(cp - 1) == '\\') - goto read_line; - *cp = '\0'; - } else if (!feof(fp)) - err(1, "LINE %d too long!", line_no); - } - /* trim comments */ - if ((cp = strchr(cmd_line, '#')) != NULL) - *cp = '\0'; - - cp = cmd_line; - if ((len = next_word(&cp, cmd)) == 0) - /* no command in this line */ - return (1); - - /* fnind the corresponding parser */ - rval = 0; - for (tp = cmd_tab; tp->cmd != NULL; tp++) - if (strncmp(cmd, tp->cmd, len) == 0) - break; - - if (tp->cmd == NULL) { - if (fp == stdin) { - printf(" ?? %s\n", cmd); - rval = 1; - } else - LOG(LOG_ERR, 0, "unknown command: %s", cmd); - return (rval); - } - - if (tp->parser != NULL) - rval = (*tp->parser)(cp); - else { - /* handle other commands */ - if (strcmp(tp->cmd, "quit") == 0) - rval = 0; - else if (strcmp(tp->cmd, "help") == 0 || - strcmp(tp->cmd, "?") == 0) { - for (tp = cmd_tab; tp->cmd != NULL; tp++) - printf("%s\n", tp->help); - rval = 1; - } else if (strcmp(tp->cmd, "debug") == 0) { - if (m_debug & DEBUG_ALTQ) { - /* turn off verbose */ - l_debug = LOG_INFO; - m_debug &= ~DEBUG_ALTQ; - } else { - /* turn on verbose */ - l_debug = LOG_DEBUG; - m_debug |= DEBUG_ALTQ; - } - rval = 1; - } - } - return (rval); -} - -static int -is_qdisc_name(const char *qname) -{ - struct qdisc_parser *qp; - - for (qp = qdisc_parser; qp->qname != NULL; qp++) - if (strncmp(qp->qname, qname, strlen(qp->qname)) == 0) - return (1); - return (0); -} - -static int -qdisc_interface_parser(const char * qname, const char *ifname, - int argc, char **argv) -{ - struct qdisc_parser *qp; - - for (qp = qdisc_parser; qp->qname != NULL; qp++) - if (strncmp(qp->qname, qname, strlen(qp->qname)) == 0) - return (*qp->interface_parser)(ifname, argc, argv); - return (0); -} - -static int -qdisc_class_parser(const char *qname, const char *ifname, - const char *class_name, const char *parent_name, - int argc, char **argv) -{ - struct qdisc_parser *qp; - struct ifinfo *ifinfo; - - for (qp = qdisc_parser; qp->qname != NULL; qp++) - if (strncmp(qp->qname, qname, strlen(qp->qname)) == 0) { - if (qp->class_parser == NULL) { - LOG(LOG_ERR, 0, - "class can't be specified for %s", qp->qname); - return (0); - } - if ((ifinfo = ifname2ifinfo(ifname)) == NULL) { - LOG(LOG_ERR, 0, "no such interface"); - return (0); - } - if (strncmp(ifinfo->qdisc->qname, qname, - strlen(ifinfo->qdisc->qname)) != 0) { - LOG(LOG_ERR, 0, - "qname doesn't match the interface"); - return (0); - } - return (*qp->class_parser)(ifname, class_name, - parent_name, argc, argv); - } - return (0); -} - -/* - * read the config file - */ -int -qcmd_config(void) -{ - FILE *fp; - int rval; - - if (if_namelist != NULL) - if_freenameindex(if_namelist); - if_namelist = if_nameindex(); - curifname[0] = '\0'; - - LOG(LOG_INFO, 0, "ALTQ config file is %s", altqconfigfile); - - fp = fopen(altqconfigfile, "r"); - if (fp == NULL) { - LOG(LOG_ERR, errno, "can't open %s", altqconfigfile, 0); - return (QOPERR_INVAL); - } - line_no = 0; - rval = 1; - while (rval) - rval = do_command(fp); - - if (!feof(fp)) { - LOG(LOG_ERR, 0, "Error in %s, line %d. config failed.", - altqconfigfile, line_no); - (void) qcmd_destroyall(); - rval = QOPERR_INVAL; - } else - rval = 0; - - (void)fclose(fp); - line_no = 0; - return (rval); -} - -static int -next_word(char **cpp, char *b) -{ - char *cp; - int i; - - cp = *cpp; - while (*cp == ' ' || *cp == '\t') - cp++; - for (i = 0; i < MAX_WORD - 1; i++) { - if (*cp == ' ' || *cp == '\t' || *cp == '\n' || *cp == '\0') - break; - *b++ = *cp++; - } - *b = '\0'; - *cpp = cp; - return (i); -} - -char * -cur_ifname(void) -{ - return (curifname); -} - -u_int -get_ifindex(const char *ifname) -{ - struct if_nameindex *ifnp; - - for (ifnp = if_namelist; ifnp->if_name != NULL; ifnp++) - if (strcmp(ifname, ifnp->if_name) == 0) - return (ifnp->if_index); - return (0); -} - -static int -get_ifname(char **cpp, char **ifnamep) -{ - char w[MAX_WORD], *ocp; - struct if_nameindex *ifnp; - - ocp = *cpp; - if (next_word(&ocp, w) && if_namelist != NULL) - for (ifnp = if_namelist; ifnp->if_name != NULL; ifnp++) - if (strcmp(w, ifnp->if_name) == 0) { - /* if_name found. advance the word pointer */ - *cpp = ocp; - strlcpy(curifname, w, sizeof(curifname)); - *ifnamep = curifname; - return (1); - } - - /* this is not interface name. use one in the context. */ - if (curifname[0] == '\0') - return (0); - *ifnamep = curifname; - return (1); -} - -/* set address and netmask in network byte order */ -static int -get_addr(char **cpp, struct in_addr *addr, struct in_addr *mask) -{ - char w[MAX_WORD], *ocp; - struct in_addr tmp; - - addr->s_addr = 0; - mask->s_addr = 0xffffffff; - - if (!next_word(cpp, w)) - return (0); - - if (inet_aton((char *)w, &tmp) != 1) { - /* try gethostbyname */ - struct hostent *h; - - if ((h = gethostbyname(w)) == NULL || - h->h_addrtype != AF_INET || h->h_length != 4) - return (0); - bcopy(h->h_addr, &tmp, (size_t)h->h_length); - } - addr->s_addr = tmp.s_addr; - - /* check if netmask option is present */ - ocp = *cpp; - if (next_word(&ocp, w) && EQUAL(w, "netmask")) { - if (!next_word(&ocp, w)) - return (0); - if (inet_aton((char *)w, (struct in_addr *)&tmp) != 1) - return (0); - - mask->s_addr = tmp.s_addr; - *cpp = ocp; - return (1); - } - /* no netmask option */ - return (1); -} - -/* returns service number in network byte order */ -static int -get_port(const char *name, u_int16_t *port_no) -{ - struct servent *s; - u_int16_t num; - - if (isdigit(name[0])) { - num = (u_int16_t)strtol(name, NULL, 0); - *port_no = htons(num); - return (1); - } - - if ((s = getservbyname(name, 0)) == NULL) - return (0); - - *port_no = (u_int16_t)s->s_port; - return (1); -} - -static int -get_proto(const char *name, int *proto_no) -{ - struct protoent *p; - - if (isdigit(name[0])) { - *proto_no = (int)strtol(name, NULL, 0); - return (1); - } - - if ((p = getprotobyname(name)) == NULL) - return (0); - - *proto_no = p->p_proto; - return (1); -} - -static int -get_fltr_opts(char **cpp, char *fltr_name, size_t len, int *ruleno) -{ - char w[MAX_WORD], *ocp; - - ocp = *cpp; - while (next_word(&ocp, w)) { - if (EQUAL(w, "name")) { - if (!next_word(&ocp, w)) - return (0); - strlcpy(fltr_name, w, len); - *cpp = ocp; - } else if (EQUAL(w, "ruleno")) { - if (!next_word(&ocp, w)) - return (0); - *ruleno = (int)strtol(w, NULL, 0); - *cpp = ocp; - } else - break; - } - return (1); -} - - -#define DISCIPLINE_NONE 0 - -static int -interface_parser(char *cmdbuf) -{ - char w[MAX_WORD], *ap, *cp = cmdbuf; - char *ifname, *argv[MAX_ARGS], qdisc_name[MAX_WORD]; - int argc; - - if (!get_ifname(&cp, &ifname)) { - LOG(LOG_ERR, 0, "missing interface name"); - return (0); - } - - /* create argment list & look for scheduling discipline options. */ - snprintf(qdisc_name, sizeof qdisc_name, "null"); - argc = 0; - ap = w; - while (next_word(&cp, ap)) { - if (is_qdisc_name(ap)) - strlcpy(qdisc_name, ap, sizeof qdisc_name); - - argv[argc] = ap; - ap += strlen(ap) + 1; - argc++; - if (argc >= MAX_ARGS) { - LOG(LOG_ERR, 0, "too many args"); - return (0); - } - } - - return qdisc_interface_parser(qdisc_name, ifname, argc, argv); -} - - -static int -class_parser(char *cmdbuf) -{ - char w[MAX_WORD], *cp = cmdbuf; - char *ifname, qdisc_name[MAX_WORD]; - char class_name[MAX_WORD], parent_name[MAX_WORD]; - char *clname = class_name; - char *parent = NULL; - char *argv[MAX_ARGS], *ap; - int argc; - - /* get scheduling class */ - if (!next_word(&cp, qdisc_name)) { - LOG(LOG_ERR, 0, "missing discipline"); - return (0); - } - if (!is_qdisc_name(qdisc_name)) { - LOG(LOG_ERR, 0, "unknown discipline '%s'", qdisc_name); - return (0); - } - - /* get interface name */ - if (!get_ifname(&cp, &ifname)) { - LOG(LOG_ERR, 0, "missing interface name"); - return (0); - } - - /* get class name */ - if (!next_word(&cp, class_name)) { - LOG(LOG_ERR, 0, "missing class name"); - return (0); - } - - /* get parent name */ - if (!next_word(&cp, parent_name)) { - LOG(LOG_ERR, 0, "missing parent class"); - return (0); - } - if (!EQUAL(parent_name, "null") && !EQUAL(parent_name, "NULL")) - parent = parent_name; - else - parent = NULL; - - ap = w; - argc = 0; - while (next_word(&cp, ap)) { - argv[argc] = ap; - ap += strlen(ap) + 1; - argc++; - if (argc >= MAX_ARGS) { - LOG(LOG_ERR, 0, "too many args"); - return (0); - } - } - - return qdisc_class_parser(qdisc_name, ifname, clname, parent, - argc, argv); -} - -static int -filter_parser(char *cmdbuf) -{ - char w[MAX_WORD], *cp = cmdbuf; - char *ifname, class_name[MAX_WORD], fltr_name[MAX_WORD]; - char *flname = NULL; - struct flow_filter sfilt; - int protocol; - u_char tos, tosmask; - int ruleno; - int dontwarn = 0; - int error; - - memset(&sfilt, 0, sizeof(sfilt)); - sfilt.ff_flow.fi_family = AF_INET; - - if (!get_ifname(&cp, &ifname)) { - LOG(LOG_ERR, 0, "missing interface name in filter command"); - return (0); - } - - if (!next_word(&cp, class_name)) { - LOG(LOG_ERR, 0, "missing class name in filter command"); - return (0); - } - - fltr_name[0] = '\0'; - ruleno = 0; - if (!get_fltr_opts(&cp, &fltr_name[0], sizeof(fltr_name), &ruleno)) { - LOG(LOG_ERR, 0, "bad filter option"); - return (0); - } - if (fltr_name[0] != '\0') - flname = fltr_name; - sfilt.ff_ruleno = ruleno; - - /* get filter destination Address */ - if (!get_addr(&cp, &sfilt.ff_flow.fi_dst, &sfilt.ff_mask.mask_dst)) { - LOG(LOG_ERR, 0, "bad filter destination address"); - return (0); - } - - /* get filter destination port */ - if (!next_word(&cp, w)) { - LOG(LOG_ERR, 0, "missing filter destination port"); - return (0); - } - if (!get_port(w, &sfilt.ff_flow.fi_dport)) { - LOG(LOG_ERR, 0, "bad filter destination port"); - return (0); - } - - /* get filter source address */ - if (!get_addr(&cp, &sfilt.ff_flow.fi_src, &sfilt.ff_mask.mask_src)) { - LOG(LOG_ERR, 0, "bad filter source address"); - return (0); - } - - /* get filter source port */ - if (!next_word(&cp, w)) { - LOG(LOG_ERR, 0, "missing filter source port"); - return (0); - } - if (!get_port(w, &sfilt.ff_flow.fi_sport)) { - LOG(LOG_ERR, 0, "bad filter source port"); - return (0); - } - - /* get filter protocol id */ - if (!next_word(&cp, w)) { - LOG(LOG_ERR, 0, "missing filter protocol"); - return (0); - } - if (!get_proto(w, &protocol)) { - LOG(LOG_ERR, 0, "bad protocol"); - return (0); - } - sfilt.ff_flow.fi_proto = protocol; - - while (next_word(&cp, w)) { - if (EQUAL(w, "tos")) { - tos = 0; - tosmask = 0xff; - - if (next_word(&cp, w)) { - tos = (u_char)strtol(w, NULL, 0); - if (next_word(&cp, w)) { - if (EQUAL(w, "tosmask")) { - next_word(&cp, w); - tosmask = (u_char)strtol(w, NULL, 0); - } - } - } - sfilt.ff_flow.fi_tos = tos; - sfilt.ff_mask.mask_tos = tosmask; - } else if (EQUAL(w, "gpi")) { - if (next_word(&cp, w)) { - sfilt.ff_flow.fi_gpi = - (u_int32_t)strtoul(w, NULL, 0); - sfilt.ff_flow.fi_gpi = - htonl(sfilt.ff_flow.fi_gpi); - } - } else if (EQUAL(w, "dontwarn")) - dontwarn = 1; - } - - /* - * Add the filter. - */ - filter_dontwarn = dontwarn; /* XXX */ - error = qcmd_add_filter(ifname, class_name, flname, &sfilt); - filter_dontwarn = 0; /* XXX */ - if (error) { - LOG(LOG_ERR, 0, - "can't add filter to class '%s' on interface '%s'", - class_name, ifname); - return (0); - } - return (1); -} - -#ifdef INET6 -static int -filter6_parser(char *cmdbuf) -{ - char w[MAX_WORD], *cp = cmdbuf; - char *ifname, class_name[MAX_WORD], fltr_name[MAX_WORD]; - char *flname = NULL; - struct flow_filter6 sfilt; - int protocol; - u_char tclass, tclassmask; - int ruleno; - int dontwarn = 0; - int ret; - - memset(&sfilt, 0, sizeof(sfilt)); - sfilt.ff_flow6.fi6_family = AF_INET6; - - if (!get_ifname(&cp, &ifname)) { - LOG(LOG_ERR, 0, "missing interface name"); - return (0); - } - - if (!next_word(&cp, class_name)) { - LOG(LOG_ERR, 0, "missing class name"); - return (0); - } - - fltr_name[0] = '\0'; - ruleno = 0; - if (!get_fltr_opts(&cp, &fltr_name[0], sizeof(fltr_name), &ruleno)) { - LOG(LOG_ERR, 0, "bad filter option"); - return (0); - } - if (fltr_name[0] != '\0') - flname = fltr_name; - sfilt.ff_ruleno = ruleno; - - /* get filter destination address */ - if (!get_ip6addr(&cp, &sfilt.ff_flow6.fi6_dst, - &sfilt.ff_mask6.mask6_dst)) { - LOG(LOG_ERR, 0, "bad destination address"); - return (0); - } - - /* get filter destination port */ - if (!next_word(&cp, w)) { - LOG(LOG_ERR, 0, "missing filter destination port"); - return (0); - } - if (!get_port(w, &sfilt.ff_flow6.fi6_dport)) { - LOG(LOG_ERR, 0, "bad filter destination port"); - return (0); - } - - /* get filter source address */ - if (!get_ip6addr(&cp, &sfilt.ff_flow6.fi6_src, - &sfilt.ff_mask6.mask6_src)) { - LOG(LOG_ERR, 0, "bad source address"); - return (0); - } - - /* get filter source port */ - if (!next_word(&cp, w)) { - LOG(LOG_ERR, 0, "missing filter source port"); - return (0); - } - if (!get_port(w, &sfilt.ff_flow6.fi6_sport)) { - LOG(LOG_ERR, 0, "bad filter source port"); - return (0); - } - - /* get filter protocol id */ - if (!next_word(&cp, w)) { - LOG(LOG_ERR, 0, "missing filter protocol"); - return (0); - } - if (!get_proto(w, &protocol)) { - LOG(LOG_ERR, 0, "bad protocol"); - return (0); - } - sfilt.ff_flow6.fi6_proto = protocol; - - while (next_word(&cp, w)) { - if (EQUAL(w, "tclass")) { - tclass = 0; - tclassmask = 0xff; - - if (next_word(&cp, w)) { - tclass = (u_char)strtol(w, NULL, 0); - if (next_word(&cp, w)) { - if (EQUAL(w, "tclassmask")) { - next_word(&cp, w); - tclassmask = - (u_char)strtol(w, NULL, 0); - } - } - } - sfilt.ff_flow6.fi6_tclass = tclass; - sfilt.ff_mask6.mask6_tclass = tclassmask; - } else if (EQUAL(w, "gpi")) { - if (next_word(&cp, w)) { - sfilt.ff_flow6.fi6_gpi = - (u_int32_t)strtoul(w, NULL, 0); - sfilt.ff_flow6.fi6_gpi = - htonl(sfilt.ff_flow6.fi6_gpi); - } - } else if (EQUAL(w, "flowlabel")) { - if (next_word(&cp, w)) { - sfilt.ff_flow6.fi6_flowlabel = - (u_int32_t)strtoul(w, NULL, 0) & 0x000fffff; - sfilt.ff_flow6.fi6_flowlabel = - htonl(sfilt.ff_flow6.fi6_flowlabel); - } - } else if (EQUAL(w, "dontwarn")) - dontwarn = 1; - } - - /* - * Add the filter. - */ - filter_dontwarn = dontwarn; /* XXX */ - ret = qcmd_add_filter(ifname, class_name, flname, - (struct flow_filter *)&sfilt); - filter_dontwarn = 0; /* XXX */ - if (ret) { - LOG(LOG_ERR, 0, - "can't add filter to class '%s' on interface '%s'", - class_name, ifname); - return (0); - } - - return (1); -} - -static int -get_ip6addr(char **cpp, struct in6_addr *addr, struct in6_addr *mask) -{ - char w[MAX_WORD], *prefix; - u_char *cp; - int len; - - *addr = in6addr_any; /* set all 0 */ - *mask = in6addr_any; /* set all 0 */ - - if (!next_word(cpp, w)) - return (0); - - if (EQUAL(w, "0")) - /* abbreviation of a wildcard (::0) */ - return (1); - - if ((prefix = strchr(w, '/')) != NULL) { - /* address has prefix length */ - *prefix++ = '\0'; - } - - if (inet_pton(AF_INET6, w, addr) != 1) - return (0); - - if (IN6_IS_ADDR_UNSPECIFIED(addr) && prefix == NULL) - /* wildcard */ - return (1); - - /* convert address prefix length to address mask */ - if (prefix != NULL) { - len = (int)strtol(prefix, NULL, 0); - if ((len < 0) || (len > 128)) - return (0); - for (cp = (u_char *)mask; len > 7; len -= 8) - *cp++ = 0xff; - if (len > 0) - *cp = (0xff << (8 - len)) & 0xff; - - IN6ADDR32(addr, 0) &= IN6ADDR32(mask, 0); - IN6ADDR32(addr, 1) &= IN6ADDR32(mask, 1); - IN6ADDR32(addr, 2) &= IN6ADDR32(mask, 2); - IN6ADDR32(addr, 3) &= IN6ADDR32(mask, 3); - } else - /* full mask */ - memset(mask, 0xff, sizeof(struct in6_addr)); - - return (1); -} - -#endif /* INET6 */ - -static int -ctl_parser(char *cmdbuf) -{ - char w[MAX_WORD], *cp = cmdbuf; - char *ifname; - int state; - int rval; - - if (!get_ifname(&cp, &ifname)) { - printf("missing interface name in %s, line %d", - altqconfigfile, line_no); - return (0); - } - - if (!next_word(&cp, w)) { - state = is_q_enabled(ifname); - printf("altq %s on %s\n", - state ? "enabled" : "disabled", ifname); - return (1); - } - - if (EQUAL(w, "enable")) { - rval = qcmd_enable(ifname); - printf("altq %s on %s\n", - (rval == 0) ? "enabled" : "enable failed!", ifname); - } else if (EQUAL(w, "disable")) { - rval = qcmd_disable(ifname); - printf("altq %s on %s\n", - (rval == 0) ? "disabled" : "disable failed!", ifname); - } else if (EQUAL(w, "reload")) { - printf("reinitializing altq...\n"); - qcmd_destroyall(); - qcmd_init(); - } else - return (0); - return (1); -} - -static int -delete_parser(char *cmdbuf) -{ - char *cp = cmdbuf; - char *ifname, class_name[MAX_WORD], filter_name[MAX_WORD]; - int ret; - - if (!get_ifname(&cp, &ifname)) { - LOG(LOG_ERR, 0, "missing interface name"); - return (0); - } - - if (!next_word(&cp, class_name)) { - LOG(LOG_ERR, 0, "missing class name"); - return (0); - } - - /* check if filter is specified */ - if (next_word(&cp, filter_name)) { - ret = qcmd_delete_filter(ifname, class_name, filter_name); - if (ret) { - LOG(LOG_ERR, 0, - "can't delete filter '%s' on interface '%s'", - filter_name, ifname); - return (0); - } - return (1); - } - - ret = qcmd_delete_class(ifname, class_name); - if (ret) { - LOG(LOG_ERR, 0, - "can't delete class '%s' on interface '%s'", - class_name, ifname); - return (0); - } - - return (1); -} - -static int -red_parser(char *cmdbuf) -{ - char w[MAX_WORD], *cp = cmdbuf; - int th_min, th_max, inv_pmax; - - if (!next_word(&cp, w)) - goto bad; - th_min = (int)strtol(w, NULL, 0); - - if (!next_word(&cp, w)) - goto bad; - th_max = (int)strtol(w, NULL, 0); - - if (!next_word(&cp, w)) - goto bad; - inv_pmax = (int)strtol(w, NULL, 0); - - if (qop_red_set_defaults(th_min, th_max, inv_pmax) != 0) { - LOG(LOG_ERR, 0, "can't set red default parameters"); - return (0); - } - - return (1); - - bad: - LOG(LOG_ERR, 0, "bad red parameter"); - return (0); -} - -static int -rio_parser(char *cmdbuf) -{ - char w[MAX_WORD], *cp = cmdbuf; - int i; - struct redparams params[RIO_NDROPPREC]; - - for (i = 0; i < RIO_NDROPPREC; i++) { - if (!next_word(&cp, w)) - goto bad; - params[i].th_min = (int)strtol(w, NULL, 0); - - if (!next_word(&cp, w)) - goto bad; - params[i].th_max = (int)strtol(w, NULL, 0); - - if (!next_word(&cp, w)) - goto bad; - params[i].inv_pmax = (int)strtol(w, NULL, 0); - } - - if (qop_rio_set_defaults(¶ms[0]) != 0) { - LOG(LOG_ERR, 0, "can't set rio default parameters"); - return (0); - } - - return (1); - - bad: - LOG(LOG_ERR, 0, "bad rio parameter"); - return (0); -} - -static int -conditioner_parser(char *cmdbuf) -{ - char cdnr_name[MAX_WORD], *cp = cmdbuf; - char *ifname; - struct tc_action action[MAX_ACTIONS]; - - if (!get_ifname(&cp, &ifname)) { - LOG(LOG_ERR, 0, "missing interface name"); - return (0); - } - - /* get conditioner name */ - if (!next_word(&cp, cdnr_name)) { - LOG(LOG_ERR, 0, "missing cdnr name"); - return (0); - } - - if (tc_action_parser(ifname, &cp, &action[0]) == 0) - return (0); - - if (qcmd_cdnr_add_element(NULL, ifname, cdnr_name, &action[0]) != 0) - return (0); - return (1); -} - -/* - * recursively parse '<'tc_action'>' - * note that array "action" grows during recursive parse. - */ -static int -tc_action_parser(char *ifname, char **cpp, struct tc_action *action) -{ - char *cp, *start, *end; - char type[MAX_WORD], w[MAX_WORD]; - int depth, i; - struct tb_profile profile[2]; - - /* - * find a possibly nested pair of '<' and '>', - * make them pointed by 'start' and 'end'. - */ - start = strchr(*cpp, '<'); - if (start == NULL) { - LOG(LOG_ERR, 0, "conditioner action missing"); - return (0); - } - depth = 1; - cp = start + 1; - do { - end = strpbrk(cp, "<>"); - if (end == NULL) { - LOG(LOG_ERR, 0, - "conditioner action delimiter mismatch"); - return (0); - } - if (*end == '<') - depth++; - else if (*end == '>') - depth--; - cp = end + 1; - } while (depth > 0); - *end = '\0'; - *cpp = end + 1; - cp = start + 1; - - if (IsDebug(DEBUG_ALTQ)) { - printf("tc_action_parser: [%s]\n", cp); - } - - if (!next_word(&cp, type)) { - LOG(LOG_ERR, 0, "missing conditioner action type"); - return (0); - } - - /* - * action type specific process - */ - if (EQUAL(type, "conditioner")) { - if (!next_word(&cp, w)) { - LOG(LOG_ERR, 0, - "missing conditioner name"); - return (0); - } - action->tca_code = TCACODE_HANDLE; - action->tca_handle = cdnr_name2handle(ifname, w); - if (action->tca_handle == CDNR_NULL_HANDLE) { - LOG(LOG_ERR, 0, - "wrong conditioner name %s", w); - return (0); - } - } else if (EQUAL(type, "pass")) { - action->tca_code = TCACODE_PASS; - } else if (EQUAL(type, "drop")) { - action->tca_code = TCACODE_DROP; - } else if (EQUAL(type, "mark")) { - if (!next_word(&cp, w)) { - LOG(LOG_ERR, 0, "missing dscp"); - return (0); - } - action->tca_code = TCACODE_MARK; - action->tca_dscp = (u_int8_t)strtol(w, NULL, 0); - } else if (EQUAL(type, "tbmeter")) { - if (!next_word(&cp, w)) { - LOG(LOG_ERR, 0, "missing tb profile"); - return (0); - } - profile[0].rate = atobps(w); - if (!next_word(&cp, w)) { - LOG(LOG_ERR, 0, "missing tb profile"); - return (0); - } - profile[0].depth = atobytes(w); - if (tc_action_parser(ifname, &cp, &action[1]) == 0) - return (0); - if (tc_action_parser(ifname, &cp, &action[2]) == 0) - return (0); - - if (qcmd_cdnr_add_tbmeter(action, ifname, NULL, &profile[0], - &action[1], &action[2]) != 0) - return (0); - } else if (EQUAL(type, "trtcm")) { - int coloraware = 0; /* default is color-blind */ - - for (i=0; i<2; i++) { - if (!next_word(&cp, w)) { - LOG(LOG_ERR, 0, "missing tb profile"); - return (0); - } - profile[i].rate = atobps(w); - if (!next_word(&cp, w)) { - LOG(LOG_ERR, 0, "missing tb profile"); - return (0); - } - profile[i].depth = atobytes(w); - } - if (tc_action_parser(ifname, &cp, &action[1]) == 0) - return (0); - if (tc_action_parser(ifname, &cp, &action[2]) == 0) - return (0); - if (tc_action_parser(ifname, &cp, &action[3]) == 0) - return (0); - if (next_word(&cp, w)) { - if (EQUAL(w, "coloraware")) - coloraware = 1; - else if (EQUAL(w, "colorblind")) - coloraware = 0; - } - - if (qcmd_cdnr_add_trtcm(action, ifname, NULL, - &profile[0], &profile[1], - &action[1], &action[2], &action[3], - coloraware) != 0) - return (0); - } else if (EQUAL(type, "tswtcm")) { - u_int32_t cmtd_rate, peak_rate, avg_interval; - - if (!next_word(&cp, w)) { - LOG(LOG_ERR, 0, "missing cmtd rate"); - return (0); - } - cmtd_rate = atobps(w); - - if (!next_word(&cp, w)) { - LOG(LOG_ERR, 0, "missing peak rate"); - return (0); - } - peak_rate = atobps(w); - - if (!next_word(&cp, w)) { - LOG(LOG_ERR, 0, "missing avg interval"); - return (0); - } - avg_interval = (u_int32_t)strtoul(w, NULL, 0); - - if (tc_action_parser(ifname, &cp, &action[1]) == 0) - return (0); - if (tc_action_parser(ifname, &cp, &action[2]) == 0) - return (0); - if (tc_action_parser(ifname, &cp, &action[3]) == 0) - return (0); - - if (qcmd_cdnr_add_tswtcm(action, ifname, NULL, - cmtd_rate, peak_rate, avg_interval, - &action[1], &action[2], &action[3]) - != 0) - return (0); - } else { - LOG(LOG_ERR, 0, "unkown action type %s"); - return (0); - } - - *end = '>'; /* restore the end delimiter */ - - return (1); -} diff --git a/usr.sbin/altq/libaltq/qop.c b/usr.sbin/altq/libaltq/qop.c deleted file mode 100644 index 0ee16ead860..00000000000 --- a/usr.sbin/altq/libaltq/qop.c +++ /dev/null @@ -1,1448 +0,0 @@ -/* $OpenBSD: qop.c,v 1.3 2001/10/26 07:39:52 kjc Exp $ */ -/* $KAME: qop.c,v 1.10 2001/08/16 10:39:13 kjc Exp $ */ -/* - * Copyright (C) 1999-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. - */ - -#include <sys/param.h> -#include <sys/socket.h> -#include <sys/sockio.h> -#include <sys/ioctl.h> -#include <sys/fcntl.h> -#include <sys/stat.h> -#if defined(__FreeBSD__) && (__FreeBSD_version > 300000) -#include <sys/linker.h> -#endif - -#include <net/if.h> -#include <netinet/in.h> -#include <arpa/inet.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <stddef.h> -#include <string.h> -#include <ctype.h> -#include <errno.h> -#include <err.h> -#include <syslog.h> - -#include <altq/altq.h> -#include <altq/altq_red.h> -#include <altq/altq_rio.h> -#include <altq/altq_cdnr.h> -#include "altq_qop.h" -#include "qop_cdnr.h" - -#define ALTQ_DEVICE "/dev/altq/altq" -#define RED_DEVICE "/dev/altq/red" -#define RIO_DEVICE "/dev/altq/rio" -#define CDNR_DEVICE "/dev/altq/cdnr" - -#ifndef LIST_HEAD_INITIALIZER -#define LIST_HEAD_INITIALIZER(head) { NULL } -#endif - -/* - * token bucket regulator information - */ -struct tbrinfo { - LIST_ENTRY(tbrinfo) link; - char ifname[IFNAMSIZ]; /* if name, e.g. "en0" */ - struct tb_profile tb_prof, otb_prof; - int installed; -}; - -/* - * Static globals - */ -/* a list of configured interfaces */ -LIST_HEAD(qop_iflist, ifinfo) qop_iflist = LIST_HEAD_INITIALIZER(&iflist); -/* a list of configured token bucket regulators */ -LIST_HEAD(tbr_list, tbrinfo) tbr_list = LIST_HEAD_INITIALIZER(&tbr_list); -int Debug_mode = 0; /* nosched (dummy mode) */ - -/* - * internal functions - */ -static int get_ifmtu(const char *); -static void tbr_install(const char *); -static void tbr_deinstall(const char *); -static int add_filter_rule(struct ifinfo *, struct fltrinfo *, - struct fltrinfo **); -static int remove_filter_rule(struct ifinfo *, - struct fltrinfo *); -static int filt_check_relation(struct flow_filter *, struct flow_filter *); -static int filt_disjoint(struct flow_filter *, struct flow_filter *); -static int filt_subset(struct flow_filter *, struct flow_filter *); - -/* - * QCMD (Queue Command) API - */ -int -qcmd_init(void) -{ - int error; - - /* read config file and execute commands */ - error = qcmd_config(); - if (error != 0) - return (error); - - error = qcmd_enableall(); - if (error != 0) - LOG(LOG_ERR, errno, "%s: qcmd_init failed", qoperror(error)); - return (error); -} - -int -qcmd_enable(const char *ifname) -{ - struct ifinfo *ifinfo; - int error = 0; - - if ((ifinfo = ifname2ifinfo(ifname)) == NULL) - error = QOPERR_BADIF; - - if (error == 0) - error = qop_enable(ifinfo); - - if (error == 0) { - LOG(LOG_INFO, 0, "%s enabled on interface %s (mtu:%d)", - ifinfo->qdisc->qname, ifname, ifinfo->ifmtu); - } else - LOG(LOG_ERR, errno, "%s: enable failed!", qoperror(error)); - return (error); -} - -int -qcmd_disable(const char *ifname) -{ - struct ifinfo *ifinfo; - int error = 0; - - if ((ifinfo = ifname2ifinfo(ifname)) == NULL) - error = QOPERR_BADIF; - - if (error == 0) - error = qop_disable(ifinfo); - - if (error != 0) - LOG(LOG_ERR, errno, "%s: disable failed!", qoperror(error)); - return (error); -} - -int -qcmd_enableall() -{ - struct ifinfo *ifinfo; - int error; - - LIST_FOREACH(ifinfo, &qop_iflist, next) { - if ((error = qop_enable(ifinfo)) != 0) - return (error); - LOG(LOG_INFO, 0, "%s enabled on interface %s (mtu:%d)", - ifinfo->qdisc->qname, ifinfo->ifname, ifinfo->ifmtu); - } - return (0); -} - -int -qcmd_disableall() -{ - struct ifinfo *ifinfo; - int err, error = 0; - - LIST_FOREACH(ifinfo, &qop_iflist, next) - if ((err = qop_disable(ifinfo)) != 0) - if (error == 0) - error = err; - return (error); -} - -int -qcmd_clear(const char *ifname) -{ - struct ifinfo *ifinfo; - int error = 0; - - if ((ifinfo = ifname2ifinfo(ifname)) == NULL) - error = QOPERR_BADIF; - - if (error == 0) - error = qop_clear(ifinfo); - if (error != 0) - LOG(LOG_ERR, errno, "%s: clear failed!", qoperror(error)); - return (error); -} - -int -qcmd_destroyall(void) -{ - while (!LIST_EMPTY(&qop_iflist)) - (void)qop_delete_if(LIST_FIRST(&qop_iflist)); - return (0); -} - -int -qcmd_restart(void) -{ - qcmd_destroyall(); - return qcmd_init(); -} - -int -qcmd_delete_class(const char *ifname, const char *clname) -{ - struct ifinfo *ifinfo; - struct classinfo *clinfo; - int error = 0; - - if ((ifinfo = ifname2ifinfo(ifname)) == NULL) - error = QOPERR_BADIF; - - if (error == 0 && - (clinfo = clname2clinfo(ifinfo, clname)) == NULL) - error = QOPERR_BADCLASS; - - if (error == 0) - error = qop_delete_class(clinfo); - if (error != 0) - LOG(LOG_ERR, errno, "%s: delete_class failed", - qoperror(error)); - return (error); -} - -int -qcmd_add_filter(const char *ifname, const char *clname, const char *flname, - const struct flow_filter *fltr) -{ - struct ifinfo *ifinfo; - struct classinfo *clinfo; - int error = 0; - - if ((ifinfo = ifname2ifinfo(ifname)) == NULL) - error = QOPERR_BADIF; - - if (error == 0 && - (clinfo = clname2clinfo(ifinfo, clname)) == NULL) { - /* - * there is no matching class. - * check if it is for a traffic conditioner - */ - if ((ifinfo = input_ifname2ifinfo(ifname)) == NULL || - (clinfo = clname2clinfo(ifinfo, clname)) == NULL) - error = QOPERR_BADCLASS; - } - - if (error == 0) - error = qop_add_filter(NULL, clinfo, flname, fltr, NULL); - - if (error != 0) - LOG(LOG_ERR, errno, "%s: add filter failed!", - qoperror(error)); - else if (IsDebug(DEBUG_ALTQ)) { - LOG(LOG_DEBUG, 0, "%s: add a filter %s to class %s", - ifname, flname ? flname : "(null)", - clname ? clname : "(null)"); - print_filter(fltr); - } - return (error); -} - -int -qcmd_delete_filter(const char *ifname, const char *clname, const char *flname) -{ - struct ifinfo *ifinfo; - struct classinfo *clinfo; - struct fltrinfo *fltrinfo; - int error = 0; - - if ((ifinfo = ifname2ifinfo(ifname)) == NULL) - error = QOPERR_BADIF; - - if (error == 0 && - (clinfo = clname2clinfo(ifinfo, clname)) == NULL) { - /* - * there is no matching class. - * check if it is for a traffic conditioner - */ - if ((ifinfo = input_ifname2ifinfo(ifname)) == NULL || - (clinfo = clname2clinfo(ifinfo, clname)) == NULL) - error = QOPERR_BADCLASS; - } - - if (error == 0 && - (fltrinfo = flname2flinfo(clinfo, flname)) == NULL) - error = QOPERR_BADFILTER; - - if (error == 0) - error = qop_delete_filter(fltrinfo); - if (error != 0) - LOG(LOG_ERR, errno, "%s: delete filter failed!", - qoperror(error)); - return (error); -} - -int -qcmd_tbr_register(const char *ifname, u_int rate, u_int size) -{ - struct tbrinfo *info; - - if ((info = calloc(1, sizeof(struct tbrinfo))) == NULL) - return (QOPERR_NOMEM); - - strlcpy(info->ifname, ifname, sizeof(info->ifname)); - info->tb_prof.rate = rate; - info->tb_prof.depth = size; - info->installed = 0; - LIST_INSERT_HEAD(&tbr_list, info, link); - return (0); -} - -/* - * QOP (Queue Operation) API - */ - -int -qop_add_if(struct ifinfo **rp, const char *ifname, u_int bandwidth, - struct qdisc_ops *qdisc_ops, void *if_private) -{ - struct ifinfo *ifinfo; - int error; - - if (ifname2ifinfo(ifname) != NULL) { - LOG(LOG_ERR, 0, "qop_add_if: %s already exists!", ifname); - return (QOPERR_BADIF); - } - - if ((ifinfo = calloc(1, sizeof(struct ifinfo))) == NULL) - return (QOPERR_NOMEM); - ifinfo->ifname = strdup(ifname); - ifinfo->bandwidth = bandwidth; - ifinfo->enabled = 0; - if (ifname[0] == '_') - /* input interface */ - ifname += 1; - ifinfo->ifindex = get_ifindex(ifname); - ifinfo->ifmtu = get_ifmtu(ifname); - if (qdisc_ops == NULL || Debug_mode) - ifinfo->qdisc = &nop_qdisc; /* replace syscalls by nops */ - else - ifinfo->qdisc = qdisc_ops; - ifinfo->private = if_private; - LIST_INIT(&ifinfo->cllist); - LIST_INIT(&ifinfo->fltr_rules); - - /* Link the interface info structure */ - LIST_INSERT_HEAD(&qop_iflist, ifinfo, next); - - /* install token bucket regulator, if necessary */ - tbr_install(ifname); - - /* attach the discipline to the interface */ - if ((error = (*ifinfo->qdisc->attach)(ifinfo)) != 0) - goto err_ret; - - /* disable and clear the interface */ - if (ifinfo->qdisc->disable != NULL) - if ((error = (*ifinfo->qdisc->disable)(ifinfo)) != 0) - goto err_ret; - if (ifinfo->qdisc->clear != NULL) - if ((error = (*ifinfo->qdisc->clear)(ifinfo)) != 0) - goto err_ret; - - if (rp != NULL) - *rp = ifinfo; - return (0); - -err_ret: - if (ifinfo != NULL) { - LIST_REMOVE(ifinfo, next); - if (ifinfo->ifname != NULL) - free(ifinfo->ifname); - free(ifinfo); - } - return (error); -} - -int -qop_delete_if(struct ifinfo *ifinfo) -{ - (void)qop_disable(ifinfo); - (void)qop_clear(ifinfo); - - if (ifinfo->delete_hook != NULL) - (*ifinfo->delete_hook)(ifinfo); - - /* remove this entry from qop_iflist */ - LIST_REMOVE(ifinfo, next); - - (void)(*ifinfo->qdisc->detach)(ifinfo); - - /* deinstall token bucket regulator, if necessary */ - tbr_deinstall(ifinfo->ifname); - - if (ifinfo->private != NULL) - free(ifinfo->private); - if (ifinfo->ifname != NULL) - free(ifinfo->ifname); - free(ifinfo); - return (0); -} - -int -qop_enable(struct ifinfo *ifinfo) -{ - int error; - - if (ifinfo->enable_hook != NULL) - if ((error = (*ifinfo->enable_hook)(ifinfo)) != 0) - return (error); - - if (ifinfo->qdisc->enable != NULL) - if ((error = (*ifinfo->qdisc->enable)(ifinfo)) != 0) - return (error); - ifinfo->enabled = 1; - return (0); -} - -int -qop_disable(struct ifinfo *ifinfo) -{ - int error; - - if (ifinfo->qdisc->disable != NULL) - if ((error = (*ifinfo->qdisc->disable)(ifinfo)) != 0) - return (error); - ifinfo->enabled = 0; - return (0); -} - -int -qop_clear(struct ifinfo *ifinfo) -{ - struct classinfo *clinfo; - - /* free all classes and filters */ - if (ifinfo->ifname[0] != '_') { - /* output interface. delete from leaf classes */ - while (!LIST_EMPTY(&ifinfo->cllist)) { - LIST_FOREACH(clinfo, &ifinfo->cllist, next) { - if (clinfo->child != NULL) - continue; - qop_delete_class(clinfo); - /* - * the list has been changed, - * restart from the head - */ - break; - } - } - } else { - /* input interface. delete from parents */ - struct classinfo *root = get_rootclass(ifinfo); - - while (!LIST_EMPTY(&ifinfo->cllist)) { - LIST_FOREACH(clinfo, &ifinfo->cllist, next) - if (clinfo->parent == root) { - qop_delete_cdnr(clinfo); - break; - } - if (root->child == NULL) - qop_delete_class(root); - } - } - - /* clear the interface */ - if (ifinfo->qdisc->clear != NULL) - return (*ifinfo->qdisc->clear)(ifinfo); - return (0); -} - -int -qop_add_class(struct classinfo **rp, const char *clname, - struct ifinfo *ifinfo, struct classinfo *parent, - void *class_private) -{ - struct classinfo *clinfo; - int error; - - if ((clinfo = calloc(1, sizeof(*clinfo))) == NULL) - return (QOPERR_NOMEM); - - if (clname != NULL) - clinfo->clname = strdup(clname); - else - clinfo->clname = strdup("(null)"); /* dummy name */ - clinfo->ifinfo = ifinfo; - clinfo->private = class_private; - clinfo->parent = parent; - clinfo->child = NULL; - LIST_INIT(&clinfo->fltrlist); - - if ((error = (*ifinfo->qdisc->add_class)(clinfo)) != 0) - goto err_ret; - - /* link classinfo in lists */ - LIST_INSERT_HEAD(&ifinfo->cllist, clinfo, next); - - if (parent != NULL) { - clinfo->sibling = parent->child; - clinfo->parent->child = clinfo; - } - - if (rp != NULL) - *rp = clinfo; - return (0); - -err_ret: - if (clinfo != NULL) { - if (clinfo->clname != NULL) - free(clinfo->clname); - free(clinfo); - } - return (error); -} - -int -qop_modify_class(struct classinfo *clinfo, void *arg) -{ - return (*clinfo->ifinfo->qdisc->modify_class)(clinfo, arg); -} - -int -qop_delete_class(struct classinfo *clinfo) -{ - struct ifinfo *ifinfo = clinfo->ifinfo; - struct classinfo *prev; - int error; - - /* a class to be removed should not have a child */ - if (clinfo->child != NULL) - return (QOPERR_CLASS_PERM); - - /* remove filters associated to this class */ - while (!LIST_EMPTY(&clinfo->fltrlist)) - (void)qop_delete_filter(LIST_FIRST(&clinfo->fltrlist)); - - if (clinfo->delete_hook != NULL) - (*clinfo->delete_hook)(clinfo); - - /* remove class info from the interface */ - LIST_REMOVE(clinfo, next); - - /* remove this class from the child list */ - if (clinfo->parent != NULL) { - if (clinfo->parent->child == clinfo) - clinfo->parent->child = clinfo->sibling; - else for (prev = clinfo->parent->child; prev->sibling != NULL; - prev = prev->sibling) - if (prev->sibling == clinfo) { - prev->sibling = clinfo->sibling; - break; - } - } - - /* delete class from kernel */ - if ((error = (*ifinfo->qdisc->delete_class)(clinfo)) != 0) - return (error); - - if (clinfo->private != NULL) - free(clinfo->private); - if (clinfo->clname != NULL) - free(clinfo->clname); - free(clinfo); - return (0); -} - -int -qop_add_filter(struct fltrinfo **rp, struct classinfo *clinfo, - const char *flname, const struct flow_filter *fltr, - struct fltrinfo **conflict) -{ - struct ifinfo *ifinfo; - struct fltrinfo *fltrinfo; - int error; - - if ((fltrinfo = calloc(1, sizeof(*fltrinfo))) == NULL) - return (QOPERR_NOMEM); - - fltrinfo->clinfo = clinfo; - fltrinfo->fltr = *fltr; -#if 1 - /* fix this */ - fltrinfo->line_no = line_no; /* XXX */ - fltrinfo->dontwarn = filter_dontwarn; /* XXX */ -#endif - if (flname != NULL) - fltrinfo->flname = strdup(flname); - else - fltrinfo->flname = strdup("(null)"); /* dummy name */ - - /* check and save the filter */ - ifinfo = clinfo->ifinfo; - if ((error = add_filter_rule(ifinfo, fltrinfo, conflict)) != 0) - goto err_ret; - - /* install the filter to the kernel */ - if ((error = (*ifinfo->qdisc->add_filter)(fltrinfo)) != 0) { - remove_filter_rule(ifinfo, fltrinfo); - goto err_ret; - } - - /* link fltrinfo onto fltrlist of the class */ - LIST_INSERT_HEAD(&clinfo->fltrlist, fltrinfo, next); - - if (rp != NULL) - *rp = fltrinfo; - return (0); - -err_ret: - if (fltrinfo != NULL) { - if (fltrinfo->flname != NULL) - free(fltrinfo->flname); - free(fltrinfo); - } - return (error); -} - -int -qop_delete_filter(struct fltrinfo *fltrinfo) -{ - struct ifinfo *ifinfo; - struct classinfo *clinfo; - int error; - - /* remove filter info from the class */ - clinfo = fltrinfo->clinfo; - ifinfo = clinfo->ifinfo; - - - /* remove the entry from fltrlist of the class */ - LIST_REMOVE(fltrinfo, next); - - remove_filter_rule(ifinfo, fltrinfo); - - /* delete filter from kernel */ - if ((error = (*ifinfo->qdisc->delete_filter)(fltrinfo)) != 0) - return (error); - - if (fltrinfo->flname) - free(fltrinfo->flname); - free(fltrinfo); - return (0); -} - -const char * -qoperror(int qoperrno) -{ - static char buf[64]; - - if (qoperrno <= QOPERR_MAX) - return (qop_errlist[qoperrno]); - snprintf(buf, sizeof(buf), "unknown error %d", qoperrno); - return (buf); -} - -/* - * misc functions - */ -struct ifinfo * -ifname2ifinfo(const char *ifname) -{ - struct ifinfo *ifinfo; - - LIST_FOREACH(ifinfo, &qop_iflist, next) - if (ifinfo->ifname != NULL && - strcmp(ifinfo->ifname, ifname) == 0) - return (ifinfo); - return (NULL); -} - -struct ifinfo * -input_ifname2ifinfo(const char *ifname) -{ - struct ifinfo *ifinfo; - - LIST_FOREACH(ifinfo, &qop_iflist, next) - if (ifinfo->ifname[0] == '_' && - strcmp(ifinfo->ifname+1, ifname) == 0) - return (ifinfo); - return (NULL); -} - -struct classinfo * -clname2clinfo(const struct ifinfo *ifinfo, const char *clname) -{ - struct classinfo *clinfo; - - LIST_FOREACH(clinfo, &ifinfo->cllist, next) - if (clinfo->clname != NULL && - strcmp(clinfo->clname, clname) == 0) - return (clinfo); - return (NULL); -} - -struct classinfo * -clhandle2clinfo(struct ifinfo *ifinfo, u_long handle) -{ - struct classinfo *clinfo; - - LIST_FOREACH(clinfo, &ifinfo->cllist, next) - if (clinfo->handle == handle) - return (clinfo); - return (NULL); -} - -struct fltrinfo * -flname2flinfo(const struct classinfo *clinfo, const char *flname) -{ - struct fltrinfo *fltrinfo; - - LIST_FOREACH(fltrinfo, &clinfo->fltrlist, next) - if (fltrinfo->flname != NULL && - strcmp(fltrinfo->flname, flname) == 0) - return (fltrinfo); - return (NULL); -} - -struct fltrinfo * -flhandle2fltrinfo(struct ifinfo *ifinfo, u_long handle) -{ - struct fltrinfo *fltrinfo; - - LIST_FOREACH(fltrinfo, &ifinfo->fltr_rules, nextrule) - if (fltrinfo->handle == handle) - return (fltrinfo); - return (NULL); -} - -int -is_q_enabled(const char *ifname) -{ - struct ifinfo *ifinfo; - - if ((ifinfo = ifname2ifinfo(ifname)) == NULL) - return (0); - return (ifinfo->enabled); -} - -/* - * functions to walk through a class tree: - * - * for (clinfo = get_rootclass(ifinfo); - * clinfo != NULL; clinfo = get_nextclass(clinfo)) { - * do_something; - * } - */ -struct classinfo *get_rootclass(struct ifinfo *ifinfo) -{ - struct classinfo *clinfo; - - /* find a class without parent */ - LIST_FOREACH(clinfo, &ifinfo->cllist, next) - if (clinfo->parent == NULL) - return (clinfo); - return (NULL); -} - -/* return next class in the tree */ -struct classinfo *get_nextclass(struct classinfo *clinfo) -{ - struct classinfo *next; - - if (clinfo->child != NULL) - next = clinfo->child; - else if (clinfo->sibling != NULL) - next = clinfo->sibling; - else { - next = clinfo; - while ((next = next->parent) != NULL) - if (next->sibling) { - next = next->sibling; - break; - } - } - return (next); -} - -u_long -atobps(const char *s) -{ - double bandwidth; - char *cp; - - bandwidth = strtod(s, &cp); - if (cp != NULL) { - if (*cp == 'K' || *cp == 'k') - bandwidth *= 1000; - else if (*cp == 'M' || *cp == 'm') - bandwidth *= 1000000; - else if (*cp == 'G' || *cp == 'g') - bandwidth *= 1000000000; - } - if (bandwidth < 0) - bandwidth = 0; - return ((u_long)bandwidth); -} - -u_long -atobytes(const char *s) -{ - double bytes; - char *cp; - - bytes = strtod(s, &cp); - if (cp != NULL) { - if (*cp == 'K' || *cp == 'k') - bytes *= 1024; - else if (*cp == 'M' || *cp == 'm') - bytes *= 1024 * 1024; - else if (*cp == 'G' || *cp == 'g') - bytes *= 1024 * 1024 * 1024; - } - if (bytes < 0) - bytes = 0; - return ((u_long)bytes); -} - -static int -get_ifmtu(const char *ifname) -{ - int s, mtu; - struct ifreq ifr; -#ifdef __OpenBSD__ - struct if_data ifdata; -#endif - - mtu = 512; /* default MTU */ - - if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) - return (mtu); - strncpy(ifr.ifr_name, ifname, sizeof ifr.ifr_name); -#ifdef __OpenBSD__ - ifr.ifr_data = (caddr_t)&ifdata; - if (ioctl(s, SIOCGIFDATA, (caddr_t)&ifr) == 0) - mtu = ifdata.ifi_mtu; -#else - if (ioctl(s, SIOCGIFMTU, (caddr_t)&ifr) == 0) - mtu = ifr.ifr_mtu; -#endif - close(s); - return (mtu); -} - -static void -tbr_install(const char *ifname) -{ - struct tbrinfo *info; - struct tbrreq req; - int fd; - - LIST_FOREACH(info, &tbr_list, link) - if (strcmp(info->ifname, ifname) == 0) - break; - if (info == NULL) - return; - if (info->tb_prof.rate == 0 || info->installed) - return; - - /* get the current token bucket regulator */ - if ((fd = open(ALTQ_DEVICE, O_RDWR)) < 0) - err(1, "can't open altq device"); - strncpy(req.ifname, ifname, IFNAMSIZ-1); - if (ioctl(fd, ALTQTBRGET, &req) < 0) - err(1, "ALTQTBRGET for interface %s", req.ifname); - - /* save the current values */ - info->otb_prof.rate = req.tb_prof.rate; - info->otb_prof.depth = req.tb_prof.depth; - - /* - * if tbr is not specified in the config file and tbr is already - * configured, do not change. - */ - if (req.tb_prof.rate != 0) { - LOG(LOG_INFO, 0, - "tbr is already installed on %s,\n" - " using the current setting (rate:%.2fM size:%.2fK).", - info->ifname, - (double)req.tb_prof.rate/1000000.0, - (double)req.tb_prof.depth/1024.0); - close (fd); - return; - } - - /* if the new size is not specified, use heuristics */ - if (info->tb_prof.depth == 0) { - u_int rate, size; - - rate = info->tb_prof.rate; - if (rate <= 1*1000*1000) - size = 1; - else if (rate <= 10*1000*1000) - size = 4; - else if (rate <= 200*1000*1000) - size = 8; - else - size = 24; - size = size * 1500; /* assume the default mtu is 1500 */ - info->tb_prof.depth = size; - } - - /* install the new tbr */ - strncpy(req.ifname, ifname, IFNAMSIZ-1); - req.tb_prof.rate = info->tb_prof.rate; - req.tb_prof.depth = info->tb_prof.depth; - if (ioctl(fd, ALTQTBRSET, &req) < 0) - err(1, "ALTQTBRSET for interface %s", req.ifname); - LOG(LOG_INFO, 0, - "tbr installed on %s (rate:%.2fM size:%.2fK)", - info->ifname, - (double)info->tb_prof.rate/1000000.0, - (double)info->tb_prof.depth/1024.0); - close(fd); - info->installed = 1; -} - -static void -tbr_deinstall(const char *ifname) -{ - struct tbrinfo *info; - struct tbrreq req; - int fd; - - LIST_FOREACH(info, &tbr_list, link) - if (strcmp(info->ifname, ifname) == 0) - break; - if (info == NULL) - return; - - /* if we installed tbr, restore the old values */ - if (info->installed != 0) { - strncpy(req.ifname, ifname, IFNAMSIZ-1); - req.tb_prof.rate = info->otb_prof.rate; - req.tb_prof.depth = info->otb_prof.depth; - if ((fd = open(ALTQ_DEVICE, O_RDWR)) < 0) - err(1, "can't open altq device"); - if (ioctl(fd, ALTQTBRSET, &req) < 0) - err(1, "ALTQTBRSET for interface %s", req.ifname); - close(fd); - } - LIST_REMOVE(info, link); - free(info); -} - -void -print_filter(const struct flow_filter *filt) -{ - if (filt->ff_flow.fi_family == AF_INET) { - struct in_addr in_addr; - - in_addr.s_addr = filt->ff_flow.fi_dst.s_addr; - LOG(LOG_DEBUG, 0, - " Filter Dest Addr: %s (mask %#x) Port: %d", - inet_ntoa(in_addr), ntoh32(filt->ff_mask.mask_dst.s_addr), - ntoh16(filt->ff_flow.fi_dport)); - in_addr.s_addr = filt->ff_flow.fi_src.s_addr; - LOG(LOG_DEBUG, 0, - " Src Addr: %s (mask %#x) Port: %d", - inet_ntoa(in_addr), ntoh32(filt->ff_mask.mask_src.s_addr), - ntoh16(filt->ff_flow.fi_sport)); - LOG(LOG_DEBUG, 0, " Protocol: %d TOS %#x (mask %#x)", - filt->ff_flow.fi_proto, filt->ff_flow.fi_tos, - filt->ff_mask.mask_tos); - } -#ifdef INET6 - else if (filt->ff_flow.fi_family == AF_INET6) { - char str1[INET6_ADDRSTRLEN], str2[INET6_ADDRSTRLEN]; - const struct flow_filter6 *sfilt6; - - sfilt6 = (const struct flow_filter6 *)filt; - LOG(LOG_DEBUG, 0, "Filter6 Dest Addr: %s (mask %s) Port: %d", - inet_ntop(AF_INET6, &sfilt6->ff_flow6.fi6_dst, - str1, sizeof(str1)), - inet_ntop(AF_INET6, &sfilt6->ff_mask6.mask6_dst, - str2, sizeof(str2)), - ntoh16(sfilt6->ff_flow6.fi6_dport)); - LOG(LOG_DEBUG, 0, " Src Addr: %s (mask %s) Port: %d", - inet_ntop(AF_INET6, &sfilt6->ff_flow6.fi6_src, - str1, sizeof(str1)), - inet_ntop(AF_INET6, &sfilt6->ff_mask6.mask6_src, - str2, sizeof(str2)), - ntoh16(sfilt6->ff_flow6.fi6_sport)); - LOG(LOG_DEBUG, 0, " Protocol: %d TCLASS %#x (mask %#x)", - sfilt6->ff_flow6.fi6_proto, sfilt6->ff_flow6.fi6_tclass, - sfilt6->ff_mask6.mask6_tclass); - } -#endif /* INET6 */ -} - -/* - * functions to check the filter-rules. - * when a new filter is added, we check the relation to the existing filters - * and if some inconsistency is found, produce an error or a warning message. - * - * filter matching is performed from the head of the list. - * let - * S: a set of packets that filter s matches - * T: a set of packets that filter t matches - * filter relations are: - * disjoint: S ^ T = empty - * subset: S <= T - * intersect: S ^ T = not empty - * - * a new filter is disjoint or subset of the existing filters --> ok - * a new filter is superset of an existing filter --> order problem - * a new filter intersect an existing filter --> warning - * - * port-intersect: a special case we don't make warning - * - intersection is only port numbers - * - one specifies src port and the other specifies dst port - * there must be no packet with well-known port numbers in - * both src and dst ports. so this is ok. - */ - -#define FILT_DISJOINT 1 -#define FILT_SUBSET 2 -#define FILT_SUPERSET 3 -#define FILT_INTERSECT 4 -#define FILT_PORTINTERSECT 5 - -static int -add_filter_rule(struct ifinfo *ifinfo, struct fltrinfo *fltrinfo, - struct fltrinfo **conflict) -{ - struct fltrinfo *fp, *front, *back, *prev = NULL; - int relation; - - LIST_FOREACH(fp, &ifinfo->fltr_rules, nextrule) { - if (fp->fltr.ff_ruleno > fltrinfo->fltr.ff_ruleno) { - front = fp; - back = fltrinfo; - prev = fp; - } else { - front = fltrinfo; - back = fp; - } - - relation = filt_check_relation(&front->fltr, &back->fltr); - - switch (relation) { - case FILT_SUBSET: - case FILT_DISJOINT: - /* OK */ - break; - case FILT_SUPERSET: - if (front->dontwarn == 0 && back->dontwarn == 0) - LOG(LOG_ERR, 0, - "filters for \"%s\" at line %d and for \"%s\" at line %d has an order problem!", - front->clinfo->clname, front->line_no, - back->clinfo->clname, back->line_no); - - if (conflict != NULL) - *conflict = fp; - return (QOPERR_FILTER_SHADOW); - case FILT_PORTINTERSECT: - break; - case FILT_INTERSECT: - /* - * if the intersecting two filters beloging to the - * same class, it's ok. - */ - if (front->clinfo == back->clinfo) - break; - if (front->dontwarn == 0 && back->dontwarn == 0) - LOG(LOG_WARNING, 0, - "warning: filter for \"%s\" at line %d could override filter for \"%s\" at line %d", - front->clinfo->clname, front->line_no, - back->clinfo->clname, back->line_no); - break; - } - } - - if (prev == NULL) - LIST_INSERT_HEAD(&ifinfo->fltr_rules, fltrinfo, nextrule); - else - LIST_INSERT_AFTER(prev, fltrinfo, nextrule); - return (0); -} - -static int -remove_filter_rule(struct ifinfo *ifinfo, struct fltrinfo *fltrinfo) -{ - LIST_REMOVE(fltrinfo, nextrule); - return (0); -} - -static int -filt_check_relation(struct flow_filter *front, struct flow_filter *back) -{ - int rval; - - if (front->ff_flow.fi_family != back->ff_flow.fi_family) - return (FILT_DISJOINT); - - if (filt_disjoint(front, back)) - return (FILT_DISJOINT); - - if ((rval = filt_subset(front, back)) == 1) - return (FILT_SUBSET); - - if (filt_subset(back, front) == 1) - return (FILT_SUPERSET); - - if (rval == 2) - return (FILT_PORTINTERSECT); - - return (FILT_INTERSECT); -} - -static int -filt_disjoint(struct flow_filter *front, struct flow_filter *back) -{ - u_int32_t mask; - u_int8_t tosmask; - - if (front->ff_flow.fi_family == AF_INET) { - if (front->ff_flow.fi_proto != 0 && back->ff_flow.fi_proto != 0 - && front->ff_flow.fi_proto != back->ff_flow.fi_proto) - return (1); - if (front->ff_flow.fi_sport != 0 && back->ff_flow.fi_sport != 0 - && front->ff_flow.fi_sport != back->ff_flow.fi_sport) - return (1); - if (front->ff_flow.fi_dport != 0 && back->ff_flow.fi_dport != 0 - && front->ff_flow.fi_dport != back->ff_flow.fi_dport) - return (1); - if (front->ff_flow.fi_gpi != 0 && back->ff_flow.fi_gpi != 0 - && front->ff_flow.fi_gpi != back->ff_flow.fi_gpi) - return (1); - if (front->ff_flow.fi_src.s_addr != 0 && - back->ff_flow.fi_src.s_addr != 0) { - mask = front->ff_mask.mask_src.s_addr & - back->ff_mask.mask_src.s_addr; - if ((front->ff_flow.fi_src.s_addr & mask) != - (back->ff_flow.fi_src.s_addr & mask)) - return (1); - } - if (front->ff_flow.fi_dst.s_addr != 0 && - back->ff_flow.fi_dst.s_addr != 0) { - mask = front->ff_mask.mask_dst.s_addr & - back->ff_mask.mask_dst.s_addr; - if ((front->ff_flow.fi_dst.s_addr & mask) != - (back->ff_flow.fi_dst.s_addr & mask)) - return (1); - } - if (front->ff_flow.fi_tos != 0 && back->ff_flow.fi_tos != 0) { - tosmask = front->ff_mask.mask_tos & - back->ff_mask.mask_tos; - if ((front->ff_flow.fi_tos & tosmask) != - (back->ff_flow.fi_tos & tosmask)) - return (1); - } - return (0); - } -#ifdef INET6 - else if (front->ff_flow.fi_family == AF_INET6) { - struct flow_filter6 *front6, *back6; - int i; - - front6 = (struct flow_filter6 *)front; - back6 = (struct flow_filter6 *)back; - - if (front6->ff_flow6.fi6_proto != 0 && - back6->ff_flow6.fi6_proto != 0 && - front6->ff_flow6.fi6_proto != back6->ff_flow6.fi6_proto) - return (1); - if (front6->ff_flow6.fi6_flowlabel != 0 && - back6->ff_flow6.fi6_flowlabel != 0 && - front6->ff_flow6.fi6_flowlabel != - back6->ff_flow6.fi6_flowlabel) - return (1); - if (front6->ff_flow6.fi6_sport != 0 && - back6->ff_flow6.fi6_sport != 0 && - front6->ff_flow6.fi6_sport != back6->ff_flow6.fi6_sport) - return (1); - if (front6->ff_flow6.fi6_dport != 0 && - back6->ff_flow6.fi6_dport != 0 && - front6->ff_flow6.fi6_dport != back6->ff_flow6.fi6_dport) - return (1); - if (front6->ff_flow6.fi6_gpi != 0 && - back6->ff_flow6.fi6_gpi != 0 && - front6->ff_flow6.fi6_gpi != back6->ff_flow6.fi6_gpi) - return (1); - if (!IN6_IS_ADDR_UNSPECIFIED(&front6->ff_flow6.fi6_src) && - !IN6_IS_ADDR_UNSPECIFIED(&back6->ff_flow6.fi6_src)) { - for (i=0; i<4; i++) { - mask = IN6ADDR32(&front6->ff_mask6.mask6_src, i) - & IN6ADDR32(&back6->ff_mask6.mask6_src, i); - if ((IN6ADDR32(&front6->ff_flow6.fi6_src, i) & mask) != - (IN6ADDR32(&back6->ff_flow6.fi6_src, i) & mask)) - return (1); - } - } - if (!IN6_IS_ADDR_UNSPECIFIED(&front6->ff_flow6.fi6_dst) && - !IN6_IS_ADDR_UNSPECIFIED(&back6->ff_flow6.fi6_dst)) { - for (i=0; i<4; i++) { - mask = IN6ADDR32(&front6->ff_mask6.mask6_dst, i) - & IN6ADDR32(&back6->ff_mask6.mask6_dst, i); - if ((IN6ADDR32(&front6->ff_flow6.fi6_dst, i) & mask) != - (IN6ADDR32(&back6->ff_flow6.fi6_dst, i) & mask)) - return (1); - } - } - if (front6->ff_flow6.fi6_tclass != 0 && - back6->ff_flow6.fi6_tclass != 0) { - tosmask = front6->ff_mask6.mask6_tclass & - back6->ff_mask6.mask6_tclass; - if ((front6->ff_flow6.fi6_tclass & tosmask) != - (back6->ff_flow6.fi6_tclass & tosmask)) - return (1); - } - return (0); - } -#endif /* INET6 */ - return (0); -} - -/* - * check if "front" is a subset of "back". assumes they are not disjoint - * return value 0: not a subset - * 1: subset - * 2: subset except src & dst ports - * (possible port-intersect) - */ -static int -filt_subset(struct flow_filter *front, struct flow_filter *back) -{ - u_int16_t srcport, dstport; - - if (front->ff_flow.fi_family == AF_INET) { - if (front->ff_flow.fi_proto == 0 && - back->ff_flow.fi_proto != 0) - return (0); - if (front->ff_flow.fi_gpi == 0 && back->ff_flow.fi_gpi != 0) - return (0); - if (front->ff_flow.fi_src.s_addr == 0) { - if (back->ff_flow.fi_src.s_addr != 0) - return (0); - } else if (back->ff_flow.fi_src.s_addr != 0 && - (~front->ff_mask.mask_src.s_addr & - back->ff_mask.mask_src.s_addr)) - return (0); - if (front->ff_flow.fi_dst.s_addr == 0) { - if (back->ff_flow.fi_dst.s_addr != 0) - return (0); - } else if (back->ff_flow.fi_dst.s_addr != 0 && - (~front->ff_mask.mask_dst.s_addr & - back->ff_mask.mask_dst.s_addr)) - return (0); - if (~front->ff_mask.mask_tos & back->ff_mask.mask_tos) - return (0); - - if (front->ff_flow.fi_sport == 0 && - back->ff_flow.fi_sport != 0) { - srcport = ntohs(back->ff_flow.fi_sport); - dstport = ntohs(front->ff_flow.fi_dport); - if (dstport > 0 /* && dstport < 1024 */ && - srcport > 0 /* && srcport < 1024 */) - return (2); - return (0); - } - if (front->ff_flow.fi_dport == 0 && - back->ff_flow.fi_dport != 0) { - dstport = ntohs(back->ff_flow.fi_dport); - srcport = ntohs(front->ff_flow.fi_sport); - if (srcport > 0 /* && srcport < 1024 */ && - dstport > 0 /* && dstport < 1024 */) - return (2); - return (0); - } - - return (1); - } -#ifdef INET6 - else if (front->ff_flow.fi_family == AF_INET6) { - struct flow_filter6 *front6, *back6; - int i; - - front6 = (struct flow_filter6 *)front; - back6 = (struct flow_filter6 *)back; - - if (front6->ff_flow6.fi6_proto == 0 && - back6->ff_flow6.fi6_proto != 0) - return (0); - if (front6->ff_flow6.fi6_flowlabel == 0 && - back6->ff_flow6.fi6_flowlabel != 0) - return (0); - if (front6->ff_flow6.fi6_gpi == 0 && - back6->ff_flow6.fi6_gpi != 0) - return (0); - - if (IN6_IS_ADDR_UNSPECIFIED(&front6->ff_flow6.fi6_src)) { - if (!IN6_IS_ADDR_UNSPECIFIED(&back6->ff_flow6.fi6_src)) - return (0); - } else if (!IN6_IS_ADDR_UNSPECIFIED(&back6->ff_flow6.fi6_src)) - for (i=0; i<4; i++) - if (~IN6ADDR32(&front6->ff_mask6.mask6_src, i) & - IN6ADDR32(&back6->ff_mask6.mask6_src, i)) - return (0); - if (IN6_IS_ADDR_UNSPECIFIED(&front6->ff_flow6.fi6_dst)) { - if (!IN6_IS_ADDR_UNSPECIFIED(&back6->ff_flow6.fi6_dst)) - return (0); - } else if (!IN6_IS_ADDR_UNSPECIFIED(&back6->ff_flow6.fi6_dst)) - for (i=0; i<4; i++) - if (~IN6ADDR32(&front6->ff_mask6.mask6_dst, i) & - IN6ADDR32(&back6->ff_mask6.mask6_dst, i)) - return (0); - - if (~front6->ff_mask6.mask6_tclass & - back6->ff_mask6.mask6_tclass) - return (0); - - if (front6->ff_flow6.fi6_sport == 0 && - back6->ff_flow6.fi6_sport != 0) { - srcport = ntohs(back6->ff_flow6.fi6_sport); - dstport = ntohs(front6->ff_flow6.fi6_dport); - if (dstport > 0 /* && dstport < 1024 */ && - srcport > 0 /* && srcport < 1024 */) - return (2); - return (0); - } - if (front6->ff_flow6.fi6_dport == 0 && - back6->ff_flow6.fi6_dport != 0) { - dstport = ntohs(back6->ff_flow6.fi6_dport); - srcport = ntohs(front6->ff_flow6.fi6_sport); - if (srcport > 0 /* && srcport < 1024 */ && - dstport > 0 /* && dstport < 1024 */) - return (2); - return (0); - } - } -#endif /* INET6 */ - return (1); -} - - -/* - * setting RED or RIO default parameters - */ -int -qop_red_set_defaults(int th_min, int th_max, int inv_pmax) -{ - struct redparams params; - int fd; - - if ((fd = open(RED_DEVICE, O_RDWR)) < 0) { - LOG(LOG_ERR, errno, "RED open"); - return (QOPERR_SYSCALL); - } - - params.th_min = th_min; - params.th_max = th_max; - params.inv_pmax = inv_pmax; - - if (ioctl(fd, RED_SETDEFAULTS, ¶ms) < 0) { - LOG(LOG_ERR, errno, "RED_SETDEFAULTS"); - return (QOPERR_SYSCALL); - } - - (void)close(fd); - return (0); -} - -int -qop_rio_set_defaults(struct redparams *params) -{ - int i, fd; - - /* sanity check */ - for (i = 1; i < RIO_NDROPPREC; i++) { - if (params[i].th_max > params[i-1].th_min) - LOG(LOG_WARNING, 0, - "warning: overlap found in RIO thresholds"); - } - - if ((fd = open(RIO_DEVICE, O_RDWR)) < 0) { - LOG(LOG_ERR, errno, "RIO open"); - return (QOPERR_SYSCALL); - } - - if (ioctl(fd, RIO_SETDEFAULTS, params) < 0) { - LOG(LOG_ERR, errno, "RIO_SETDEFAULTS"); - return (QOPERR_SYSCALL); - } - - (void)close(fd); - return (0); -} - -/* - * try to load and open KLD module - * (also check the altq device file) - */ -int -open_module(const char *devname, int flags) -{ -#if defined(__FreeBSD__) && (__FreeBSD_version > 300000) - char modname[64], filename[MAXPATHLEN], *cp; - int fd; -#endif - struct stat sbuf; - - /* check if the altq device exists */ - if (stat(devname, &sbuf) < 0) { - LOG(LOG_ERR, errno, "can't access %s!", devname); - return (-1); - } - -#if defined(__FreeBSD__) && (__FreeBSD_version > 300000) - /* turn discipline name into module name */ - strlcpy(modname, "altq_", sizeof(modname)); - if ((cp = strrchr(devname, '/')) == NULL) - return (-1); - strlcat(modname, cp + 1, sizeof(modname)); - - /* check if the kld module exists */ - snprintf(filename, sizeof(filename), "/modules/%s.ko", modname); - if (stat(filename, &sbuf) < 0) { - /* module file doesn't exist */ - return (-1); - } - - if (kldload(modname) < 0) { - LOG(LOG_ERR, errno, "kldload %s failed!", modname); - return (-1); - } - - /* successfully loaded, open the device */ - LOG(LOG_INFO, 0, "kld module %s loaded", modname); - fd = open(devname, flags); - return (fd); -#else - return (-1); -#endif -} diff --git a/usr.sbin/altq/libaltq/qop_blue.c b/usr.sbin/altq/libaltq/qop_blue.c deleted file mode 100644 index 2153ce5573c..00000000000 --- a/usr.sbin/altq/libaltq/qop_blue.c +++ /dev/null @@ -1,278 +0,0 @@ -/* $OpenBSD: qop_blue.c,v 1.3 2001/12/03 08:38:48 kjc Exp $ */ -/* $KAME: qop_blue.c,v 1.5 2001/08/16 10:39:13 kjc Exp $ */ -/* - * Copyright (C) 1999-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. - */ - -#include <sys/param.h> -#include <sys/socket.h> -#include <sys/sockio.h> -#include <sys/ioctl.h> -#include <sys/fcntl.h> -#include <net/if.h> -#include <netinet/in.h> -#include <arpa/inet.h> - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <stddef.h> -#include <string.h> -#include <ctype.h> -#include <errno.h> -#include <syslog.h> -#include <netdb.h> - -#include <altq/altq.h> -#include <altq/altq_blue.h> -#include "altq_qop.h" -#include "qop_blue.h" - -static int blue_attach(struct ifinfo *); -static int blue_detach(struct ifinfo *); -static int blue_enable(struct ifinfo *); -static int blue_disable(struct ifinfo *); - -#define BLUE_DEVICE "/dev/altq/blue" - -static int blue_fd = -1; -static int blue_refcount = 0; - -static struct qdisc_ops blue_qdisc = { - ALTQT_BLUE, - "blue", - blue_attach, - blue_detach, - NULL, /* clear */ - blue_enable, - blue_disable, - NULL, /* add class */ - NULL, /* modify class */ - NULL, /* delete class */ - NULL, /* add filter */ - NULL /* delete filter */ -}; - -/* - * parser interface - */ -#define EQUAL(s1, s2) (strcmp((s1), (s2)) == 0) - -int -blue_interface_parser(const char *ifname, int argc, char **argv) -{ - u_int bandwidth = 100000000; /* 100Mbps */ - u_int tbrsize = 0; - int max_pmark = 4000; - int hold_time = 1000; - int qlimit = 60; - int pkttime = 0; - int flags = 0; - int packet_size = 1000; - - /* - * process options - */ - while (argc > 0) { - if (EQUAL(*argv, "bandwidth")) { - argc--; argv++; - if (argc > 0) - bandwidth = atobps(*argv); - } else if (EQUAL(*argv, "tbrsize")) { - argc--; argv++; - if (argc > 0) - tbrsize = atobytes(*argv); - } else if (EQUAL(*argv, "packetsize")) { - argc--; argv++; - if (argc > 0) - packet_size = atobytes(*argv); - } else if (EQUAL(*argv, "qlimit")) { - argc--; argv++; - if (argc > 0) - qlimit = (int)strtol(*argv, NULL, 0); - } else if (EQUAL(*argv, "maxpmark")) { - argc--; argv++; - if (argc > 0) - max_pmark = (int)strtol(*argv, NULL, 0); - } else if (EQUAL(*argv, "holdtime")) { - argc--; argv++; - if (argc > 0) - hold_time = (int)strtol(*argv, NULL, 0); - } else if (EQUAL(*argv, "blue")) { - /* just skip */ - } else if (EQUAL(*argv, "ecn")) { - flags |= BLUEF_ECN; - } else { - LOG(LOG_ERR, 0, "Unknown keyword '%s'", *argv); - return (0); - } - argc--; argv++; - } - - if (qcmd_tbr_register(ifname, bandwidth, tbrsize) != 0) - return (0); - - pkttime = packet_size * 8 * 1000 / (bandwidth / 1000); - - if (qcmd_blue_add_if(ifname, bandwidth, max_pmark, hold_time, - qlimit, pkttime, flags) != 0) - return (0); - return (1); -} - -/* - * qcmd api - */ -int -qcmd_blue_add_if(const char *ifname, u_int bandwidth, int max_pmark, - int hold_time, int qlimit, int pkttime, int flags) -{ - int error; - - error = qop_blue_add_if(NULL, ifname, bandwidth, max_pmark, hold_time, - qlimit, pkttime, flags); - if (error != 0) - LOG(LOG_ERR, errno, "%s: can't add blue on interface '%s'", - qoperror(error), ifname); - return (error); -} - -/* - * qop api - */ -int -qop_blue_add_if(struct ifinfo **rp, const char *ifname, u_int bandwidth, - int max_pmark, int hold_time, int qlimit, - int pkttime, int flags) -{ - struct ifinfo *ifinfo = NULL; - struct blue_ifinfo *blue_ifinfo; - int error; - - if ((blue_ifinfo = calloc(1, sizeof(*blue_ifinfo))) == NULL) - return (QOPERR_NOMEM); - blue_ifinfo->max_pmark = max_pmark; - blue_ifinfo->hold_time = hold_time; - blue_ifinfo->qlimit = qlimit; - blue_ifinfo->pkttime = pkttime; - blue_ifinfo->flags = flags; - - error = qop_add_if(&ifinfo, ifname, bandwidth, - &blue_qdisc, blue_ifinfo); - if (error != 0) { - free(blue_ifinfo); - return (error); - } - - if (rp != NULL) - *rp = ifinfo; - return (0); -} - -/* - * system call interfaces for qdisc_ops - */ -static int -blue_attach(struct ifinfo *ifinfo) -{ - struct blue_interface iface; - struct blue_ifinfo *blue_ifinfo; - struct blue_conf conf; - - if (blue_fd < 0 && - (blue_fd = open(BLUE_DEVICE, O_RDWR)) < 0 && - (blue_fd = open_module(BLUE_DEVICE, O_RDWR)) < 0) { - LOG(LOG_ERR, errno, "BLUE open"); - return (QOPERR_SYSCALL); - } - - blue_refcount++; - memset(&iface, 0, sizeof(iface)); - strncpy(iface.blue_ifname, ifinfo->ifname, IFNAMSIZ); - - if (ioctl(blue_fd, BLUE_IF_ATTACH, &iface) < 0) - return (QOPERR_SYSCALL); - - /* set blue parameters */ - blue_ifinfo = (struct blue_ifinfo *)ifinfo->private; - memset(&conf, 0, sizeof(conf)); - strncpy(conf.iface.blue_ifname, ifinfo->ifname, IFNAMSIZ); - conf.blue_max_pmark = blue_ifinfo->max_pmark; - conf.blue_hold_time = blue_ifinfo->hold_time; - conf.blue_limit = blue_ifinfo->qlimit; - conf.blue_pkttime = blue_ifinfo->pkttime; - conf.blue_flags = blue_ifinfo->flags; - if (ioctl(blue_fd, BLUE_CONFIG, &conf) < 0) - return (QOPERR_SYSCALL); - -#if 1 - LOG(LOG_INFO, 0, "blue attached to %s", iface.blue_ifname); -#endif - return (0); -} - -static int -blue_detach(struct ifinfo *ifinfo) -{ - struct blue_interface iface; - - memset(&iface, 0, sizeof(iface)); - strncpy(iface.blue_ifname, ifinfo->ifname, IFNAMSIZ); - - if (ioctl(blue_fd, BLUE_IF_DETACH, &iface) < 0) - return (QOPERR_SYSCALL); - - if (--blue_refcount == 0) { - close(blue_fd); - blue_fd = -1; - } - return (0); -} - -static int -blue_enable(struct ifinfo *ifinfo) -{ - struct blue_interface iface; - - memset(&iface, 0, sizeof(iface)); - strncpy(iface.blue_ifname, ifinfo->ifname, IFNAMSIZ); - - if (ioctl(blue_fd, BLUE_ENABLE, &iface) < 0) - return (QOPERR_SYSCALL); - return (0); -} - -static int -blue_disable(struct ifinfo *ifinfo) -{ - struct blue_interface iface; - - memset(&iface, 0, sizeof(iface)); - strncpy(iface.blue_ifname, ifinfo->ifname, IFNAMSIZ); - - if (ioctl(blue_fd, BLUE_DISABLE, &iface) < 0) - return (QOPERR_SYSCALL); - return (0); -} diff --git a/usr.sbin/altq/libaltq/qop_blue.h b/usr.sbin/altq/libaltq/qop_blue.h deleted file mode 100644 index 7210422eef2..00000000000 --- a/usr.sbin/altq/libaltq/qop_blue.h +++ /dev/null @@ -1,45 +0,0 @@ -/* $OpenBSD: qop_blue.h,v 1.1.1.1 2001/06/27 18:23:27 kjc Exp $ */ -/* $KAME: qop_blue.h,v 1.2 2000/10/18 09:15:18 kjc Exp $ */ -/* - * Copyright (C) 1999-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. - */ - -/* - * blue private ifinfo structure - */ -struct blue_ifinfo { - int max_pmark; /* precision of marking probability */ - int hold_time; /* hold time in usec */ - int qlimit; /* max queue length */ - int pkttime; /* average packet time in usec */ - int flags; /* see below */ -}; - -int blue_interface_parser(const char *ifname, int argc, char **argv); -int qcmd_blue_add_if(const char *ifname, u_int bandwidth, int max_pmark, - int hold_time, int qlimit, int pkttime, int flags); -int qop_blue_add_if(struct ifinfo **rp, const char *ifname, u_int bandwidth, - int max_pmark, int hold_time, int qlimit, - int pkttime, int flags); diff --git a/usr.sbin/altq/libaltq/qop_cbq.c b/usr.sbin/altq/libaltq/qop_cbq.c deleted file mode 100644 index f0e77d189f2..00000000000 --- a/usr.sbin/altq/libaltq/qop_cbq.c +++ /dev/null @@ -1,1083 +0,0 @@ -/* $OpenBSD: qop_cbq.c,v 1.4 2002/05/31 09:46:12 kjc Exp $ */ -/* $KAME: qop_cbq.c,v 1.5 2001/08/16 10:39:14 kjc Exp $ */ -/* - * Copyright (c) Sun Microsystems, Inc. 1993-1998 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. - * - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the SMCC Technology - * Development Group at Sun Microsystems, Inc. - * - * 4. The name of the Sun Microsystems, Inc nor may not be used to endorse or - * promote products derived from this software without specific prior - * written permission. - * - * SUN MICROSYSTEMS DOES NOT CLAIM MERCHANTABILITY OF THIS SOFTWARE OR THE - * SUITABILITY OF THIS SOFTWARE FOR ANY PARTICULAR PURPOSE. The software is - * provided "as is" without express or implied warranty of any kind. - * - * These notices must be retained in any copies of any part of this software. - */ - -#include <sys/param.h> -#include <sys/socket.h> -#include <sys/sockio.h> -#include <sys/ioctl.h> -#include <sys/fcntl.h> -#include <net/if.h> -#include <netinet/in.h> -#include <arpa/inet.h> - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <stddef.h> -#include <string.h> -#include <ctype.h> -#include <errno.h> -#include <syslog.h> -#include <netdb.h> -#include <math.h> - -#include <altq/altq.h> -#include <altq/altq_cbq.h> -#include "altq_qop.h" -#include "qop_cbq.h" - -static int qcmd_cbq_add_ctl_filters(const char *, const char *); - -static int qop_cbq_enable_hook(struct ifinfo *); -static int qop_cbq_delete_class_hook(struct classinfo *); - -static int cbq_class_spec(struct ifinfo *, u_long, u_long, u_int, int, - u_int, u_int, u_int, u_int, u_int, - u_int, cbq_class_spec_t *); - -static int cbq_attach(struct ifinfo *); -static int cbq_detach(struct ifinfo *); -static int cbq_clear(struct ifinfo *); -static int cbq_enable(struct ifinfo *); -static int cbq_disable(struct ifinfo *); -static int cbq_add_class(struct classinfo *); -static int cbq_modify_class(struct classinfo *, void *); -static int cbq_delete_class(struct classinfo *); -static int cbq_add_filter(struct fltrinfo *); -static int cbq_delete_filter(struct fltrinfo *); - -#define CTL_PBANDWIDTH 2 -#define NS_PER_MS (1000000.0) -#define NS_PER_SEC (NS_PER_MS*1000.0) -#define RM_FILTER_GAIN 5 - -#define CBQ_DEVICE "/dev/altq/cbq" - -static int cbq_fd = -1; -static int cbq_refcount = 0; - -static struct qdisc_ops cbq_qdisc = { - ALTQT_CBQ, - "cbq", - cbq_attach, - cbq_detach, - cbq_clear, - cbq_enable, - cbq_disable, - cbq_add_class, - cbq_modify_class, - cbq_delete_class, - cbq_add_filter, - cbq_delete_filter, -}; - -#define EQUAL(s1, s2) (strcmp((s1), (s2)) == 0) - -/* - * parser interface - */ -int -cbq_interface_parser(const char *ifname, int argc, char **argv) -{ - u_int bandwidth = 100000000; /* 100Mbps */ - u_int tbrsize = 0; - u_int is_efficient = 0; - u_int is_wrr = 1; /* weighted round-robin is default */ - - /* - * process options - */ - while (argc > 0) { - if (EQUAL(*argv, "bandwidth")) { - argc--; argv++; - if (argc > 0) - bandwidth = atobps(*argv); - } else if (EQUAL(*argv, "tbrsize")) { - argc--; argv++; - if (argc > 0) - tbrsize = atobytes(*argv); - } else if (EQUAL(*argv, "efficient")) { - is_efficient = 1; - } else if (EQUAL(*argv, "cbq")) { - /* just skip */ - } else if (EQUAL(*argv, "cbq-wrr")) { - is_wrr = 1; - } else if (EQUAL(*argv, "cbq-prr")) { - is_wrr = 0; - } else { - LOG(LOG_ERR, 0, "Unknown keyword '%s'", *argv); - return (0); - } - argc--; argv++; - } - - if (qcmd_tbr_register(ifname, bandwidth, tbrsize) != 0) - return (0); - - if (qcmd_cbq_add_if(ifname, bandwidth, - is_wrr, is_efficient) != 0) - return (0); - return (1); -} - -int -cbq_class_parser(const char *ifname, const char *class_name, - const char *parent_name, int argc, char **argv) -{ - const char *borrow = NULL; - u_int pri = 1; - u_int pbandwidth = 0; - u_int bandwidth = 0; - u_int maxdelay = 0; /* 0 means default */ - u_int maxburst = 0; /* 0 means default */ - u_int minburst = 0; /* 0 means default */ - u_int av_pkt_size = 0; /* 0 means use if mtu as default */ - u_int max_pkt_size = 0; /* 0 means use if mtu as default */ - int flags = 0; - cbq_tos_t admission_type = CBQ_QOS_NONE; - int error; - - if (parent_name == NULL) - flags |= CBQCLF_ROOTCLASS; - - while (argc > 0) { - if (EQUAL(*argv, "priority")) { - argc--; argv++; - if (argc > 0) - pri = strtoul(*argv, NULL, 0); - } else if (EQUAL(*argv, "default")) { - flags |= CBQCLF_DEFCLASS; - } else if (EQUAL(*argv, "control")) { - flags |= CBQCLF_CTLCLASS; - } else if (EQUAL(*argv, "admission")) { - argc--; argv++; - if (argc > 0) { - if (EQUAL(*argv, "guaranteed")) - admission_type = CBQ_QOS_GUARANTEED; - else if (EQUAL(*argv, "predictive")) - admission_type = CBQ_QOS_PREDICTIVE; - else if (EQUAL(*argv, "cntlload")) - admission_type = CBQ_QOS_CNTR_LOAD; - else if (EQUAL(*argv, "cntldelay")) - admission_type = CBQ_QOS_CNTR_DELAY; - else if (EQUAL(*argv, "none")) - admission_type = CBQ_QOS_NONE; - else { - LOG(LOG_ERR, 0, - "unknown admission type - %s, line %d", - *argv, line_no); - return (0); - } - } - } else if (EQUAL(*argv, "maxdelay")) { - argc--; argv++; - if (argc > 0) - maxdelay = strtoul(*argv, NULL, 0); - } else if (EQUAL(*argv, "borrow")) { - borrow = parent_name; -#if 1 - /* support old style "borrow [parent]" */ - if (argc > 1 && - EQUAL(*(argv + 1), parent_name)) { - /* old style, skip borrow_name */ - argc--; argv++; - } -#endif - } else if (EQUAL(*argv, "pbandwidth")) { - argc--; argv++; - if (argc > 0) - pbandwidth = strtoul(*argv, NULL, 0); - if (pbandwidth > 100) { - LOG(LOG_ERR, 0, - "bad pbandwidth %d for %s!", - pbandwidth, class_name); - return (0); - } - } else if (EQUAL(*argv, "exactbandwidth")) { - argc--; argv++; - if (argc > 0) - bandwidth = atobps(*argv); - } else if (EQUAL(*argv, "maxburst")) { - argc--; argv++; - if (argc > 0) - maxburst = strtoul(*argv, NULL, 0); - } else if (EQUAL(*argv, "minburst")) { - argc--; argv++; - if (argc > 0) - minburst = strtoul(*argv, NULL, 0); - } else if (EQUAL(*argv, "packetsize")) { - argc--; argv++; - if (argc > 0) - av_pkt_size = atobytes(*argv); - } else if (EQUAL(*argv, "maxpacketsize")) { - argc--; argv++; - if (argc > 0) - max_pkt_size = atobytes(*argv); - } else if (EQUAL(*argv, "red")) { - flags |= CBQCLF_RED; - } else if (EQUAL(*argv, "ecn")) { - flags |= CBQCLF_ECN; - } else if (EQUAL(*argv, "flowvalve")) { - flags |= CBQCLF_FLOWVALVE; - } else if (EQUAL(*argv, "rio")) { - flags |= CBQCLF_RIO; - } else if (EQUAL(*argv, "cleardscp")) { - flags |= CBQCLF_CLEARDSCP; - } else { - LOG(LOG_ERR, 0, - "Unknown keyword '%s' in %s, line %d", - *argv, altqconfigfile, line_no); - return (0); - } - - argc--; argv++; - } - - if ((flags & (CBQCLF_RED|CBQCLF_RIO)) == (CBQCLF_RED|CBQCLF_RIO)) { - LOG(LOG_ERR, 0, - "both red and rio defined on interface '%s'", - ifname); - return (0); - } - if ((flags & (CBQCLF_ECN|CBQCLF_FLOWVALVE)) - && (flags & (CBQCLF_RED|CBQCLF_RIO)) == 0) - flags |= CBQCLF_RED; - - if (strcmp("ctl_class", class_name) == 0) - flags |= CBQCLF_CTLCLASS; - - if (bandwidth == 0 && pbandwidth != 0) { - struct ifinfo *ifinfo; - - if ((ifinfo = ifname2ifinfo(ifname)) != NULL) - bandwidth = ifinfo->bandwidth / 100 * pbandwidth; - } - - error = qcmd_cbq_add_class(ifname, class_name, parent_name, borrow, - pri, bandwidth, - maxdelay, maxburst, minburst, - av_pkt_size, max_pkt_size, - admission_type, flags); - if (error) - return (0); - return (1); -} - -/* - * qcmd api - */ -int -qcmd_cbq_add_if(const char *ifname, u_int bandwidth, int is_wrr, int efficient) -{ - int error; - - error = qop_cbq_add_if(NULL, ifname, bandwidth, is_wrr, efficient); - if (error != 0) - LOG(LOG_ERR, errno, "%s: can't add cbq on interface '%s'", - qoperror(error), ifname); - return (error); -} - -int -qcmd_cbq_add_class(const char *ifname, const char *class_name, - const char *parent_name, const char *borrow_name, - u_int pri, u_int bandwidth, - u_int maxdelay, u_int maxburst, u_int minburst, - u_int av_pkt_size, u_int max_pkt_size, - int admission_type, int flags) -{ - struct ifinfo *ifinfo; - struct cbq_ifinfo *cbq_ifinfo; - struct classinfo *parent = NULL, *borrow = NULL; - u_int ctl_bandwidth = 0; - int error = 0; - - if ((ifinfo = ifname2ifinfo(ifname)) == NULL) - error = QOPERR_BADIF; - cbq_ifinfo = ifinfo->private; - - if (error == 0 && parent_name != NULL && - (parent = clname2clinfo(ifinfo, parent_name)) == NULL) - error = QOPERR_BADCLASS; - - if (error == 0 && borrow_name != NULL && - (borrow = clname2clinfo(ifinfo, borrow_name)) == NULL) - error = QOPERR_BADCLASS; - - if (flags & CBQCLF_DEFCLASS) { - /* - * if this is a default class and no ctl_class is defined, - * we will create a ctl_class. - */ - if (cbq_ifinfo->ctl_class == NULL) { - /* reserve bandwidth for ctl_class */ - ctl_bandwidth = - ifinfo->bandwidth / 100 * CTL_PBANDWIDTH; - if (bandwidth <= ctl_bandwidth) - LOG(LOG_ERR, 0, - "bandwidth for default class too small!"); - bandwidth -= ctl_bandwidth; - } - } - - if (error == 0) - error = qop_cbq_add_class(NULL, class_name, ifinfo, parent, - borrow, pri, bandwidth, - maxdelay, maxburst, minburst, - av_pkt_size, max_pkt_size, - admission_type, flags); - if (error != 0) - LOG(LOG_ERR, errno, - "cbq: %s: can't add class '%s' on interface '%s'", - qoperror(error), class_name, ifname); - - if (ctl_bandwidth != 0) { - /* - * If were adding the default traffic class and - * no ctl_class is defined, also add the ctl traffic class. - * This is for RSVP and IGMP packets. - */ - if (qcmd_cbq_add_class(ifname, "ctl_class", parent_name, - borrow_name, 6, ctl_bandwidth, - maxdelay, maxburst, minburst, av_pkt_size, - max_pkt_size, admission_type, CBQCLF_CTLCLASS) != 0) { - LOG(LOG_ERR, errno, "can't create ctl_class!"); - return (QOPERR_CLASS); - } - } - - /* - * if this is a ctl class, add the default filters for backward - * compatibility - */ - if (flags & CBQCLF_CTLCLASS) - qcmd_cbq_add_ctl_filters(ifname, class_name); - - return (error); -} - -int -qcmd_cbq_modify_class(const char *ifname, const char *class_name, - u_int pri, u_int bandwidth, - u_int maxdelay, u_int maxburst, u_int minburst, - u_int av_pkt_size, u_int max_pkt_size, int flags) -{ - struct ifinfo *ifinfo; - struct classinfo *clinfo; - - if ((ifinfo = ifname2ifinfo(ifname)) == NULL) - return (QOPERR_BADIF); - - if ((clinfo = clname2clinfo(ifinfo, class_name)) == NULL) - return (QOPERR_BADCLASS); - - return qop_cbq_modify_class(clinfo, pri, bandwidth, - maxdelay, maxburst, minburst, - av_pkt_size, max_pkt_size, flags); -} - -/* - * add the default filters for ctl_class (for backward compatibility). - */ -#ifndef IPPROTO_RSVP -#define IPPROTO_RSVP 46 -#endif - -static int -qcmd_cbq_add_ctl_filters(const char *ifname, const char *clname) -{ - struct flow_filter sfilt; - u_int8_t ctl_protos[3] = {IPPROTO_ICMP, IPPROTO_IGMP, IPPROTO_RSVP}; -#ifdef INET6 - struct flow_filter6 sfilt6; - u_int8_t ctl6_protos[3] = {IPPROTO_ICMPV6, IPPROTO_IGMP, IPPROTO_RSVP}; -#endif - int error, i; - - for (i = 0; i < (int)sizeof(ctl_protos); i++) { - memset(&sfilt, 0, sizeof(sfilt)); - sfilt.ff_flow.fi_family = AF_INET; - sfilt.ff_flow.fi_proto = ctl_protos[i]; - - filter_dontwarn = 1; /* XXX */ - error = qcmd_add_filter(ifname, clname, NULL, &sfilt); - filter_dontwarn = 0; /* XXX */ - if (error) { - LOG(LOG_ERR, 0, - "can't add ctl class filter on interface '%s'", - ifname); - return (error); - } - } - -#ifdef INET6 - for (i = 0; i < sizeof(ctl6_protos); i++) { - memset(&sfilt6, 0, sizeof(sfilt6)); - sfilt6.ff_flow6.fi6_family = AF_INET6; - sfilt6.ff_flow6.fi6_proto = ctl6_protos[i]; - - error = qcmd_add_filter(ifname, clname, NULL, - (struct flow_filter *)&sfilt6); - if (error) { - LOG(LOG_WARNING, 0, - "can't add ctl class IPv6 filter on interface '%s'", - ifname); - return (error); - } - } -#endif - return (0); -} - -/* - * qop api - */ -int -qop_cbq_add_if(struct ifinfo **rp, const char *ifname, - u_int bandwidth, int is_wrr, int efficient) -{ - struct ifinfo *ifinfo = NULL; - struct cbq_ifinfo *cbq_ifinfo = NULL; - int error; - - if ((cbq_ifinfo = calloc(1, sizeof(*cbq_ifinfo))) == NULL) - return (QOPERR_NOMEM); - - cbq_ifinfo->nsPerByte = - (1.0 / (double)bandwidth) * NS_PER_SEC * 8; - cbq_ifinfo->is_wrr = is_wrr; - cbq_ifinfo->is_efficient = efficient; - - error = qop_add_if(&ifinfo, ifname, bandwidth, - &cbq_qdisc, cbq_ifinfo); - if (error != 0) - goto err_ret; - - /* set enable hook */ - ifinfo->enable_hook = qop_cbq_enable_hook; - - if (rp != NULL) - *rp = ifinfo; - return (0); - - err_ret: - if (cbq_ifinfo != NULL) { - free(cbq_ifinfo); - if (ifinfo != NULL) - ifinfo->private = NULL; - } - return (error); -} - -#define is_sc_null(sc) (((sc) == NULL) || ((sc)->m1 == 0 && (sc)->m2 == 0)) - -int -qop_cbq_add_class(struct classinfo **rp, const char *class_name, - struct ifinfo *ifinfo, struct classinfo *parent, - struct classinfo *borrow, u_int pri, u_int bandwidth, - u_int maxdelay, u_int maxburst, u_int minburst, - u_int av_pkt_size, u_int max_pkt_size, - int admission_type, int flags) -{ - struct classinfo *clinfo; - struct cbq_ifinfo *cbq_ifinfo; - struct cbq_classinfo *cbq_clinfo, *parent_clinfo; - u_int parent_handle, borrow_handle; - int error; - - cbq_ifinfo = ifinfo->private; - - if (parent == NULL) { - if (cbq_ifinfo->root_class != NULL) - return (QOPERR_CLASS_INVAL); - flags |= CBQCLF_ROOTCLASS; - } - if ((flags & CBQCLF_DEFCLASS) && cbq_ifinfo->default_class != NULL) - return (QOPERR_CLASS_INVAL); - if ((flags & CBQCLF_CTLCLASS) && cbq_ifinfo->ctl_class != NULL) - return (QOPERR_CLASS_INVAL); - - /* admission control */ - if (parent != NULL) { - parent_clinfo = parent->private; - if (bandwidth > - parent_clinfo->bandwidth - parent_clinfo->allocated) { -#ifdef ALLOW_OVERCOMMIT - LOG(LOG_WARNING, 0, - "bandwidth overcommitted %uK requested but only %dK available (%uK already allocated)", - bandwidth / 1000, - ((int)parent_clinfo->bandwidth - - parent_clinfo->allocated) / 1000, - parent_clinfo->allocated / 1000); -#else /* !ALLOW_OVERCOMMIT */ - LOG(LOG_ERR, 0, - "cbq admission failed! %uK requested but only %uK available (%uK already allocated)", - bandwidth / 1000, - (parent_clinfo->bandwidth - - parent_clinfo->allocated) / 1000, - parent_clinfo->allocated / 1000); - return (QOPERR_ADMISSION_NOBW); -#endif /* !ALLOW_OVERCOMMIT */ - } - } - - if ((cbq_clinfo = calloc(1, sizeof(*cbq_clinfo))) == NULL) - return (QOPERR_NOMEM); - - cbq_clinfo->bandwidth = bandwidth; - cbq_clinfo->allocated = 0; - - /* if average paket size isn't specified, set if mtu. */ - if (av_pkt_size == 0) { /* use default */ - av_pkt_size = ifinfo->ifmtu; - if (av_pkt_size > MCLBYTES) /* do what TCP does */ - av_pkt_size &= ~MCLBYTES; - } else if (av_pkt_size > ifinfo->ifmtu) - av_pkt_size = ifinfo->ifmtu; - - if (max_pkt_size == 0) /* use default */ - max_pkt_size = ifinfo->ifmtu; - else if (max_pkt_size > ifinfo->ifmtu) - max_pkt_size = ifinfo->ifmtu; - - cbq_clinfo->maxdelay = maxdelay; - cbq_clinfo->maxburst = maxburst; - cbq_clinfo->minburst = minburst; - cbq_clinfo->av_pkt_size = av_pkt_size; - cbq_clinfo->max_pkt_size = max_pkt_size; - - parent_handle = parent != NULL ? parent->handle : NULL_CLASS_HANDLE; - borrow_handle = borrow != NULL ? borrow->handle : NULL_CLASS_HANDLE; - - if (cbq_class_spec(ifinfo, parent_handle, borrow_handle, pri, flags, - bandwidth, maxdelay, maxburst, minburst, - av_pkt_size, max_pkt_size, - &cbq_clinfo->class_spec) < 0) { - error = QOPERR_INVAL; - goto err_ret; - } - - clinfo = NULL; - error = qop_add_class(&clinfo, class_name, ifinfo, parent, cbq_clinfo); - if (error != 0) - goto err_ret; - - /* set delete hook */ - clinfo->delete_hook = qop_cbq_delete_class_hook; - - if (parent == NULL) - cbq_ifinfo->root_class = clinfo; - else { - parent_clinfo = parent->private; - parent_clinfo->allocated += bandwidth; - } - if (flags & CBQCLF_DEFCLASS) - cbq_ifinfo->default_class = clinfo; - if (flags & CBQCLF_CTLCLASS) - cbq_ifinfo->ctl_class = clinfo; - - switch (admission_type) { - case CBQ_QOS_CNTR_LOAD: - case CBQ_QOS_GUARANTEED: - case CBQ_QOS_PREDICTIVE: - case CBQ_QOS_CNTR_DELAY: - if (ifinfo->resv_class != NULL) { - LOG(LOG_ERR, 0, - "%s: duplicate resv meta class", class_name); - return (QOPERR_CLASS); - } - ifinfo->resv_class = clinfo; - } - - if (rp != NULL) - *rp = clinfo; - return (0); - - err_ret: - if (cbq_clinfo != NULL) { - free(cbq_clinfo); - if (clinfo != NULL) - clinfo->private = NULL; - } - return (error); -} - -/* - * this is called from qop_delete_class() before a class is destroyed - * for discipline specific cleanup. - */ -static int -qop_cbq_delete_class_hook(struct classinfo *clinfo) -{ - struct cbq_classinfo *cbq_clinfo, *parent_clinfo; - - /* cancel admission control */ - if (clinfo->parent != NULL) { - cbq_clinfo = clinfo->private; - parent_clinfo = clinfo->parent->private; - - parent_clinfo->allocated -= cbq_clinfo->bandwidth; - } - return (0); -} - -int -qop_cbq_modify_class(struct classinfo *clinfo, u_int pri, u_int bandwidth, - u_int maxdelay, u_int maxburst, u_int minburst, - u_int av_pkt_size, u_int max_pkt_size, int flags) -{ - struct ifinfo *ifinfo; - struct cbq_classinfo *cbq_clinfo, *parent_clinfo; - u_int parent_handle, borrow_handle; - u_int old_bandwidth; - int error; - - ifinfo = clinfo->ifinfo; - cbq_clinfo = clinfo->private; - - /* admission control */ - old_bandwidth = cbq_clinfo->bandwidth; - if (clinfo->parent != NULL) { - parent_clinfo = clinfo->parent->private; - if (bandwidth > old_bandwidth) { - /* increase bandwidth */ - if (bandwidth - old_bandwidth > - parent_clinfo->bandwidth - - parent_clinfo->allocated) - return (QOPERR_ADMISSION_NOBW); - } else if (bandwidth < old_bandwidth) { - /* decrease bandwidth */ - if (bandwidth < cbq_clinfo->allocated) - return (QOPERR_ADMISSION); - } - } - - /* if average paket size isn't specified, set if mtu. */ - if (av_pkt_size == 0) { /* use default */ - av_pkt_size = ifinfo->ifmtu; - if (av_pkt_size > MCLBYTES) /* do what TCP does */ - av_pkt_size &= ~MCLBYTES; - } else if (av_pkt_size > ifinfo->ifmtu) - av_pkt_size = ifinfo->ifmtu; - - if (max_pkt_size == 0) /* use default */ - max_pkt_size = ifinfo->ifmtu; - else if (max_pkt_size > ifinfo->ifmtu) - max_pkt_size = ifinfo->ifmtu; - - cbq_clinfo->maxdelay = maxdelay; - cbq_clinfo->maxburst = maxburst; - cbq_clinfo->minburst = minburst; - cbq_clinfo->av_pkt_size = av_pkt_size; - cbq_clinfo->max_pkt_size = max_pkt_size; - - parent_handle = cbq_clinfo->class_spec.parent_class_handle; - borrow_handle = cbq_clinfo->class_spec.borrow_class_handle; - - if (cbq_class_spec(ifinfo, parent_handle, borrow_handle, pri, flags, - bandwidth, maxdelay, maxburst, minburst, - av_pkt_size, max_pkt_size, - &cbq_clinfo->class_spec) < 0) { - return (QOPERR_INVAL); - } - - error = qop_modify_class(clinfo, NULL); - - if (error == 0) { - if (clinfo->parent != NULL) { - parent_clinfo = clinfo->parent->private; - parent_clinfo->allocated -= old_bandwidth; - parent_clinfo->allocated += bandwidth; - } - cbq_clinfo->bandwidth = bandwidth; - } - return (error); -} - -/* - * sanity check at enabling cbq: - * there must one root class and one default class for an interface - */ -static int -qop_cbq_enable_hook(struct ifinfo *ifinfo) -{ - struct cbq_ifinfo *cbq_ifinfo; - - cbq_ifinfo = ifinfo->private; - if (cbq_ifinfo->root_class == NULL) { - LOG(LOG_ERR, 0, "cbq: no root class on interface %s!", - ifinfo->ifname); - return (QOPERR_CLASS); - } - if (cbq_ifinfo->default_class == NULL) { - LOG(LOG_ERR, 0, "cbq: no default class on interface %s!", - ifinfo->ifname); - return (QOPERR_CLASS); - } - return (0); -} - -static int -cbq_class_spec(struct ifinfo *ifinfo, u_long parent_class, - u_long borrow_class, u_int pri, int flags, - u_int bandwidth, u_int maxdelay, u_int maxburst, - u_int minburst, u_int av_pkt_size, u_int max_pkt_size, - cbq_class_spec_t *cl_spec) -{ - struct cbq_ifinfo *cbq_ifinfo = ifinfo->private; - double maxq, maxidle_s, maxidle, minidle, - offtime, nsPerByte, ptime, cptime; - double z = (double)(1 << RM_FILTER_GAIN); - double g = (1.0 - 1.0 / z); - double f; - double gton; - double gtom; - double maxrate; - - /* Compute other class parameters */ - if (bandwidth == 0) - f = 0.0001; /* small enough? */ - else - f = ((double) bandwidth / (double) ifinfo->bandwidth); - - if (av_pkt_size == 0) { /* use default */ - av_pkt_size = ifinfo->ifmtu; - if (av_pkt_size > MCLBYTES) /* do what TCP does */ - av_pkt_size &= ~MCLBYTES; - } else if (av_pkt_size > ifinfo->ifmtu) - av_pkt_size = ifinfo->ifmtu; - if (max_pkt_size == 0) /* use default */ - max_pkt_size = ifinfo->ifmtu; - else if (max_pkt_size > ifinfo->ifmtu) - max_pkt_size = ifinfo->ifmtu; - - nsPerByte = cbq_ifinfo->nsPerByte / f; - ptime = (double) av_pkt_size * (double)cbq_ifinfo->nsPerByte; - maxrate = f * ((double)ifinfo->bandwidth / 8.0); - cptime = ptime * (1.0 - f) / f; -#if 1 /* ALTQ */ - if (nsPerByte * (double)max_pkt_size > (double)INT_MAX) { - /* - * this causes integer overflow in kernel! - * (bandwidth < 6Kbps when max_pkt_size=1500) - */ - if (bandwidth != 0) - LOG(LOG_WARNING, 0, "warning: class is too slow!!"); - nsPerByte = (double)(INT_MAX / max_pkt_size); - } -#endif - if (maxburst == 0) { /* use default */ - if (cptime > 10.0 * NS_PER_MS) - maxburst = 4; - else - maxburst = 16; - } - if (minburst == 0) /* use default */ - minburst = 2; - if (minburst > maxburst) - minburst = maxburst; - - if (IsDebug(DEBUG_ALTQ)) { - int packet_time; - LOG(LOG_DEBUG, 0, - "cbq_flowspec: maxburst=%d,minburst=%d,pkt_size=%d", - maxburst, minburst, av_pkt_size); - LOG(LOG_DEBUG, 0, - " nsPerByte=%.2f ns, link's nsPerByte=%.2f, f=%.3f", - nsPerByte, cbq_ifinfo->nsPerByte, f); - packet_time = av_pkt_size * (int)nsPerByte / 1000; - LOG(LOG_DEBUG, 0, - " packet time=%d [us]\n", packet_time); - if (maxburst * packet_time < 20000) { - LOG(LOG_WARNING, 0, - "warning: maxburst smaller than timer granularity!"); - LOG(LOG_WARNING, 0, - " maxburst=%d, packet_time=%d [us]", - maxburst, packet_time); - } - } - gton = pow(g, (double)maxburst); - gtom = pow(g, (double)(minburst-1)); - maxidle = ((1.0 / f - 1.0) * ((1.0 - gton) / gton)); - maxidle_s = (1.0 - g); - if (maxidle > maxidle_s) - maxidle = ptime * maxidle; - else - maxidle = ptime * maxidle_s; - if (IsDebug(DEBUG_ALTQ)) - LOG(LOG_DEBUG, 0, " maxidle=%.2f us", maxidle/1000.0); - if (minburst) - offtime = cptime * (1.0 + 1.0/(1.0 - g) * (1.0 - gtom) / gtom); - else - offtime = cptime; - minidle = -((double)max_pkt_size * (double)nsPerByte); - if (IsDebug(DEBUG_ALTQ)) - LOG(LOG_DEBUG, 0, " offtime=%.2f us minidle=%.2f us", - offtime/1000.0, minidle/1000.0); - - maxidle = ((maxidle * 8.0) / nsPerByte) * pow(2, RM_FILTER_GAIN); -#if 1 /* ALTQ */ - /* also scale offtime and minidle */ - offtime = (offtime * 8.0) / nsPerByte * pow(2, RM_FILTER_GAIN); - minidle = ((minidle * 8.0) / nsPerByte) * pow(2, RM_FILTER_GAIN); -#endif - maxidle = maxidle / 1000.0; - offtime = offtime / 1000.0; - minidle = minidle / 1000.0; - /* adjust queue size when maxdelay is specified. - queue size should be relative to its share */ - if (maxdelay == 0) { - if (flags & (CBQCLF_RED|CBQCLF_RIO)) - maxq = 60.0; - else - maxq = 30.0; - } else { - maxq = ((double) maxdelay * NS_PER_MS) / (nsPerByte * av_pkt_size); - if (maxq < 4) { - LOG(LOG_WARNING, 0, - "warning: maxq (%d) is too small. set to %d", - (int)maxq, 4); - maxq = 4; - } - } - if (bandwidth == 0 && borrow_class == NULL_CLASS_HANDLE) - /* filter out this class by setting queue size to zero */ - maxq = 0; - if (IsDebug(DEBUG_ALTQ)) { - if ((u_int)maxq < maxburst) - LOG(LOG_WARNING, 0, - "warning: maxq (%d) is smaller than maxburst(%d)", - (int)maxq, maxburst); - else if (maxq > 100.0) - LOG(LOG_WARNING, 0, - "warning: maxq %d too large\n", (int)maxq); - LOG(LOG_DEBUG, 0, " maxq=%d", (int)maxq); - } - - if (parent_class == NULL_CLASS_HANDLE) { - if ((flags & CBQCLF_ROOTCLASS) == 0) - flags |= CBQCLF_ROOTCLASS; - if (cbq_ifinfo->is_wrr) - flags |= CBQCLF_WRR; - if (cbq_ifinfo->is_efficient) - flags |= CBQCLF_EFFICIENT; - } - - memset((void *)cl_spec, 0, sizeof(cbq_class_spec_t)); - cl_spec->priority = pri; - cl_spec->nano_sec_per_byte = (u_int) nsPerByte; - cl_spec->maxq = (u_int) maxq; - cl_spec->maxidle = (u_int) fabs(maxidle); - cl_spec->minidle = (int)minidle; - cl_spec->offtime = (u_int) fabs(offtime); - - cl_spec->parent_class_handle = parent_class; - cl_spec->borrow_class_handle = borrow_class; - - cl_spec->pktsize = av_pkt_size; - cl_spec->flags = flags; - - return (0); -} - - -/* - * system call interfaces for qdisc_ops - */ -static int -cbq_attach(struct ifinfo *ifinfo) -{ - struct cbq_interface iface; - - if (cbq_fd < 0 && - (cbq_fd = open(CBQ_DEVICE, O_RDWR)) < 0 && - (cbq_fd = open_module(CBQ_DEVICE, O_RDWR)) < 0) { - LOG(LOG_ERR, errno, "CBQ open"); - return (QOPERR_SYSCALL); - } - - cbq_refcount++; - memset(&iface, 0, sizeof(iface)); - strncpy(iface.cbq_ifacename, ifinfo->ifname, IFNAMSIZ); - - if (ioctl(cbq_fd, CBQ_IF_ATTACH, &iface) < 0) - return (QOPERR_SYSCALL); - return (0); -} - -static int -cbq_detach(struct ifinfo *ifinfo) -{ - struct cbq_interface iface; - - memset(&iface, 0, sizeof(iface)); - strncpy(iface.cbq_ifacename, ifinfo->ifname, IFNAMSIZ); - - if (ioctl(cbq_fd, CBQ_IF_DETACH, &iface) < 0) - return (QOPERR_SYSCALL); - - if (--cbq_refcount == 0) { - close(cbq_fd); - cbq_fd = -1; - } - return (0); -} - -static int -cbq_clear(struct ifinfo *ifinfo) -{ - struct cbq_interface iface; - - memset(&iface, 0, sizeof(iface)); - strncpy(iface.cbq_ifacename, ifinfo->ifname, IFNAMSIZ); - - if (ioctl(cbq_fd, CBQ_CLEAR_HIERARCHY, &iface) < 0) - return (QOPERR_SYSCALL); - return (0); -} - -static int -cbq_enable(struct ifinfo *ifinfo) -{ - struct cbq_interface iface; - - memset(&iface, 0, sizeof(iface)); - strncpy(iface.cbq_ifacename, ifinfo->ifname, IFNAMSIZ); - - if (ioctl(cbq_fd, CBQ_ENABLE, &iface) < 0) - return (QOPERR_SYSCALL); - return (0); -} - -static int -cbq_disable(struct ifinfo *ifinfo) -{ - struct cbq_interface iface; - - memset(&iface, 0, sizeof(iface)); - strncpy(iface.cbq_ifacename, ifinfo->ifname, IFNAMSIZ); - - if (ioctl(cbq_fd, CBQ_DISABLE, &iface) < 0) - return (QOPERR_SYSCALL); - return (0); -} - -static int -cbq_add_class(struct classinfo *clinfo) -{ - struct cbq_add_class class_add; - struct cbq_classinfo *cbq_clinfo; - struct cbq_ifinfo *cbq_ifinfo; - - cbq_ifinfo = clinfo->ifinfo->private; - cbq_clinfo = clinfo->private; - - memset(&class_add, 0, sizeof(class_add)); - strncpy(class_add.cbq_iface.cbq_ifacename, - clinfo->ifinfo->ifname, IFNAMSIZ); - - class_add.cbq_class = cbq_clinfo->class_spec; - - if (ioctl(cbq_fd, CBQ_ADD_CLASS, &class_add) < 0) - return (QOPERR_SYSCALL); - - clinfo->handle = class_add.cbq_class_handle; - return (0); -} - -static int -cbq_modify_class(struct classinfo *clinfo, void *arg) -{ - struct cbq_modify_class class_mod; - struct cbq_classinfo *cbq_clinfo; - - cbq_clinfo = clinfo->private; - - memset(&class_mod, 0, sizeof(class_mod)); - strncpy(class_mod.cbq_iface.cbq_ifacename, - clinfo->ifinfo->ifname, IFNAMSIZ); - class_mod.cbq_class_handle = clinfo->handle; - class_mod.cbq_class = cbq_clinfo->class_spec; - - if (ioctl(cbq_fd, CBQ_MODIFY_CLASS, &class_mod) < 0) - return (QOPERR_SYSCALL); - return (0); -} - -static int -cbq_delete_class(struct classinfo *clinfo) -{ - struct cbq_delete_class class_delete; - - memset(&class_delete, 0, sizeof(class_delete)); - strncpy(class_delete.cbq_iface.cbq_ifacename, - clinfo->ifinfo->ifname, IFNAMSIZ); - class_delete.cbq_class_handle = clinfo->handle; - - if (ioctl(cbq_fd, CBQ_DEL_CLASS, &class_delete) < 0) - return (QOPERR_SYSCALL); - return (0); -} - -static int -cbq_add_filter(struct fltrinfo *fltrinfo) -{ - struct cbq_add_filter fltr_add; - - memset(&fltr_add, 0, sizeof(fltr_add)); - strncpy(fltr_add.cbq_iface.cbq_ifacename, - fltrinfo->clinfo->ifinfo->ifname, IFNAMSIZ); - fltr_add.cbq_class_handle = fltrinfo->clinfo->handle; - fltr_add.cbq_filter = fltrinfo->fltr; - - if (ioctl(cbq_fd, CBQ_ADD_FILTER, &fltr_add) < 0) - return (QOPERR_SYSCALL); - fltrinfo->handle = fltr_add.cbq_filter_handle; - return (0); -} - -static int -cbq_delete_filter(struct fltrinfo *fltrinfo) -{ - struct cbq_delete_filter fltr_del; - - memset(&fltr_del, 0, sizeof(fltr_del)); - strncpy(fltr_del.cbq_iface.cbq_ifacename, - fltrinfo->clinfo->ifinfo->ifname, IFNAMSIZ); - fltr_del.cbq_filter_handle = fltrinfo->handle; - - if (ioctl(cbq_fd, CBQ_DEL_FILTER, &fltr_del) < 0) - return (QOPERR_SYSCALL); - return (0); -} - - diff --git a/usr.sbin/altq/libaltq/qop_cbq.h b/usr.sbin/altq/libaltq/qop_cbq.h deleted file mode 100644 index 0153239cc37..00000000000 --- a/usr.sbin/altq/libaltq/qop_cbq.h +++ /dev/null @@ -1,102 +0,0 @@ -/* $OpenBSD: qop_cbq.h,v 1.1.1.1 2001/06/27 18:23:29 kjc Exp $ */ -/* $KAME: qop_cbq.h,v 1.2 2000/10/18 09:15:18 kjc Exp $ */ -/* - * Copyright (c) Sun Microsystems, Inc. 1993-1998 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. - * - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the SMCC Technology - * Development Group at Sun Microsystems, Inc. - * - * 4. The name of the Sun Microsystems, Inc nor may not be used to endorse or - * promote products derived from this software without specific prior - * written permission. - * - * SUN MICROSYSTEMS DOES NOT CLAIM MERCHANTABILITY OF THIS SOFTWARE OR THE - * SUITABILITY OF THIS SOFTWARE FOR ANY PARTICULAR PURPOSE. The software is - * provided "as is" without express or implied warranty of any kind. - * - * These notices must be retained in any copies of any part of this software. - */ - -#include <altq/altq_rmclass.h> -#include <altq/altq_cbq.h> - -/* cbq admission types */ -typedef enum { - CBQ_QOS_NONE, - CBQ_QOS_GUARANTEED, - CBQ_QOS_PREDICTIVE, - CBQ_QOS_CNTR_DELAY, - CBQ_QOS_CNTR_LOAD -} cbq_tos_t; - -/* - * cbq private ifinfo structure - */ -struct cbq_ifinfo { - struct classinfo *root_class; /* root class */ - struct classinfo *default_class; /* default class */ - struct classinfo *ctl_class; /* control class */ - - double nsPerByte; /* bandwidth in ns per sec */ - int is_wrr; /* use weighted-round robin */ - int is_efficient; /* use work-conserving */ -}; - -/* - * cbq private classinfo structure - */ -struct cbq_classinfo { - u_int bandwidth; /* bandwidth in bps */ - u_int allocated; /* bandwidth used by children */ - - u_int maxdelay; - u_int maxburst; - u_int minburst; - u_int av_pkt_size; - u_int max_pkt_size; - - cbq_class_spec_t class_spec; /* class parameters */ -}; - -int cbq_interface_parser(const char *ifname, int argc, char **argv); -int cbq_class_parser(const char *ifname, const char *class_name, - const char *parent_name, int argc, char **argv); - -int qcmd_cbq_add_if(const char *ifname, u_int bandwidth, - int is_wrr, int efficient); -int qcmd_cbq_add_class(const char *ifname, const char *class_name, - const char *parent_name, const char *borrow_name, - u_int pri, u_int bandwidth, - u_int maxdelay, u_int maxburst, u_int minburst, - u_int av_pkt_size, u_int max_pkt_size, - int admission_type, int flags); -int qcmd_cbq_modify_class(const char *ifname, const char *class_name, - u_int pri, u_int bandwidth, - u_int maxdelay, u_int maxburst, u_int minburst, - u_int av_pkt_size, u_int max_pkt_size, int flags); - -int qop_cbq_add_if(struct ifinfo **rp, const char *ifname, - u_int bandwidth, int is_wrr, int efficient); -int qop_cbq_add_class(struct classinfo **rp, const char *class_name, - struct ifinfo *ifinfo, struct classinfo *parent, - struct classinfo *borrow, u_int pri, u_int bandwidth, - u_int maxdelay, u_int maxburst, u_int minburst, - u_int av_pkt_size, u_int max_pkt_size, - int admission_type, int flags); -int qop_cbq_modify_class(struct classinfo *clinfo, u_int pri, u_int bandwidth, - u_int maxdelay, u_int maxburst, u_int minburst, - u_int av_pkt_size, u_int max_pkt_size, int flags); - diff --git a/usr.sbin/altq/libaltq/qop_cdnr.c b/usr.sbin/altq/libaltq/qop_cdnr.c deleted file mode 100644 index a59b827f14c..00000000000 --- a/usr.sbin/altq/libaltq/qop_cdnr.c +++ /dev/null @@ -1,933 +0,0 @@ -/* $OpenBSD: qop_cdnr.c,v 1.2 2001/08/16 12:59:43 kjc Exp $ */ -/* $KAME: qop_cdnr.c,v 1.9 2001/08/16 10:39:14 kjc Exp $ */ -/* - * Copyright (C) 1999-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. - */ - -#include <sys/param.h> -#include <sys/socket.h> -#include <sys/sockio.h> -#include <sys/ioctl.h> -#include <sys/fcntl.h> -#include <net/if.h> -#include <netinet/in.h> -#include <arpa/inet.h> - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <stddef.h> -#include <string.h> -#include <ctype.h> -#include <errno.h> -#include <syslog.h> -#include <netdb.h> - -#include <altq/altq.h> -#include <altq/altq_cdnr.h> -#include "altq_qop.h" -#include "qop_cdnr.h" -/* - * diffserve traffic conditioner support - * - * we use the existing qop interface to support conditioner. - */ - -static struct ifinfo *cdnr_ifname2ifinfo(const char *); -static int cdnr_attach(struct ifinfo *); -static int cdnr_detach(struct ifinfo *); -static int cdnr_enable(struct ifinfo *); -static int cdnr_disable(struct ifinfo *); -static int cdnr_add_class(struct classinfo *); -static int cdnr_modify_class(struct classinfo *, void *); -static int cdnr_delete_class(struct classinfo *); -static int cdnr_add_filter(struct fltrinfo *); -static int cdnr_delete_filter(struct fltrinfo *); -static int verify_tbprofile(struct tb_profile *, const char *); - -#define CDNR_DEVICE "/dev/altq/cdnr" - -static int cdnr_fd = -1; -static int cdnr_refcount = 0; - -static struct qdisc_ops cdnr_qdisc = { - ALTQT_CDNR, - "cdnr", - cdnr_attach, - cdnr_detach, - NULL, /* clear */ - cdnr_enable, - cdnr_disable, - cdnr_add_class, - cdnr_modify_class, - cdnr_delete_class, - cdnr_add_filter, - cdnr_delete_filter, -}; - -u_long -cdnr_name2handle(const char *ifname, const char *cdnr_name) -{ - struct ifinfo *ifinfo; - struct classinfo *clinfo; - - if ((ifinfo = cdnr_ifname2ifinfo(ifname)) == NULL) - return (CDNR_NULL_HANDLE); - - if ((clinfo = clname2clinfo(ifinfo, cdnr_name)) == NULL) - return (CDNR_NULL_HANDLE); - - return (clinfo->handle); -} - -static struct ifinfo * -cdnr_ifname2ifinfo(const char *ifname) -{ - struct ifinfo *ifinfo; - char input_ifname[64]; - - /* - * search for an existing input interface - */ - if ((ifinfo = input_ifname2ifinfo(ifname)) != NULL) - return (ifinfo); - - /* - * if there is a corresponding output interface, - * create an input interface by prepending "_" to - * its name. - */ - if ((ifinfo = ifname2ifinfo(ifname)) == NULL) - return (NULL); - - input_ifname[0] = '_'; - strlcpy(input_ifname+1, ifname, sizeof(input_ifname)-1); - if (qop_add_if(&ifinfo, input_ifname, 0, &cdnr_qdisc, NULL) != 0) { - LOG(LOG_ERR, errno, - "cdnr_ifname2ifinfo: can't add a input interface %s", - ifname); - return (NULL); - } - return (ifinfo); -} - -int -qcmd_cdnr_add_element(struct tc_action *rp, const char *ifname, - const char *cdnr_name, struct tc_action *action) -{ - struct ifinfo *ifinfo; - struct classinfo *clinfo; - int error; - - if ((ifinfo = cdnr_ifname2ifinfo(ifname)) == NULL) - return (QOPERR_BADIF); - - if ((error = qop_cdnr_add_element(&clinfo, cdnr_name, ifinfo, - action)) != 0) { - LOG(LOG_ERR, errno, "%s: add element failed!", - qoperror(error)); - return (error); - } - - if (rp != NULL) { - rp->tca_code = TCACODE_HANDLE; - rp->tca_handle = clinfo->handle; - } - return (0); -} - -int -qcmd_cdnr_add_tbmeter(struct tc_action *rp, const char *ifname, - const char *cdnr_name, - struct tb_profile *profile, - struct tc_action *in_action, - struct tc_action *out_action) -{ - struct ifinfo *ifinfo; - struct classinfo *clinfo; - int error; - - if ((ifinfo = cdnr_ifname2ifinfo(ifname)) == NULL) - return (QOPERR_BADIF); - - verify_tbprofile(profile, cdnr_name); - - if ((error = qop_cdnr_add_tbmeter(&clinfo, cdnr_name, ifinfo, - profile, in_action, out_action)) != 0) { - LOG(LOG_ERR, errno, "%s: add tbmeter failed!", - qoperror(error)); - return (error); - } - - if (rp != NULL) { - rp->tca_code = TCACODE_HANDLE; - rp->tca_handle = clinfo->handle; - } - return (0); -} - -int -qcmd_cdnr_add_trtcm(struct tc_action *rp, const char *ifname, - const char *cdnr_name, - struct tb_profile *cmtd_profile, - struct tb_profile *peak_profile, - struct tc_action *green_action, - struct tc_action *yellow_action, - struct tc_action *red_action, int coloraware) -{ - struct ifinfo *ifinfo; - struct classinfo *clinfo; - int error; - - if ((ifinfo = cdnr_ifname2ifinfo(ifname)) == NULL) - return (QOPERR_BADIF); - - verify_tbprofile(cmtd_profile, cdnr_name); - verify_tbprofile(peak_profile, cdnr_name); - - if ((error = qop_cdnr_add_trtcm(&clinfo, cdnr_name, ifinfo, - cmtd_profile, peak_profile, - green_action, yellow_action, red_action, - coloraware)) != 0) { - LOG(LOG_ERR, errno, "%s: add trtcm failed!", - qoperror(error)); - return (error); - } - - if (rp != NULL) { - rp->tca_code = TCACODE_HANDLE; - rp->tca_handle = clinfo->handle; - } - return (0); -} - -int -qcmd_cdnr_add_tswtcm(struct tc_action *rp, const char *ifname, - const char *cdnr_name, const u_int32_t cmtd_rate, - const u_int32_t peak_rate, const u_int32_t avg_interval, - struct tc_action *green_action, - struct tc_action *yellow_action, - struct tc_action *red_action) -{ - struct ifinfo *ifinfo; - struct classinfo *clinfo; - int error; - - if ((ifinfo = cdnr_ifname2ifinfo(ifname)) == NULL) - return (QOPERR_BADIF); - - if (cmtd_rate > peak_rate) { - LOG(LOG_ERR, 0, - "add tswtcm: cmtd_rate larger than peak_rate!"); - return (QOPERR_INVAL); - } - - if ((error = qop_cdnr_add_tswtcm(&clinfo, cdnr_name, ifinfo, - cmtd_rate, peak_rate, avg_interval, - green_action, yellow_action, - red_action)) != 0) { - LOG(LOG_ERR, errno, "%s: add tswtcm failed!", - qoperror(error)); - return (error); - } - - if (rp != NULL) { - rp->tca_code = TCACODE_HANDLE; - rp->tca_handle = clinfo->handle; - } - return (0); -} - -int -qcmd_cdnr_delete(const char *ifname, const char *cdnr_name) -{ - struct ifinfo *ifinfo; - struct classinfo *clinfo; - - if ((ifinfo = cdnr_ifname2ifinfo(ifname)) == NULL) - return (QOPERR_BADIF); - - if ((clinfo = clname2clinfo(ifinfo, cdnr_name)) == NULL) - return (QOPERR_BADCLASS); - - return qop_delete_cdnr(clinfo); -} - -/* - * class operations: - * class structure is used to hold conditioners. - * XXX - * conditioners has dependencies in the reverse order; parent nodes - * refere to child nodes, and thus, a child is created first and - * parents should be removed first. - * qop_add_cdnr() and qop_delete_cdnr() are wrapper functions - * of qop_add_class() and qop_delete_class(), and takes care - * of dependencies. - * 1. when adding a conditioner, it is created as a child of a - * dummy root class. then, the child conditioners are made - * as its children. - * 2. when deleting a conditioner, its child conditioners are made - * as children of the dummy root class. then, the conditioner - * is deleted. - */ - -int -qop_add_cdnr(struct classinfo **rp, const char *cdnr_name, - struct ifinfo *ifinfo, struct classinfo **childlist, - void *cdnr_private) -{ - struct classinfo *clinfo, *root, *cl, *prev; - int error; - - /* - * if there is no root cdnr, create one. - */ - if ((root = get_rootclass(ifinfo)) == NULL) { - if ((error = qop_add_class(&root, "cdnr_root", - ifinfo, NULL, NULL)) != 0) { - LOG(LOG_ERR, errno, - "cdnr: %s: can't create dummy root cdnr on %s!", - qoperror(error), ifinfo->ifname); - return (QOPERR_CLASS); - } - } - - /* - * create a class as a child of a root class. - */ - if ((error = qop_add_class(&clinfo, cdnr_name, - ifinfo, root, cdnr_private)) != 0) - return (error); - /* - * move child nodes - */ - for (cl = *childlist; cl != NULL; cl = *++childlist) { - if (cl->parent != root) { - /* - * this conditioner already has a non-root parent. - * we can't track down a multi-parent node by a - * tree structure; leave it as it is. - * (we need a mechanism similar to a symbolic link - * in a file system) - */ - continue; - } - /* remove this child from the root */ - if (root->child == cl) - root->child = cl->sibling; - else for (prev = root->child; - prev->sibling != NULL; prev = prev->sibling) - if (prev->sibling == cl) { - prev->sibling = cl->sibling; - break; - } - - /* add as a child */ - cl->sibling = clinfo->child; - clinfo->child = cl; - cl->parent = clinfo; - } - - if (rp != NULL) - *rp = clinfo; - return (0); -} - -int -qop_delete_cdnr(struct classinfo *clinfo) -{ - struct classinfo *cl, *root; - int error; - - if ((root = get_rootclass(clinfo->ifinfo)) == NULL) { - LOG(LOG_ERR, 0, "qop_delete_cdnr: no root cdnr!"); - return (QOPERR_CLASS); - } - - if (clinfo->parent != root) - return (QOPERR_CLASS_PERM); - - if ((cl = clinfo->child) != NULL) { - /* change child's parent to root, find the last child */ - while (cl->sibling != NULL) { - cl->parent = root; - cl = cl->sibling; - } - cl->parent = root; - - /* move children to siblings */ - cl->sibling = clinfo->sibling; - clinfo->sibling = cl; - clinfo->child = NULL; - } - - error = qop_delete_class(clinfo); - - if (error) { - /* ick! restore the class tree */ - if (cl != NULL) { - clinfo->child = clinfo->sibling; - clinfo->sibling = cl->sibling; - cl->sibling = NULL; - /* restore parent field */ - for (cl = clinfo->child; cl != NULL; cl = cl->sibling) - cl->parent = clinfo; - } - } - return (error); -} - -int -qop_cdnr_add_element(struct classinfo **rp, const char *cdnr_name, - struct ifinfo *ifinfo, struct tc_action *action) -{ - struct classinfo *clinfo, *clist[2]; - struct cdnrinfo *cdnrinfo = NULL; - int error; - - if (action->tca_code == TCACODE_HANDLE) { - clinfo = clhandle2clinfo(ifinfo, action->tca_handle); - if (clinfo == NULL) - return (QOPERR_BADCLASS); - clist[0] = clinfo; - clist[1] = NULL; -#if 1 - /* - * if the conditioner referred to doesn't have a name, - * this is called just to add a name to it. - * we can simply add the name to the existing conditioner - * and return it. - */ - if (cdnr_name != NULL && - strcmp(clinfo->clname, "(null)") == 0) { - free(clinfo->clname); - clinfo->clname = strdup(cdnr_name); - if (rp != NULL) - *rp = clinfo; - return (0); - } -#endif - } else - clist[0] = NULL; - - if ((cdnrinfo = calloc(1, sizeof(*cdnrinfo))) == NULL) - return (QOPERR_NOMEM); - - cdnrinfo->tce_type = TCETYPE_ELEMENT; - cdnrinfo->tce_un.element.action = *action; - - if ((error = qop_add_cdnr(&clinfo, cdnr_name, ifinfo, clist, - cdnrinfo)) != 0) - goto err_ret; - - if (rp != NULL) - *rp = clinfo; - return (0); - - err_ret: - if (cdnrinfo != NULL) - free(cdnrinfo); - return (error); -} - -int -qop_cdnr_add_tbmeter(struct classinfo **rp, const char *cdnr_name, - struct ifinfo *ifinfo, - struct tb_profile *profile, - struct tc_action *in_action, - struct tc_action *out_action) -{ - struct classinfo *clinfo, *clist[3]; - struct cdnrinfo *cdnrinfo = NULL; - int n, error; - - n = 0; - if (in_action->tca_code == TCACODE_HANDLE) { - clist[n] = clhandle2clinfo(ifinfo, in_action->tca_handle); - if (clist[n] == NULL) - return (QOPERR_BADCLASS); - n++; - } - if (out_action->tca_code == TCACODE_HANDLE) { - clist[n] = clhandle2clinfo(ifinfo, out_action->tca_handle); - if (clist[n] == NULL) - return (QOPERR_BADCLASS); - n++; - } - clist[n] = NULL; - - if ((cdnrinfo = calloc(1, sizeof(*cdnrinfo))) == NULL) - return (QOPERR_NOMEM); - - cdnrinfo->tce_type = TCETYPE_TBMETER; - cdnrinfo->tce_un.tbmeter.profile = *profile; - cdnrinfo->tce_un.tbmeter.in_action = *in_action; - cdnrinfo->tce_un.tbmeter.out_action = *out_action; - - if ((error = qop_add_cdnr(&clinfo, cdnr_name, ifinfo, clist, - cdnrinfo)) != 0) - goto err_ret; - - if (rp != NULL) - *rp = clinfo; - return (0); - - err_ret: - if (cdnrinfo != NULL) - free(cdnrinfo); - return (error); -} - -int -qop_cdnr_modify_tbmeter(struct classinfo *clinfo, struct tb_profile *profile) -{ - struct cdnrinfo *cdnrinfo = clinfo->private; - - if (cdnrinfo->tce_type != TCETYPE_TBMETER) - return (QOPERR_CLASS_INVAL); - cdnrinfo->tce_un.tbmeter.profile = *profile; - - return qop_modify_class(clinfo, NULL); -} - -int -qop_cdnr_add_trtcm(struct classinfo **rp, const char *cdnr_name, - struct ifinfo *ifinfo, - struct tb_profile *cmtd_profile, - struct tb_profile *peak_profile, - struct tc_action *green_action, - struct tc_action *yellow_action, - struct tc_action *red_action, int coloraware) -{ - struct classinfo *clinfo, *clist[4]; - struct cdnrinfo *cdnrinfo = NULL; - int n, error; - - n = 0; - if (green_action->tca_code == TCACODE_HANDLE) { - clist[n] = clhandle2clinfo(ifinfo, green_action->tca_handle); - if (clist[n] == NULL) - return (QOPERR_BADCLASS); - n++; - } - if (yellow_action->tca_code == TCACODE_HANDLE) { - clist[n] = clhandle2clinfo(ifinfo, yellow_action->tca_handle); - if (clist[n] == NULL) - return (QOPERR_BADCLASS); - n++; - } - if (red_action->tca_code == TCACODE_HANDLE) { - clist[n] = clhandle2clinfo(ifinfo, yellow_action->tca_handle); - if (clist[n] == NULL) - return (QOPERR_BADCLASS); - n++; - } - clist[n] = NULL; - - if ((cdnrinfo = calloc(1, sizeof(*cdnrinfo))) == NULL) - return (QOPERR_NOMEM); - - cdnrinfo->tce_type = TCETYPE_TRTCM; - cdnrinfo->tce_un.trtcm.cmtd_profile = *cmtd_profile; - cdnrinfo->tce_un.trtcm.peak_profile = *peak_profile; - cdnrinfo->tce_un.trtcm.green_action = *green_action; - cdnrinfo->tce_un.trtcm.yellow_action = *yellow_action; - cdnrinfo->tce_un.trtcm.red_action = *red_action; - cdnrinfo->tce_un.trtcm.coloraware = coloraware; - - if ((error = qop_add_cdnr(&clinfo, cdnr_name, ifinfo, clist, - cdnrinfo)) != 0) - goto err_ret; - - if (rp != NULL) - *rp = clinfo; - return (0); - - err_ret: - if (cdnrinfo != NULL) - free(cdnrinfo); - return (error); -} - -int -qop_cdnr_modify_trtcm(struct classinfo *clinfo, - struct tb_profile *cmtd_profile, - struct tb_profile *peak_profile, int coloraware) -{ - struct cdnrinfo *cdnrinfo = clinfo->private; - - if (cdnrinfo->tce_type != TCETYPE_TRTCM) - return (QOPERR_CLASS_INVAL); - cdnrinfo->tce_un.trtcm.cmtd_profile = *cmtd_profile; - cdnrinfo->tce_un.trtcm.peak_profile = *peak_profile; - cdnrinfo->tce_un.trtcm.coloraware = coloraware; - - return qop_modify_class(clinfo, NULL); -} - -int -qop_cdnr_add_tswtcm(struct classinfo **rp, const char *cdnr_name, - struct ifinfo *ifinfo, const u_int32_t cmtd_rate, - const u_int32_t peak_rate, const u_int32_t avg_interval, - struct tc_action *green_action, - struct tc_action *yellow_action, - struct tc_action *red_action) -{ - struct classinfo *clinfo, *clist[4]; - struct cdnrinfo *cdnrinfo = NULL; - int n, error; - - n = 0; - if (green_action->tca_code == TCACODE_HANDLE) { - clist[n] = clhandle2clinfo(ifinfo, green_action->tca_handle); - if (clist[n] == NULL) - return (QOPERR_BADCLASS); - n++; - } - if (yellow_action->tca_code == TCACODE_HANDLE) { - clist[n] = clhandle2clinfo(ifinfo, yellow_action->tca_handle); - if (clist[n] == NULL) - return (QOPERR_BADCLASS); - n++; - } - if (red_action->tca_code == TCACODE_HANDLE) { - clist[n] = clhandle2clinfo(ifinfo, yellow_action->tca_handle); - if (clist[n] == NULL) - return (QOPERR_BADCLASS); - n++; - } - clist[n] = NULL; - - if ((cdnrinfo = calloc(1, sizeof(*cdnrinfo))) == NULL) - return (QOPERR_NOMEM); - - cdnrinfo->tce_type = TCETYPE_TSWTCM; - cdnrinfo->tce_un.tswtcm.cmtd_rate = cmtd_rate; - cdnrinfo->tce_un.tswtcm.peak_rate = peak_rate; - cdnrinfo->tce_un.tswtcm.avg_interval = avg_interval; - cdnrinfo->tce_un.tswtcm.green_action = *green_action; - cdnrinfo->tce_un.tswtcm.yellow_action = *yellow_action; - cdnrinfo->tce_un.tswtcm.red_action = *red_action; - - if ((error = qop_add_cdnr(&clinfo, cdnr_name, ifinfo, clist, - cdnrinfo)) != 0) - goto err_ret; - - if (rp != NULL) - *rp = clinfo; - return (0); - - err_ret: - if (cdnrinfo != NULL) - free(cdnrinfo); - return (error); -} - -int -qop_cdnr_modify_tswtcm(struct classinfo *clinfo, const u_int32_t cmtd_rate, - const u_int32_t peak_rate, const u_int32_t avg_interval) -{ - struct cdnrinfo *cdnrinfo = clinfo->private; - - if (cdnrinfo->tce_type != TCETYPE_TSWTCM) - return (QOPERR_CLASS_INVAL); - cdnrinfo->tce_un.tswtcm.cmtd_rate = cmtd_rate; - cdnrinfo->tce_un.tswtcm.peak_rate = peak_rate; - cdnrinfo->tce_un.tswtcm.avg_interval = avg_interval; - - return qop_modify_class(clinfo, NULL); -} - -/* - * system call interfaces for qdisc_ops - */ -static int -cdnr_attach(struct ifinfo *ifinfo) -{ - struct cdnr_interface iface; - - if (cdnr_fd < 0 && - (cdnr_fd = open(CDNR_DEVICE, O_RDWR)) < 0 && - (cdnr_fd = open_module(CDNR_DEVICE, O_RDWR)) < 0) { - LOG(LOG_ERR, errno, "CDNR open"); - return (QOPERR_SYSCALL); - } - - cdnr_refcount++; - memset(&iface, 0, sizeof(iface)); - strncpy(iface.cdnr_ifname, ifinfo->ifname+1, IFNAMSIZ); - - if (ioctl(cdnr_fd, CDNR_IF_ATTACH, &iface) < 0) - return (QOPERR_SYSCALL); -#if 1 - LOG(LOG_INFO, 0, "conditioner attached to %s", iface.cdnr_ifname); -#endif - return (0); -} - -static int -cdnr_detach(struct ifinfo *ifinfo) -{ - struct cdnr_interface iface; - - memset(&iface, 0, sizeof(iface)); - strncpy(iface.cdnr_ifname, ifinfo->ifname+1, IFNAMSIZ); - - if (ioctl(cdnr_fd, CDNR_IF_DETACH, &iface) < 0) - return (QOPERR_SYSCALL); - - if (--cdnr_refcount == 0) { - close(cdnr_fd); - cdnr_fd = -1; - } - return (0); -} - -static int -cdnr_enable(struct ifinfo *ifinfo) -{ - struct cdnr_interface iface; - - memset(&iface, 0, sizeof(iface)); - strncpy(iface.cdnr_ifname, ifinfo->ifname+1, IFNAMSIZ); - - if (ioctl(cdnr_fd, CDNR_ENABLE, &iface) < 0) - return (QOPERR_SYSCALL); - return (0); -} - -static int -cdnr_disable(struct ifinfo *ifinfo) -{ - struct cdnr_interface iface; - - memset(&iface, 0, sizeof(iface)); - strncpy(iface.cdnr_ifname, ifinfo->ifname+1, IFNAMSIZ); - - if (ioctl(cdnr_fd, CDNR_DISABLE, &iface) < 0) - return (QOPERR_SYSCALL); - return (0); -} - -static int -cdnr_add_class(struct classinfo *clinfo) -{ - struct cdnr_add_element element_add; - struct cdnr_add_tbmeter tbmeter_add; - struct cdnr_add_trtcm trtcm_add; - struct cdnr_add_tswtcm tswtcm_add; - struct cdnrinfo *cdnrinfo; - - cdnrinfo = clinfo->private; - - /* root class is a dummy class */ - if (clinfo->parent == NULL) { - clinfo->handle = 0; - return (0); - } - - switch (cdnrinfo->tce_type) { - case TCETYPE_ELEMENT: - memset(&element_add, 0, sizeof(element_add)); - strncpy(element_add.iface.cdnr_ifname, - clinfo->ifinfo->ifname+1, IFNAMSIZ); - element_add.action = cdnrinfo->tce_un.element.action; - if (ioctl(cdnr_fd, CDNR_ADD_ELEM, &element_add) < 0) { - clinfo->handle = CDNR_NULL_HANDLE; - return (QOPERR_SYSCALL); - } - clinfo->handle = element_add.cdnr_handle; - break; - - case TCETYPE_TBMETER: - memset(&tbmeter_add, 0, sizeof(tbmeter_add)); - strncpy(tbmeter_add.iface.cdnr_ifname, - clinfo->ifinfo->ifname+1, IFNAMSIZ); - tbmeter_add.profile = cdnrinfo->tce_un.tbmeter.profile; - tbmeter_add.in_action = cdnrinfo->tce_un.tbmeter.in_action; - tbmeter_add.out_action = cdnrinfo->tce_un.tbmeter.out_action; - if (ioctl(cdnr_fd, CDNR_ADD_TBM, &tbmeter_add) < 0) { - clinfo->handle = CDNR_NULL_HANDLE; - return (QOPERR_SYSCALL); - } - clinfo->handle = tbmeter_add.cdnr_handle; - break; - - case TCETYPE_TRTCM: - memset(&trtcm_add, 0, sizeof(trtcm_add)); - strncpy(trtcm_add.iface.cdnr_ifname, - clinfo->ifinfo->ifname+1, IFNAMSIZ); - trtcm_add.cmtd_profile = cdnrinfo->tce_un.trtcm.cmtd_profile; - trtcm_add.peak_profile = cdnrinfo->tce_un.trtcm.peak_profile; - trtcm_add.green_action = cdnrinfo->tce_un.trtcm.green_action; - trtcm_add.yellow_action = cdnrinfo->tce_un.trtcm.yellow_action; - trtcm_add.red_action = cdnrinfo->tce_un.trtcm.red_action; - trtcm_add.coloraware = cdnrinfo->tce_un.trtcm.coloraware; - if (ioctl(cdnr_fd, CDNR_ADD_TCM, &trtcm_add) < 0) { - clinfo->handle = CDNR_NULL_HANDLE; - return (QOPERR_SYSCALL); - } - clinfo->handle = trtcm_add.cdnr_handle; - break; - - case TCETYPE_TSWTCM: - memset(&tswtcm_add, 0, sizeof(tswtcm_add)); - strncpy(tswtcm_add.iface.cdnr_ifname, - clinfo->ifinfo->ifname+1, IFNAMSIZ); - tswtcm_add.cmtd_rate = cdnrinfo->tce_un.tswtcm.cmtd_rate; - tswtcm_add.peak_rate = cdnrinfo->tce_un.tswtcm.peak_rate; - tswtcm_add.avg_interval = cdnrinfo->tce_un.tswtcm.avg_interval; - tswtcm_add.green_action = cdnrinfo->tce_un.tswtcm.green_action; - tswtcm_add.yellow_action = cdnrinfo->tce_un.tswtcm.yellow_action; - tswtcm_add.red_action = cdnrinfo->tce_un.tswtcm.red_action; - if (ioctl(cdnr_fd, CDNR_ADD_TSW, &tswtcm_add) < 0) { - clinfo->handle = CDNR_NULL_HANDLE; - return (QOPERR_SYSCALL); - } - clinfo->handle = tswtcm_add.cdnr_handle; - break; - - default: - return (QOPERR_CLASS_INVAL); - } - return (0); -} - -static int -cdnr_modify_class(struct classinfo *clinfo, void *arg) -{ - struct cdnr_modify_tbmeter tbmeter_modify; - struct cdnr_modify_trtcm trtcm_modify; - struct cdnr_modify_tswtcm tswtcm_modify; - struct cdnrinfo *cdnrinfo; - - cdnrinfo = clinfo->private; - - switch (cdnrinfo->tce_type) { - case TCETYPE_TBMETER: - memset(&tbmeter_modify, 0, sizeof(tbmeter_modify)); - strncpy(tbmeter_modify.iface.cdnr_ifname, - clinfo->ifinfo->ifname+1, IFNAMSIZ); - tbmeter_modify.cdnr_handle = clinfo->handle; - tbmeter_modify.profile = cdnrinfo->tce_un.tbmeter.profile; - if (ioctl(cdnr_fd, CDNR_MOD_TBM, &tbmeter_modify) < 0) - return (QOPERR_SYSCALL); - break; - - case TCETYPE_TRTCM: - memset(&trtcm_modify, 0, sizeof(trtcm_modify)); - strncpy(trtcm_modify.iface.cdnr_ifname, - clinfo->ifinfo->ifname+1, IFNAMSIZ); - trtcm_modify.cdnr_handle = clinfo->handle; - trtcm_modify.cmtd_profile = - cdnrinfo->tce_un.trtcm.cmtd_profile; - trtcm_modify.peak_profile = - cdnrinfo->tce_un.trtcm.peak_profile; - trtcm_modify.coloraware = cdnrinfo->tce_un.trtcm.coloraware; - if (ioctl(cdnr_fd, CDNR_MOD_TCM, &trtcm_modify) < 0) - return (QOPERR_SYSCALL); - break; - - case TCETYPE_TSWTCM: - memset(&tswtcm_modify, 0, sizeof(tswtcm_modify)); - strncpy(tswtcm_modify.iface.cdnr_ifname, - clinfo->ifinfo->ifname+1, IFNAMSIZ); - tswtcm_modify.cdnr_handle = clinfo->handle; - tswtcm_modify.cmtd_rate = cdnrinfo->tce_un.tswtcm.cmtd_rate; - tswtcm_modify.peak_rate = cdnrinfo->tce_un.tswtcm.peak_rate; - tswtcm_modify.avg_interval = cdnrinfo->tce_un.tswtcm.avg_interval; - if (ioctl(cdnr_fd, CDNR_MOD_TSW, &tswtcm_modify) < 0) - return (QOPERR_SYSCALL); - break; - - default: - return (QOPERR_CLASS_INVAL); - } - return (0); -} - -static int -cdnr_delete_class(struct classinfo *clinfo) -{ - struct cdnr_delete_element element_delete; - - if (clinfo->handle == CDNR_NULL_HANDLE) - return (0); - - memset(&element_delete, 0, sizeof(element_delete)); - strncpy(element_delete.iface.cdnr_ifname, clinfo->ifinfo->ifname+1, - IFNAMSIZ); - element_delete.cdnr_handle = clinfo->handle; - - if (ioctl(cdnr_fd, CDNR_DEL_ELEM, &element_delete) < 0) - return (QOPERR_SYSCALL); - return (0); -} - -static int -cdnr_add_filter(struct fltrinfo *fltrinfo) -{ - struct cdnr_add_filter fltr_add; - - memset(&fltr_add, 0, sizeof(fltr_add)); - strncpy(fltr_add.iface.cdnr_ifname, - fltrinfo->clinfo->ifinfo->ifname+1, IFNAMSIZ); - fltr_add.cdnr_handle = fltrinfo->clinfo->handle; - fltr_add.filter = fltrinfo->fltr; - - if (ioctl(cdnr_fd, CDNR_ADD_FILTER, &fltr_add) < 0) - return (QOPERR_SYSCALL); - fltrinfo->handle = fltr_add.filter_handle; - return (0); -} - -static int -cdnr_delete_filter(struct fltrinfo *fltrinfo) -{ - struct cdnr_delete_filter fltr_del; - - memset(&fltr_del, 0, sizeof(fltr_del)); - strncpy(fltr_del.iface.cdnr_ifname, - fltrinfo->clinfo->ifinfo->ifname+1, IFNAMSIZ); - fltr_del.filter_handle = fltrinfo->handle; - - if (ioctl(cdnr_fd, CDNR_DEL_FILTER, &fltr_del) < 0) - return (QOPERR_SYSCALL); - return (0); -} - - -static int -verify_tbprofile(struct tb_profile *profile, const char *cdnr_name) -{ - if (profile->depth < 1500) { - LOG(LOG_WARNING, 0, - "warning: token bucket depth for %s is too small (%d)", - cdnr_name, profile->depth); - return (-1); - } - return (0); -} - diff --git a/usr.sbin/altq/libaltq/qop_cdnr.h b/usr.sbin/altq/libaltq/qop_cdnr.h deleted file mode 100644 index 57dbd1572b3..00000000000 --- a/usr.sbin/altq/libaltq/qop_cdnr.h +++ /dev/null @@ -1,119 +0,0 @@ -/* $OpenBSD: qop_cdnr.h,v 1.1.1.1 2001/06/27 18:23:30 kjc Exp $ */ -/* $KAME: qop_cdnr.h,v 1.4 2000/10/18 09:15:19 kjc Exp $ */ -/* - * Copyright (C) 1999-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. - */ - -/* - * struct classinfo is used also for traffic conditioners - */ - -/* discipline specific class info */ -struct cdnrinfo { - int tce_type; - union { - struct { - struct tc_action action; - } element; - struct { - struct tb_profile profile; - struct tc_action in_action; - struct tc_action out_action; - } tbmeter; - struct { - struct tb_profile cmtd_profile; - struct tb_profile peak_profile; - struct tc_action green_action; - struct tc_action yellow_action; - struct tc_action red_action; - int coloraware; - } trtcm; - struct { - u_int32_t cmtd_rate; - u_int32_t peak_rate; - u_int32_t avg_interval; - struct tc_action green_action; - struct tc_action yellow_action; - struct tc_action red_action; - } tswtcm; - } tce_un; -}; - -u_long cdnr_name2handle(const char *ifname, const char *cdnr_name); - -int qcmd_cdnr_add_element(struct tc_action *rp, const char *ifname, - const char *cdnr_name, struct tc_action *action); -int qcmd_cdnr_add_tbmeter(struct tc_action *rp, const char *ifname, - const char *cdnr_name, - struct tb_profile *profile, - struct tc_action *in_action, - struct tc_action *out_action); -int qcmd_cdnr_add_trtcm(struct tc_action *rp, const char *ifname, - const char *cdnr_name, - struct tb_profile *cmtd_profile, - struct tb_profile *peak_profile, - struct tc_action *green_action, - struct tc_action *yellow_action, - struct tc_action *red_action, int coloraware); -int qcmd_cdnr_add_tswtcm(struct tc_action *rp, const char *ifname, - const char *cdnr_name, const u_int32_t cmtd_rate, - const u_int32_t peak_rate, - const u_int32_t avg_interval, - struct tc_action *green_action, - struct tc_action *yellow_action, - struct tc_action *red_action); -int qcmd_cdnr_delete(const char *ifname, const char *cdnr_name); -int qcmd_nop_add_if(const char *ifname); - -int qop_add_cdnr(struct classinfo **rp, const char *cdnr_name, - struct ifinfo *ifinfo, struct classinfo **childlist, - void *cdnr_private); -int qop_delete_cdnr(struct classinfo *clinfo); -int qop_cdnr_add_element(struct classinfo **rp, const char *cdnr_name, - struct ifinfo *ifinfo, struct tc_action *action); -int qop_cdnr_add_tbmeter(struct classinfo **rp, const char *cdnr_name, - struct ifinfo *ifinfo, struct tb_profile *profile, - struct tc_action *in_action, struct tc_action *out_action); -int qop_cdnr_add_trtcm(struct classinfo **rp, const char *cdnr_name, - struct ifinfo *ifinfo, - struct tb_profile *cmtd_profile, struct tb_profile *peak_profile, - struct tc_action *green_action, struct tc_action *yellow_action, - struct tc_action *red_action, int colorware); -int qop_cdnr_add_tswtcm(struct classinfo **rp, const char *cdnr_name, - struct ifinfo *ifinfo, const u_int32_t cmtd_rate, - const u_int32_t peak_rate, - const u_int32_t avg_interval, - struct tc_action *green_action, - struct tc_action *yellow_action, - struct tc_action *red_action); -int qop_cdnr_modify_tbmeter(struct classinfo *clinfo, - struct tb_profile *profile); -int qop_cdnr_modify_trtcm(struct classinfo *clinfo, - struct tb_profile *cmtd_profile, - struct tb_profile *peak_profile, int coloraware); -int qop_cdnr_modify_tswtcm(struct classinfo *clinfo, - const u_int32_t cmtd_rate, - const u_int32_t peak_rate, - const u_int32_t avg_interval); diff --git a/usr.sbin/altq/libaltq/qop_conf.c b/usr.sbin/altq/libaltq/qop_conf.c deleted file mode 100644 index 70557c91642..00000000000 --- a/usr.sbin/altq/libaltq/qop_conf.c +++ /dev/null @@ -1,67 +0,0 @@ -/* $OpenBSD: qop_conf.c,v 1.1.1.1 2001/06/27 18:23:30 kjc Exp $ */ -/* $KAME: qop_conf.c,v 1.2 2000/10/18 09:15:19 kjc Exp $ */ -/* - * Copyright (C) 1999-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. - */ - -#include <sys/param.h> -#include <sys/socket.h> -#include <net/if.h> -#include <stdio.h> - -#include <altq/altq.h> -#include "altq_qop.h" - -typedef int (interface_parser_t)(const char *, int, char **); -typedef int (class_parser_t)(const char *, const char *, const char *, - int, char **); - -extern interface_parser_t null_interface_parser; -extern class_parser_t null_class_parser; -extern interface_parser_t cbq_interface_parser; -extern class_parser_t cbq_class_parser; -extern interface_parser_t hfsc_interface_parser; -extern class_parser_t hfsc_class_parser; -extern interface_parser_t red_interface_parser; -extern interface_parser_t rio_interface_parser; -extern interface_parser_t blue_interface_parser; -extern interface_parser_t wfq_interface_parser; -extern interface_parser_t fifoq_interface_parser; -extern interface_parser_t priq_interface_parser; -extern class_parser_t priq_class_parser; - -struct qdisc_parser qdisc_parser[] = { - {"null", null_interface_parser, null_class_parser}, - {"cbq", cbq_interface_parser, cbq_class_parser}, - {"hfsc", hfsc_interface_parser, hfsc_class_parser}, - {"red", red_interface_parser, NULL}, - {"rio", rio_interface_parser, NULL}, - {"blue", blue_interface_parser, NULL}, - {"wfq", wfq_interface_parser, NULL}, - {"fifoq", fifoq_interface_parser, NULL}, - {"priq", priq_interface_parser, priq_class_parser}, - {NULL, NULL, NULL} -}; - diff --git a/usr.sbin/altq/libaltq/qop_dummy.c b/usr.sbin/altq/libaltq/qop_dummy.c deleted file mode 100644 index 9deece6caee..00000000000 --- a/usr.sbin/altq/libaltq/qop_dummy.c +++ /dev/null @@ -1,187 +0,0 @@ -/* $OpenBSD: qop_dummy.c,v 1.3 2001/12/03 08:38:48 kjc Exp $ */ -/* $KAME: qop_dummy.c,v 1.4 2001/08/16 10:39:14 kjc Exp $ */ -/* - * Copyright (C) 1999-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. - */ - -#include <sys/param.h> -#include <sys/socket.h> -#include <net/if.h> -#include <stdio.h> -#include <string.h> -#include <errno.h> -#include <syslog.h> - -#include <altq/altq.h> -#include "altq_qop.h" - -int null_interface_parser(const char *, int, char **); -int null_class_parser(const char *, const char *, const char *, int, char **); -int qcmd_nop_add_if(const char *); -static int nop_attach(struct ifinfo *); -static int nop_detach(struct ifinfo *); -static int nop_clear(struct ifinfo *); -static int nop_enable(struct ifinfo *); -static int nop_disable(struct ifinfo *); -static int nop_add_class(struct classinfo *); -static int nop_modify_class(struct classinfo *, void *); -static int nop_delete_class(struct classinfo *); -static int nop_add_filter(struct fltrinfo *); -static int nop_delete_filter(struct fltrinfo *); - -struct qdisc_ops nop_qdisc = { - ALTQT_NONE, - "nop", - nop_attach, - nop_detach, - nop_clear, - nop_enable, - nop_disable, - nop_add_class, - nop_modify_class, - nop_delete_class, - nop_add_filter, - nop_delete_filter, -}; - -#define EQUAL(s1, s2) (strcmp((s1), (s2)) == 0) - -/* - * parser interface for null interface - */ -int -null_interface_parser(const char *ifname, int argc, char **argv) -{ - u_int bandwidth = 0; - u_int tbrsize = 0; - - /* - * process options - */ - while (argc > 0) { - if (EQUAL(*argv, "bandwidth")) { - argc--; argv++; - if (argc > 0) - bandwidth = atobps(*argv); - } else if (EQUAL(*argv, "tbrsize")) { - argc--; argv++; - if (argc > 0) - tbrsize = atobytes(*argv); - } else { - LOG(LOG_ERR, 0, "Unknown keyword '%s'", *argv); - return (0); - } - argc--; argv++; - } - - if (bandwidth != 0) - if (qcmd_tbr_register(ifname, bandwidth, tbrsize) != 0) - return (0); - - /* - * add a dummy interface since traffic conditioner might need it. - */ - if (qcmd_nop_add_if(ifname) != 0) - return (0); - return (1); -} - -int -null_class_parser(const char *ifname, const char *class_name, - const char *parent_name, int argc, char **argv) -{ - LOG(LOG_ERR, 0, - "class cannot be defined without a queueing discipline in %s, line %d", - altqconfigfile, line_no); - return (0); -} - -/* - * qcmd api - */ -int -qcmd_nop_add_if(const char *ifname) -{ - int error; - - error = qop_add_if(NULL, ifname, 0, &nop_qdisc, NULL); - if (error != 0) - LOG(LOG_ERR, errno, "%s: can't add nop on interface '%s'", - qoperror(error), ifname); - return (error); -} - -/* - * qop api - */ -static int nop_attach(struct ifinfo *ifinfo) -{ - return (0); -} - -static int nop_detach(struct ifinfo *ifinfo) -{ - return (0); -} - -static int nop_clear(struct ifinfo *ifinfo) -{ - return (0); -} - -static int nop_enable(struct ifinfo *ifinfo) -{ - return (0); -} - -static int nop_disable(struct ifinfo *ifinfo) -{ - return (0); -} - -static int nop_add_class(struct classinfo *clinfo) -{ - return (0); -} - -static int nop_modify_class(struct classinfo *clinfo, void *arg) -{ - return (0); -} - -static int nop_delete_class(struct classinfo *clinfo) -{ - return (0); -} - -static int nop_add_filter(struct fltrinfo *fltrinfo) -{ - return (0); -} - -static int nop_delete_filter(struct fltrinfo *fltrinfo) -{ - return (0); -} diff --git a/usr.sbin/altq/libaltq/qop_errlist.c b/usr.sbin/altq/libaltq/qop_errlist.c deleted file mode 100644 index b51d5d19c94..00000000000 --- a/usr.sbin/altq/libaltq/qop_errlist.c +++ /dev/null @@ -1,49 +0,0 @@ -/* $OpenBSD: qop_errlist.c,v 1.1.1.1 2001/06/27 18:23:22 kjc Exp $ */ -/* $KAME: qop_errlist.c,v 1.2 2000/10/18 09:15:19 kjc Exp $ */ -/* - * Copyright (C) 1999-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. - */ - -const char *qop_errlist[] = { - "no error", /* 0 */ - "syscall error", /* 1 */ - "no memory", /* 2 */ - "invalid parameter", /* 3 */ - "out of range", /* 4 */ - "bad interface", /* 5 */ - "bad class", /* 6 */ - "bad filter", /* 7 */ - "class error", /* 8 */ - "bad class value", /* 9 */ - "class operation not permitted", /* 10 */ - "filter error", /* 11 */ - "bad filter value", /* 12 */ - "filter shadows an existing filter", /* 13 */ - "admission failure", /* 14 */ - "admission failure (no bandwidth)", /* 15 */ - "admission failure (delay)", /* 16 */ - "admission failure (no service)", /* 17 */ - "policy error", /* 18 */ -}; diff --git a/usr.sbin/altq/libaltq/qop_fifoq.c b/usr.sbin/altq/libaltq/qop_fifoq.c deleted file mode 100644 index e47fcddfded..00000000000 --- a/usr.sbin/altq/libaltq/qop_fifoq.c +++ /dev/null @@ -1,246 +0,0 @@ -/* $OpenBSD: qop_fifoq.c,v 1.3 2001/12/03 08:38:48 kjc Exp $ */ -/* $KAME: qop_fifoq.c,v 1.5 2001/08/16 10:39:14 kjc Exp $ */ -/* - * Copyright (C) 1999-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. - */ - -#include <sys/param.h> -#include <sys/socket.h> -#include <sys/sockio.h> -#include <sys/ioctl.h> -#include <sys/fcntl.h> -#include <net/if.h> -#include <netinet/in.h> -#include <arpa/inet.h> - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <stddef.h> -#include <string.h> -#include <ctype.h> -#include <errno.h> -#include <syslog.h> -#include <netdb.h> - -#include <altq/altq.h> -#include <altq/altq_fifoq.h> -#include "altq_qop.h" -#include "qop_fifoq.h" - -static int fifoq_attach(struct ifinfo *); -static int fifoq_detach(struct ifinfo *); -static int fifoq_enable(struct ifinfo *); -static int fifoq_disable(struct ifinfo *); - -#define FIFOQ_DEVICE "/dev/altq/fifoq" - -static int fifoq_fd = -1; -static int fifoq_refcount = 0; - -static struct qdisc_ops fifoq_qdisc = { - ALTQT_FIFOQ, - "fifoq", - fifoq_attach, - fifoq_detach, - NULL, /* clear */ - fifoq_enable, - fifoq_disable, - NULL, /* add class */ - NULL, /* modify class */ - NULL, /* delete class */ - NULL, /* add filter */ - NULL /* delete filter */ -}; - -/* - * parser interface - */ -#define EQUAL(s1, s2) (strcmp((s1), (s2)) == 0) - -int -fifoq_interface_parser(const char *ifname, int argc, char **argv) -{ - u_int bandwidth = 100000000; /* 100Mbps */ - u_int tbrsize = 0; - int qlimit = 50; - - /* - * process options - */ - while (argc > 0) { - if (EQUAL(*argv, "bandwidth")) { - argc--; argv++; - if (argc > 0) - bandwidth = atobps(*argv); - } else if (EQUAL(*argv, "tbrsize")) { - argc--; argv++; - if (argc > 0) - tbrsize = atobytes(*argv); - } else if (EQUAL(*argv, "qlimit")) { - argc--; argv++; - if (argc > 0) - qlimit = (int)strtol(*argv, NULL, 0); - } else if (EQUAL(*argv, "fifoq")) { - /* just skip */ - } else { - LOG(LOG_ERR, 0, "Unknown keyword '%s'", *argv); - return (0); - } - argc--; argv++; - } - - if (qcmd_tbr_register(ifname, bandwidth, tbrsize) != 0) - return (0); - - if (qcmd_fifoq_add_if(ifname, bandwidth, qlimit) != 0) - return (0); - return (1); -} - -/* - * qcmd api - */ -int -qcmd_fifoq_add_if(const char *ifname, u_int bandwidth, int qlimit) -{ - int error; - - error = qop_fifoq_add_if(NULL, ifname, bandwidth, qlimit); - if (error != 0) - LOG(LOG_ERR, errno, "%s: can't add fifoq on interface '%s'", - qoperror(error), ifname); - return (error); -} - -/* - * qop api - */ -int -qop_fifoq_add_if(struct ifinfo **rp, const char *ifname, - u_int bandwidth, int qlimit) -{ - struct ifinfo *ifinfo = NULL; - struct fifoq_ifinfo *fifoq_ifinfo; - int error; - - if ((fifoq_ifinfo = calloc(1, sizeof(*fifoq_ifinfo))) == NULL) - return (QOPERR_NOMEM); - fifoq_ifinfo->qlimit = qlimit; - - error = qop_add_if(&ifinfo, ifname, bandwidth, - &fifoq_qdisc, fifoq_ifinfo); - if (error != 0) { - free(fifoq_ifinfo); - return (error); - } - - if (rp != NULL) - *rp = ifinfo; - return (0); -} - -/* - * system call interfaces for qdisc_ops - */ -static int -fifoq_attach(struct ifinfo *ifinfo) -{ - struct fifoq_interface iface; - struct fifoq_ifinfo *fifoq_ifinfo; - struct fifoq_conf conf; - - if (fifoq_fd < 0 && - (fifoq_fd = open(FIFOQ_DEVICE, O_RDWR)) < 0 && - (fifoq_fd = open_module(FIFOQ_DEVICE, O_RDWR)) < 0) { - LOG(LOG_ERR, errno, "FIFOQ open"); - return (QOPERR_SYSCALL); - } - - fifoq_refcount++; - memset(&iface, 0, sizeof(iface)); - strncpy(iface.fifoq_ifname, ifinfo->ifname, IFNAMSIZ); - - if (ioctl(fifoq_fd, FIFOQ_IF_ATTACH, &iface) < 0) - return (QOPERR_SYSCALL); - - /* set fifoq parameters */ - fifoq_ifinfo = (struct fifoq_ifinfo *)ifinfo->private; - if (fifoq_ifinfo->qlimit > 0) { - memset(&conf, 0, sizeof(conf)); - strncpy(conf.iface.fifoq_ifname, ifinfo->ifname, IFNAMSIZ); - conf.fifoq_limit = fifoq_ifinfo->qlimit; - if (ioctl(fifoq_fd, FIFOQ_CONFIG, &conf) < 0) - return (QOPERR_SYSCALL); - } -#if 1 - LOG(LOG_INFO, 0, "fifoq attached to %s", iface.fifoq_ifname); -#endif - return (0); -} - -static int -fifoq_detach(struct ifinfo *ifinfo) -{ - struct fifoq_interface iface; - - memset(&iface, 0, sizeof(iface)); - strncpy(iface.fifoq_ifname, ifinfo->ifname, IFNAMSIZ); - - if (ioctl(fifoq_fd, FIFOQ_IF_DETACH, &iface) < 0) - return (QOPERR_SYSCALL); - - if (--fifoq_refcount == 0) { - close(fifoq_fd); - fifoq_fd = -1; - } - return (0); -} - -static int -fifoq_enable(struct ifinfo *ifinfo) -{ - struct fifoq_interface iface; - - memset(&iface, 0, sizeof(iface)); - strncpy(iface.fifoq_ifname, ifinfo->ifname, IFNAMSIZ); - - if (ioctl(fifoq_fd, FIFOQ_ENABLE, &iface) < 0) - return (QOPERR_SYSCALL); - return (0); -} - -static int -fifoq_disable(struct ifinfo *ifinfo) -{ - struct fifoq_interface iface; - - memset(&iface, 0, sizeof(iface)); - strncpy(iface.fifoq_ifname, ifinfo->ifname, IFNAMSIZ); - - if (ioctl(fifoq_fd, FIFOQ_DISABLE, &iface) < 0) - return (QOPERR_SYSCALL); - return (0); -} diff --git a/usr.sbin/altq/libaltq/qop_fifoq.h b/usr.sbin/altq/libaltq/qop_fifoq.h deleted file mode 100644 index e2805d9cd28..00000000000 --- a/usr.sbin/altq/libaltq/qop_fifoq.h +++ /dev/null @@ -1,39 +0,0 @@ -/* $OpenBSD: qop_fifoq.h,v 1.1.1.1 2001/06/27 18:23:31 kjc Exp $ */ -/* $KAME: qop_fifoq.h,v 1.2 2000/10/18 09:15:19 kjc Exp $ */ -/* - * Copyright (C) 1999-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 private ifinfo structure - */ -struct fifoq_ifinfo { - int qlimit; /* max queue length */ -}; - -int fifoq_interface_parser(const char *ifname, int argc, char **argv); -int qcmd_fifoq_add_if(const char *ifname, u_int bandwidth, int qlimit); -int qop_fifoq_add_if(struct ifinfo **rp, const char *ifname, - u_int bandwidth, int qlimit); diff --git a/usr.sbin/altq/libaltq/qop_hfsc.c b/usr.sbin/altq/libaltq/qop_hfsc.c deleted file mode 100644 index 9a3ad333066..00000000000 --- a/usr.sbin/altq/libaltq/qop_hfsc.c +++ /dev/null @@ -1,1096 +0,0 @@ -/* $OpenBSD: qop_hfsc.c,v 1.4 2002/09/08 09:09:54 kjc Exp $ */ -/* $KAME: qop_hfsc.c,v 1.6 2001/08/16 10:39:14 kjc Exp $ */ -/* - * Copyright (C) 1999-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. - */ - -#include <sys/param.h> -#include <sys/socket.h> -#include <sys/sockio.h> -#include <sys/ioctl.h> -#include <sys/fcntl.h> -#include <net/if.h> -#include <netinet/in.h> -#include <arpa/inet.h> - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <stddef.h> -#include <string.h> -#include <ctype.h> -#include <errno.h> -#include <syslog.h> -#include <netdb.h> -#include <math.h> - -#include <altq/altq.h> -#include <altq/altq_hfsc.h> -#include "altq_qop.h" -#include "qop_hfsc.h" - -static int read_sc(int *, char ***, int *, u_int *, u_int *, u_int *); -static int qop_hfsc_enable_hook(struct ifinfo *); -static int qop_hfsc_delete_class_hook(struct classinfo *); -static int validate_sc(struct service_curve *); - -static void gsc_add_sc(struct gen_sc *, struct service_curve *); -static void gsc_sub_sc(struct gen_sc *, struct service_curve *); -static int is_gsc_under_sc(struct gen_sc *, struct service_curve *); -static void gsc_destroy(struct gen_sc *); -static struct segment *gsc_getentry(struct gen_sc *, double); -static int gsc_add_seg(struct gen_sc *, double, double, double, double); -static int gsc_sub_seg(struct gen_sc *, double, double, double, double); -static void gsc_compress(struct gen_sc *); -static double sc_x2y(struct service_curve *, double); - -static int hfsc_attach(struct ifinfo *); -static int hfsc_detach(struct ifinfo *); -static int hfsc_clear(struct ifinfo *); -static int hfsc_enable(struct ifinfo *); -static int hfsc_disable(struct ifinfo *); -static int hfsc_add_class(struct classinfo *); -static int hfsc_modify_class(struct classinfo *, void *); -static int hfsc_delete_class(struct classinfo *); -static int hfsc_add_filter(struct fltrinfo *); -static int hfsc_delete_filter(struct fltrinfo *); - -#define HFSC_DEVICE "/dev/altq/hfsc" - -static int hfsc_fd = -1; -static int hfsc_refcount = 0; - -static struct qdisc_ops hfsc_qdisc = { - ALTQT_HFSC, - "hfsc", - hfsc_attach, - hfsc_detach, - hfsc_clear, - hfsc_enable, - hfsc_disable, - hfsc_add_class, - hfsc_modify_class, - hfsc_delete_class, - hfsc_add_filter, - hfsc_delete_filter, -}; - -#define EQUAL(s1, s2) (strcmp((s1), (s2)) == 0) - -/* - * parser interface - */ -int -hfsc_interface_parser(const char *ifname, int argc, char **argv) -{ - u_int bandwidth = 100000000; /* 100Mbps */ - u_int tbrsize = 0; - int flags = 0; - - /* - * process options - */ - while (argc > 0) { - if (EQUAL(*argv, "bandwidth")) { - argc--; argv++; - if (argc > 0) - bandwidth = atobps(*argv); - } else if (EQUAL(*argv, "tbrsize")) { - argc--; argv++; - if (argc > 0) - tbrsize = atobytes(*argv); - } else if (EQUAL(*argv, "hfsc")) { - /* just skip */ - } else { - LOG(LOG_ERR, 0, "Unknown keyword '%s'", *argv); - return (0); - } - argc--; argv++; - } - - if (qcmd_tbr_register(ifname, bandwidth, tbrsize) != 0) - return (0); - - if (qcmd_hfsc_add_if(ifname, bandwidth, flags) != 0) - return (0); - return (1); -} - -int -hfsc_class_parser(const char *ifname, const char *class_name, - const char *parent_name, int argc, char **argv) -{ - u_int m1, d, m2, rm1, rd, rm2, fm1, fd, fm2; - int qlimit = 50; - int flags = 0, admission = 0; - int type = 0, error; - - rm1 = rd = rm2 = fm1 = fd = fm2 = 0; - while (argc > 0) { - if (*argv[0] == '[') { - if (read_sc(&argc, &argv, &type, &m1, &d, &m2) != 0) { - LOG(LOG_ERR, 0, - "Bad service curve in %s, line %d", - altqconfigfile, line_no); - return (0); - } - if (type & HFSC_REALTIMESC) { - rm1 = m1; rd = d; rm2 = m2; - } - if (type & HFSC_LINKSHARINGSC) { - fm1 = m1; fd = d; fm2 = m2; - } - } else if (EQUAL(*argv, "pshare")) { - argc--; argv++; - if (argc > 0) { - struct ifinfo *ifinfo; - u_int pshare; - - pshare = (u_int)strtoul(*argv, NULL, 0); - if ((ifinfo = ifname2ifinfo(ifname)) != NULL) { - fm2 = ifinfo->bandwidth / 100 * pshare; - type |= HFSC_LINKSHARINGSC; - } - } - } else if (EQUAL(*argv, "grate")) { - argc--; argv++; - if (argc > 0) { - rm2 = atobps(*argv); - type |= HFSC_REALTIMESC; - } - } else if (EQUAL(*argv, "qlimit")) { - argc--; argv++; - if (argc > 0) - qlimit = strtoul(*argv, NULL, 0); - } else if (EQUAL(*argv, "default")) { - flags |= HFCF_DEFAULTCLASS; - } else if (EQUAL(*argv, "admission")) { - argc--; argv++; - if (argc > 0) { - if (EQUAL(*argv, "guaranteed") - || EQUAL(*argv, "cntlload")) - admission = 1; - else if (EQUAL(*argv, "none")) { - /* nothing */ - } else { - LOG(LOG_ERR, 0, - "unknown admission type - %s, line %d", - *argv, line_no); - return (0); - } - } - } else if (EQUAL(*argv, "red")) { - flags |= HFCF_RED; - } else if (EQUAL(*argv, "ecn")) { - flags |= HFCF_ECN; - } else if (EQUAL(*argv, "rio")) { - flags |= HFCF_RIO; - } else if (EQUAL(*argv, "cleardscp")) { - flags |= HFCF_CLEARDSCP; - } else { - LOG(LOG_ERR, 0, - "Unknown keyword '%s' in %s, line %d", - *argv, altqconfigfile, line_no); - return (0); - } - - argc--; argv++; - } - - if (type == 0) { - LOG(LOG_ERR, 0, - "hfsc: service curve not specified in %s, line %d", - altqconfigfile, line_no); - return (0); - } - - if ((flags & HFCF_ECN) && (flags & (HFCF_RED|HFCF_RIO)) == 0) - flags |= HFCF_RED; - - /* - * if the link-sharing service curve is diffrent from - * the real-time service curve, we first create a class with the - * smaller service curve and then modify the other service curve. - */ - if (rm2 <= fm2) { - m1 = rm1; d = rd; m2 = rm2; - } else { - m1 = fm1; d = fd; m2 = fm2; - } - error = qcmd_hfsc_add_class(ifname, class_name, parent_name, - m1, d, m2, qlimit, flags); - - if (error == 0 && (rm1 != fm1 || rd != fd || rm2 != fm2)) { - if (rm2 <= fm2) { - m1 = fm1; d = fd; m2 = fm2; type = HFSC_LINKSHARINGSC; - } else { - m1 = rm1; d = rd; m2 = rm2; type = HFSC_REALTIMESC; - } - error = qcmd_hfsc_modify_class(ifname, class_name, - m1, d, m2, type); - } - - if (error == 0 && admission) { - /* this is a special class for rsvp */ - struct ifinfo *ifinfo = ifname2ifinfo(ifname); - struct classinfo *clinfo = clname2clinfo(ifinfo, class_name); - - if (ifinfo->resv_class != NULL) { - LOG(LOG_ERR, 0, - "more than one admission class specified: %s", - class_name); - return (0); - } - ifinfo->resv_class = clinfo; - } - - if (error) { - LOG(LOG_ERR, errno, "hfsc_class_parser: %s", - qoperror(error)); - return (0); - } - return (1); -} - -/* - * read service curve parameters - * '[' <type> <m1> <d> <m2> ']' - * type := "sc", "rt", or "ls" - */ -static int -read_sc(int *argcp, char ***argvp, int *type, u_int *m1, u_int *d, u_int *m2) -{ - int argc = *argcp; - char **argv = *argvp; - char *cp; - - cp = *argv; - if (*cp++ != '[') - return (-1); - if (*cp == '\0') { - cp = *++argv; --argc; - } - if (*cp == 's' || *cp == 'S') - *type = HFSC_DEFAULTSC; - else if (*cp == 'r' || *cp == 'R') - *type = HFSC_REALTIMESC; - else if (*cp == 'l' || *cp == 'L') - *type = HFSC_LINKSHARINGSC; - else - return (-1); - cp = *++argv; --argc; - *m1 = atobps(cp); - cp = *++argv; --argc; - *d = (u_int)strtoul(cp, NULL, 0); - cp = *++argv; --argc; - *m2 = atobps(cp); - if (strchr(cp, ']') == NULL) { - cp = *++argv; --argc; - if (*cp != ']') - return (-1); - } - *argcp = argc; - *argvp = argv; - return (0); -} - -/* - * qcmd api - */ -int -qcmd_hfsc_add_if(const char *ifname, u_int bandwidth, int flags) -{ - int error; - - error = qop_hfsc_add_if(NULL, ifname, bandwidth, flags); - if (error != 0) - LOG(LOG_ERR, errno, "%s: can't add hfsc on interface '%s'", - qoperror(error), ifname); - return (error); -} - -int -qcmd_hfsc_add_class(const char *ifname, const char *class_name, - const char *parent_name, u_int m1, u_int d, u_int m2, - int qlimit, int flags) -{ - struct ifinfo *ifinfo; - struct classinfo *parent = NULL; - struct service_curve sc; - int error = 0; - - if ((ifinfo = ifname2ifinfo(ifname)) == NULL) - error = QOPERR_BADIF; - - if (error == 0 && - (parent = clname2clinfo(ifinfo, parent_name)) == NULL) - error = QOPERR_BADCLASS; - - sc.m1 = m1; - sc.d = d; - sc.m2 = m2; - - if (error == 0) - error = qop_hfsc_add_class(NULL, class_name, ifinfo, parent, - &sc, qlimit, flags); - if (error != 0) - LOG(LOG_ERR, errno, - "hfsc: %s: can't add class '%s' on interface '%s'", - qoperror(error), class_name, ifname); - return (error); -} - -int -qcmd_hfsc_modify_class(const char *ifname, const char *class_name, - u_int m1, u_int d, u_int m2, int sctype) -{ - struct ifinfo *ifinfo; - struct classinfo *clinfo; - struct service_curve sc; - - if ((ifinfo = ifname2ifinfo(ifname)) == NULL) - return (QOPERR_BADIF); - - if ((clinfo = clname2clinfo(ifinfo, class_name)) == NULL) - return (QOPERR_BADCLASS); - - sc.m1 = m1; - sc.d = d; - sc.m2 = m2; - - return qop_hfsc_modify_class(clinfo, &sc, sctype); -} - -/* - * qop api - */ -int -qop_hfsc_add_if(struct ifinfo **rp, const char *ifname, - u_int bandwidth, int flags) -{ - struct ifinfo *ifinfo = NULL; - struct hfsc_ifinfo *hfsc_ifinfo = NULL; - struct service_curve sc; - int error; - - if ((hfsc_ifinfo = calloc(1, sizeof(*hfsc_ifinfo))) == NULL) - return (QOPERR_NOMEM); - - error = qop_add_if(&ifinfo, ifname, bandwidth, - &hfsc_qdisc, hfsc_ifinfo); - if (error != 0) - goto err_ret; - - /* set enable hook */ - ifinfo->enable_hook = qop_hfsc_enable_hook; - - /* create a dummy root class */ - sc.m1 = bandwidth; - sc.d = 0; - sc.m2 = bandwidth; - if ((error = qop_hfsc_add_class(&hfsc_ifinfo->root_class, "root", - ifinfo, NULL, &sc, 0, 0)) != 0) { - LOG(LOG_ERR, errno, - "hfsc: %s: can't create dummy root class on %s!", - qoperror(error), ifname); - (void)qop_delete_if(ifinfo); - return (QOPERR_CLASS); - } - - if (rp != NULL) - *rp = ifinfo; - return (0); - - err_ret: - if (hfsc_ifinfo != NULL) { - free(hfsc_ifinfo); - if (ifinfo != NULL) - ifinfo->private = NULL; - } - return (error); -} - -#define is_sc_null(sc) (((sc) == NULL) || ((sc)->m1 == 0 && (sc)->m2 == 0)) - -int -qop_hfsc_add_class(struct classinfo **rp, const char *class_name, - struct ifinfo *ifinfo, struct classinfo *parent, - struct service_curve *sc, int qlimit, int flags) -{ - struct classinfo *clinfo; - struct hfsc_ifinfo *hfsc_ifinfo; - struct hfsc_classinfo *hfsc_clinfo = NULL, *parent_clinfo = NULL; - int error; - - hfsc_ifinfo = ifinfo->private; - if ((flags & HFCF_DEFAULTCLASS) && hfsc_ifinfo->default_class != NULL) - return (QOPERR_CLASS_INVAL); - - if (validate_sc(sc) != 0) - return (QOPERR_INVAL); - - /* admission control */ - if (parent != NULL && !is_sc_null(sc)) { - parent_clinfo = parent->private; - gsc_add_sc(&parent_clinfo->gen_rsc, sc); - gsc_add_sc(&parent_clinfo->gen_fsc, sc); - if (!is_gsc_under_sc(&parent_clinfo->gen_rsc, - &parent_clinfo->rsc) || - !is_gsc_under_sc(&parent_clinfo->gen_fsc, - &parent_clinfo->fsc)) { - /* admission control failure */ - error = QOPERR_ADMISSION_NOBW; - goto err_ret; - } - } - - if ((hfsc_clinfo = calloc(1, sizeof(*hfsc_clinfo))) == NULL) { - error = QOPERR_NOMEM; - goto err_ret; - } - - hfsc_clinfo->rsc = *sc; - hfsc_clinfo->fsc = *sc; - LIST_INIT(&hfsc_clinfo->gen_rsc); - LIST_INIT(&hfsc_clinfo->gen_fsc); - hfsc_clinfo->qlimit = qlimit; - hfsc_clinfo->flags = flags; - - if ((error = qop_add_class(&clinfo, class_name, ifinfo, parent, - hfsc_clinfo)) != 0) - goto err_ret; - - /* set delete hook */ - clinfo->delete_hook = qop_hfsc_delete_class_hook; - - if (flags & HFCF_DEFAULTCLASS) - hfsc_ifinfo->default_class = clinfo; - - if (parent == NULL) { - /* - * if this is a root class, reserve 20% of the real-time - * bandwidth for safety. - * many network cards are not able to saturate the wire, - * and if we allocate real-time traffic more than the - * maximum sending rate of the card, hfsc is no longer - * able to meet the delay bound requirements. - */ - hfsc_clinfo->rsc.m1 = hfsc_clinfo->rsc.m1 / 10 * 8; - hfsc_clinfo->rsc.m2 = hfsc_clinfo->rsc.m2 / 10 * 8; - } - - if (rp != NULL) - *rp = clinfo; - return (0); - - err_ret: - /* cancel admission control */ - if (parent != NULL && !is_sc_null(sc)) { - gsc_sub_sc(&parent_clinfo->gen_rsc, sc); - gsc_sub_sc(&parent_clinfo->gen_fsc, sc); - } - - if (hfsc_clinfo != NULL) { - free(hfsc_clinfo); - clinfo->private = NULL; - } - - return (error); -} - -/* - * this is called from qop_delete_class() before a class is destroyed - * for discipline specific cleanup. - */ -static int -qop_hfsc_delete_class_hook(struct classinfo *clinfo) -{ - struct hfsc_classinfo *hfsc_clinfo, *parent_clinfo; - - hfsc_clinfo = clinfo->private; - - /* cancel admission control */ - if (clinfo->parent != NULL) { - parent_clinfo = clinfo->parent->private; - - gsc_sub_sc(&parent_clinfo->gen_rsc, &hfsc_clinfo->rsc); - gsc_sub_sc(&parent_clinfo->gen_fsc, &hfsc_clinfo->fsc); - } - - gsc_destroy(&hfsc_clinfo->gen_rsc); - gsc_destroy(&hfsc_clinfo->gen_fsc); - return (0); -} - -int -qop_hfsc_modify_class(struct classinfo *clinfo, - struct service_curve *sc, int sctype) -{ - struct hfsc_classinfo *hfsc_clinfo, *parent_clinfo; - struct service_curve rsc, fsc; - int error; - - if (validate_sc(sc) != 0) - return (QOPERR_INVAL); - - hfsc_clinfo = clinfo->private; - if (clinfo->parent == NULL) - return (QOPERR_CLASS_INVAL); - parent_clinfo = clinfo->parent->private; - - /* save old service curves */ - rsc = hfsc_clinfo->rsc; - fsc = hfsc_clinfo->fsc; - - /* admission control */ - if (sctype & HFSC_REALTIMESC) { - if (!is_gsc_under_sc(&hfsc_clinfo->gen_rsc, sc)) { - /* admission control failure */ - return (QOPERR_ADMISSION); - } - - gsc_sub_sc(&parent_clinfo->gen_rsc, &hfsc_clinfo->rsc); - gsc_add_sc(&parent_clinfo->gen_rsc, sc); - if (!is_gsc_under_sc(&parent_clinfo->gen_rsc, - &parent_clinfo->rsc)) { - /* admission control failure */ - gsc_sub_sc(&parent_clinfo->gen_rsc, sc); - gsc_add_sc(&parent_clinfo->gen_rsc, &hfsc_clinfo->rsc); - return (QOPERR_ADMISSION_NOBW); - } - hfsc_clinfo->rsc = *sc; - } - if (sctype & HFSC_LINKSHARINGSC) { - if (!is_gsc_under_sc(&hfsc_clinfo->gen_fsc, sc)) { - /* admission control failure */ - return (QOPERR_ADMISSION); - } - - gsc_sub_sc(&parent_clinfo->gen_fsc, &hfsc_clinfo->fsc); - gsc_add_sc(&parent_clinfo->gen_fsc, sc); - if (!is_gsc_under_sc(&parent_clinfo->gen_fsc, - &parent_clinfo->fsc)) { - /* admission control failure */ - gsc_sub_sc(&parent_clinfo->gen_fsc, sc); - gsc_add_sc(&parent_clinfo->gen_fsc, &hfsc_clinfo->fsc); - return (QOPERR_ADMISSION_NOBW); - } - hfsc_clinfo->fsc = *sc; - } - - error = qop_modify_class(clinfo, (void *)((long)sctype)); - if (error == 0) - return (0); - - /* modify failed!, restore the old service curves */ - if (sctype & HFSC_REALTIMESC) { - gsc_sub_sc(&parent_clinfo->gen_rsc, sc); - gsc_add_sc(&parent_clinfo->gen_rsc, &rsc); - hfsc_clinfo->rsc = rsc; - } - if (sctype & HFSC_LINKSHARINGSC) { - gsc_sub_sc(&parent_clinfo->gen_fsc, sc); - gsc_add_sc(&parent_clinfo->gen_fsc, &fsc); - hfsc_clinfo->fsc = fsc; - } - return (error); -} - -/* - * sanity check at enabling hfsc: - * 1. there must one default class for an interface - * 2. the default class must be a leaf class - * 3. an internal class should not have filters - * (rule 2 and 3 are due to the fact that the hfsc link-sharing algorithm - * do not schedule internal classes.) - */ -static int -qop_hfsc_enable_hook(struct ifinfo *ifinfo) -{ - struct hfsc_ifinfo *hfsc_ifinfo; - struct classinfo *clinfo; - - hfsc_ifinfo = ifinfo->private; - if (hfsc_ifinfo->default_class == NULL) { - LOG(LOG_ERR, 0, "hfsc: no default class on interface %s!", - ifinfo->ifname); - return (QOPERR_CLASS); - } else if (hfsc_ifinfo->default_class->child != NULL) { - LOG(LOG_ERR, 0, "hfsc: default class on %s must be a leaf!", - ifinfo->ifname); - return (QOPERR_CLASS); - } - - LIST_FOREACH(clinfo, &ifinfo->cllist, next) { - if (clinfo->child != NULL && !LIST_EMPTY(&clinfo->fltrlist)) { - LOG(LOG_ERR, 0, - "hfsc: internal class \"%s\" should not have a filter!", - clinfo->clname); - return (QOPERR_CLASS); - } - } - - return (0); -} - -static int -validate_sc(struct service_curve *sc) -{ - /* the 1st segment of a concave curve must be zero */ - if (sc->m1 < sc->m2 && sc->m1 != 0) { - LOG(LOG_ERR, 0, "m1 must be 0 for convex!"); - return (-1); - } - return (0); -} - -/* - * admission control using generalized service curve - */ -#define INFINITY HUGE_VAL /* positive infinity defined in <math.h> */ - -/* add a new service curve to a generilized service curve */ -static void -gsc_add_sc(struct gen_sc *gsc, struct service_curve *sc) -{ - if (is_sc_null(sc)) - return; - if (sc->d != 0) - gsc_add_seg(gsc, 0, 0, (double)sc->d, (double)sc->m1); - gsc_add_seg(gsc, (double)sc->d, 0, INFINITY, (double)sc->m2); -} - -/* subtract a service curve from a generilized service curve */ -static void -gsc_sub_sc(struct gen_sc *gsc, struct service_curve *sc) -{ - if (is_sc_null(sc)) - return; - if (sc->d != 0) - gsc_sub_seg(gsc, 0, 0, (double)sc->d, (double)sc->m1); - gsc_sub_seg(gsc, (double)sc->d, 0, INFINITY, (double)sc->m2); -} - -/* - * check whether all points of a generalized service curve have - * their y-coordinates no larger than a given two-piece linear - * service curve. - */ -static int -is_gsc_under_sc(struct gen_sc *gsc, struct service_curve *sc) -{ - struct segment *s, *last, *end; - double y; - - if (is_sc_null(sc)) { - if (LIST_EMPTY(gsc)) - return (1); - LIST_FOREACH(s, gsc, _next) { - if (s->m != 0) - return (0); - } - return (1); - } - /* - * gsc has a dummy entry at the end with x = INFINITY. - * loop through up to this dummy entry. - */ - end = gsc_getentry(gsc, INFINITY); - if (end == NULL) - return (1); - last = NULL; - for (s = LIST_FIRST(gsc); s != end; s = LIST_NEXT(s, _next)) { - if (s->y > sc_x2y(sc, s->x)) - return (0); - last = s; - } - /* last now holds the real last segment */ - if (last == NULL) - return (1); - if (last->m > sc->m2) - return (0); - if (last->x < sc->d && last->m > sc->m1) { - y = last->y + (sc->d - last->x) * last->m; - if (y > sc_x2y(sc, sc->d)) - return (0); - } - return (1); -} - -static void -gsc_destroy(struct gen_sc *gsc) -{ - struct segment *s; - - while ((s = LIST_FIRST(gsc)) != NULL) { - LIST_REMOVE(s, _next); - free(s); - } -} - -/* - * return a segment entry starting at x. - * if gsc has no entry starting at x, a new entry is created at x. - */ -static struct segment * -gsc_getentry(struct gen_sc *gsc, double x) -{ - struct segment *new, *prev, *s; - - prev = NULL; - LIST_FOREACH(s, gsc, _next) { - if (s->x == x) - return (s); /* matching entry found */ - else if (s->x < x) - prev = s; - else - break; - } - - /* we have to create a new entry */ - if ((new = calloc(1, sizeof(struct segment))) == NULL) - return (NULL); - - new->x = x; - if (x == INFINITY || s == NULL) - new->d = 0; - else if (s->x == INFINITY) - new->d = INFINITY; - else - new->d = s->x - x; - if (prev == NULL) { - /* insert the new entry at the head of the list */ - new->y = 0; - new->m = 0; - LIST_INSERT_HEAD(gsc, new, _next); - } else { - /* - * the start point intersects with the segment pointed by - * prev. divide prev into 2 segments - */ - if (x == INFINITY) { - prev->d = INFINITY; - if (prev->m == 0) - new->y = prev->y; - else - new->y = INFINITY; - } else { - prev->d = x - prev->x; - new->y = prev->d * prev->m + prev->y; - } - new->m = prev->m; - LIST_INSERT_AFTER(prev, new, _next); - } - return (new); -} - -/* add a segment to a generalized service curve */ -static int -gsc_add_seg(struct gen_sc *gsc, double x, double y, double d, double m) -{ - struct segment *start, *end, *s; - double x2; - - if (d == INFINITY) - x2 = INFINITY; - else - x2 = x + d; - start = gsc_getentry(gsc, x); - end = gsc_getentry(gsc, x2); - if (start == NULL || end == NULL) - return (-1); - - for (s = start; s != end; s = LIST_NEXT(s, _next)) { - s->m += m; - s->y += y + (s->x - x) * m; - } - - end = gsc_getentry(gsc, INFINITY); - for (; s != end; s = LIST_NEXT(s, _next)) { - s->y += m * d; - } - - return (0); -} - -/* subtract a segment from a generalized service curve */ -static int -gsc_sub_seg(struct gen_sc *gsc, double x, double y, double d, double m) -{ - if (gsc_add_seg(gsc, x, y, d, -m) < 0) - return (-1); - gsc_compress(gsc); - return (0); -} - -/* - * collapse adjacent segments with the same slope - */ -static void -gsc_compress(struct gen_sc *gsc) -{ - struct segment *s, *next; - - again: - LIST_FOREACH(s, gsc, _next) { - - if ((next = LIST_NEXT(s, _next)) == NULL) { - if (LIST_FIRST(gsc) == s && s->m == 0) { - /* - * if this is the only entry and its - * slope is 0, it's a remaining dummy - * entry. we can discard it. - */ - LIST_REMOVE(s, _next); - free(s); - } - break; - } - - if (s->x == next->x) { - /* discard this entry */ - LIST_REMOVE(s, _next); - free(s); - goto again; - } else if (s->m == next->m) { - /* join the two entries */ - if (s->d != INFINITY && next->d != INFINITY) - s->d += next->d; - LIST_REMOVE(next, _next); - free(next); - goto again; - } - } -} - -/* get y-projection of a service curve */ -static double -sc_x2y(struct service_curve *sc, double x) -{ - double y; - - if (x <= (double)sc->d) - /* y belongs to the 1st segment */ - y = x * (double)sc->m1; - else - /* y belongs to the 2nd segment */ - y = (double)sc->d * (double)sc->m1 - + (x - (double)sc->d) * (double)sc->m2; - return (y); -} - -/* - * system call interfaces for qdisc_ops - */ -static int -hfsc_attach(struct ifinfo *ifinfo) -{ - struct hfsc_attach attach; - - if (hfsc_fd < 0 && - (hfsc_fd = open(HFSC_DEVICE, O_RDWR)) < 0 && - (hfsc_fd = open_module(HFSC_DEVICE, O_RDWR)) < 0) { - LOG(LOG_ERR, errno, "HFSC open"); - return (QOPERR_SYSCALL); - } - - hfsc_refcount++; - memset(&attach, 0, sizeof(attach)); - strncpy(attach.iface.hfsc_ifname, ifinfo->ifname, IFNAMSIZ); - attach.bandwidth = ifinfo->bandwidth; - - if (ioctl(hfsc_fd, HFSC_IF_ATTACH, &attach) < 0) - return (QOPERR_SYSCALL); - return (0); -} - -static int -hfsc_detach(struct ifinfo *ifinfo) -{ - struct hfsc_interface iface; - - memset(&iface, 0, sizeof(iface)); - strncpy(iface.hfsc_ifname, ifinfo->ifname, IFNAMSIZ); - - if (ioctl(hfsc_fd, HFSC_IF_DETACH, &iface) < 0) - return (QOPERR_SYSCALL); - - if (--hfsc_refcount == 0) { - close(hfsc_fd); - hfsc_fd = -1; - } - return (0); -} - -static int -hfsc_clear(struct ifinfo *ifinfo) -{ - struct hfsc_interface iface; - - memset(&iface, 0, sizeof(iface)); - strncpy(iface.hfsc_ifname, ifinfo->ifname, IFNAMSIZ); - - if (ioctl(hfsc_fd, HFSC_CLEAR_HIERARCHY, &iface) < 0) - return (QOPERR_SYSCALL); - return (0); -} - -static int -hfsc_enable(struct ifinfo *ifinfo) -{ - struct hfsc_interface iface; - - memset(&iface, 0, sizeof(iface)); - strncpy(iface.hfsc_ifname, ifinfo->ifname, IFNAMSIZ); - - if (ioctl(hfsc_fd, HFSC_ENABLE, &iface) < 0) - return (QOPERR_SYSCALL); - return (0); -} - -static int -hfsc_disable(struct ifinfo *ifinfo) -{ - struct hfsc_interface iface; - - memset(&iface, 0, sizeof(iface)); - strncpy(iface.hfsc_ifname, ifinfo->ifname, IFNAMSIZ); - - if (ioctl(hfsc_fd, HFSC_DISABLE, &iface) < 0) - return (QOPERR_SYSCALL); - return (0); -} - -static int -hfsc_add_class(struct classinfo *clinfo) -{ - struct hfsc_add_class class_add; - struct hfsc_classinfo *hfsc_clinfo; - struct hfsc_ifinfo *hfsc_ifinfo; - - /* root class is a dummy class */ - if (clinfo->parent == NULL) { - clinfo->handle = HFSC_ROOTCLASS_HANDLE; - return (0); - } - - hfsc_ifinfo = clinfo->ifinfo->private; - hfsc_clinfo = clinfo->private; - - memset(&class_add, 0, sizeof(class_add)); - strncpy(class_add.iface.hfsc_ifname, clinfo->ifinfo->ifname, IFNAMSIZ); - if (clinfo->parent == hfsc_ifinfo->root_class) - class_add.parent_handle = HFSC_ROOTCLASS_HANDLE; - else - class_add.parent_handle = clinfo->parent->handle; - class_add.service_curve = hfsc_clinfo->rsc; - class_add.qlimit = hfsc_clinfo->qlimit; - class_add.flags = hfsc_clinfo->flags; - if (ioctl(hfsc_fd, HFSC_ADD_CLASS, &class_add) < 0) { - clinfo->handle = HFSC_NULLCLASS_HANDLE; - return (QOPERR_SYSCALL); - } - clinfo->handle = class_add.class_handle; - return (0); -} - -static int -hfsc_modify_class(struct classinfo *clinfo, void *arg) -{ - struct hfsc_modify_class class_mod; - struct hfsc_classinfo *hfsc_clinfo; - long sctype; - - sctype = (long)arg; - hfsc_clinfo = clinfo->private; - - memset(&class_mod, 0, sizeof(class_mod)); - strncpy(class_mod.iface.hfsc_ifname, clinfo->ifinfo->ifname, IFNAMSIZ); - class_mod.class_handle = clinfo->handle; - if (sctype & HFSC_REALTIMESC) - class_mod.service_curve = hfsc_clinfo->rsc; - else if (sctype & HFSC_LINKSHARINGSC) - class_mod.service_curve = hfsc_clinfo->fsc; - else - return (QOPERR_INVAL); - class_mod.sctype = sctype; - - if (ioctl(hfsc_fd, HFSC_MOD_CLASS, &class_mod) < 0) - return (QOPERR_SYSCALL); - return (0); -} - -static int -hfsc_delete_class(struct classinfo *clinfo) -{ - struct hfsc_delete_class class_delete; - - if (clinfo->handle == HFSC_NULLCLASS_HANDLE || - clinfo->handle == HFSC_ROOTCLASS_HANDLE) - return (0); - - memset(&class_delete, 0, sizeof(class_delete)); - strncpy(class_delete.iface.hfsc_ifname, clinfo->ifinfo->ifname, - IFNAMSIZ); - class_delete.class_handle = clinfo->handle; - - if (ioctl(hfsc_fd, HFSC_DEL_CLASS, &class_delete) < 0) - return (QOPERR_SYSCALL); - return (0); -} - -static int -hfsc_add_filter(struct fltrinfo *fltrinfo) -{ - struct hfsc_add_filter fltr_add; - - memset(&fltr_add, 0, sizeof(fltr_add)); - strncpy(fltr_add.iface.hfsc_ifname, fltrinfo->clinfo->ifinfo->ifname, - IFNAMSIZ); - fltr_add.class_handle = fltrinfo->clinfo->handle; - fltr_add.filter = fltrinfo->fltr; - - if (ioctl(hfsc_fd, HFSC_ADD_FILTER, &fltr_add) < 0) - return (QOPERR_SYSCALL); - fltrinfo->handle = fltr_add.filter_handle; - return (0); -} - -static int -hfsc_delete_filter(struct fltrinfo *fltrinfo) -{ - struct hfsc_delete_filter fltr_del; - - memset(&fltr_del, 0, sizeof(fltr_del)); - strncpy(fltr_del.iface.hfsc_ifname, fltrinfo->clinfo->ifinfo->ifname, - IFNAMSIZ); - fltr_del.filter_handle = fltrinfo->handle; - - if (ioctl(hfsc_fd, HFSC_DEL_FILTER, &fltr_del) < 0) - return (QOPERR_SYSCALL); - return (0); -} - - diff --git a/usr.sbin/altq/libaltq/qop_hfsc.h b/usr.sbin/altq/libaltq/qop_hfsc.h deleted file mode 100644 index d4a32839aab..00000000000 --- a/usr.sbin/altq/libaltq/qop_hfsc.h +++ /dev/null @@ -1,79 +0,0 @@ -/* $OpenBSD: qop_hfsc.h,v 1.1.1.1 2001/06/27 18:23:33 kjc Exp $ */ -/* $KAME: qop_hfsc.h,v 1.2 2000/10/18 09:15:19 kjc Exp $ */ -/* - * Copyright (C) 1999-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. - */ - -#include <altq/altq_hfsc.h> - -/* - * generalized service curve used for admission control - */ -struct segment { - LIST_ENTRY(segment) _next; - double x, y, d, m; -}; - -typedef LIST_HEAD(gen_sc, segment) gsc_head_t; - -/* - * hfsc private ifinfo structure - */ -struct hfsc_ifinfo { - struct classinfo *root_class; /* root class */ - struct classinfo *default_class; /* default class */ -}; - -/* - * hfsc private classinfo structure - */ -struct hfsc_classinfo { - struct service_curve rsc; /* real-time service curve */ - struct service_curve fsc; /* fair service curve */ - gsc_head_t gen_rsc; /* generalized real-time sc */ - gsc_head_t gen_fsc; /* generalized fsc */ - int qlimit; - int flags; -}; - -int hfsc_interface_parser(const char *ifname, int argc, char **argv); -int hfsc_class_parser(const char *ifname, const char *class_name, - const char *parent_name, int argc, char **argv); - -int qcmd_hfsc_add_if(const char *ifname, u_int bandwidth, int flags); -int qcmd_hfsc_add_class(const char *ifname, const char *class_name, - const char *parent_name, u_int m1, u_int d, u_int m2, - int qlimit, int flags); -int qcmd_hfsc_modify_class(const char *ifname, const char *class_name, - u_int m1, u_int d, u_int m2, int sctype); - -int qop_hfsc_add_if(struct ifinfo **rp, const char *ifname, - u_int bandwidth, int flags); -int qop_hfsc_add_class(struct classinfo **rp, const char *class_name, - struct ifinfo *ifinfo, struct classinfo *parent, - struct service_curve *sc, int qlimit, int flags); -int qop_hfsc_modify_class(struct classinfo *clinfo, - struct service_curve *sc, int sctype); - diff --git a/usr.sbin/altq/libaltq/qop_priq.c b/usr.sbin/altq/libaltq/qop_priq.c deleted file mode 100644 index c3c0c212bf1..00000000000 --- a/usr.sbin/altq/libaltq/qop_priq.c +++ /dev/null @@ -1,524 +0,0 @@ -/* $OpenBSD: qop_priq.c,v 1.3 2001/12/03 08:38:48 kjc Exp $ */ -/* $KAME: qop_priq.c,v 1.3 2001/08/16 10:39:14 kjc Exp $ */ -/* - * Copyright (C) 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. - */ - -#include <sys/param.h> -#include <sys/socket.h> -#include <sys/sockio.h> -#include <sys/ioctl.h> -#include <sys/fcntl.h> -#include <net/if.h> -#include <netinet/in.h> -#include <arpa/inet.h> - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <stddef.h> -#include <string.h> -#include <ctype.h> -#include <errno.h> -#include <syslog.h> -#include <netdb.h> - -#include <altq/altq.h> -#include <altq/altq_priq.h> -#include "altq_qop.h" -#include "qop_priq.h" - -static int qop_priq_enable_hook(struct ifinfo *); - -static int priq_attach(struct ifinfo *); -static int priq_detach(struct ifinfo *); -static int priq_clear(struct ifinfo *); -static int priq_enable(struct ifinfo *); -static int priq_disable(struct ifinfo *); -static int priq_add_class(struct classinfo *); -static int priq_modify_class(struct classinfo *, void *); -static int priq_delete_class(struct classinfo *); -static int priq_add_filter(struct fltrinfo *); -static int priq_delete_filter(struct fltrinfo *); - -#define PRIQ_DEVICE "/dev/altq/priq" - -static int priq_fd = -1; -static int priq_refcount = 0; - -static struct qdisc_ops priq_qdisc = { - ALTQT_PRIQ, - "priq", - priq_attach, - priq_detach, - priq_clear, - priq_enable, - priq_disable, - priq_add_class, - priq_modify_class, - priq_delete_class, - priq_add_filter, - priq_delete_filter, -}; - -#define EQUAL(s1, s2) (strcmp((s1), (s2)) == 0) - -/* - * parser interface - */ -int -priq_interface_parser(const char *ifname, int argc, char **argv) -{ - u_int bandwidth = 100000000; /* 100Mbps */ - u_int tbrsize = 0; - int flags = 0; - - /* - * process options - */ - while (argc > 0) { - if (EQUAL(*argv, "bandwidth")) { - argc--; argv++; - if (argc > 0) - bandwidth = atobps(*argv); - } else if (EQUAL(*argv, "tbrsize")) { - argc--; argv++; - if (argc > 0) - tbrsize = atobytes(*argv); - } else if (EQUAL(*argv, "priq")) { - /* just skip */ - } else { - LOG(LOG_ERR, 0, "Unknown keyword '%s'", *argv); - return (0); - } - argc--; argv++; - } - - if (qcmd_tbr_register(ifname, bandwidth, tbrsize) != 0) - return (0); - - if (qcmd_priq_add_if(ifname, bandwidth, flags) != 0) - return (0); - return (1); -} - -int -priq_class_parser(const char *ifname, const char *class_name, - const char *parent_name, int argc, char **argv) -{ - int pri = 0, qlimit = 50; - int flags = 0, error; - - while (argc > 0) { - if (EQUAL(*argv, "priority")) { - argc--; argv++; - if (argc > 0) - pri = strtoul(*argv, NULL, 0); - } else if (EQUAL(*argv, "qlimit")) { - argc--; argv++; - if (argc > 0) - qlimit = strtoul(*argv, NULL, 0); - } else if (EQUAL(*argv, "default")) { - flags |= PRCF_DEFAULTCLASS; - } else if (EQUAL(*argv, "red")) { - flags |= PRCF_RED; - } else if (EQUAL(*argv, "ecn")) { - flags |= PRCF_ECN; - } else if (EQUAL(*argv, "rio")) { - flags |= PRCF_RIO; - } else if (EQUAL(*argv, "cleardscp")) { - flags |= PRCF_CLEARDSCP; - } else { - LOG(LOG_ERR, 0, - "Unknown keyword '%s' in %s, line %d", - *argv, altqconfigfile, line_no); - return (0); - } - - argc--; argv++; - } - - if ((flags & PRCF_ECN) && (flags & (PRCF_RED|PRCF_RIO)) == 0) - flags |= PRCF_RED; - - error = qcmd_priq_add_class(ifname, class_name, pri, qlimit, flags); - - if (error) { - LOG(LOG_ERR, errno, "priq_class_parser: %s", - qoperror(error)); - return (0); - } - return (1); -} - -/* - * qcmd api - */ -int -qcmd_priq_add_if(const char *ifname, u_int bandwidth, int flags) -{ - int error; - - error = qop_priq_add_if(NULL, ifname, bandwidth, flags); - if (error != 0) - LOG(LOG_ERR, errno, "%s: can't add priq on interface '%s'", - qoperror(error), ifname); - return (error); -} - -int -qcmd_priq_add_class(const char *ifname, const char *class_name, - int pri, int qlimit, int flags) -{ - struct ifinfo *ifinfo; - int error = 0; - - if ((ifinfo = ifname2ifinfo(ifname)) == NULL) - error = QOPERR_BADIF; - - if (error == 0) - error = qop_priq_add_class(NULL, class_name, ifinfo, - pri, qlimit, flags); - if (error != 0) - LOG(LOG_ERR, errno, - "priq: %s: can't add class '%s' on interface '%s'", - qoperror(error), class_name, ifname); - return (error); -} - -int -qcmd_priq_modify_class(const char *ifname, const char *class_name, - int pri, int qlimit, int flags) -{ - struct ifinfo *ifinfo; - struct classinfo *clinfo; - - if ((ifinfo = ifname2ifinfo(ifname)) == NULL) - return (QOPERR_BADIF); - - if ((clinfo = clname2clinfo(ifinfo, class_name)) == NULL) - return (QOPERR_BADCLASS); - - return qop_priq_modify_class(clinfo, pri, qlimit, flags); -} - -/* - * qop api - */ -int -qop_priq_add_if(struct ifinfo **rp, const char *ifname, - u_int bandwidth, int flags) -{ - struct ifinfo *ifinfo = NULL; - struct priq_ifinfo *priq_ifinfo = NULL; - int error; - - if ((priq_ifinfo = calloc(1, sizeof(*priq_ifinfo))) == NULL) - return (QOPERR_NOMEM); - - error = qop_add_if(&ifinfo, ifname, bandwidth, - &priq_qdisc, priq_ifinfo); - if (error != 0) - goto err_ret; - - /* set enable hook */ - ifinfo->enable_hook = qop_priq_enable_hook; - - if (rp != NULL) - *rp = ifinfo; - return (0); - - err_ret: - if (priq_ifinfo != NULL) { - free(priq_ifinfo); - if (ifinfo != NULL) - ifinfo->private = NULL; - } - return (error); -} - -int -qop_priq_add_class(struct classinfo **rp, const char *class_name, - struct ifinfo *ifinfo, int pri, int qlimit, int flags) -{ - struct classinfo *clinfo; - struct priq_ifinfo *priq_ifinfo; - struct priq_classinfo *priq_clinfo = NULL; - int error; - - priq_ifinfo = ifinfo->private; - if ((flags & PRCF_DEFAULTCLASS) && priq_ifinfo->default_class != NULL) - return (QOPERR_CLASS_INVAL); - - if ((priq_clinfo = calloc(1, sizeof(*priq_clinfo))) == NULL) { - error = QOPERR_NOMEM; - goto err_ret; - } - - priq_clinfo->pri = pri; - priq_clinfo->qlimit = qlimit; - priq_clinfo->flags = flags; - - if ((error = qop_add_class(&clinfo, class_name, ifinfo, NULL, - priq_clinfo)) != 0) - goto err_ret; - - if (flags & PRCF_DEFAULTCLASS) - priq_ifinfo->default_class = clinfo; - - if (rp != NULL) - *rp = clinfo; - return (0); - - err_ret: - if (priq_clinfo != NULL) { - free(priq_clinfo); - clinfo->private = NULL; - } - - return (error); -} - -int -qop_priq_modify_class(struct classinfo *clinfo, - int pri, int qlimit, int flags) -{ - struct priq_classinfo *priq_clinfo, *parent_clinfo; - int error; - - priq_clinfo = clinfo->private; - if (clinfo->parent == NULL) - return (QOPERR_CLASS_INVAL); - parent_clinfo = clinfo->parent->private; - - priq_clinfo->pri = pri; - priq_clinfo->qlimit = qlimit; - priq_clinfo->flags = flags; - - error = qop_modify_class(clinfo, NULL); - if (error == 0) - return (0); - return (error); -} - -/* - * sanity check at enabling priq: - * 1. there must one default class for an interface - */ -static int -qop_priq_enable_hook(struct ifinfo *ifinfo) -{ - struct priq_ifinfo *priq_ifinfo; - - priq_ifinfo = ifinfo->private; - if (priq_ifinfo->default_class == NULL) { - LOG(LOG_ERR, 0, "priq: no default class on interface %s!", - ifinfo->ifname); - return (QOPERR_CLASS); - } - return (0); -} - -/* - * system call interfaces for qdisc_ops - */ -static int -priq_attach(struct ifinfo *ifinfo) -{ - struct priq_interface iface; - - memset(&iface, 0, sizeof(iface)); - strncpy(iface.ifname, ifinfo->ifname, IFNAMSIZ); - - if (priq_fd < 0 && - (priq_fd = open(PRIQ_DEVICE, O_RDWR)) < 0 && - (priq_fd = open_module(PRIQ_DEVICE, O_RDWR)) < 0) { - LOG(LOG_ERR, errno, "PRIQ open"); - return (QOPERR_SYSCALL); - } - - priq_refcount++; - memset(&iface, 0, sizeof(iface)); - strncpy(iface.ifname, ifinfo->ifname, IFNAMSIZ); - iface.arg = ifinfo->bandwidth; - - if (ioctl(priq_fd, PRIQ_IF_ATTACH, &iface) < 0) - return (QOPERR_SYSCALL); - return (0); -} - -static int -priq_detach(struct ifinfo *ifinfo) -{ - struct priq_interface iface; - - memset(&iface, 0, sizeof(iface)); - strncpy(iface.ifname, ifinfo->ifname, IFNAMSIZ); - - if (ioctl(priq_fd, PRIQ_IF_DETACH, &iface) < 0) - return (QOPERR_SYSCALL); - - if (--priq_refcount == 0) { - close(priq_fd); - priq_fd = -1; - } - return (0); -} - -static int -priq_clear(struct ifinfo *ifinfo) -{ - struct priq_interface iface; - - memset(&iface, 0, sizeof(iface)); - strncpy(iface.ifname, ifinfo->ifname, IFNAMSIZ); - - if (ioctl(priq_fd, PRIQ_CLEAR, &iface) < 0) - return (QOPERR_SYSCALL); - return (0); -} - -static int -priq_enable(struct ifinfo *ifinfo) -{ - struct priq_interface iface; - - memset(&iface, 0, sizeof(iface)); - strncpy(iface.ifname, ifinfo->ifname, IFNAMSIZ); - - if (ioctl(priq_fd, PRIQ_ENABLE, &iface) < 0) - return (QOPERR_SYSCALL); - return (0); -} - -static int -priq_disable(struct ifinfo *ifinfo) -{ - struct priq_interface iface; - - memset(&iface, 0, sizeof(iface)); - strncpy(iface.ifname, ifinfo->ifname, IFNAMSIZ); - - if (ioctl(priq_fd, PRIQ_DISABLE, &iface) < 0) - return (QOPERR_SYSCALL); - return (0); -} - -static int -priq_add_class(struct classinfo *clinfo) -{ - struct priq_add_class class_add; - struct priq_classinfo *priq_clinfo; - struct priq_ifinfo *priq_ifinfo; - - priq_ifinfo = clinfo->ifinfo->private; - priq_clinfo = clinfo->private; - - memset(&class_add, 0, sizeof(class_add)); - strncpy(class_add.iface.ifname, clinfo->ifinfo->ifname, IFNAMSIZ); - - class_add.pri = priq_clinfo->pri; - class_add.qlimit = priq_clinfo->qlimit; - class_add.flags = priq_clinfo->flags; - if (ioctl(priq_fd, PRIQ_ADD_CLASS, &class_add) < 0) { - clinfo->handle = PRIQ_NULLCLASS_HANDLE; - return (QOPERR_SYSCALL); - } - clinfo->handle = class_add.class_handle; - return (0); -} - -static int -priq_modify_class(struct classinfo *clinfo, void *arg) -{ - struct priq_modify_class class_mod; - struct priq_classinfo *priq_clinfo; - - priq_clinfo = clinfo->private; - - memset(&class_mod, 0, sizeof(class_mod)); - strncpy(class_mod.iface.ifname, clinfo->ifinfo->ifname, IFNAMSIZ); - class_mod.class_handle = clinfo->handle; - - class_mod.pri = priq_clinfo->pri; - class_mod.qlimit = priq_clinfo->qlimit; - class_mod.flags = priq_clinfo->flags; - - if (ioctl(priq_fd, PRIQ_MOD_CLASS, &class_mod) < 0) - return (QOPERR_SYSCALL); - return (0); -} - -static int -priq_delete_class(struct classinfo *clinfo) -{ - struct priq_delete_class class_delete; - - if (clinfo->handle == PRIQ_NULLCLASS_HANDLE) - return (0); - - memset(&class_delete, 0, sizeof(class_delete)); - strncpy(class_delete.iface.ifname, clinfo->ifinfo->ifname, - IFNAMSIZ); - class_delete.class_handle = clinfo->handle; - - if (ioctl(priq_fd, PRIQ_DEL_CLASS, &class_delete) < 0) - return (QOPERR_SYSCALL); - return (0); -} - -static int -priq_add_filter(struct fltrinfo *fltrinfo) -{ - struct priq_add_filter fltr_add; - - memset(&fltr_add, 0, sizeof(fltr_add)); - strncpy(fltr_add.iface.ifname, fltrinfo->clinfo->ifinfo->ifname, - IFNAMSIZ); - fltr_add.class_handle = fltrinfo->clinfo->handle; - fltr_add.filter = fltrinfo->fltr; - - if (ioctl(priq_fd, PRIQ_ADD_FILTER, &fltr_add) < 0) - return (QOPERR_SYSCALL); - fltrinfo->handle = fltr_add.filter_handle; - return (0); -} - -static int -priq_delete_filter(struct fltrinfo *fltrinfo) -{ - struct priq_delete_filter fltr_del; - - memset(&fltr_del, 0, sizeof(fltr_del)); - strncpy(fltr_del.iface.ifname, fltrinfo->clinfo->ifinfo->ifname, - IFNAMSIZ); - fltr_del.filter_handle = fltrinfo->handle; - - if (ioctl(priq_fd, PRIQ_DEL_FILTER, &fltr_del) < 0) - return (QOPERR_SYSCALL); - return (0); -} - - diff --git a/usr.sbin/altq/libaltq/qop_priq.h b/usr.sbin/altq/libaltq/qop_priq.h deleted file mode 100644 index a7c70a28286..00000000000 --- a/usr.sbin/altq/libaltq/qop_priq.h +++ /dev/null @@ -1,62 +0,0 @@ -/* $OpenBSD: qop_priq.h,v 1.1.1.1 2001/06/27 18:23:34 kjc Exp $ */ -/* $KAME: qop_priq.h,v 1.1 2000/10/18 09:15:19 kjc Exp $ */ -/* - * Copyright (C) 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. - */ - -#include <altq/altq_priq.h> - -/* - * priq private ifinfo structure - */ -struct priq_ifinfo { - struct classinfo *default_class; /* default class */ -}; - -/* - * priq private classinfo structure - */ -struct priq_classinfo { - int pri; - int qlimit; - int flags; -}; - -int priq_interface_parser(const char *ifname, int argc, char **argv); -int priq_class_parser(const char *ifname, const char *class_name, - const char *parent_name, int argc, char **argv); - -int qcmd_priq_add_if(const char *ifname, u_int bandwidth, int flags); -int qcmd_priq_add_class(const char *ifname, const char *class_name, - int pri, int qlimit, int flags); -int qcmd_priq_modify_class(const char *ifname, const char *class_name, - int pri, int qlimit, int flags); -int qop_priq_add_if(struct ifinfo **rp, const char *ifname, - u_int bandwidth, int flags); -int qop_priq_add_class(struct classinfo **rp, const char *class_name, - struct ifinfo *ifinfo, - int pri, int qlimit, int flags); -int qop_priq_modify_class(struct classinfo *clinfo, - int pri, int qlimit, int flags); diff --git a/usr.sbin/altq/libaltq/qop_red.c b/usr.sbin/altq/libaltq/qop_red.c deleted file mode 100644 index 863313676bb..00000000000 --- a/usr.sbin/altq/libaltq/qop_red.c +++ /dev/null @@ -1,308 +0,0 @@ -/* $OpenBSD: qop_red.c,v 1.3 2001/12/03 08:38:48 kjc Exp $ */ -/* $KAME: qop_red.c,v 1.5 2001/08/16 10:39:14 kjc Exp $ */ -/* - * Copyright (C) 1999-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. - */ - -#include <sys/param.h> -#include <sys/socket.h> -#include <sys/sockio.h> -#include <sys/ioctl.h> -#include <sys/fcntl.h> -#include <net/if.h> -#include <netinet/in.h> -#include <arpa/inet.h> - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <stddef.h> -#include <string.h> -#include <ctype.h> -#include <errno.h> -#include <syslog.h> -#include <netdb.h> - -#include <altq/altq.h> -#include <altq/altq_red.h> -#include "altq_qop.h" -#include "qop_red.h" - -static int red_attach(struct ifinfo *); -static int red_detach(struct ifinfo *); -static int red_enable(struct ifinfo *); -static int red_disable(struct ifinfo *); - -#define RED_DEVICE "/dev/altq/red" - -static int red_fd = -1; -static int red_refcount = 0; - -static struct qdisc_ops red_qdisc = { - ALTQT_RED, - "red", - red_attach, - red_detach, - NULL, /* clear */ - red_enable, - red_disable, - NULL, /* add class */ - NULL, /* modify class */ - NULL, /* delete class */ - NULL, /* add filter */ - NULL /* delete filter */ -}; - -/* - * parser interface - */ -#define EQUAL(s1, s2) (strcmp((s1), (s2)) == 0) - -int -red_interface_parser(const char *ifname, int argc, char **argv) -{ - u_int bandwidth = 100000000; /* 100Mbps */ - u_int tbrsize = 0; - int weight = 0; /* 0: use default */ - int inv_pmax = 0; /* 0: use default */ - int th_min = 0; /* 0: use default */ - int th_max = 0; /* 0: use default */ - int qlimit = 60; - int pkttime = 0; - int flags = 0; - int packet_size = 1000; - - /* - * process options - */ - while (argc > 0) { - if (EQUAL(*argv, "bandwidth")) { - argc--; argv++; - if (argc > 0) - bandwidth = atobps(*argv); - } else if (EQUAL(*argv, "tbrsize")) { - argc--; argv++; - if (argc > 0) - tbrsize = atobytes(*argv); - } else if (EQUAL(*argv, "packetsize")) { - argc--; argv++; - if (argc > 0) - packet_size = atobytes(*argv); - } else if (EQUAL(*argv, "weight")) { - argc--; argv++; - if (argc > 0) - weight = (int)strtol(*argv, NULL, 0); - } else if (EQUAL(*argv, "qlimit")) { - argc--; argv++; - if (argc > 0) - qlimit = (int)strtol(*argv, NULL, 0); - } else if (EQUAL(*argv, "thmin")) { - argc--; argv++; - if (argc > 0) - th_min = (int)strtol(*argv, NULL, 0); - } else if (EQUAL(*argv, "thmax")) { - argc--; argv++; - if (argc > 0) - th_max = (int)strtol(*argv, NULL, 0); - } else if (EQUAL(*argv, "invpmax")) { - argc--; argv++; - if (argc > 0) - inv_pmax = (int)strtol(*argv, NULL, 0); - } else if (EQUAL(*argv, "red")) { - /* just skip */ - } else if (EQUAL(*argv, "ecn")) { - flags |= REDF_ECN; - } else if (EQUAL(*argv, "flowvalve")) { - flags |= REDF_FLOWVALVE; - } else { - LOG(LOG_ERR, 0, "Unknown keyword '%s'", *argv); - return (0); - } - argc--; argv++; - } - - if (qcmd_tbr_register(ifname, bandwidth, tbrsize) != 0) - return (0); - - pkttime = packet_size * 8 * 1000 / (bandwidth / 1000); - if (weight != 0) { - /* check if weight is power of 2 */ - int i, w; - - w = weight; - for (i = 0; w > 1; i++) - w = w >> 1; - w = 1 << i; - if (weight != w) { - LOG(LOG_ERR, 0, "weight %d: should be power of 2", - weight); - return (0); - } - } - - if (qcmd_red_add_if(ifname, bandwidth, weight, inv_pmax, - th_min, th_max, qlimit, pkttime, flags) != 0) - return (0); - return (1); -} - -/* - * qcmd api - */ -int -qcmd_red_add_if(const char *ifname, u_int bandwidth, int weight, - int inv_pmax, int th_min, int th_max, int qlimit, - int pkttime, int flags) -{ - int error; - - error = qop_red_add_if(NULL, ifname, bandwidth, weight, inv_pmax, - th_min, th_max, qlimit, pkttime, flags); - if (error != 0) - LOG(LOG_ERR, errno, "%s: can't add red on interface '%s'", - qoperror(error), ifname); - return (error); -} - -/* - * qop api - */ -int -qop_red_add_if(struct ifinfo **rp, const char *ifname, - u_int bandwidth, int weight, int inv_pmax, int th_min, - int th_max, int qlimit, int pkttime, int flags) -{ - struct ifinfo *ifinfo = NULL; - struct red_ifinfo *red_ifinfo; - int error; - - if ((red_ifinfo = calloc(1, sizeof(*red_ifinfo))) == NULL) - return (QOPERR_NOMEM); - red_ifinfo->weight = weight; - red_ifinfo->inv_pmax = inv_pmax; - red_ifinfo->th_min = th_min; - red_ifinfo->th_max = th_max; - red_ifinfo->qlimit = qlimit; - red_ifinfo->pkttime = pkttime; - red_ifinfo->flags = flags; - - error = qop_add_if(&ifinfo, ifname, bandwidth, - &red_qdisc, red_ifinfo); - if (error != 0) { - free(red_ifinfo); - return (error); - } - - if (rp != NULL) - *rp = ifinfo; - return (0); -} - -/* - * system call interfaces for qdisc_ops - */ -static int -red_attach(struct ifinfo *ifinfo) -{ - struct red_interface iface; - struct red_ifinfo *red_ifinfo; - struct red_conf conf; - - if (red_fd < 0 && - (red_fd = open(RED_DEVICE, O_RDWR)) < 0 && - (red_fd = open_module(RED_DEVICE, O_RDWR)) < 0) { - LOG(LOG_ERR, errno, "RED open"); - return (QOPERR_SYSCALL); - } - - red_refcount++; - memset(&iface, 0, sizeof(iface)); - strncpy(iface.red_ifname, ifinfo->ifname, IFNAMSIZ); - - if (ioctl(red_fd, RED_IF_ATTACH, &iface) < 0) - return (QOPERR_SYSCALL); - - /* set red parameters */ - red_ifinfo = (struct red_ifinfo *)ifinfo->private; - memset(&conf, 0, sizeof(conf)); - strncpy(conf.iface.red_ifname, ifinfo->ifname, IFNAMSIZ); - conf.red_weight = red_ifinfo->weight; - conf.red_inv_pmax = red_ifinfo->inv_pmax; - conf.red_thmin = red_ifinfo->th_min; - conf.red_thmax = red_ifinfo->th_max; - conf.red_limit = red_ifinfo->qlimit; - conf.red_flags = red_ifinfo->flags; - if (ioctl(red_fd, RED_CONFIG, &conf) < 0) - return (QOPERR_SYSCALL); - -#if 1 - LOG(LOG_INFO, 0, "red attached to %s", iface.red_ifname); -#endif - return (0); -} - -static int -red_detach(struct ifinfo *ifinfo) -{ - struct red_interface iface; - - memset(&iface, 0, sizeof(iface)); - strncpy(iface.red_ifname, ifinfo->ifname, IFNAMSIZ); - - if (ioctl(red_fd, RED_IF_DETACH, &iface) < 0) - return (QOPERR_SYSCALL); - - if (--red_refcount == 0) { - close(red_fd); - red_fd = -1; - } - return (0); -} - -static int -red_enable(struct ifinfo *ifinfo) -{ - struct red_interface iface; - - memset(&iface, 0, sizeof(iface)); - strncpy(iface.red_ifname, ifinfo->ifname, IFNAMSIZ); - - if (ioctl(red_fd, RED_ENABLE, &iface) < 0) - return (QOPERR_SYSCALL); - return (0); -} - -static int -red_disable(struct ifinfo *ifinfo) -{ - struct red_interface iface; - - memset(&iface, 0, sizeof(iface)); - strncpy(iface.red_ifname, ifinfo->ifname, IFNAMSIZ); - - if (ioctl(red_fd, RED_DISABLE, &iface) < 0) - return (QOPERR_SYSCALL); - return (0); -} diff --git a/usr.sbin/altq/libaltq/qop_red.h b/usr.sbin/altq/libaltq/qop_red.h deleted file mode 100644 index fa01665b9be..00000000000 --- a/usr.sbin/altq/libaltq/qop_red.h +++ /dev/null @@ -1,48 +0,0 @@ -/* $OpenBSD: qop_red.h,v 1.1.1.1 2001/06/27 18:23:35 kjc Exp $ */ -/* $KAME: qop_red.h,v 1.2 2000/10/18 09:15:20 kjc Exp $ */ -/* - * Copyright (C) 1999-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. - */ - -/* - * red private ifinfo structure - */ -struct red_ifinfo { - int weight; /* weight for EWMA */ - int inv_pmax; /* inverse of max drop probability */ - int th_min; /* red min threshold */ - int th_max; /* red max threshold */ - int qlimit; /* max queue length */ - int pkttime; /* average packet time in usec */ - int flags; /* see below */ -}; - -int red_interface_parser(const char *ifname, int argc, char **argv); -int qcmd_red_add_if(const char *ifname, u_int bandwidth, int weight, - int inv_pmax, int th_min, int th_max, int qlimit, - int pkttime, int flags); -int qop_red_add_if(struct ifinfo **rp, const char *ifname, - u_int bandwidth, int weight, int inv_pmax, int th_min, - int th_max, int qlimit, int pkttime, int flags); diff --git a/usr.sbin/altq/libaltq/qop_rio.c b/usr.sbin/altq/libaltq/qop_rio.c deleted file mode 100644 index 1381165e118..00000000000 --- a/usr.sbin/altq/libaltq/qop_rio.c +++ /dev/null @@ -1,352 +0,0 @@ -/* $OpenBSD: qop_rio.c,v 1.3 2001/12/03 08:38:48 kjc Exp $ */ -/* $KAME: qop_rio.c,v 1.5 2001/08/16 10:39:15 kjc Exp $ */ -/* - * Copyright (C) 1999-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. - */ - -#include <sys/param.h> -#include <sys/socket.h> -#include <sys/sockio.h> -#include <sys/ioctl.h> -#include <sys/fcntl.h> -#include <net/if.h> -#include <netinet/in.h> -#include <arpa/inet.h> - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <stddef.h> -#include <string.h> -#include <ctype.h> -#include <errno.h> -#include <syslog.h> -#include <netdb.h> - -#include <altq/altq.h> -#include <altq/altq_red.h> -#include <altq/altq_rio.h> -#include "altq_qop.h" -#include "qop_rio.h" - -static int rio_attach(struct ifinfo *); -static int rio_detach(struct ifinfo *); -static int rio_enable(struct ifinfo *); -static int rio_disable(struct ifinfo *); - -#define RIO_DEVICE "/dev/altq/rio" - -static int rio_fd = -1; -static int rio_refcount = 0; - -static struct qdisc_ops rio_qdisc = { - ALTQT_RIO, - "rio", - rio_attach, - rio_detach, - NULL, /* clear */ - rio_enable, - rio_disable, - NULL, /* add class */ - NULL, /* modify class */ - NULL, /* delete class */ - NULL, /* add filter */ - NULL /* delete filter */ -}; - -/* - * parser interface - */ -#define EQUAL(s1, s2) (strcmp((s1), (s2)) == 0) - -int -rio_interface_parser(const char *ifname, int argc, char **argv) -{ - u_int bandwidth = 100000000; /* 100Mbps */ - u_int tbrsize = 0; - int weight = 0; /* 0: use default */ - int lo_inv_pmax = 0; /* 0: use default */ - int lo_th_min = 0; /* 0: use default */ - int lo_th_max = 0; /* 0: use default */ - int med_inv_pmax = 0; /* 0: use default */ - int med_th_min = 0; /* 0: use default */ - int med_th_max = 0; /* 0: use default */ - int hi_inv_pmax = 0; /* 0: use default */ - int hi_th_min = 0; /* 0: use default */ - int hi_th_max = 0; /* 0: use default */ - int qlimit = 60; - int pkttime = 0; - int flags = 0; - int packet_size = 1000; - - /* - * process options - */ - while (argc > 0) { - if (EQUAL(*argv, "bandwidth")) { - argc--; argv++; - if (argc > 0) - bandwidth = atobps(*argv); - } else if (EQUAL(*argv, "tbrsize")) { - argc--; argv++; - if (argc > 0) - tbrsize = atobytes(*argv); - } else if (EQUAL(*argv, "packetsize")) { - argc--; argv++; - if (argc > 0) - packet_size = atobytes(*argv); - } else if (EQUAL(*argv, "weight")) { - argc--; argv++; - if (argc > 0) - weight = (int)strtol(*argv, NULL, 0); - } else if (EQUAL(*argv, "qlimit")) { - argc--; argv++; - if (argc > 0) - qlimit = (int)strtol(*argv, NULL, 0); - } else if (EQUAL(*argv, "lo_thmin")) { - argc--; argv++; - if (argc > 0) - lo_th_min = (int)strtol(*argv, NULL, 0); - } else if (EQUAL(*argv, "lo_thmax")) { - argc--; argv++; - if (argc > 0) - lo_th_max = (int)strtol(*argv, NULL, 0); - } else if (EQUAL(*argv, "lo_invpmax")) { - argc--; argv++; - if (argc > 0) - lo_inv_pmax = (int)strtol(*argv, NULL, 0); - } else if (EQUAL(*argv, "med_thmin")) { - argc--; argv++; - if (argc > 0) - med_th_min = (int)strtol(*argv, NULL, 0); - } else if (EQUAL(*argv, "med_thmax")) { - argc--; argv++; - if (argc > 0) - med_th_max = (int)strtol(*argv, NULL, 0); - } else if (EQUAL(*argv, "med_invpmax")) { - argc--; argv++; - if (argc > 0) - med_inv_pmax = (int)strtol(*argv, NULL, 0); - } else if (EQUAL(*argv, "hi_thmin")) { - argc--; argv++; - if (argc > 0) - hi_th_min = (int)strtol(*argv, NULL, 0); - } else if (EQUAL(*argv, "hi_thmax")) { - argc--; argv++; - if (argc > 0) - hi_th_max = (int)strtol(*argv, NULL, 0); - } else if (EQUAL(*argv, "hi_invpmax")) { - argc--; argv++; - if (argc > 0) - hi_inv_pmax = (int)strtol(*argv, NULL, 0); - } else if (EQUAL(*argv, "rio")) { - /* just skip */ - } else if (EQUAL(*argv, "ecn")) { - flags |= RIOF_ECN; - } else { - LOG(LOG_ERR, 0, "Unknown keyword '%s'", *argv); - return (0); - } - argc--; argv++; - } - - if (qcmd_tbr_register(ifname, bandwidth, tbrsize) != 0) - return (0); - - pkttime = packet_size * 8 * 1000 / (bandwidth / 1000); - if (weight != 0) { - /* check if weight is power of 2 */ - int i, w; - - w = weight; - for (i = 0; w > 1; i++) - w = w >> 1; - w = 1 << i; - if (weight != w) { - LOG(LOG_ERR, 0, "weight %d: should be power of 2", - weight); - return (0); - } - } - - if (qcmd_rio_add_if(ifname, bandwidth, weight, - lo_inv_pmax, lo_th_min, lo_th_max, - med_inv_pmax, med_th_min, med_th_max, - hi_inv_pmax, hi_th_min, hi_th_max, - qlimit, pkttime, flags) != 0) - return (0); - return (1); -} - -/* - * qcmd api - */ -int -qcmd_rio_add_if(const char *ifname, u_int bandwidth, int weight, - int lo_inv_pmax, int lo_th_min, int lo_th_max, - int med_inv_pmax, int med_th_min, int med_th_max, - int hi_inv_pmax, int hi_th_min, int hi_th_max, - int qlimit, int pkttime, int flags) -{ - struct redparams red_params[RIO_NDROPPREC]; - int error; - - red_params[0].inv_pmax = lo_inv_pmax; - red_params[0].th_min = lo_th_min; - red_params[0].th_max = lo_th_max; - red_params[1].inv_pmax = med_inv_pmax; - red_params[1].th_min = med_th_min; - red_params[1].th_max = med_th_max; - red_params[2].inv_pmax = hi_inv_pmax; - red_params[2].th_min = hi_th_min; - red_params[2].th_max = hi_th_max; - - error = qop_rio_add_if(NULL, ifname, bandwidth, weight, red_params, - qlimit, pkttime, flags); - if (error != 0) - LOG(LOG_ERR, errno, "%s: can't add rio on interface '%s'", - qoperror(error), ifname); - return (error); -} - -/* - * qop api - */ -int -qop_rio_add_if(struct ifinfo **rp, const char *ifname, - u_int bandwidth, int weight, struct redparams *red_params, - int qlimit, int pkttime, int flags) -{ - struct ifinfo *ifinfo = NULL; - struct rio_ifinfo *rio_ifinfo; - int i, error; - - if ((rio_ifinfo = calloc(1, sizeof(*rio_ifinfo))) == NULL) - return (QOPERR_NOMEM); - for (i = 0; i < RIO_NDROPPREC; i++) - rio_ifinfo->red_params[i] = red_params[i]; - rio_ifinfo->weight = weight; - rio_ifinfo->qlimit = qlimit; - rio_ifinfo->pkttime = pkttime; - rio_ifinfo->flags = flags; - - error = qop_add_if(&ifinfo, ifname, bandwidth, - &rio_qdisc, rio_ifinfo); - if (error != 0) { - free(rio_ifinfo); - return (error); - } - - if (rp != NULL) - *rp = ifinfo; - return (0); -} - -/* - * system call interfaces for qdisc_ops - */ -static int -rio_attach(struct ifinfo *ifinfo) -{ - struct rio_interface iface; - struct rio_ifinfo *rio_ifinfo; - struct rio_conf conf; - int i; - - if (rio_fd < 0 && - (rio_fd = open(RIO_DEVICE, O_RDWR)) < 0 && - (rio_fd = open_module(RIO_DEVICE, O_RDWR)) < 0) { - LOG(LOG_ERR, errno, "RIO open"); - return (QOPERR_SYSCALL); - } - - rio_refcount++; - memset(&iface, 0, sizeof(iface)); - strncpy(iface.rio_ifname, ifinfo->ifname, IFNAMSIZ); - - if (ioctl(rio_fd, RIO_IF_ATTACH, &iface) < 0) - return (QOPERR_SYSCALL); - - /* set rio parameters */ - rio_ifinfo = (struct rio_ifinfo *)ifinfo->private; - memset(&conf, 0, sizeof(conf)); - strncpy(conf.iface.rio_ifname, ifinfo->ifname, IFNAMSIZ); - for (i = 0; i < RIO_NDROPPREC; i++) - conf.q_params[i] = rio_ifinfo->red_params[i]; - conf.rio_weight = rio_ifinfo->weight; - conf.rio_limit = rio_ifinfo->qlimit; - conf.rio_flags = rio_ifinfo->flags; - if (ioctl(rio_fd, RIO_CONFIG, &conf) < 0) - return (QOPERR_SYSCALL); - -#if 1 - LOG(LOG_INFO, 0, "rio attached to %s", iface.rio_ifname); -#endif - return (0); -} - -static int -rio_detach(struct ifinfo *ifinfo) -{ - struct rio_interface iface; - - memset(&iface, 0, sizeof(iface)); - strncpy(iface.rio_ifname, ifinfo->ifname, IFNAMSIZ); - - if (ioctl(rio_fd, RIO_IF_DETACH, &iface) < 0) - return (QOPERR_SYSCALL); - - if (--rio_refcount == 0) { - close(rio_fd); - rio_fd = -1; - } - return (0); -} - -static int -rio_enable(struct ifinfo *ifinfo) -{ - struct rio_interface iface; - - memset(&iface, 0, sizeof(iface)); - strncpy(iface.rio_ifname, ifinfo->ifname, IFNAMSIZ); - - if (ioctl(rio_fd, RIO_ENABLE, &iface) < 0) - return (QOPERR_SYSCALL); - return (0); -} - -static int -rio_disable(struct ifinfo *ifinfo) -{ - struct rio_interface iface; - - memset(&iface, 0, sizeof(iface)); - strncpy(iface.rio_ifname, ifinfo->ifname, IFNAMSIZ); - - if (ioctl(rio_fd, RIO_DISABLE, &iface) < 0) - return (QOPERR_SYSCALL); - return (0); -} diff --git a/usr.sbin/altq/libaltq/qop_rio.h b/usr.sbin/altq/libaltq/qop_rio.h deleted file mode 100644 index 94324e4398c..00000000000 --- a/usr.sbin/altq/libaltq/qop_rio.h +++ /dev/null @@ -1,48 +0,0 @@ -/* $OpenBSD: qop_rio.h,v 1.1.1.1 2001/06/27 18:23:36 kjc Exp $ */ -/* $KAME: qop_rio.h,v 1.2 2000/10/18 09:15:20 kjc Exp $ */ -/* - * Copyright (C) 1999-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. - */ - -/* - * rio private ifinfo structure - */ -struct rio_ifinfo { - struct redparams red_params[RIO_NDROPPREC]; - int weight; /* weight for EWMA */ - int qlimit; /* max queue length */ - int pkttime; /* average packet time in usec */ - int flags; /* see below */ -}; - -int rio_interface_parser(const char *ifname, int argc, char **argv); -int qcmd_rio_add_if(const char *ifname, u_int bandwidth, int weight, - int lo_inv_pmax, int lo_th_min, int lo_th_max, - int mid_inv_pmax, int mid_th_min, int mid_th_max, - int hi_inv_pmax, int hi_th_min, int hi_th_max, - int qlimit, int pkttime, int flags); -int qop_rio_add_if(struct ifinfo **rp, const char *ifname, - u_int bandwidth, int weight, struct redparams *red_params, - int qlimit, int pkttime, int flags); diff --git a/usr.sbin/altq/libaltq/qop_wfq.c b/usr.sbin/altq/libaltq/qop_wfq.c deleted file mode 100644 index 4b73f390304..00000000000 --- a/usr.sbin/altq/libaltq/qop_wfq.c +++ /dev/null @@ -1,282 +0,0 @@ -/* $OpenBSD: qop_wfq.c,v 1.4 2002/03/01 11:01:42 kjc Exp $ */ -/* $KAME: qop_wfq.c,v 1.5 2001/08/16 10:39:15 kjc Exp $ */ -/* - * Copyright (C) 1999-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. - */ - -#include <sys/param.h> -#include <sys/socket.h> -#include <sys/sockio.h> -#include <sys/ioctl.h> -#include <sys/fcntl.h> -#include <net/if.h> -#include <netinet/in.h> -#include <arpa/inet.h> - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <stddef.h> -#include <string.h> -#include <ctype.h> -#include <errno.h> -#include <syslog.h> -#include <netdb.h> - -#include <altq/altq.h> -#include <altq/altq_wfq.h> -#include "altq_qop.h" -#include "qop_wfq.h" - -static int wfq_attach(struct ifinfo *); -static int wfq_detach(struct ifinfo *); -static int wfq_enable(struct ifinfo *); -static int wfq_disable(struct ifinfo *); - -#define WFQ_DEVICE "/dev/altq/wfq" - -static int wfq_fd = -1; -static int wfq_refcount = 0; - -static struct qdisc_ops wfq_qdisc = { - ALTQT_WFQ, - "wfq", - wfq_attach, - wfq_detach, - NULL, /* clear */ - wfq_enable, - wfq_disable, - NULL, /* add class */ - NULL, /* modify class */ - NULL, /* delete class */ - NULL, /* add filter */ - NULL /* delete filter */ -}; - -/* - * parser interface - */ -#define EQUAL(s1, s2) (strcmp((s1), (s2)) == 0) - -int -wfq_interface_parser(const char *ifname, int argc, char **argv) -{ - u_int bandwidth = 100000000; /* 100Mbps */ - u_int tbrsize = 0; - int hash_policy = 0; /* 0: use default */ - int nqueues = 0; /* 0: use default */ - int qsize = 0; /* 0: use default */ - - /* - * process options - */ - while (argc > 0) { - if (EQUAL(*argv, "bandwidth")) { - argc--; argv++; - if (argc > 0) - bandwidth = atobps(*argv); - } else if (EQUAL(*argv, "tbrsize")) { - argc--; argv++; - if (argc > 0) - tbrsize = atobytes(*argv); - } else if (EQUAL(*argv, "nqueues")) { - argc--; argv++; - if (argc > 0) - nqueues = (int)strtol(*argv, NULL, 0); - } else if (EQUAL(*argv, "qsize")) { - argc--; argv++; - if (argc > 0) - qsize = atobytes(*argv); - } else if (EQUAL(*argv, "hash")) { - argc--; argv++; - if (argc > 0) { - if (EQUAL(*argv, "dstaddr")) - hash_policy = WFQ_HASH_DSTADDR; - else if (EQUAL(*argv, "full")) - hash_policy = WFQ_HASH_FULL; - else if (EQUAL(*argv, "srcport")) - hash_policy = WFQ_HASH_SRCPORT; - else { - LOG(LOG_ERR, 0, - "Unknown hash policy '%s'", *argv); - return (0); - } - } - } else if (EQUAL(*argv, "wfq")) { - /* just skip */ - } else { - LOG(LOG_ERR, 0, "Unknown keyword '%s'", *argv); - return (0); - } - argc--; argv++; - } - - if (qcmd_tbr_register(ifname, bandwidth, tbrsize) != 0) - return (0); - - if (qsize != 0 && qsize < 1500) { - LOG(LOG_ERR, 0, "qsize too small: %d bytes", qsize); - return (0); - } - - if (qcmd_wfq_add_if(ifname, bandwidth, - hash_policy, nqueues, qsize) != 0) - return (0); - return (1); -} - -/* - * qcmd api - */ -int -qcmd_wfq_add_if(const char *ifname, u_int bandwidth, int hash_policy, - int nqueues, int qsize) -{ - int error; - - error = qop_wfq_add_if(NULL, ifname, bandwidth, - hash_policy, nqueues, qsize); - if (error != 0) - LOG(LOG_ERR, errno, "%s: can't add wfq on interface '%s'", - qoperror(error), ifname); - return (error); -} - -/* - * qop api - */ -int -qop_wfq_add_if(struct ifinfo **rp, const char *ifname, u_int bandwidth, - int hash_policy, int nqueues, int qsize) -{ - struct ifinfo *ifinfo = NULL; - struct wfq_ifinfo *wfq_ifinfo; - int error; - - if ((wfq_ifinfo = calloc(1, sizeof(*wfq_ifinfo))) == NULL) - return (QOPERR_NOMEM); - wfq_ifinfo->hash_policy = hash_policy; - wfq_ifinfo->nqueues = nqueues; - wfq_ifinfo->qsize = qsize; - - error = qop_add_if(&ifinfo, ifname, bandwidth, - &wfq_qdisc, wfq_ifinfo); - if (error != 0) { - free(wfq_ifinfo); - return (error); - } - - if (rp != NULL) - *rp = ifinfo; - return (0); -} - -/* - * system call interfaces for qdisc_ops - */ -static int -wfq_attach(struct ifinfo *ifinfo) -{ - struct wfq_interface iface; - struct wfq_ifinfo *wfq_ifinfo; - struct wfq_conf conf; - - if (wfq_fd < 0 && - (wfq_fd = open(WFQ_DEVICE, O_RDWR)) < 0 && - (wfq_fd = open_module(WFQ_DEVICE, O_RDWR)) < 0) { - LOG(LOG_ERR, errno, "WFQ open"); - return (QOPERR_SYSCALL); - } - - wfq_refcount++; - memset(&iface, 0, sizeof(iface)); - strncpy(iface.wfq_ifacename, ifinfo->ifname, IFNAMSIZ); - - if (ioctl(wfq_fd, WFQ_IF_ATTACH, &iface) < 0) - return (QOPERR_SYSCALL); - - /* set wfq parameters */ - wfq_ifinfo = (struct wfq_ifinfo *)ifinfo->private; - if (wfq_ifinfo->hash_policy != 0 || wfq_ifinfo->nqueues != 0 || - wfq_ifinfo->qsize != 0) { - memset(&conf, 0, sizeof(conf)); - strncpy(conf.iface.wfq_ifacename, ifinfo->ifname, IFNAMSIZ); - conf.hash_policy = wfq_ifinfo->hash_policy; - conf.nqueues = wfq_ifinfo->nqueues; - conf.qlimit = wfq_ifinfo->qsize; - if (ioctl(wfq_fd, WFQ_CONFIG, &conf) < 0) { - LOG(LOG_ERR, errno, "WFQ_CONFIG"); - return (QOPERR_SYSCALL); - } - } -#if 1 - LOG(LOG_INFO, 0, "wfq attached to %s", iface.wfq_ifacename); -#endif - return (0); -} - -static int -wfq_detach(struct ifinfo *ifinfo) -{ - struct wfq_interface iface; - - memset(&iface, 0, sizeof(iface)); - strncpy(iface.wfq_ifacename, ifinfo->ifname, IFNAMSIZ); - - if (ioctl(wfq_fd, WFQ_IF_DETACH, &iface) < 0) - return (QOPERR_SYSCALL); - - if (--wfq_refcount == 0) { - close(wfq_fd); - wfq_fd = -1; - } - return (0); -} - -static int -wfq_enable(struct ifinfo *ifinfo) -{ - struct wfq_interface iface; - - memset(&iface, 0, sizeof(iface)); - strncpy(iface.wfq_ifacename, ifinfo->ifname, IFNAMSIZ); - - if (ioctl(wfq_fd, WFQ_ENABLE, &iface) < 0) - return (QOPERR_SYSCALL); - return (0); -} - -static int -wfq_disable(struct ifinfo *ifinfo) -{ - struct wfq_interface iface; - - memset(&iface, 0, sizeof(iface)); - strncpy(iface.wfq_ifacename, ifinfo->ifname, IFNAMSIZ); - - if (ioctl(wfq_fd, WFQ_DISABLE, &iface) < 0) - return (QOPERR_SYSCALL); - return (0); -} diff --git a/usr.sbin/altq/libaltq/qop_wfq.h b/usr.sbin/altq/libaltq/qop_wfq.h deleted file mode 100644 index ab4af9ca608..00000000000 --- a/usr.sbin/altq/libaltq/qop_wfq.h +++ /dev/null @@ -1,42 +0,0 @@ -/* $OpenBSD: qop_wfq.h,v 1.1.1.1 2001/06/27 18:23:36 kjc Exp $ */ -/* $KAME: qop_wfq.h,v 1.2 2000/10/18 09:15:21 kjc Exp $ */ -/* - * Copyright (C) 1999-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. - */ - -/* - * wfq private ifinfo structure - */ -struct wfq_ifinfo { - int hash_policy; /* hash policy */ - int nqueues; /* number of queues */ - int qsize; /* queue size in bytes */ -}; - -int wfq_interface_parser(const char *ifname, int argc, char **argv); -int qcmd_wfq_add_if(const char *ifname, u_int bandwidth, int hash_policy, - int nqueues, int qsize); -int qop_wfq_add_if(struct ifinfo **rp, const char *ifname, u_int bandwidth, - int hash_policy, int nqueues, int qsize); diff --git a/usr.sbin/altq/libaltq/quip_server.c b/usr.sbin/altq/libaltq/quip_server.c deleted file mode 100644 index 7a818b3600b..00000000000 --- a/usr.sbin/altq/libaltq/quip_server.c +++ /dev/null @@ -1,498 +0,0 @@ -/* $OpenBSD: quip_server.c,v 1.3 2001/08/20 08:40:14 kjc Exp $ */ -/* $KAME: quip_server.c,v 1.5 2001/08/16 07:43:17 itojun Exp $ */ -/* - * Copyright (C) 1999-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. - */ - -#include <sys/param.h> -#include <sys/socket.h> -#include <sys/queue.h> - -#include <net/if.h> -#include <netinet/in.h> -#include <arpa/inet.h> - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <stddef.h> -#include <string.h> -#include <errno.h> -#include <err.h> - -#include <altq/altq.h> -#include <altq/altq_red.h> -#include <altq/altq_rio.h> - -#include "altq_qop.h" -#include "quip_server.h" - -extern LIST_HEAD(qop_iflist, ifinfo) qop_iflist; - -#define EQUAL(s1, s2) (strcmp((s1), (s2)) == 0) - -static int next_word(char **, char *); - -static int query_list(const char *, const char *, char *, size_t); -static int query_handle2name(const char *, const char *, char *, size_t); -static int query_qdisc(const char *, const char *, char *, size_t); -static int query_filterspec(const char *, const char *, char *, size_t); - -int -quip_input(FILE *fp) -{ - char request[REQ_MAXSIZE], result[RES_MAXSIZE], body[BODY_MAXSIZE], - w[REQ_MAXSIZE], *cp, *query; - int n = 0; - - while (1) { - if (fgets(request, REQ_MAXSIZE, fp) == NULL) /* EOF */ - return (-1); - /* skip preceding blank lines */ - if (request[0] == '\n') - continue; - break; - } - - /* remove trailing newline and white space */ - if ((cp = strrchr(request, '\n')) != NULL) { - *cp-- = '\0'; - while (*cp == ' ' || *cp == '\t') - *cp-- = '\0'; - } - - body[0] = '\0'; - cp = request; - if (!next_word(&cp, w)) { - snprintf(result, sizeof(result), "400 Bad request\n"); - goto done; - } - if (EQUAL(w, "GET")) { - if (!next_word(&cp, w)) { - snprintf(result, sizeof(result), "400 Bad request\n"); - goto done; - } - if ((query = strchr(w, '?')) != NULL) { - /* request has a query string */ - *query = '\0'; - query++; - } - - if (EQUAL(w, "list")) { - n = query_list(w, query, body, BODY_MAXSIZE); - } else if (EQUAL(w, "handle-to-name")) { - n = query_handle2name(w, query, body, BODY_MAXSIZE); - } else if (EQUAL(w, "qdisc")) { - n = query_qdisc(w, query, body, BODY_MAXSIZE); - } else if (EQUAL(w, "filter")) { - n = query_filterspec(w, query, body, BODY_MAXSIZE); - } else { - snprintf(result, sizeof(result), "400 Bad request\n"); - goto done; - } - } else { - snprintf(result, sizeof(result), "400 Bad request\n"); - goto done; - } - - if (n == 0) { - snprintf(result, sizeof(result), "204 No content\n"); - } else if (n < 0) { - snprintf(result, sizeof(result), "400 Bad request\n"); - } else { - snprintf(result, sizeof(result), "200 OK\nContent-Length:%d\n", n); - } - - done: - /* send a result line and a blank line */ - if (fputs ("QUIP/1.0 ", fp) != 0 || - fputs(result, fp) != 0 || fputs("\n", fp) != 0) - return (-1); - - /* send message body */ - if (fputs(body, fp) != 0) - return (-1); - return (0); -} - -/* - * Skip leading blanks, then copy next word (delimited by blank or zero, but - * no longer than 63 bytes) into buffer b, set scan pointer to following - * non-blank (or end of string), and return 1. If there is no non-blank text, - * set scan ptr to point to 0 byte and return 0. - */ -static int -next_word(char **cpp, char *b) -{ - char *tp; - int L; - - *cpp += strspn(*cpp, " \t"); - if (**cpp == '\0' || **cpp == '\n' || **cpp == '#') - return(0); - - tp = strpbrk(*cpp, " \t\n#"); - L = MIN((tp)?(tp-*cpp):strlen(*cpp), 63); - strncpy(b, *cpp, L); - *(b + L) = '\0'; - *cpp += L; - *cpp += strspn(*cpp, " \t"); - return (1); -} - - -/* - * expand_classname creates a long class name. - * <ifname>:/<root_name>/../<parent_name>/<class_name> - */ -static int -expand_classname(struct classinfo *clinfo, char *name, size_t maxname) -{ - struct classinfo *ci = clinfo; -#define CLASSNAMEMAX 256 - char buf[2][CLASSNAMEMAX], *b0, *b1, *tmp; - - b0 = buf[0]; b1 = buf[1]; - b1[0] = '\0'; - while (ci != NULL) { - strlcpy(b0, "/", CLASSNAMEMAX); - strlcat(b0, ci->clname, CLASSNAMEMAX); - strlcat(b0, b1, CLASSNAMEMAX); - - ci = ci->parent; - tmp = b0; b0 = b1; b1 = tmp; - } - snprintf(b0, CLASSNAMEMAX, "%s:", clinfo->ifinfo->ifname); - strlcat(b0, b1, CLASSNAMEMAX); - strlcpy(name, b0, CLASSNAMEMAX); - return (strlen(name)); -#undef CLASSNAMEMAX -} - -/* - * expand_filtername creates a long filter name. - * <ifname>:/<root_name>/../<parent_name>/<class_name>:<fltr_name> - */ -static int -expand_filtername(struct fltrinfo *fltrinfo, char *name, size_t maxname) -{ - int len; - - len = expand_classname(fltrinfo->clinfo, name, maxname); - snprintf(name + len, maxname - len, ":%s", fltrinfo->flname); - return (strlen(name)); -} - -static int -query_handle2name(const char *cmd, const char *arg, char *msg, size_t maxmsg) -{ - struct ifinfo *ifinfo; - struct classinfo *clinfo; - struct fltrinfo *fltrinfo; - char *ifname, *class_field, *fltr_field, buf[256], *cp; - u_long handle; - int len; - - strlcpy(buf, arg, sizeof(buf)); - cp = buf; - ifname = strsep(&cp, ":"); - class_field = strsep(&cp, ":"); - fltr_field = cp; - - if (fltr_field != NULL) { - if (sscanf(fltr_field, "%lx", &handle) != 1) - return (-1); - if ((ifinfo = ifname2ifinfo(ifname)) == NULL) - return (-1); - if ((fltrinfo = flhandle2fltrinfo(ifinfo, handle)) == NULL) - return (-1); - - len = expand_filtername(fltrinfo, msg, maxmsg); - } else { - if (sscanf(class_field, "%lx", &handle) != 1) - return (-1); - if ((ifinfo = ifname2ifinfo(ifname)) == NULL) - return (-1); - if ((clinfo = clhandle2clinfo(ifinfo, handle)) == NULL) - return (-1); - - len = expand_classname(clinfo, msg, maxmsg); - } - strlcat(msg, "\n", maxmsg); - return (strlen(msg)); -} - -static int -query_qdisc(const char *cmd, const char *arg, char *msg, size_t maxmsg) -{ - struct ifinfo *ifinfo; - - if ((ifinfo = ifname2ifinfo(arg)) == NULL) - return (-1); - - snprintf(msg, maxmsg, "%s\nbandwidth:%.2fMbps\nstatus:%s\n", - ifinfo->qdisc->qname, (double)ifinfo->bandwidth/1000000, - (ifinfo->enabled ? "enabled" : "disabled")); - return (strlen(msg)); -} - -static int -query_filterspec(const char *cmd, const char *arg, char *msg, size_t maxmsg) -{ - struct ifinfo *ifinfo; - struct fltrinfo *fltrinfo; - struct flow_filter *filt; - char *ifname, *class_field, *fltr_field, buf[256], *cp; - u_long handle; - - strlcpy(buf, arg, sizeof(buf)); - cp = buf; - ifname = strsep(&cp, ":"); - class_field = strsep(&cp, ":"); - fltr_field = cp; - - if (fltr_field == NULL) - return (-1); - if (sscanf(fltr_field, "%lx", &handle) != 1) - return (-1); - - if ((ifinfo = ifname2ifinfo(ifname)) == NULL) - return (-1); - if ((fltrinfo = flhandle2fltrinfo(ifinfo, handle)) == NULL) - return (-1); - - filt = &fltrinfo->fltr; - - if (filt->ff_flow.fi_family == AF_INET) { - char src[128], dst[128], smask[128], dmask[128], tos[128]; - - if (filt->ff_flow.fi_dst.s_addr == 0) { - snprintf(dst, sizeof(dst), "0"); - dmask[0] = '\0'; - } else { - snprintf(dst, sizeof(dst), "%s", - inet_ntoa(filt->ff_flow.fi_dst)); - if (filt->ff_mask.mask_dst.s_addr == 0xffffffff) - dmask[0] = '\0'; - else - snprintf(dmask, sizeof(dmask), " mask %#x", - ntoh32(filt->ff_mask.mask_dst.s_addr)); - } - if (filt->ff_flow.fi_src.s_addr == 0) { - snprintf(src, sizeof(src), "0"); - smask[0] = '\0'; - } else { - snprintf(src, sizeof(src), "%s", - inet_ntoa(filt->ff_flow.fi_src)); - if (filt->ff_mask.mask_src.s_addr == 0xffffffff) - smask[0] = '\0'; - else - snprintf(smask, sizeof(smask), " mask %#x", - ntoh32(filt->ff_mask.mask_src.s_addr)); - } - if (filt->ff_flow.fi_tos == 0) - tos[0] = '\0'; - else - snprintf(tos, sizeof(tos), " tos %#x tosmask %#x", - filt->ff_flow.fi_tos, - filt->ff_mask.mask_tos); - - snprintf(msg, maxmsg, "inet %s%s %d %s%s %d %d%s\n", - dst, dmask, - ntoh16(filt->ff_flow.fi_dport), - src, smask, - ntoh16(filt->ff_flow.fi_sport), - filt->ff_flow.fi_proto, tos); - } -#ifdef INET6 - else if (filt->ff_flow.fi_family == AF_INET6) { - struct flow_filter6 *filt6; - char dst6[INET6_ADDRSTRLEN], dmask6[INET6_ADDRSTRLEN]; - char src6[INET6_ADDRSTRLEN], smask6[INET6_ADDRSTRLEN]; - char tclass6[128]; - const struct in6_addr mask128 = - {{{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }}}; - - filt6 = (struct flow_filter6 *)&fltrinfo->fltr; - if (IN6_IS_ADDR_UNSPECIFIED(&filt6->ff_flow6.fi6_dst)) { - snprintf(dst6, sizeof(dst6), "0"); - dmask6[0] = '\0'; - } else { - inet_ntop(AF_INET6, &filt6->ff_flow6.fi6_dst, - dst6, sizeof(dst6)); - if (IN6_ARE_ADDR_EQUAL(&mask128, - &filt6->ff_mask6.mask6_dst)) - dmask6[0] = '\0'; - else { - snprintf(dmask6, sizeof(dmask6), " mask "); - inet_ntop(AF_INET6, &filt6->ff_mask6.mask6_dst, - dmask6 + 6, sizeof(dmask6) -6); - } - } - - if (IN6_IS_ADDR_UNSPECIFIED(&filt6->ff_flow6.fi6_src)) { - snprintf(src6, sizeof(src6), "0"); - smask6[0] = '\0'; - } else { - inet_ntop(AF_INET6, &filt6->ff_flow6.fi6_src, - src6, sizeof(src6)); - if (IN6_ARE_ADDR_EQUAL(&mask128, - &filt6->ff_mask6.mask6_src)) - smask6[0] = '\0'; - else { - snprintf(smask6, sizeof(smask6), " mask "); - inet_ntop(AF_INET6, &filt6->ff_mask6.mask6_src, - smask6 + 6, sizeof(smask6) -6); - } - } - if (filt6->ff_flow6.fi6_tclass == 0) - tclass6[0] = '\0'; - else - snprintf(tclass6, sizeof(tclass6), - " tclass %#x tclassmask %#x", - filt6->ff_flow6.fi6_tclass, - filt6->ff_mask6.mask6_tclass); - - snprintf(msg, maxmsg, "inet6 %s%s %d %s%s %d %d%s\n", - dst6, dmask6, - ntoh16(filt6->ff_flow6.fi6_dport), - src6, smask6, - ntoh16(filt6->ff_flow6.fi6_sport), - filt6->ff_flow6.fi6_proto, tclass6); - } -#endif /* INET6 */ - - return (strlen(msg)); -} - - -/* - * string_match compares 2 strings and returns 1 when s1 matches s2. - * s1: possibly includes wildcards, "*". - * s2: must be a full string (should not include "*"). - */ -static int -string_match(const char *s1, const char *s2) -{ - char *ap, *next, sub[256]; - int prefixlen, sublen; - - /* if there's no wild card, compare full string */ - if ((ap = strchr(s1, '*')) == NULL) - return (strcmp(s1, s2) == 0); - - /* compare string prefix */ - prefixlen = ap - s1; - if (strncmp(s1, s2, prefixlen) != 0) - return (0); - s2 += prefixlen; - - /* - * if there is another wildcard in the rest of the string, - * compare the substring between the 2 wildcards. - */ - while ((next = strchr(ap + 1, '*')) != NULL) { - sublen = next - ap - 1; - strncpy(sub, ap+1, sublen); - sub[sublen] = '\0'; - if ((s2 = strstr(s2, sub)) == NULL) - return (0); - - s2 += sublen; - ap = next; - } - - /* no more wildcard, compare the rest of the string */ - return (strcmp(ap+1, s2+strlen(s2)-strlen(ap+1)) == 0); -} - -static int -query_list(const char *cmd, const char *arg, char *msg, size_t maxmsg) -{ - char tmp[256], *cp, *ep; - struct ifinfo *ifinfo; - struct classinfo *clinfo; - struct fltrinfo *fltrinfo; - int print_if, print_class, print_fltr, len; - - if (arg == NULL) { - /* no arg, print all */ - print_if = print_class = print_fltr = 1; - } else { - print_if = print_class = print_fltr = 0; - if ((cp = strchr(arg, ':')) == NULL) - print_if = 1; - else if (strchr(cp+1, ':') == NULL) - print_class = 1; - else - print_fltr = 1; - } - - cp = msg; - ep = msg + maxmsg; - LIST_FOREACH(ifinfo, &qop_iflist, next) { - if (print_if) { - strlcpy(tmp, ifinfo->ifname, sizeof(tmp)); - if (arg == NULL || string_match(arg, tmp)) { - len = snprintf(cp, ep - cp, "%#010x\t%s\n", - ifinfo->ifindex, tmp); - if (len < 0 || len >= ep - cp) - break; - cp += len; - } - } - if (!print_class && !print_fltr) - continue; - for (clinfo = get_rootclass(ifinfo); - clinfo != NULL; clinfo = get_nextclass(clinfo)) { - if (print_class) { - expand_classname(clinfo, tmp, sizeof(tmp)); - if (arg == NULL || string_match(arg, tmp)) { - len = snprintf(cp, ep - cp, - "%#010lx\t%s\n", - clinfo->handle, tmp); - if (len < 0 || len >= ep - cp) - break; - cp += len; - } - } - if (!print_fltr) - continue; - LIST_FOREACH(fltrinfo, &clinfo->fltrlist, next) { - expand_filtername(fltrinfo, tmp, sizeof(tmp)); - if (arg == NULL || string_match(arg, tmp)) { - len = snprintf(cp, ep - cp, "%#010lx\t%s\n", - fltrinfo->handle, tmp); - if (len < 0 || len >= ep - cp) - break; - cp += len; - } - } - } - } - return (strlen(msg)); -} - diff --git a/usr.sbin/altq/libaltq/quip_server.h b/usr.sbin/altq/libaltq/quip_server.h deleted file mode 100644 index 397acea9780..00000000000 --- a/usr.sbin/altq/libaltq/quip_server.h +++ /dev/null @@ -1,42 +0,0 @@ -/* $OpenBSD: quip_server.h,v 1.2 2001/08/16 12:59:43 kjc Exp $ */ -/* $KAME: quip_server.h,v 1.3 2001/08/15 12:51:58 kjc Exp $ */ -/* - * Copyright (C) 1999-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 _QUIP_SERVER_H_ -#define _QUIP_SERVER_H_ - -/* unix domain socket for quip */ -#define QUIP_PATH "/var/run/altq_quip" - -#define REQ_MAXSIZE 256 /* max request size */ -#define RES_MAXSIZE 256 /* max reply header size */ -#define BODY_MAXSIZE 8192 /* max reply body size */ -#define QUIPMSG_MAXSIZE (RES_MAXSIZE+BODY_MAXSIZE) /* max message size */ - -int quip_input(FILE *fp); - -#endif /* _QUIP_SERVER_H_ */ diff --git a/usr.sbin/altq/tbrconfig/Makefile b/usr.sbin/altq/tbrconfig/Makefile deleted file mode 100644 index f4534dcd61c..00000000000 --- a/usr.sbin/altq/tbrconfig/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -# $OpenBSD: Makefile,v 1.2 2002/06/05 11:01:55 deraadt Exp $ -# $NetBSD: Makefile,v 1.2 2001/04/05 21:48:05 thorpej Exp $ - -BINDIR=/sbin -LDSTATIC=-static - -PROG= tbrconfig -MAN= tbrconfig.8 - -CPPFLAGS+= -DALTQ -I${.CURDIR}/../libaltq - -.include <bsd.prog.mk> diff --git a/usr.sbin/altq/tbrconfig/tbrconfig.8 b/usr.sbin/altq/tbrconfig/tbrconfig.8 deleted file mode 100644 index 1167065f545..00000000000 --- a/usr.sbin/altq/tbrconfig/tbrconfig.8 +++ /dev/null @@ -1,170 +0,0 @@ -.\" $OpenBSD: tbrconfig.8,v 1.3 2001/07/25 10:04:56 mpech Exp $ -.\" $KAME: tbrconfig.8,v 1.2 2001/04/09 16:26:30 thorpej Exp $ -.\" -.\" Copyright (C) 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. -.\" -.Dd July 25, 2000 -.Dt TBRCONFIG 8 -.Os KAME -.\" -.Sh NAME -.Nm tbrconfig -.Nd configure a token bucket regulator for an output queue -.\" -.Sh SYNOPSIS -.Nm -.Ar interface -.Oo -.Ar tokenrate -.Op Ar bucketsize -.Oc -.Nm tbrconfig -.Fl d -.Ar interface -.Nm tbrconfig -.Fl a -.Sh DESCRIPTION -.Nm -configures a token bucket regulator for the output network -inteface queue. -A token bucket regulator limits both the average amount and -instantaneous amount of packets that the underlying driver can dequeue -from the network interface within the kernel. -.Pp -Conceptually, tokens accumulate in a bucket at the average -.Ar tokenrate , -up to the -.Ar bucketsize . -The driver can dequeue packets as long as there are positive amount -of tokens, and the length of the dequeued packet is subtracted from -the remaining tokens. Tokens can be negative as a deficit, and -packets are not dequeued from the interface queue until the tokens -become positive again. -The -.Ar tokenrate -limits the average rate, and the -.Ar bucketsize -limits the maximum burst size. -.Pp -Limiting the burst size is essential to packet scheduling, since the -scheduler schedules packets backlogged at the network interface. -Limiting the burst size is also needed for drivers which dequeues more -packets than they can send and end up with discarding excess packets. -.Pp -When the -.Ar tokenrate -is set to higher than the actual transmission rate, the transmission -complete interrupt will trigger the next dequeue. -On the other hand, when the -.Ar tokenrate -is set to lower than the actual transmission rate, the transmission -complete interrupt would occur before the tokens become positive. -In this case, the next dequeue will be triggered by a timer event. -Because the kernel timer has a limited granularity, a larger -.Ar bucketsize -is required for a higher -.Ar tokenrate . -.Pp -The -.Ar interface -parameter is a string of the form -.Dq name unit , -for example, -.Dq en0 . -.Pp -The -.Ar tokenrate -parameter specifies the average rate in bits per second, and -.Dq K -or -.Dq M -can be appended to -.Ar tokenrate -as a short hand of -.Dq Kilo-bps -or -.Dq Mega-bps , -respectively. -When -.Ar tokenrate -is omitted, -.Nm -displays the current parameter values. -.Pp -The -.Ar bucketsize -parameter specifies the bucket size in bytes, and -.Dq K -can be appended to -.Ar bucketsize -as a short hand of -.Dq Kilo-bytes . -When -.Ar bucketsize -is omitted, -.Nm -assumes the regulator is driven by transmission complete interrupts -and, using heuristics, assigns a small bucket size according to the -.Ar tokenrate . -When the keyword -.Dq auto -is given as -.Ar bucketsize , -.Nm -assumes the regulator is driven by the kernel timer, and -computes the bucket size from -.Ar tokenrate -and the kernel clock frequency. -.Pp -If the -.Fl d -flag is passed before an interface name, -.Nm -will remove the token bucket regulator for the specified interface. -.Pp -Optionally, the -.Fl a -flag may be used instead of an interface name. This flag instructs -.Nm -to display information about all interfaces in the system. -.Sh EXAMPLES -To configure a token bucket regulator for the interface en0 with -10Mbps token rate and 8KB bucket size, -.Bd -literal -offset -# tbrconfig en0 10M 8K -.Ed -.Pp -To rate-limit the interface en0 up to 3Mbps, -.Bd -literal -offset -# tbrconfig en0 3M auto -.Ed -.Sh SEE ALSO -.Xr altq.conf 5 , -.Xr altqd 8 -.Sh HISTORY -The -.Nm -command first appeared in WIDE/KAME IPv6 protocol stack kit as part of -ALTQ tools. diff --git a/usr.sbin/altq/tbrconfig/tbrconfig.c b/usr.sbin/altq/tbrconfig/tbrconfig.c deleted file mode 100644 index c6a98ea27ec..00000000000 --- a/usr.sbin/altq/tbrconfig/tbrconfig.c +++ /dev/null @@ -1,327 +0,0 @@ -/* $OpenBSD: tbrconfig.c,v 1.3 2002/02/15 03:31:16 deraadt Exp $ */ -/* $KAME: tbrconfig.c,v 1.3 2001/05/08 04:36:39 itojun Exp $ */ -/* - * Copyright (C) 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. - */ - -#include <sys/param.h> -#include <sys/time.h> -#include <sys/socket.h> -#include <sys/ioctl.h> -#include <sys/fcntl.h> -#include <sys/sysctl.h> -#include <net/if.h> - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <string.h> -#include <err.h> - -#include <altq/altq.h> - -#define ALTQ_DEVICE "/dev/altq/altq" - -static void usage(void); -static u_long atobps(const char *s); -static u_long atobytes(const char *s); -static u_int size_bucket(const char *ifname, const u_int rate); -static u_int autosize_bucket(const char *ifname, const u_int rate); -static int get_clockfreq(void); -static int get_ifmtu(const char *ifname); -static void list_all(void); - -static void -usage(void) -{ - fprintf(stderr, "usage: tbrconfig interface [tokenrate [bucketsize]\n"); - fprintf(stderr, " tbrconfig -d interface\n"); - fprintf(stderr, " tbrconfig -a\n"); - exit(1); -} - -int -main(int argc, char **argv) -{ - struct tbrreq req; - u_int rate, depth; - int fd, ch, delete; - - delete = 0; - rate = 0; - depth = 0; - - while ((ch = getopt(argc, argv, "ad")) != -1) { - switch (ch) { - case 'a': - list_all(); - return (0); - case 'd': - delete = 1; - break; - } - } - - argc -= optind; - argv += optind; - if (argc < 1) - usage(); - - req.ifname[IFNAMSIZ-1] = '\0'; - strncpy(req.ifname, argv[0], IFNAMSIZ-1); - if (argc > 1) - rate = (u_int)atobps(argv[1]); - if (argc > 2) { - if (strncmp(argv[2], "auto", strlen("auto")) == 0) - depth = autosize_bucket(req.ifname, rate); - else - depth = (u_int)atobytes(argv[2]); - } - if (argc > 3) - usage(); - - if (delete || rate > 0) { - /* set token bucket regulator */ - if (delete) - rate = 0; - else if (depth == 0) - depth = size_bucket(req.ifname, rate); - - req.tb_prof.rate = rate; - req.tb_prof.depth = depth; - - if ((fd = open(ALTQ_DEVICE, O_RDWR)) < 0) - err(1, "can't open altq device"); - - if (ioctl(fd, ALTQTBRSET, &req) < 0) - err(1, "ALTQTBRSET for interface %s", req.ifname); - - close(fd); - - if (delete) { - printf("deleted token bucket regulator on %s\n", - req.ifname); - return (0); - } - } - - /* get token bucket regulator */ - if ((fd = open(ALTQ_DEVICE, O_RDONLY)) < 0) - err(1, "can't open altq device"); - if (ioctl(fd, ALTQTBRGET, &req) < 0) - err(1, "ALTQTBRGET for interface %s", req.ifname); - if (req.tb_prof.rate == 0) - printf("no token bucket regulater found on %s\n", req.ifname); - else { - char rate_str[64], size_str[64]; - - if (req.tb_prof.rate < 999999) - snprintf(rate_str, sizeof rate_str, "%.2fK", - (double)req.tb_prof.rate/1000.0); - else - snprintf(rate_str, sizeof rate_str, "%.2fM", - (double)req.tb_prof.rate/1000000.0); - if (req.tb_prof.depth < 10240) - snprintf(size_str, sizeof size_str, "%u", req.tb_prof.depth); - else - snprintf(size_str, sizeof size_str, "%.2fK", - (double)req.tb_prof.depth/1024.0); - printf("%s: tokenrate %s(bps) bucketsize %s(bytes)\n", - req.ifname, rate_str, size_str); - } - close(fd); - return (0); -} - -static void -list_all(void) -{ - struct if_nameindex *ifn_list, *ifnp; - struct tbrreq req; - char rate_str[64], size_str[64]; - int fd, ntbr; - - if ((ifn_list = if_nameindex()) == NULL) - err(1, "if_nameindex failed"); - - if ((fd = open(ALTQ_DEVICE, O_RDONLY)) < 0) - err(1, "can't open altq device"); - - ntbr = 0; - for (ifnp = ifn_list; ifnp->if_name != NULL; ifnp++) { - req.ifname[IFNAMSIZ-1] = '\0'; - strncpy(req.ifname, ifnp->if_name, IFNAMSIZ-1); - if (ioctl(fd, ALTQTBRGET, &req) < 0) - err(1, "ALTQTBRGET"); - if (req.tb_prof.rate == 0) - continue; - - if (req.tb_prof.rate < 999999) - snprintf(rate_str, sizeof rate_str, "%.2fK", - (double)req.tb_prof.rate/1000.0); - else - snprintf(rate_str, sizeof rate_str, "%.2fM", - (double)req.tb_prof.rate/1000000.0); - if (req.tb_prof.depth < 10240) - snprintf(size_str, sizeof size_str, - "%u", req.tb_prof.depth); - else - snprintf(size_str, sizeof size_str, "%.2fK", - (double)req.tb_prof.depth/1024.0); - printf("%s: tokenrate %s(bps) bucketsize %s(bytes)\n", - req.ifname, rate_str, size_str); - ntbr++; - } - if (ntbr == 0) - printf("no active token bucket regulator\n"); - - close(fd); - if_freenameindex(ifn_list); -} - -static u_long -atobps(const char *s) -{ - double bandwidth; - char *cp; - - bandwidth = strtod(s, &cp); - if (cp != NULL) { - if (*cp == 'K' || *cp == 'k') - bandwidth *= 1000; - else if (*cp == 'M' || *cp == 'm') - bandwidth *= 1000000; - else if (*cp == 'G' || *cp == 'g') - bandwidth *= 1000000000; - } - if (bandwidth < 0) - bandwidth = 0; - return ((u_long)bandwidth); -} - -static u_long -atobytes(const char *s) -{ - double bytes; - char *cp; - - bytes = strtod(s, &cp); - if (cp != NULL) { - if (*cp == 'K' || *cp == 'k') - bytes *= 1024; - else if (*cp == 'M' || *cp == 'm') - bytes *= 1024 * 1024; - else if (*cp == 'G' || *cp == 'g') - bytes *= 1024 * 1024 * 1024; - } - if (bytes < 0) - bytes = 0; - return ((u_long)bytes); -} - -/* - * use heuristics to determin the bucket size - */ -static u_int -size_bucket(const char *ifname, const u_int rate) -{ - u_int size, mtu; - - mtu = get_ifmtu(ifname); - if (mtu > 1500) - mtu = 1500; /* assume that the path mtu is still 1500 */ - - if (rate <= 1*1000*1000) - size = 1; - else if (rate <= 10*1000*1000) - size = 4; - else if (rate <= 200*1000*1000) - size = 8; - else - size = 24; - - size = size * mtu; - return (size); -} - -/* - * compute the bucket size to be required to fill the rate - * even when the rate is controlled only by the kernel timer. - */ -static u_int -autosize_bucket(const char *ifname, const u_int rate) -{ - u_int size, freq, mtu; - - mtu = get_ifmtu(ifname); - freq = get_clockfreq(); - size = rate / 8 / freq; - if (size < mtu) - size = mtu; - return (size); -} - -static int -get_clockfreq(void) -{ - struct clockinfo clkinfo; - int mib[2]; - size_t len; - - clkinfo.hz = 100; /* default Hz */ - - mib[0] = CTL_KERN; - mib[1] = KERN_CLOCKRATE; - len = sizeof(struct clockinfo); - if (sysctl(mib, 2, &clkinfo, &len, NULL, 0) == -1) - warnx("can't get clockrate via sysctl! use %dHz", clkinfo.hz); - return (clkinfo.hz); -} - -static int -get_ifmtu(const char *ifname) -{ - int s, mtu; - struct ifreq ifr; -#ifdef __OpenBSD__ - struct if_data ifdata; -#endif - - mtu = 512; /* default MTU */ - - if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) - return (mtu); - strncpy(ifr.ifr_name, ifname, sizeof ifr.ifr_name); -#ifdef __OpenBSD__ - ifr.ifr_data = (caddr_t)&ifdata; - if (ioctl(s, SIOCGIFDATA, (caddr_t)&ifr) == 0) - mtu = ifdata.ifi_mtu; -#else - if (ioctl(s, SIOCGIFMTU, (caddr_t)&ifr) == 0) - mtu = ifr.ifr_mtu; -#endif - close(s); - return (mtu); -} |