1.\" Copyright (c) 1990 The Regents of the University of California. 2.\" All rights reserved. 3.\" 4.\" Redistribution and use in source and binary forms, with or without 5.\" modification, are permitted provided that: (1) source code distributions 6.\" retain the above copyright notice and this paragraph in its entirety, (2) 7.\" distributions including binary code include the above copyright notice and 8.\" this paragraph in its entirety in the documentation or other materials 9.\" provided with the distribution, and (3) all advertising materials mentioning 10.\" features or use of this software display the following acknowledgement: 11.\" ``This product includes software developed by the University of California, 12.\" Lawrence Berkeley Laboratory and its contributors.'' Neither the name of 13.\" the University nor the names of its contributors may be used to endorse 14.\" or promote products derived from this software without specific prior 15.\" written permission. 16.\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED 17.\" WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF 18.\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 19.\" 20.\" This document is derived in part from the enet man page (enet.4) 21.\" distributed with 4.3BSD Unix. 22.\" 23.\" $FreeBSD$ 24.\" 25.Dd January 16, 1996 26.Dt BPF 4 27.Os 28.Sh NAME 29.Nm bpf 30.Nd Berkeley Packet Filter 31.Sh SYNOPSIS 32.Cd device bpf 33.Sh DESCRIPTION 34The Berkeley Packet Filter 35provides a raw interface to data link layers in a protocol 36independent fashion. 37All packets on the network, even those destined for other hosts, 38are accessible through this mechanism. 39.Pp 40The packet filter appears as a character special device, 41.Pa /dev/bpf0 , 42.Pa /dev/bpf1 , 43etc. 44After opening the device, the file descriptor must be bound to a 45specific network interface with the 46.Dv BIOCSETIF 47ioctl. 48A given interface can be shared by multiple listeners, and the filter 49underlying each descriptor will see an identical packet stream. 50.Pp 51A separate device file is required for each minor device. 52If a file is in use, the open will fail and 53.Va errno 54will be set to 55.Er EBUSY . 56.Pp 57Associated with each open instance of a 58.Nm 59file is a user-settable packet filter. 60Whenever a packet is received by an interface, 61all file descriptors listening on that interface apply their filter. 62Each descriptor that accepts the packet receives its own copy. 63.Pp 64Reads from these files return the next group of packets 65that have matched the filter. 66To improve performance, the buffer passed to read must be 67the same size as the buffers used internally by 68.Nm . 69This size is returned by the 70.Dv BIOCGBLEN 71ioctl (see below), and 72can be set with 73.Dv BIOCSBLEN . 74Note that an individual packet larger than this size is necessarily 75truncated. 76.Pp 77The packet filter will support any link level protocol that has fixed length 78headers. 79Currently, only Ethernet, 80.Tn SLIP , 81and 82.Tn PPP 83drivers have been modified to interact with 84.Nm . 85.Pp 86Since packet data is in network byte order, applications should use the 87.Xr byteorder 3 88macros to extract multi-byte values. 89.Pp 90A packet can be sent out on the network by writing to a 91.Nm 92file descriptor. 93The writes are unbuffered, meaning only one packet can be processed per write. 94Currently, only writes to Ethernets and 95.Tn SLIP 96links are supported. 97.Sh IOCTLS 98The 99.Xr ioctl 2 100command codes below are defined in 101.In net/bpf.h . 102All commands require 103these includes: 104.Bd -literal 105 #include <sys/types.h> 106 #include <sys/time.h> 107 #include <sys/ioctl.h> 108 #include <net/bpf.h> 109.Ed 110.Pp 111Additionally, 112.Dv BIOCGETIF 113and 114.Dv BIOCSETIF 115require 116.In sys/socket.h 117and 118.In net/if.h . 119.Pp 120In addition to 121.Dv FIONREAD 122and 123.Dv SIOCGIFADDR , 124the following commands may be applied to any open 125.Nm 126file. 127The (third) argument to 128.Xr ioctl 2 129should be a pointer to the type indicated. 130.Bl -tag -width BIOCGRTIMEOUT 131.It Dv BIOCGBLEN 132.Pq Li u_int 133Returns the required buffer length for reads on 134.Nm 135files. 136.It Dv BIOCSBLEN 137.Pq Li u_int 138Sets the buffer length for reads on 139.Nm 140files. 141The buffer must be set before the file is attached to an interface 142with 143.Dv BIOCSETIF . 144If the requested buffer size cannot be accommodated, the closest 145allowable size will be set and returned in the argument. 146A read call will result in 147.Er EIO 148if it is passed a buffer that is not this size. 149.It Dv BIOCGDLT 150.Pq Li u_int 151Returns the type of the data link layer underlying the attached interface. 152.Er EINVAL 153is returned if no interface has been specified. 154The device types, prefixed with 155.Dq Li DLT_ , 156are defined in 157.In net/bpf.h . 158.It Dv BIOCPROMISC 159Forces the interface into promiscuous mode. 160All packets, not just those destined for the local host, are processed. 161Since more than one file can be listening on a given interface, 162a listener that opened its interface non-promiscuously may receive 163packets promiscuously. 164This problem can be remedied with an appropriate filter. 165.It Dv BIOCFLUSH 166Flushes the buffer of incoming packets, 167and resets the statistics that are returned by BIOCGSTATS. 168.It Dv BIOCGETIF 169.Pq Li "struct ifreq" 170Returns the name of the hardware interface that the file is listening on. 171The name is returned in the ifr_name field of 172the 173.Li ifreq 174structure. 175All other fields are undefined. 176.It Dv BIOCSETIF 177.Pq Li "struct ifreq" 178Sets the hardware interface associate with the file. 179This 180command must be performed before any packets can be read. 181The device is indicated by name using the 182.Li ifr_name 183field of the 184.Li ifreq 185structure. 186Additionally, performs the actions of 187.Dv BIOCFLUSH . 188.It Dv BIOCSRTIMEOUT 189.It Dv BIOCGRTIMEOUT 190.Pq Li "struct timeval" 191Set or get the read timeout parameter. 192The argument 193specifies the length of time to wait before timing 194out on a read request. 195This parameter is initialized to zero by 196.Xr open 2 , 197indicating no timeout. 198.It Dv BIOCGSTATS 199.Pq Li "struct bpf_stat" 200Returns the following structure of packet statistics: 201.Bd -literal 202struct bpf_stat { 203 u_int bs_recv; /* number of packets received */ 204 u_int bs_drop; /* number of packets dropped */ 205}; 206.Ed 207.Pp 208The fields are: 209.Bl -hang -offset indent 210.It Li bs_recv 211the number of packets received by the descriptor since opened or reset 212(including any buffered since the last read call); 213and 214.It Li bs_drop 215the number of packets which were accepted by the filter but dropped by the 216kernel because of buffer overflows 217(i.e., the application's reads are not keeping up with the packet traffic). 218.El 219.It Dv BIOCIMMEDIATE 220.Pq Li u_int 221Enable or disable 222.Dq immediate mode , 223based on the truth value of the argument. 224When immediate mode is enabled, reads return immediately upon packet 225reception. 226Otherwise, a read will block until either the kernel buffer 227becomes full or a timeout occurs. 228This is useful for programs like 229.Xr rarpd 8 230which must respond to messages in real time. 231The default for a new file is off. 232.It Dv BIOCSETF 233.Pq Li "struct bpf_program" 234Sets the read filter program used by the kernel to discard uninteresting 235packets. 236An array of instructions and its length is passed in using 237the following structure: 238.Bd -literal 239struct bpf_program { 240 int bf_len; 241 struct bpf_insn *bf_insns; 242}; 243.Ed 244.Pp 245The filter program is pointed to by the 246.Li bf_insns 247field while its length in units of 248.Sq Li struct bpf_insn 249is given by the 250.Li bf_len 251field. 252Also, the actions of 253.Dv BIOCFLUSH 254are performed. 255See section 256.Sx "FILTER MACHINE" 257for an explanation of the filter language. 258.It Dv BIOCSETWF 259.Pq Li "struct bpf_program" 260Sets the write filter program used by the kernel to control what type of 261packets can be written to the interface. See the BIOCSETF command for more 262information on the bpf filter program. 263.It Dv BIOCVERSION 264.Pq Li "struct bpf_version" 265Returns the major and minor version numbers of the filter language currently 266recognized by the kernel. 267Before installing a filter, applications must check 268that the current version is compatible with the running kernel. 269Version numbers are compatible if the major numbers match and the application minor 270is less than or equal to the kernel minor. 271The kernel version number is returned in the following structure: 272.Bd -literal 273struct bpf_version { 274 u_short bv_major; 275 u_short bv_minor; 276}; 277.Ed 278.Pp 279The current version numbers are given by 280.Dv BPF_MAJOR_VERSION 281and 282.Dv BPF_MINOR_VERSION 283from 284.In net/bpf.h . 285An incompatible filter 286may result in undefined behavior (most likely, an error returned by 287.Fn ioctl 288or haphazard packet matching). 289.It Dv BIOCSHDRCMPLT 290.It Dv BIOCGHDRCMPLT 291.Pq Li u_int 292Set or get the status of the 293.Dq header complete 294flag. 295Set to zero if the link level source address should be filled in automatically 296by the interface output routine. 297Set to one if the link level source 298address will be written, as provided, to the wire. 299This flag is initialized to zero by default. 300.It Dv BIOCSSEESENT 301.It Dv BIOCGSEESENT 302.Pq Li u_int 303Set or get the flag determining whether locally generated packets on the 304interface should be returned by BPF. 305Set to zero to see only incoming packets on the interface. 306Set to one to see packets originating locally and remotely on the interface. 307This flag is initialized to one by 308default. 309.It Dv BIOCLOCK 310Set the locked flag on the bpf descriptor. This prevents the execution of 311ioctl commands which could change the underlying operating parameters of 312the device. 313.El 314.Sh BPF HEADER 315The following structure is prepended to each packet returned by 316.Xr read 2 : 317.Bd -literal 318struct bpf_hdr { 319 struct timeval bh_tstamp; /* time stamp */ 320 u_long bh_caplen; /* length of captured portion */ 321 u_long bh_datalen; /* original length of packet */ 322 u_short bh_hdrlen; /* length of bpf header (this struct 323 plus alignment padding */ 324}; 325.Ed 326.Pp 327The fields, whose values are stored in host order, and are: 328.Pp 329.Bl -tag -compact -width bh_datalen 330.It Li bh_tstamp 331The time at which the packet was processed by the packet filter. 332.It Li bh_caplen 333The length of the captured portion of the packet. 334This is the minimum of 335the truncation amount specified by the filter and the length of the packet. 336.It Li bh_datalen 337The length of the packet off the wire. 338This value is independent of the truncation amount specified by the filter. 339.It Li bh_hdrlen 340The length of the 341.Nm 342header, which may not be equal to 343.\" XXX - not really a function call 344.Fn sizeof "struct bpf_hdr" . 345.El 346.Pp 347The 348.Li bh_hdrlen 349field exists to account for 350padding between the header and the link level protocol. 351The purpose here is to guarantee proper alignment of the packet 352data structures, which is required on alignment sensitive 353architectures and improves performance on many other architectures. 354The packet filter insures that the 355.Li bpf_hdr 356and the network layer 357header will be word aligned. 358Suitable precautions 359must be taken when accessing the link layer protocol fields on alignment 360restricted machines. 361(This is not a problem on an Ethernet, since 362the type field is a short falling on an even offset, 363and the addresses are probably accessed in a bytewise fashion). 364.Pp 365Additionally, individual packets are padded so that each starts 366on a word boundary. 367This requires that an application 368has some knowledge of how to get from packet to packet. 369The macro 370.Dv BPF_WORDALIGN 371is defined in 372.In net/bpf.h 373to facilitate 374this process. 375It rounds up its argument to the nearest word aligned value (where a word is 376.Dv BPF_ALIGNMENT 377bytes wide). 378.Pp 379For example, if 380.Sq Li p 381points to the start of a packet, this expression 382will advance it to the next packet: 383.Dl p = (char *)p + BPF_WORDALIGN(p->bh_hdrlen + p->bh_caplen) 384.Pp 385For the alignment mechanisms to work properly, the 386buffer passed to 387.Xr read 2 388must itself be word aligned. 389The 390.Xr malloc 3 391function 392will always return an aligned buffer. 393.Sh FILTER MACHINE 394A filter program is an array of instructions, with all branches forwardly 395directed, terminated by a 396.Em return 397instruction. 398Each instruction performs some action on the pseudo-machine state, 399which consists of an accumulator, index register, scratch memory store, 400and implicit program counter. 401.Pp 402The following structure defines the instruction format: 403.Bd -literal 404struct bpf_insn { 405 u_short code; 406 u_char jt; 407 u_char jf; 408 u_long k; 409}; 410.Ed 411.Pp 412The 413.Li k 414field is used in different ways by different instructions, 415and the 416.Li jt 417and 418.Li jf 419fields are used as offsets 420by the branch instructions. 421The opcodes are encoded in a semi-hierarchical fashion. 422There are eight classes of instructions: 423.Dv BPF_LD , 424.Dv BPF_LDX , 425.Dv BPF_ST , 426.Dv BPF_STX , 427.Dv BPF_ALU , 428.Dv BPF_JMP , 429.Dv BPF_RET , 430and 431.Dv BPF_MISC . 432Various other mode and 433operator bits are or'd into the class to give the actual instructions. 434The classes and modes are defined in 435.In net/bpf.h . 436.Pp 437Below are the semantics for each defined 438.Nm 439instruction. 440We use the convention that A is the accumulator, X is the index register, 441P[] packet data, and M[] scratch memory store. 442P[i:n] gives the data at byte offset 443.Dq i 444in the packet, 445interpreted as a word (n=4), 446unsigned halfword (n=2), or unsigned byte (n=1). 447M[i] gives the i'th word in the scratch memory store, which is only 448addressed in word units. 449The memory store is indexed from 0 to 450.Dv BPF_MEMWORDS 451- 1. 452.Li k , 453.Li jt , 454and 455.Li jf 456are the corresponding fields in the 457instruction definition. 458.Dq len 459refers to the length of the packet. 460.Pp 461.Bl -tag -width BPF_STXx 462.It Dv BPF_LD 463These instructions copy a value into the accumulator. 464The type of the source operand is specified by an 465.Dq addressing mode 466and can be a constant 467.Pq Dv BPF_IMM , 468packet data at a fixed offset 469.Pq Dv BPF_ABS , 470packet data at a variable offset 471.Pq Dv BPF_IND , 472the packet length 473.Pq Dv BPF_LEN , 474or a word in the scratch memory store 475.Pq Dv BPF_MEM . 476For 477.Dv BPF_IND 478and 479.Dv BPF_ABS , 480the data size must be specified as a word 481.Pq Dv BPF_W , 482halfword 483.Pq Dv BPF_H , 484or byte 485.Pq Dv BPF_B . 486The semantics of all the recognized 487.Dv BPF_LD 488instructions follow. 489.Pp 490.Bd -literal 491BPF_LD+BPF_W+BPF_ABS A <- P[k:4] 492BPF_LD+BPF_H+BPF_ABS A <- P[k:2] 493BPF_LD+BPF_B+BPF_ABS A <- P[k:1] 494BPF_LD+BPF_W+BPF_IND A <- P[X+k:4] 495BPF_LD+BPF_H+BPF_IND A <- P[X+k:2] 496BPF_LD+BPF_B+BPF_IND A <- P[X+k:1] 497BPF_LD+BPF_W+BPF_LEN A <- len 498BPF_LD+BPF_IMM A <- k 499BPF_LD+BPF_MEM A <- M[k] 500.Ed 501.It Dv BPF_LDX 502These instructions load a value into the index register. 503Note that 504the addressing modes are more restrictive than those of the accumulator loads, 505but they include 506.Dv BPF_MSH , 507a hack for efficiently loading the IP header length. 508.Pp 509.Bd -literal 510BPF_LDX+BPF_W+BPF_IMM X <- k 511BPF_LDX+BPF_W+BPF_MEM X <- M[k] 512BPF_LDX+BPF_W+BPF_LEN X <- len 513BPF_LDX+BPF_B+BPF_MSH X <- 4*(P[k:1]&0xf) 514.Ed 515.It Dv BPF_ST 516This instruction stores the accumulator into the scratch memory. 517We do not need an addressing mode since there is only one possibility 518for the destination. 519.Pp 520.Bd -literal 521BPF_ST M[k] <- A 522.Ed 523.It Dv BPF_STX 524This instruction stores the index register in the scratch memory store. 525.Pp 526.Bd -literal 527BPF_STX M[k] <- X 528.Ed 529.It Dv BPF_ALU 530The alu instructions perform operations between the accumulator and 531index register or constant, and store the result back in the accumulator. 532For binary operations, a source mode is required 533.Dv ( BPF_K 534or 535.Dv BPF_X ) . 536.Pp 537.Bd -literal 538BPF_ALU+BPF_ADD+BPF_K A <- A + k 539BPF_ALU+BPF_SUB+BPF_K A <- A - k 540BPF_ALU+BPF_MUL+BPF_K A <- A * k 541BPF_ALU+BPF_DIV+BPF_K A <- A / k 542BPF_ALU+BPF_AND+BPF_K A <- A & k 543BPF_ALU+BPF_OR+BPF_K A <- A | k 544BPF_ALU+BPF_LSH+BPF_K A <- A << k 545BPF_ALU+BPF_RSH+BPF_K A <- A >> k 546BPF_ALU+BPF_ADD+BPF_X A <- A + X 547BPF_ALU+BPF_SUB+BPF_X A <- A - X 548BPF_ALU+BPF_MUL+BPF_X A <- A * X 549BPF_ALU+BPF_DIV+BPF_X A <- A / X 550BPF_ALU+BPF_AND+BPF_X A <- A & X 551BPF_ALU+BPF_OR+BPF_X A <- A | X 552BPF_ALU+BPF_LSH+BPF_X A <- A << X 553BPF_ALU+BPF_RSH+BPF_X A <- A >> X 554BPF_ALU+BPF_NEG A <- -A 555.Ed 556.It Dv BPF_JMP 557The jump instructions alter flow of control. 558Conditional jumps 559compare the accumulator against a constant 560.Pq Dv BPF_K 561or the index register 562.Pq Dv BPF_X . 563If the result is true (or non-zero), 564the true branch is taken, otherwise the false branch is taken. 565Jump offsets are encoded in 8 bits so the longest jump is 256 instructions. 566However, the jump always 567.Pq Dv BPF_JA 568opcode uses the 32 bit 569.Li k 570field as the offset, allowing arbitrarily distant destinations. 571All conditionals use unsigned comparison conventions. 572.Pp 573.Bd -literal 574BPF_JMP+BPF_JA pc += k 575BPF_JMP+BPF_JGT+BPF_K pc += (A > k) ? jt : jf 576BPF_JMP+BPF_JGE+BPF_K pc += (A >= k) ? jt : jf 577BPF_JMP+BPF_JEQ+BPF_K pc += (A == k) ? jt : jf 578BPF_JMP+BPF_JSET+BPF_K pc += (A & k) ? jt : jf 579BPF_JMP+BPF_JGT+BPF_X pc += (A > X) ? jt : jf 580BPF_JMP+BPF_JGE+BPF_X pc += (A >= X) ? jt : jf 581BPF_JMP+BPF_JEQ+BPF_X pc += (A == X) ? jt : jf 582BPF_JMP+BPF_JSET+BPF_X pc += (A & X) ? jt : jf 583.Ed 584.It Dv BPF_RET 585The return instructions terminate the filter program and specify the amount 586of packet to accept (i.e., they return the truncation amount). 587A return value of zero indicates that the packet should be ignored. 588The return value is either a constant 589.Pq Dv BPF_K 590or the accumulator 591.Pq Dv BPF_A . 592.Pp 593.Bd -literal 594BPF_RET+BPF_A accept A bytes 595BPF_RET+BPF_K accept k bytes 596.Ed 597.It Dv BPF_MISC 598The miscellaneous category was created for anything that does not 599fit into the above classes, and for any new instructions that might need to 600be added. 601Currently, these are the register transfer instructions 602that copy the index register to the accumulator or vice versa. 603.Pp 604.Bd -literal 605BPF_MISC+BPF_TAX X <- A 606BPF_MISC+BPF_TXA A <- X 607.Ed 608.El 609.Pp 610The 611.Nm 612interface provides the following macros to facilitate 613array initializers: 614.Fn BPF_STMT opcode operand 615and 616.Fn BPF_JUMP opcode operand true_offset false_offset . 617.Sh FILES 618.Bl -tag -compact -width /dev/bpfXXX 619.It Pa /dev/bpf Ns Sy n 620the packet filter device 621.El 622.Sh EXAMPLES 623The following filter is taken from the Reverse ARP Daemon. 624It accepts only Reverse ARP requests. 625.Bd -literal 626struct bpf_insn insns[] = { 627 BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12), 628 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, ETHERTYPE_REVARP, 0, 3), 629 BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 20), 630 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, REVARP_REQUEST, 0, 1), 631 BPF_STMT(BPF_RET+BPF_K, sizeof(struct ether_arp) + 632 sizeof(struct ether_header)), 633 BPF_STMT(BPF_RET+BPF_K, 0), 634}; 635.Ed 636.Pp 637This filter accepts only IP packets between host 128.3.112.15 and 638128.3.112.35. 639.Bd -literal 640struct bpf_insn insns[] = { 641 BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12), 642 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, ETHERTYPE_IP, 0, 8), 643 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26), 644 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2), 645 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30), 646 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 4), 647 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3), 648 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30), 649 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 1), 650 BPF_STMT(BPF_RET+BPF_K, (u_int)-1), 651 BPF_STMT(BPF_RET+BPF_K, 0), 652}; 653.Ed 654.Pp 655Finally, this filter returns only TCP finger packets. 656We must parse the IP header to reach the TCP header. 657The 658.Dv BPF_JSET 659instruction 660checks that the IP fragment offset is 0 so we are sure 661that we have a TCP header. 662.Bd -literal 663struct bpf_insn insns[] = { 664 BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12), 665 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, ETHERTYPE_IP, 0, 10), 666 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 23), 667 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, IPPROTO_TCP, 0, 8), 668 BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 20), 669 BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 0x1fff, 6, 0), 670 BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, 14), 671 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 14), 672 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 79, 2, 0), 673 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 16), 674 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 79, 0, 1), 675 BPF_STMT(BPF_RET+BPF_K, (u_int)-1), 676 BPF_STMT(BPF_RET+BPF_K, 0), 677}; 678.Ed 679.Sh SEE ALSO 680.Xr tcpdump 1 , 681.Xr ioctl 2 , 682.Xr byteorder 3 , 683.Xr ng_bpf 4 , 684.Xr bpf 9 685.Rs 686.%A McCanne, S. 687.%A Jacobson V. 688.%T "An efficient, extensible, and portable network monitor" 689.Re 690.Sh HISTORY 691The Enet packet filter was created in 1980 by Mike Accetta and 692Rick Rashid at Carnegie-Mellon University. 693Jeffrey Mogul, at 694Stanford, ported the code to 695.Bx 696and continued its development from 6971983 on. 698Since then, it has evolved into the Ultrix Packet Filter at 699.Tn DEC , 700a 701.Tn STREAMS 702.Tn NIT 703module under 704.Tn SunOS 4.1 , 705and 706.Tn BPF . 707.Sh AUTHORS 708.An -nosplit 709.An Steven McCanne , 710of Lawrence Berkeley Laboratory, implemented BPF in 711Summer 1990. 712Much of the design is due to 713.An Van Jacobson . 714.Sh BUGS 715The read buffer must be of a fixed size (returned by the 716.Dv BIOCGBLEN 717ioctl). 718.Pp 719A file that does not request promiscuous mode may receive promiscuously 720received packets as a side effect of another file requesting this 721mode on the same hardware interface. 722This could be fixed in the kernel with additional processing overhead. 723However, we favor the model where 724all files must assume that the interface is promiscuous, and if 725so desired, must utilize a filter to reject foreign packets. 726.Pp 727Data link protocols with variable length headers are not currently supported. 728.Pp 729The 730.Dv SEESENT 731flag has been observed to work incorrectly on some interface 732types, including those with hardware loopback rather than software loopback, 733and point-to-point interfaces. 734It appears to function correctly on a 735broad range of Ethernet-style interfaces. 736