⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ppp_generic.txt

📁 linux 内核源代码
💻 TXT
📖 第 1 页 / 共 2 页
字号:
  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 + -