📄 ppp_generic.txt
字号:
from process context, not interrupt or softirq/BH context.* The remaining generic layer functions may be called at softirq/BH level but must not be called from a hardware interrupt handler.* The generic layer may call the channel start_xmit() function at softirq/BH level but will not call it at interrupt level. Thus the start_xmit() function may not block.* The generic layer will only call the channel ioctl() function in process context.The generic layer provides these guarantees to the channels:* The generic layer will not call the start_xmit() function for a channel while any thread is already executing in that function for that channel.* The generic layer will not call the ioctl() function for a channel while any thread is already executing in that function for that channel.* By the time a call to ppp_unregister_channel() returns, no thread will be executing in a call from the generic layer to that channel's start_xmit() or ioctl() function, and the generic layer will not call either of those functions subsequently.Interface to pppd-----------------The PPP generic layer exports a character device interface called/dev/ppp. This is used by pppd to control PPP interface units andchannels. Although there is only one /dev/ppp, each open instance of/dev/ppp acts independently and can be attached either to a PPP unitor a PPP channel. This is achieved using the file->private_data fieldto point to a separate object for each open instance of /dev/ppp. Inthis way an effect similar to Solaris' clone open is obtained,allowing us to control an arbitrary number of PPP interfaces andchannels without having to fill up /dev with hundreds of device names.When /dev/ppp is opened, a new instance is created which is initiallyunattached. Using an ioctl call, it can then be attached to anexisting unit, attached to a newly-created unit, or attached to anexisting channel. An instance attached to a unit can be used to sendand receive PPP control frames, using the read() and write() systemcalls, along with poll() if necessary. Similarly, an instanceattached to a channel can be used to send and receive PPP frames onthat channel.In multilink terms, the unit represents the bundle, while the channelsrepresent the individual physical links. Thus, a PPP frame sent by awrite to the unit (i.e., to an instance of /dev/ppp attached to theunit) will be subject to bundle-level compression and to fragmentationacross the individual links (if multilink is in use). In contrast, aPPP frame sent by a write to the channel will be sent as-is on thatchannel, without any multilink header.A channel is not initially attached to any unit. In this state it canbe used for PPP negotiation but not for the transfer of data packets.It can then be connected to a PPP unit with an ioctl call, whichmakes it available to send and receive data packets for that unit.The ioctl calls which are available on an instance of /dev/ppp dependon whether it is unattached, attached to a PPP interface, or attachedto a PPP channel. The ioctl calls which are available on anunattached instance are:* PPPIOCNEWUNIT creates a new PPP interface and makes this /dev/ppp instance the "owner" of the interface. The argument should point to an int which is the desired unit number if >= 0, or -1 to assign the lowest unused unit number. Being the owner of the interface means that the interface will be shut down if this instance of /dev/ppp is closed.* PPPIOCATTACH attaches this instance to an existing PPP interface. The argument should point to an int containing the unit number. This does not make this instance the owner of the PPP interface.* PPPIOCATTCHAN attaches this instance to an existing PPP channel. The argument should point to an int containing the channel number.The ioctl calls available on an instance of /dev/ppp attached to achannel are:* PPPIOCDETACH detaches the instance from the channel. This ioctl is deprecated since the same effect can be achieved by closing the instance. In order to prevent possible races this ioctl will fail with an EINVAL error if more than one file descriptor refers to this instance (i.e. as a result of dup(), dup2() or fork()).* PPPIOCCONNECT connects this channel to a PPP interface. The argument should point to an int containing the interface unit number. It will return an EINVAL error if the channel is already connected to an interface, or ENXIO if the requested interface does not exist.* PPPIOCDISCONN disconnects this channel from the PPP interface that it is connected to. It will return an EINVAL error if the channel is not connected to an interface.* All other ioctl commands are passed to the channel ioctl() function.The ioctl calls that are available on an instance that is attached toan interface unit are:* PPPIOCSMRU sets the MRU (maximum receive unit) for the interface. The argument should point to an int containing the new MRU value.* PPPIOCSFLAGS sets flags which control the operation of the interface. The argument should be a pointer to an int containing the new flags value. The bits in the flags value that can be set are: SC_COMP_TCP enable transmit TCP header compression SC_NO_TCP_CCID disable connection-id compression for TCP header compression SC_REJ_COMP_TCP disable receive TCP header decompression SC_CCP_OPEN Compression Control Protocol (CCP) is open, so inspect CCP packets SC_CCP_UP CCP is up, may (de)compress packets SC_LOOP_TRAFFIC send IP traffic to pppd SC_MULTILINK enable PPP multilink fragmentation on transmitted packets SC_MP_SHORTSEQ expect short multilink sequence numbers on received multilink fragments SC_MP_XSHORTSEQ transmit short multilink sequence nos. The values of these flags are defined in <linux/if_ppp.h>. Note that the values of the SC_MULTILINK, SC_MP_SHORTSEQ and SC_MP_XSHORTSEQ bits are ignored if the CONFIG_PPP_MULTILINK option is not selected.* PPPIOCGFLAGS returns the value of the status/control flags for the interface unit. The argument should point to an int where the ioctl will store the flags value. As well as the values listed above for PPPIOCSFLAGS, the following bits may be set in the returned value: SC_COMP_RUN CCP compressor is running SC_DECOMP_RUN CCP decompressor is running SC_DC_ERROR CCP decompressor detected non-fatal error SC_DC_FERROR CCP decompressor detected fatal error* PPPIOCSCOMPRESS sets the parameters for packet compression or decompression. The argument should point to a ppp_option_data structure (defined in <linux/if_ppp.h>), which contains a pointer/length pair which should describe a block of memory containing a CCP option specifying a compression method and its parameters. The ppp_option_data struct also contains a `transmit' field. If this is 0, the ioctl will affect the receive path, otherwise the transmit path.* PPPIOCGUNIT returns, in the int pointed to by the argument, the unit number of this interface unit.* PPPIOCSDEBUG sets the debug flags for the interface to the value in the int pointed to by the argument. Only the least significant bit is used; if this is 1 the generic layer will print some debug messages during its operation. This is only intended for debugging the generic PPP layer code; it is generally not helpful for working out why a PPP connection is failing.* PPPIOCGDEBUG returns the debug flags for the interface in the int pointed to by the argument.* PPPIOCGIDLE returns the time, in seconds, since the last data packets were sent and received. The argument should point to a ppp_idle structure (defined in <linux/ppp_defs.h>). If the CONFIG_PPP_FILTER option is enabled, the set of packets which reset the transmit and receive idle timers is restricted to those which pass the `active' packet filter.* PPPIOCSMAXCID sets the maximum connection-ID parameter (and thus the number of connection slots) for the TCP header compressor and decompressor. The lower 16 bits of the int pointed to by the argument specify the maximum connection-ID for the compressor. If the upper 16 bits of that int are non-zero, they specify the maximum connection-ID for the decompressor, otherwise the decompressor's maximum connection-ID is set to 15.* PPPIOCSNPMODE sets the network-protocol mode for a given network protocol. The argument should point to an npioctl struct (defined in <linux/if_ppp.h>). The `protocol' field gives the PPP protocol number for the protocol to be affected, and the `mode' field specifies what to do with packets for that protocol: NPMODE_PASS normal operation, transmit and receive packets NPMODE_DROP silently drop packets for this protocol NPMODE_ERROR drop packets and return an error on transmit NPMODE_QUEUE queue up packets for transmit, drop received packets At present NPMODE_ERROR and NPMODE_QUEUE have the same effect as NPMODE_DROP.* PPPIOCGNPMODE returns the network-protocol mode for a given protocol. The argument should point to an npioctl struct with the `protocol' field set to the PPP protocol number for the protocol of interest. On return the `mode' field will be set to the network- protocol mode for that protocol.* PPPIOCSPASS and PPPIOCSACTIVE set the `pass' and `active' packet filters. These ioctls are only available if the CONFIG_PPP_FILTER option is selected. The argument should point to a sock_fprog structure (defined in <linux/filter.h>) containing the compiled BPF instructions for the filter. Packets are dropped if they fail the `pass' filter; otherwise, if they fail the `active' filter they are passed but they do not reset the transmit or receive idle timer.* PPPIOCSMRRU enables or disables multilink processing for received packets and sets the multilink MRRU (maximum reconstructed receive unit). The argument should point to an int containing the new MRRU value. If the MRRU value is 0, processing of received multilink fragments is disabled. This ioctl is only available if the CONFIG_PPP_MULTILINK option is selected.Last modified: 7-feb-2002
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -