Annotation of 43BSD/contrib/enet/enet.4, revision 1.1

1.1     ! root        1: .TH ENET 4 "17 January 1986" Stanford
        !             2: .SH "NAME"
        !             3: enet \- ethernet packet filter
        !             4: .SH SYNOPSIS
        !             5: .B "pseudo-device enetfilter 64"
        !             6: .SH "DESCRIPTION"
        !             7: The packet filter
        !             8: provides a raw interface to Ethernets and similar network data link layers.
        !             9: Packets received that are not used by the kernel
        !            10: (i.e., to support IP, ARP, and on some systems XNS, protocols)
        !            11: are available through this mechanism.
        !            12: The packet filter appears as a set of character special files, one
        !            13: per hardware interface.
        !            14: Each
        !            15: .I enet
        !            16: file may be opened multiple times, allowing each interface to be used by
        !            17: many processes.
        !            18: The total number of open ethernet
        !            19: files is limited to the value given in the kernel configuration; the
        !            20: example given in the SYNOPSIS above sets the limit to 64.
        !            21: .PP
        !            22: The minor device numbers
        !            23: are associated with interfaces when the system is booted.
        !            24: Minor device 0
        !            25: is associated with the first Ethernet interface ``attached'',
        !            26: minor device 1 with the second, and so forth.
        !            27: (These character special files are, for historical reasons,
        !            28: given the names
        !            29: .IR /dev/enet0 ,
        !            30: .IR /dev/eneta0 ,
        !            31: .IR /dev/enetb0 ,
        !            32: etc.)
        !            33: .PP
        !            34: Associated with each open instance of an
        !            35: .I enet
        !            36: file is a user-settable packet filter which is used to deliver
        !            37: incoming ethernet packets to the appropriate process.
        !            38: Whenever a packet is received from the net, 
        !            39: successive packet filters from the list of filters for
        !            40: all open
        !            41: .I enet
        !            42: files are applied to the packet.
        !            43: When a filter accepts the packet,
        !            44: it is placed on the packet input queue of the
        !            45: associated file.
        !            46: If no filters accept the packet, it is discarded.
        !            47: The format of a packet filter is described below.
        !            48: .PP
        !            49: Reads from these files return the next packet
        !            50: from a queue of packets that have matched the filter.
        !            51: If insufficient buffer space to store the entire packet is specified in the
        !            52: read, the packet will be truncated and the trailing contents lost.
        !            53: Writes to these devices transmit packets on the
        !            54: network, with each write generating exactly one packet.
        !            55: .PP
        !            56: The packet filter currently supports a variety of different ``Ethernet''
        !            57: data-link levels:
        !            58: .IP "3mb Ethernet" 1.5i
        !            59: packets consist of 4 or more bytes with the first byte
        !            60: specifying the source ethernet address, the second
        !            61: byte specifying the destination ethernet  address,
        !            62: and the next two bytes specifying the packet type.
        !            63: (Actually, on the network the source and destination addresses
        !            64: are in the opposite order.)
        !            65: .IP "byte-swapping 3mb Ethernet" 1.5i
        !            66: packets consist of 4 or more bytes with the first byte
        !            67: specifying the source ethernet address, the second
        !            68: byte specifying the destination ethernet address,
        !            69: and the next two bytes specifying the packet type.
        !            70: \fBEach short word (pair of bytes) is swapped from the network
        !            71: byte order\fR; this device type is only provided as a concession
        !            72: to backwards-compatibility.
        !            73: .IP "10mb Ethernet" 1.5i
        !            74: packets consist of 14 or more bytes with the first six
        !            75: bytes specifying the destination ethernet address,
        !            76: the next six bytes the source ethernet address,
        !            77: and the next two bytes specifying the packet type.
        !            78: .PP
        !            79: The remaining words are interpreted according to the packet type.
        !            80: Note that 16-bit and 32-bit quantities may have to be byteswapped
        !            81: (and possible short-swapped) to be intelligible on a Vax.
        !            82: .PP
        !            83: The packet filter mechanism does not know anything about the data portion
        !            84: of the packets it sends and receives.  The user must supply
        !            85: the headers for transmitted packets (although the system makes sure that
        !            86: the source address is correct) and the headers of received packets
        !            87: are delivered to the user.  The packet filters treat the entire packet,
        !            88: including headers, as uninterpreted data.
        !            89: .SH "IOCTL CALLS"
        !            90: In addition to FIONREAD,
        !            91: ten special
        !            92: .I
        !            93: ioctl
        !            94: calls may be applied to an open
        !            95: .I
        !            96: enet
        !            97: file.
        !            98: The first two set and fetch parameters
        !            99: for the file and are of the form:
        !           100: .sp
        !           101: .nf
        !           102: .RS
        !           103: .B #include <sys/types.h>
        !           104: .B #include <sys/enet.h>
        !           105: .B ioctl(fildes, code, param)
        !           106: .B
        !           107: struct eniocb *param;
        !           108: .RE
        !           109: .fi
        !           110: .sp
        !           111: where
        !           112: .I
        !           113: param
        !           114: is defined in 
        !           115: .I
        !           116: <sys/enet.h>
        !           117: as:
        !           118: .br
        !           119: .sp
        !           120: .nf
        !           121: .RS
        !           122: .ta \w'struct 'u +\w'u_char  'u
        !           123: .ft B
        !           124: struct eniocb
        !           125: {
        !           126:        u_char  en_addr;
        !           127:        u_char  en_maxfilters;
        !           128:        u_char  en_maxwaiting;
        !           129:        u_char  en_maxpriority;
        !           130:        long    en_rtout;
        !           131: };
        !           132: .DT
        !           133: .RE
        !           134: .fi
        !           135: .ft R
        !           136: .sp
        !           137: with the applicable codes being:
        !           138: .TP
        !           139: EIOCGETP
        !           140: Fetch the parameters for this file.
        !           141: .TP
        !           142: EIOCSETP
        !           143: Set the parameters for this file.
        !           144: .i0
        !           145: .DT
        !           146: .PP
        !           147: The maximum filter length parameter en_maxfilters indicates
        !           148: the maximum possible packet filter command
        !           149: list length (see EIOCSETF below).
        !           150: The maximum input wait queue size parameter en_maxwaitingindicates
        !           151: the maximum number of packets which may be queued for an
        !           152: ethernet file at one time (see EIOCSETW below).
        !           153: The maximum priority parameter en_maxpriority indicates the highest
        !           154: filter priority which may be set for the file (see EIOCSETF below).
        !           155: The en_addr field is no longer maintained by the driver; see
        !           156: EIOCDEVP below.
        !           157: .PP
        !           158: The read timeout parameter en_rtout specifies the number of clock ticks to
        !           159: wait before timing out on a read request and returning an EOF.
        !           160: This parameter is initialized to zero by
        !           161: .IR open (2),
        !           162: indicating no timeout. If it is negative, then read requests will return an
        !           163: EOF immediately if there are no packets in the input queue.
        !           164: (Note that all parameters except for the read timeout are read-only
        !           165: and are ignored when changed.)
        !           166: .PP
        !           167: A different
        !           168: .I ioctl
        !           169: is used to get device parameters of the ethernet underlying the
        !           170: minor device.  It is of the form:
        !           171: .sp
        !           172: .nf
        !           173: .RS
        !           174: .B #include <sys/types.h>
        !           175: .br
        !           176: .B #include <sys/enet.h>
        !           177: .B ioctl(fildes, EIOCDEVP, param)
        !           178: .RE
        !           179: .fi
        !           180: .sp
        !           181: where
        !           182: .I param
        !           183: is defined in
        !           184: .I <sys/enet.h>
        !           185: as:
        !           186: .br
        !           187: .sp
        !           188: .nf
        !           189: .RS
        !           190: .ta \w'struct 'u +\w'u_short  'u
        !           191: .ft B
        !           192: struct endevp {
        !           193:        u_char  end_dev_type;
        !           194:        u_char  end_addr_len;
        !           195:        u_short end_hdr_len;
        !           196:        u_short end_MTU;
        !           197:        u_char  end_addr[EN_MAX_ADDR_LEN];
        !           198:        u_char  end_broadaddr[EN_MAX_ADDR_LEN];
        !           199: };
        !           200: .DT
        !           201: .RE
        !           202: .fi
        !           203: .ft R
        !           204: .sp
        !           205: The fields are:
        !           206: .IP end_dev_type 1.5i
        !           207: Specifies the device type; currently one of ENDT_3MB, ENDT_BS3MB or ENDT_10MB.
        !           208: .IP end_addr_len 1.5i
        !           209: Specifies the address length in bytes (e.g., 1 or 6).
        !           210: .IP end_hdr_len 1.5i
        !           211: Specifies the total header length in bytes (e.g., 4 or 14).
        !           212: .IP end_MTU 1.5i
        !           213: Specifies the maximum packet size, including header, in bytes.
        !           214: .IP end_addr 1.5i
        !           215: The address of this interface; aligned so that the low order
        !           216: byte of the address is the first byte in the array.
        !           217: .IP end_broadaddr 1.5i
        !           218: The hardware destination address for broadcasts on this network.
        !           219: .PP
        !           220: The next two calls enable and disable the input
        !           221: packet signal mechanism
        !           222: for the file and are of the form:
        !           223: .sp
        !           224: .nf
        !           225: .RS
        !           226: .B #include <sys/types.h>
        !           227: .B #include <sys/enet.h>
        !           228: .B ioctl(fildes, code, signp)
        !           229: .B
        !           230: u_int *signp;
        !           231: .RE
        !           232: .fi
        !           233: .sp
        !           234: where
        !           235: .I
        !           236: signp
        !           237: is a pointer to a word containing the number
        !           238: of the signal
        !           239: to be sent when an input packet arrives and
        !           240: with the applicable codes being:
        !           241: .TP
        !           242: EIOCENBS
        !           243: Enable the specified signal when an input packet
        !           244: is received for this file.
        !           245: If the ENHOLDSIG flag (see EIOCMBIS below) is not set,
        !           246: further signals are automatically disabled
        !           247: whenever a signal is sent to prevent nesting and hence
        !           248: must be specifically re-enabled after processing.
        !           249: When a signal number of 0 is supplied,
        !           250: this call is equivalent to EIOCINHS.
        !           251: .TP
        !           252: EIOCINHS
        !           253: Disable any signal when an input
        !           254: packet is received for this file
        !           255: (the
        !           256: .I signp
        !           257: parameter is ignored).
        !           258: This is the default when the file is first opened.
        !           259: .i0
        !           260: .DT
        !           261: .PP
        !           262: .sp
        !           263: The next two calls set and clear ``mode bits'' for the
        !           264: for the file and are of the form:
        !           265: .sp
        !           266: .nf
        !           267: .RS
        !           268: .B #include <sys/types.h>
        !           269: .B #include <sys/enet.h>
        !           270: .B ioctl(fildes, code, bits)
        !           271: .B
        !           272: u_short *bits;
        !           273: .RE
        !           274: .fi
        !           275: .sp
        !           276: where
        !           277: .I bits
        !           278: is a short work bit-mask specifying which bits to set or clear.
        !           279: Currently, the only bit mask recognized is ENHOLDSIG, which (if
        !           280: .IR clear )
        !           281: means that the driver should
        !           282: disable the effect of EIOCENBS once it has delivered a signal.
        !           283: Setting this bit
        !           284: means that you need use EIOCENBS only once.  (For historical reasons, the
        !           285: default is that ENHOLDSIG is set.)
        !           286: The applicable codes are:
        !           287: .TP
        !           288: EIOCMBIS
        !           289: Sets the specified mode bits
        !           290: .TP
        !           291: EIOCMBIC
        !           292: Clears the specified mode bits
        !           293: .PP
        !           294: Another
        !           295: .I
        !           296: ioctl
        !           297: call is used to set the maximum size
        !           298: of the packet input queue for
        !           299: an open
        !           300: .I
        !           301: enet
        !           302: file.
        !           303: It is of the form:
        !           304: .sp
        !           305: .nf
        !           306: .RS
        !           307: .B #include <sys/types.h>
        !           308: .B #include <sys/enet.h>
        !           309: .B ioctl(fildes, EIOCSETW, maxwaitingp)
        !           310: .B u_int *maxwaitingp;
        !           311: .RE
        !           312: .fi
        !           313: .sp
        !           314: where
        !           315: .I
        !           316: maxwaitingp
        !           317: is a pointer
        !           318: to a word containing
        !           319: the input queue size to be set.
        !           320: If this is greater than maximum allowable
        !           321: size (see EIOCGETP above), it is set to the maximum,
        !           322: and if it is zero, it is set to
        !           323: a default value.
        !           324: .sp
        !           325: Another
        !           326: .I
        !           327: ioctl
        !           328: call flushes the queue of incoming packets.
        !           329: It is of the
        !           330: form:
        !           331: .sp
        !           332: .nf
        !           333: .RS
        !           334: .B #include <sys/types.h>
        !           335: .B #include <sys/enet.h>
        !           336: .B ioctl(fildes, EIOCFLUSH, 0)
        !           337: .RE
        !           338: .fi
        !           339: .sp
        !           340: The final
        !           341: .I
        !           342: ioctl
        !           343: call is used to set the packet filter
        !           344: for an open
        !           345: .I
        !           346: enet
        !           347: file.
        !           348: It is of the form:
        !           349: .sp
        !           350: .nf
        !           351: .RS
        !           352: .B #include <sys/types.h>
        !           353: .B #include <sys/enet.h>
        !           354: .B ioctl(fildes, EIOCSETF, filter)
        !           355: .B struct enfilter *filter
        !           356: .RE
        !           357: .fi
        !           358: .sp
        !           359: where enfilter is defined in 
        !           360: .I
        !           361: <sys/enet.h>
        !           362: as:
        !           363: .sp
        !           364: .nf
        !           365: .RS
        !           366: .ft B
        !           367: .ta \w'struct 'u \w'struct u_short  'u
        !           368: struct enfilter
        !           369: {
        !           370:        u_char  enf_Priority;
        !           371:        u_char  enf_FilterLen;
        !           372:        u_short enf_Filter[ENMAXFILTERS];
        !           373: };
        !           374: .DT
        !           375: .ft R
        !           376: .RE
        !           377: .fi
        !           378: .PP
        !           379: A packet filter consists of a priority,
        !           380: the filter command list length (in shortwords),
        !           381: and the filter command list itself.
        !           382: Each filter command list specifies
        !           383: a sequence of actions which
        !           384: operate on an internal stack.
        !           385: Each shortword of the
        !           386: command list specifies an action from the set {
        !           387: .B
        !           388: ENF_PUSHLIT,
        !           389: .B
        !           390: ENF_PUSHZERO,
        !           391: .B
        !           392: ENF_PUSHWORD+N
        !           393: } which respectively push the next shortword of the
        !           394: command list, zero,
        !           395: or shortword
        !           396: .B
        !           397: N
        !           398: of the incoming packet on the stack, and a binary operator
        !           399: from the set {
        !           400: .B
        !           401: ENF_EQ,
        !           402: .B
        !           403: ENF_NEQ,
        !           404: .B
        !           405: ENF_LT,
        !           406: .B
        !           407: ENF_LE,
        !           408: .B
        !           409: ENF_GT,
        !           410: .B
        !           411: ENF_GE,
        !           412: .B
        !           413: ENF_AND,
        !           414: .B
        !           415: ENF_OR,
        !           416: .B
        !           417: ENF_XOR
        !           418: }
        !           419: which then operates on the
        !           420: top two elements of the stack and replaces them with its result.
        !           421: When both an action and operator are specified in the
        !           422: same shortword, the action is performed followed by the
        !           423: operation.
        !           424: .PP
        !           425: The binary operator can also be from the set {
        !           426: .B
        !           427: ENF_COR,
        !           428: .B
        !           429: ENF_CAND,
        !           430: .B
        !           431: ENF_CNOR,
        !           432: .B
        !           433: ENF_CNAND
        !           434: }.  These are ``short-circuit'' operators, in that they terminate
        !           435: the execution of the filter immediately if the condition they are checking
        !           436: for is found, and continue otherwise.
        !           437: All pop two elements from the stack and compare them for equality;
        !           438: .B
        !           439: ENF_CAND
        !           440: returns false if the result is false;
        !           441: .B
        !           442: ENF_COR
        !           443: returns true if the result is true;
        !           444: .B
        !           445: ENF_CNAND
        !           446: returns true if the result is false;
        !           447: .B
        !           448: ENF_CNOR
        !           449: returns false if the result is true.
        !           450: Unlike the other binary operators, these four do not leave a result
        !           451: on the stack, even if they continue.
        !           452: .PP
        !           453: The short-circuit operators should be used when possible, to reduce the
        !           454: amount of time spent evaluating filters.  When they are used, you should
        !           455: also arrange the order of the tests so that the filter will succeed or fail
        !           456: as soon as possible; for example, checking the Socket field of a Pup packet
        !           457: is more likely to indicate failure than the packet type field.
        !           458: .PP
        !           459: The
        !           460: special action
        !           461: .B
        !           462: ENF_NOPUSH
        !           463: and the special operator
        !           464: .B
        !           465: ENF_NOP
        !           466: can be used to only
        !           467: perform the binary operation or to only push a value on the stack.
        !           468: Since both are (conveniently) defined to be zero, indicating
        !           469: only an action actually specifies the action followed by
        !           470: .BR ENF_NOP ,
        !           471: and
        !           472: indicating only an operation actually specifies
        !           473: .B
        !           474: ENF_NOPUSH
        !           475: followed
        !           476: by the operation.
        !           477: .PP
        !           478: After executing the filter command list, a non-zero value (true)
        !           479: left on top of the stack
        !           480: (or an empty stack) causes the incoming
        !           481: packet to be accepted for the corresponding
        !           482: .I
        !           483: enet
        !           484: file and a zero value (false) causes the packet to
        !           485: be passed through the next packet filter.
        !           486: (If the filter exits as the result of a short-circuit operator,
        !           487: the top-of-stack value is ignored.)
        !           488: Specifying an undefined operation or action in the command list
        !           489: or performing an illegal operation or action (such as pushing
        !           490: a shortword offset
        !           491: past the end of the packet or executing a binary operator
        !           492: with fewer than two shortwords on the stack) causes a filter to
        !           493: reject the packet.
        !           494: .sp
        !           495: In an attempt to deal with the problem of
        !           496: overlapping and/or conflicting packet filters,
        !           497: the filters for each open
        !           498: .I
        !           499: enet
        !           500: file are ordered by the driver
        !           501: according to their priority
        !           502: (lowest
        !           503: priority is 0, highest is 255).
        !           504: When processing incoming
        !           505: ethernet
        !           506: packets, filters are applied according to their
        !           507: priority (from highest to lowest) and
        !           508: for identical priority values according to their
        !           509: relative ``busyness'' (the filter that has previously
        !           510: matched the most packets is checked first) until one or more filters
        !           511: accept the packet or all filters reject it and
        !           512: it is discarded.
        !           513: .PP
        !           514: Filters at a priority of 2 or higher are called "high priority"
        !           515: filters.
        !           516: Once a packet is delivered to one of these "high priority"
        !           517: .I
        !           518: enet
        !           519: files,
        !           520: no further filters are examined,
        !           521: i.e. 
        !           522: the packet is delivered only
        !           523: to the first
        !           524: .I
        !           525: enet
        !           526: file with a
        !           527: "high priority" filter
        !           528: which accepts the packet.
        !           529: A packet may be delivered to more than one filter with a priority
        !           530: below 2; this might be useful, for example, in building replicated programs.
        !           531: However, the use of low-priority filters imposes an additional cost on
        !           532: the system, as these filters each must be checked against all packets not
        !           533: accepted by a high-priority filter.
        !           534: .PP
        !           535: The packet filter for an
        !           536: .I
        !           537: enet
        !           538: file is initialized
        !           539: with length 0 at priority 0 by
        !           540: .IR open (2),
        !           541: and hence by default accepts all
        !           542: packets which no "high priority" filter
        !           543: is interested in.
        !           544: .PP
        !           545: Priorities should be assigned so that, in general, the more packets a
        !           546: filter is expected to match, the higher its priority.  This will prevent
        !           547: a lot of needless checking of packets against filters that aren't likely
        !           548: to match them.
        !           549: .SH "FILTER EXAMPLES"
        !           550: The following filter would accept all incoming
        !           551: .I Pup
        !           552: packets on a 3mb ethernet with Pup types in the range 1-0100:
        !           553: .sp
        !           554: .nf
        !           555: .ft B
        !           556: .ta \w'stru'u \w'struct ENF_PUSHWORD+8, ENF_PUSHLIT, 2,      'u
        !           557: struct enfilter f =
        !           558: {
        !           559:        10, 19, /* priority and length */
        !           560:        ENF_PUSHWORD+1, ENF_PUSHLIT, 2,
        !           561:                ENF_EQ, /* packet type == PUP */
        !           562:        ENF_PUSHWORD+3, ENF_PUSHLIT,
        !           563:                0xFF00, ENF_AND,        /* mask high byte */
        !           564:        ENF_PUSHZERO, ENF_GT,   /* PupType > 0 */
        !           565:        ENF_PUSHWORD+3, ENF_PUSHLIT,
        !           566:                0xFF00, ENF_AND,        /* mask high byte */
        !           567:        ENF_PUSHLIT, 0100, ENF_LE,      /* PupType <= 0100 */
        !           568:        ENF_AND,        /* 0 < PupType <= 0100 */
        !           569:        ENF_AND /* && packet type == PUP */
        !           570: };
        !           571: .DT
        !           572: .ft R
        !           573: .fi
        !           574: .sp
        !           575: Note that shortwords, such as the packet type field, are byte-swapped
        !           576: and so the literals you compare them to must be byte-swapped. Also,
        !           577: although for this example the word offsets are constants, code that
        !           578: must run with either 3mb or 10mb ethernets must use
        !           579: offsets that depend on the device type.
        !           580: .PP
        !           581: By taking advantage of the ability to
        !           582: specify both an action and operation in each word of
        !           583: the command list, the filter could be abbreviated to:
        !           584: .sp
        !           585: .nf
        !           586: .ta \w'stru'u \w'struct ENF_PUSHWORD+3, ENF_PUSHLIT | ENF_AND,   'u
        !           587: .ft B
        !           588: struct enfilter f =
        !           589: {
        !           590:        10, 14, /* priority and length */
        !           591:        ENF_PUSHWORD+1, ENF_PUSHLIT | ENF_EQ, 2,        /* packet type == PUP */
        !           592:        ENF_PUSHWORD+3, ENF_PUSHLIT | ENF_AND,
        !           593:                0xFF00, /* mask high byte */
        !           594:        ENF_PUSHZERO | ENF_GT,  /* PupType > 0 */
        !           595:        ENF_PUSHWORD+3, ENF_PUSHLIT | ENF_AND,
        !           596:                0xFF00, /* mask high byte */
        !           597:        ENF_PUSHLIT | ENF_LE, 0100,     /* PupType <= 0100 */
        !           598:        ENF_AND,        /* 0 < PupType <= 0100 */
        !           599:        ENF_AND /* && packet type == PUP */
        !           600: };
        !           601: .ft R
        !           602: .DT
        !           603: .fi
        !           604: .sp
        !           605: A different example shows the use of "short-circuit" operators to
        !           606: create a more efficient filter.  This one accepts Pup packets (on a 3Mbit
        !           607: ethernet) with a Socket field of 12345.  Note that we check the Socket field
        !           608: before the packet type field, since in most
        !           609: packets the Socket is not likely to match. 
        !           610: .sp
        !           611: .nf
        !           612: .ta \w'stru'u \w'struct ENF_PUSHWORD+3, ENF_PUSHLIT | ENF_CAND,  'u
        !           613: .ft B
        !           614: struct enfilter f =
        !           615: {
        !           616:        10, 9,  /* priority and length */
        !           617:        ENF_PUSHWORD+7, ENF_PUSHLIT | ENF_CAND,
        !           618:                0,      /* High word of socket */
        !           619:        ENF_PUSHWORD+8, ENF_PUSHLIT | ENF_CAND,
        !           620:                12345,  /* Low word of socket */
        !           621:        ENF_PUSHWORD+1, ENF_PUSHLIT | ENF_CAND,
        !           622:                2       /* packet type == Pup */
        !           623: };
        !           624: .ft R
        !           625: .DT
        !           626: .fi
        !           627: .SH "SEE ALSO"
        !           628: de(4), ec(4), en(4), il(4), enstat(8)
        !           629: .SH "FILES"
        !           630: /dev/enet{,a,b,c,...}0
        !           631: .SH BUGS
        !           632: The current implementation can only filter on words within
        !           633: the first "mbuf" of the packet; this is around 100 bytes (or
        !           634: 50 words).
        !           635: .PP
        !           636: Because packets are streams of bytes, yet the filters operate
        !           637: on short words, and standard network byte order is usually opposite
        !           638: from Vax byte order, the relational operators
        !           639: .B ENF_LT, ENF_LE,
        !           640: .B ENF_GT,
        !           641: and
        !           642: .B ENF_GE
        !           643: are not all that useful.  Fortunately, they were not often used
        !           644: when the packets were treated as streams of shorts, so this is
        !           645: probably not a severe problem.  If this becomes a severe problem,
        !           646: a byte-swapping operator could be added.
        !           647: .PP
        !           648: Many of the "features" of this driver are there for historical
        !           649: reasons; the manual page could be a lot cleaner if these were
        !           650: left out.
        !           651: .SH "HISTORY"
        !           652: .TP
        !           653: 8-Oct-85  Jeffrey Mogul at Stanford University
        !           654: Revised to describe 4.3BSD version of driver.
        !           655: .TP
        !           656: 18-Oct-84  Jeffrey Mogul at Stanford University
        !           657: Added short-circuit operators, changed discussion of priorities to
        !           658: reflect new arrangement.
        !           659: .TP
        !           660: 18-Jan-84  Jeffrey Mogul at Stanford University
        !           661: Updated for 4.2BSD (device-independent) version, including
        !           662: documentation of all non-kernel ioctls.
        !           663: .TP
        !           664: 17-Nov-81  Mike Accetta (mja) at Carnegie-Mellon University
        !           665: Added mention of <sys/types.h> to include examples.
        !           666: .TP
        !           667: 29-Sep-81  Mike Accetta (mja) at Carnegie-Mellon University
        !           668: Changed to describe new EIOCSETW and EIOCFLUSH ioctl
        !           669: calls and the new multiple packet queuing features.
        !           670: .TP
        !           671: 12-Nov-80  Mike Accetta (mja) at Carnegie-Mellon University
        !           672: Added description of signal mechanism for input packets.
        !           673: .TP
        !           674: 07-Mar-80  Mike Accetta (mja) at Carnegie-Mellon University
        !           675: Created.

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.