mirror of https://gitee.com/openkylin/linux.git
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (27 commits) net: clear heap allocation for ETHTOOL_GRXCLSRLALL isdn: strcpy() => strlcpy() Revert "mac80211: use netif_receive_skb in ieee80211_tx_status callpath" mac80211: delete AddBA response timer ath9k_hw: fix regression in ANI listen time calculation caif: fix two caif_connect() bugs bonding: fix WARN_ON when writing to bond_master sysfs file skge: add quirk to limit DMA MAINTAINERS: update Intel LAN Ethernet info e1000e.txt: Add e1000e documentation e1000.txt: Update e1000 documentation ixgbevf.txt: Update ixgbevf documentation cls_u32: signedness bug Bluetooth: Disallow to change L2CAP_OPTIONS values when connected sctp: Fix out-of-bounds reading in sctp_asoc_get_hmac() sctp: prevent reading out-of-bounds memory ipv4: correct IGMP behavior on v3 query during v2-compatibility mode netdev: Depend on INET before selecting INET_LRO Revert "ipv4: Make INET_LRO a bool instead of tristate." net: Fix the condition passed to sk_wait_event() ...
This commit is contained in:
commit
85a331881d
|
@ -1,82 +1,35 @@
|
|||
Linux* Base Driver for the Intel(R) PRO/1000 Family of Adapters
|
||||
===============================================================
|
||||
|
||||
September 26, 2006
|
||||
|
||||
Intel Gigabit Linux driver.
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
|
||||
Contents
|
||||
========
|
||||
|
||||
- In This Release
|
||||
- Identifying Your Adapter
|
||||
- Building and Installation
|
||||
- Command Line Parameters
|
||||
- Speed and Duplex Configuration
|
||||
- Additional Configurations
|
||||
- Known Issues
|
||||
- Support
|
||||
|
||||
|
||||
In This Release
|
||||
===============
|
||||
|
||||
This file describes the Linux* Base Driver for the Intel(R) PRO/1000 Family
|
||||
of Adapters. This driver includes support for Itanium(R)2-based systems.
|
||||
|
||||
For questions related to hardware requirements, refer to the documentation
|
||||
supplied with your Intel PRO/1000 adapter. All hardware requirements listed
|
||||
apply to use with Linux.
|
||||
|
||||
The following features are now available in supported kernels:
|
||||
- Native VLANs
|
||||
- Channel Bonding (teaming)
|
||||
- SNMP
|
||||
|
||||
Channel Bonding documentation can be found in the Linux kernel source:
|
||||
/Documentation/networking/bonding.txt
|
||||
|
||||
The driver information previously displayed in the /proc filesystem is not
|
||||
supported in this release. Alternatively, you can use ethtool (version 1.6
|
||||
or later), lspci, and ifconfig to obtain the same information.
|
||||
|
||||
Instructions on updating ethtool can be found in the section "Additional
|
||||
Configurations" later in this document.
|
||||
|
||||
NOTE: The Intel(R) 82562v 10/100 Network Connection only provides 10/100
|
||||
support.
|
||||
|
||||
|
||||
Identifying Your Adapter
|
||||
========================
|
||||
|
||||
For more information on how to identify your adapter, go to the Adapter &
|
||||
Driver ID Guide at:
|
||||
|
||||
http://support.intel.com/support/network/adapter/pro100/21397.htm
|
||||
http://support.intel.com/support/go/network/adapter/idguide.htm
|
||||
|
||||
For the latest Intel network drivers for Linux, refer to the following
|
||||
website. In the search field, enter your adapter name or type, or use the
|
||||
networking link on the left to search for your adapter:
|
||||
|
||||
http://downloadfinder.intel.com/scripts-df/support_intel.asp
|
||||
|
||||
http://support.intel.com/support/go/network/adapter/home.htm
|
||||
|
||||
Command Line Parameters
|
||||
=======================
|
||||
|
||||
If the driver is built as a module, the following optional parameters
|
||||
are used by entering them on the command line with the modprobe command
|
||||
using this syntax:
|
||||
|
||||
modprobe e1000 [<option>=<VAL1>,<VAL2>,...]
|
||||
|
||||
For example, with two PRO/1000 PCI adapters, entering:
|
||||
|
||||
modprobe e1000 TxDescriptors=80,128
|
||||
|
||||
loads the e1000 driver with 80 TX descriptors for the first adapter and
|
||||
128 TX descriptors for the second adapter.
|
||||
|
||||
The default value for each parameter is generally the recommended setting,
|
||||
unless otherwise noted.
|
||||
|
||||
|
@ -89,10 +42,6 @@ NOTES: For more information about the AutoNeg, Duplex, and Speed
|
|||
parameters, see the application note at:
|
||||
http://www.intel.com/design/network/applnots/ap450.htm
|
||||
|
||||
A descriptor describes a data buffer and attributes related to
|
||||
the data buffer. This information is accessed by the hardware.
|
||||
|
||||
|
||||
AutoNeg
|
||||
-------
|
||||
(Supported only on adapters with copper connections)
|
||||
|
@ -106,7 +55,6 @@ Duplex parameters must not be specified.
|
|||
NOTE: Refer to the Speed and Duplex section of this readme for more
|
||||
information on the AutoNeg parameter.
|
||||
|
||||
|
||||
Duplex
|
||||
------
|
||||
(Supported only on adapters with copper connections)
|
||||
|
@ -119,7 +67,6 @@ set to auto-negotiate, the board auto-detects the correct duplex. If the
|
|||
link partner is forced (either full or half), Duplex defaults to half-
|
||||
duplex.
|
||||
|
||||
|
||||
FlowControl
|
||||
-----------
|
||||
Valid Range: 0-3 (0=none, 1=Rx only, 2=Tx only, 3=Rx&Tx)
|
||||
|
@ -128,16 +75,16 @@ Default Value: Reads flow control settings from the EEPROM
|
|||
This parameter controls the automatic generation(Tx) and response(Rx)
|
||||
to Ethernet PAUSE frames.
|
||||
|
||||
|
||||
InterruptThrottleRate
|
||||
---------------------
|
||||
(not supported on Intel(R) 82542, 82543 or 82544-based adapters)
|
||||
Valid Range: 0,1,3,100-100000 (0=off, 1=dynamic, 3=dynamic conservative)
|
||||
Valid Range: 0,1,3,4,100-100000 (0=off, 1=dynamic, 3=dynamic conservative,
|
||||
4=simplified balancing)
|
||||
Default Value: 3
|
||||
|
||||
The driver can limit the amount of interrupts per second that the adapter
|
||||
will generate for incoming packets. It does this by writing a value to the
|
||||
adapter that is based on the maximum amount of interrupts that the adapter
|
||||
will generate for incoming packets. It does this by writing a value to the
|
||||
adapter that is based on the maximum amount of interrupts that the adapter
|
||||
will generate per second.
|
||||
|
||||
Setting InterruptThrottleRate to a value greater or equal to 100
|
||||
|
@ -146,37 +93,43 @@ per second, even if more packets have come in. This reduces interrupt
|
|||
load on the system and can lower CPU utilization under heavy load,
|
||||
but will increase latency as packets are not processed as quickly.
|
||||
|
||||
The default behaviour of the driver previously assumed a static
|
||||
InterruptThrottleRate value of 8000, providing a good fallback value for
|
||||
all traffic types,but lacking in small packet performance and latency.
|
||||
The hardware can handle many more small packets per second however, and
|
||||
The default behaviour of the driver previously assumed a static
|
||||
InterruptThrottleRate value of 8000, providing a good fallback value for
|
||||
all traffic types,but lacking in small packet performance and latency.
|
||||
The hardware can handle many more small packets per second however, and
|
||||
for this reason an adaptive interrupt moderation algorithm was implemented.
|
||||
|
||||
Since 7.3.x, the driver has two adaptive modes (setting 1 or 3) in which
|
||||
it dynamically adjusts the InterruptThrottleRate value based on the traffic
|
||||
it dynamically adjusts the InterruptThrottleRate value based on the traffic
|
||||
that it receives. After determining the type of incoming traffic in the last
|
||||
timeframe, it will adjust the InterruptThrottleRate to an appropriate value
|
||||
timeframe, it will adjust the InterruptThrottleRate to an appropriate value
|
||||
for that traffic.
|
||||
|
||||
The algorithm classifies the incoming traffic every interval into
|
||||
classes. Once the class is determined, the InterruptThrottleRate value is
|
||||
adjusted to suit that traffic type the best. There are three classes defined:
|
||||
classes. Once the class is determined, the InterruptThrottleRate value is
|
||||
adjusted to suit that traffic type the best. There are three classes defined:
|
||||
"Bulk traffic", for large amounts of packets of normal size; "Low latency",
|
||||
for small amounts of traffic and/or a significant percentage of small
|
||||
packets; and "Lowest latency", for almost completely small packets or
|
||||
packets; and "Lowest latency", for almost completely small packets or
|
||||
minimal traffic.
|
||||
|
||||
In dynamic conservative mode, the InterruptThrottleRate value is set to 4000
|
||||
for traffic that falls in class "Bulk traffic". If traffic falls in the "Low
|
||||
latency" or "Lowest latency" class, the InterruptThrottleRate is increased
|
||||
In dynamic conservative mode, the InterruptThrottleRate value is set to 4000
|
||||
for traffic that falls in class "Bulk traffic". If traffic falls in the "Low
|
||||
latency" or "Lowest latency" class, the InterruptThrottleRate is increased
|
||||
stepwise to 20000. This default mode is suitable for most applications.
|
||||
|
||||
For situations where low latency is vital such as cluster or
|
||||
grid computing, the algorithm can reduce latency even more when
|
||||
InterruptThrottleRate is set to mode 1. In this mode, which operates
|
||||
the same as mode 3, the InterruptThrottleRate will be increased stepwise to
|
||||
the same as mode 3, the InterruptThrottleRate will be increased stepwise to
|
||||
70000 for traffic in class "Lowest latency".
|
||||
|
||||
In simplified mode the interrupt rate is based on the ratio of Tx and
|
||||
Rx traffic. If the bytes per second rate is approximately equal, the
|
||||
interrupt rate will drop as low as 2000 interrupts per second. If the
|
||||
traffic is mostly transmit or mostly receive, the interrupt rate could
|
||||
be as high as 8000.
|
||||
|
||||
Setting InterruptThrottleRate to 0 turns off any interrupt moderation
|
||||
and may improve small packet latency, but is generally not suitable
|
||||
for bulk throughput traffic.
|
||||
|
@ -212,8 +165,6 @@ NOTE: When e1000 is loaded with default settings and multiple adapters
|
|||
be platform-specific. If CPU utilization is not a concern, use
|
||||
RX_POLLING (NAPI) and default driver settings.
|
||||
|
||||
|
||||
|
||||
RxDescriptors
|
||||
-------------
|
||||
Valid Range: 80-256 for 82542 and 82543-based adapters
|
||||
|
@ -225,15 +176,14 @@ by the driver. Increasing this value allows the driver to buffer more
|
|||
incoming packets, at the expense of increased system memory utilization.
|
||||
|
||||
Each descriptor is 16 bytes. A receive buffer is also allocated for each
|
||||
descriptor and can be either 2048, 4096, 8192, or 16384 bytes, depending
|
||||
descriptor and can be either 2048, 4096, 8192, or 16384 bytes, depending
|
||||
on the MTU setting. The maximum MTU size is 16110.
|
||||
|
||||
NOTE: MTU designates the frame size. It only needs to be set for Jumbo
|
||||
Frames. Depending on the available system resources, the request
|
||||
for a higher number of receive descriptors may be denied. In this
|
||||
NOTE: MTU designates the frame size. It only needs to be set for Jumbo
|
||||
Frames. Depending on the available system resources, the request
|
||||
for a higher number of receive descriptors may be denied. In this
|
||||
case, use a lower number.
|
||||
|
||||
|
||||
RxIntDelay
|
||||
----------
|
||||
Valid Range: 0-65535 (0=off)
|
||||
|
@ -254,7 +204,6 @@ CAUTION: When setting RxIntDelay to a value other than 0, adapters may
|
|||
restoring the network connection. To eliminate the potential
|
||||
for the hang ensure that RxIntDelay is set to 0.
|
||||
|
||||
|
||||
RxAbsIntDelay
|
||||
-------------
|
||||
(This parameter is supported only on 82540, 82545 and later adapters.)
|
||||
|
@ -268,7 +217,6 @@ packet is received within the set amount of time. Proper tuning,
|
|||
along with RxIntDelay, may improve traffic throughput in specific network
|
||||
conditions.
|
||||
|
||||
|
||||
Speed
|
||||
-----
|
||||
(This parameter is supported only on adapters with copper connections.)
|
||||
|
@ -280,7 +228,6 @@ Speed forces the line speed to the specified value in megabits per second
|
|||
partner is set to auto-negotiate, the board will auto-detect the correct
|
||||
speed. Duplex should also be set when Speed is set to either 10 or 100.
|
||||
|
||||
|
||||
TxDescriptors
|
||||
-------------
|
||||
Valid Range: 80-256 for 82542 and 82543-based adapters
|
||||
|
@ -295,6 +242,36 @@ NOTE: Depending on the available system resources, the request for a
|
|||
higher number of transmit descriptors may be denied. In this case,
|
||||
use a lower number.
|
||||
|
||||
TxDescriptorStep
|
||||
----------------
|
||||
Valid Range: 1 (use every Tx Descriptor)
|
||||
4 (use every 4th Tx Descriptor)
|
||||
|
||||
Default Value: 1 (use every Tx Descriptor)
|
||||
|
||||
On certain non-Intel architectures, it has been observed that intense TX
|
||||
traffic bursts of short packets may result in an improper descriptor
|
||||
writeback. If this occurs, the driver will report a "TX Timeout" and reset
|
||||
the adapter, after which the transmit flow will restart, though data may
|
||||
have stalled for as much as 10 seconds before it resumes.
|
||||
|
||||
The improper writeback does not occur on the first descriptor in a system
|
||||
memory cache-line, which is typically 32 bytes, or 4 descriptors long.
|
||||
|
||||
Setting TxDescriptorStep to a value of 4 will ensure that all TX descriptors
|
||||
are aligned to the start of a system memory cache line, and so this problem
|
||||
will not occur.
|
||||
|
||||
NOTES: Setting TxDescriptorStep to 4 effectively reduces the number of
|
||||
TxDescriptors available for transmits to 1/4 of the normal allocation.
|
||||
This has a possible negative performance impact, which may be
|
||||
compensated for by allocating more descriptors using the TxDescriptors
|
||||
module parameter.
|
||||
|
||||
There are other conditions which may result in "TX Timeout", which will
|
||||
not be resolved by the use of the TxDescriptorStep parameter. As the
|
||||
issue addressed by this parameter has never been observed on Intel
|
||||
Architecture platforms, it should not be used on Intel platforms.
|
||||
|
||||
TxIntDelay
|
||||
----------
|
||||
|
@ -307,7 +284,6 @@ efficiency if properly tuned for specific network traffic. If the
|
|||
system is reporting dropped transmits, this value may be set too high
|
||||
causing the driver to run out of available transmit descriptors.
|
||||
|
||||
|
||||
TxAbsIntDelay
|
||||
-------------
|
||||
(This parameter is supported only on 82540, 82545 and later adapters.)
|
||||
|
@ -330,6 +306,35 @@ Default Value: 1
|
|||
A value of '1' indicates that the driver should enable IP checksum
|
||||
offload for received packets (both UDP and TCP) to the adapter hardware.
|
||||
|
||||
Copybreak
|
||||
---------
|
||||
Valid Range: 0-xxxxxxx (0=off)
|
||||
Default Value: 256
|
||||
Usage: insmod e1000.ko copybreak=128
|
||||
|
||||
Driver copies all packets below or equaling this size to a fresh Rx
|
||||
buffer before handing it up the stack.
|
||||
|
||||
This parameter is different than other parameters, in that it is a
|
||||
single (not 1,1,1 etc.) parameter applied to all driver instances and
|
||||
it is also available during runtime at
|
||||
/sys/module/e1000/parameters/copybreak
|
||||
|
||||
SmartPowerDownEnable
|
||||
--------------------
|
||||
Valid Range: 0-1
|
||||
Default Value: 0 (disabled)
|
||||
|
||||
Allows PHY to turn off in lower power states. The user can turn off
|
||||
this parameter in supported chipsets.
|
||||
|
||||
KumeranLockLoss
|
||||
---------------
|
||||
Valid Range: 0-1
|
||||
Default Value: 1 (enabled)
|
||||
|
||||
This workaround skips resetting the PHY at shutdown for the initial
|
||||
silicon releases of ICH8 systems.
|
||||
|
||||
Speed and Duplex Configuration
|
||||
==============================
|
||||
|
@ -385,40 +390,9 @@ If the link partner is forced to a specific speed and duplex, then this
|
|||
parameter should not be used. Instead, use the Speed and Duplex parameters
|
||||
previously mentioned to force the adapter to the same speed and duplex.
|
||||
|
||||
|
||||
Additional Configurations
|
||||
=========================
|
||||
|
||||
Configuring the Driver on Different Distributions
|
||||
-------------------------------------------------
|
||||
Configuring a network driver to load properly when the system is started
|
||||
is distribution dependent. Typically, the configuration process involves
|
||||
adding an alias line to /etc/modules.conf or /etc/modprobe.conf as well
|
||||
as editing other system startup scripts and/or configuration files. Many
|
||||
popular Linux distributions ship with tools to make these changes for you.
|
||||
To learn the proper way to configure a network device for your system,
|
||||
refer to your distribution documentation. If during this process you are
|
||||
asked for the driver or module name, the name for the Linux Base Driver
|
||||
for the Intel(R) PRO/1000 Family of Adapters is e1000.
|
||||
|
||||
As an example, if you install the e1000 driver for two PRO/1000 adapters
|
||||
(eth0 and eth1) and set the speed and duplex to 10full and 100half, add
|
||||
the following to modules.conf or or modprobe.conf:
|
||||
|
||||
alias eth0 e1000
|
||||
alias eth1 e1000
|
||||
options e1000 Speed=10,100 Duplex=2,1
|
||||
|
||||
Viewing Link Messages
|
||||
---------------------
|
||||
Link messages will not be displayed to the console if the distribution is
|
||||
restricting system messages. In order to see network driver link messages
|
||||
on your console, set dmesg to eight by entering the following:
|
||||
|
||||
dmesg -n 8
|
||||
|
||||
NOTE: This setting is not saved across reboots.
|
||||
|
||||
Jumbo Frames
|
||||
------------
|
||||
Jumbo Frames support is enabled by changing the MTU to a value larger than
|
||||
|
@ -437,9 +411,11 @@ Additional Configurations
|
|||
setting in a different location.
|
||||
|
||||
Notes:
|
||||
|
||||
- To enable Jumbo Frames, increase the MTU size on the interface beyond
|
||||
1500.
|
||||
Degradation in throughput performance may be observed in some Jumbo frames
|
||||
environments. If this is observed, increasing the application's socket buffer
|
||||
size and/or increasing the /proc/sys/net/ipv4/tcp_*mem entry values may help.
|
||||
See the specific application manual and /usr/src/linux*/Documentation/
|
||||
networking/ip-sysctl.txt for more details.
|
||||
|
||||
- The maximum MTU setting for Jumbo Frames is 16110. This value coincides
|
||||
with the maximum Jumbo Frames size of 16128.
|
||||
|
@ -447,40 +423,11 @@ Additional Configurations
|
|||
- Using Jumbo Frames at 10 or 100 Mbps may result in poor performance or
|
||||
loss of link.
|
||||
|
||||
- Some Intel gigabit adapters that support Jumbo Frames have a frame size
|
||||
limit of 9238 bytes, with a corresponding MTU size limit of 9216 bytes.
|
||||
The adapters with this limitation are based on the Intel(R) 82571EB,
|
||||
82572EI, 82573L and 80003ES2LAN controller. These correspond to the
|
||||
following product names:
|
||||
Intel(R) PRO/1000 PT Server Adapter
|
||||
Intel(R) PRO/1000 PT Desktop Adapter
|
||||
Intel(R) PRO/1000 PT Network Connection
|
||||
Intel(R) PRO/1000 PT Dual Port Server Adapter
|
||||
Intel(R) PRO/1000 PT Dual Port Network Connection
|
||||
Intel(R) PRO/1000 PF Server Adapter
|
||||
Intel(R) PRO/1000 PF Network Connection
|
||||
Intel(R) PRO/1000 PF Dual Port Server Adapter
|
||||
Intel(R) PRO/1000 PB Server Connection
|
||||
Intel(R) PRO/1000 PL Network Connection
|
||||
Intel(R) PRO/1000 EB Network Connection with I/O Acceleration
|
||||
Intel(R) PRO/1000 EB Backplane Connection with I/O Acceleration
|
||||
Intel(R) PRO/1000 PT Quad Port Server Adapter
|
||||
|
||||
- Adapters based on the Intel(R) 82542 and 82573V/E controller do not
|
||||
support Jumbo Frames. These correspond to the following product names:
|
||||
Intel(R) PRO/1000 Gigabit Server Adapter
|
||||
Intel(R) PRO/1000 PM Network Connection
|
||||
|
||||
- The following adapters do not support Jumbo Frames:
|
||||
Intel(R) 82562V 10/100 Network Connection
|
||||
Intel(R) 82566DM Gigabit Network Connection
|
||||
Intel(R) 82566DC Gigabit Network Connection
|
||||
Intel(R) 82566MM Gigabit Network Connection
|
||||
Intel(R) 82566MC Gigabit Network Connection
|
||||
Intel(R) 82562GT 10/100 Network Connection
|
||||
Intel(R) 82562G 10/100 Network Connection
|
||||
|
||||
|
||||
Ethtool
|
||||
-------
|
||||
The driver utilizes the ethtool interface for driver configuration and
|
||||
|
@ -490,142 +437,14 @@ Additional Configurations
|
|||
The latest release of ethtool can be found from
|
||||
http://sourceforge.net/projects/gkernel.
|
||||
|
||||
NOTE: Ethtool 1.6 only supports a limited set of ethtool options. Support
|
||||
for a more complete ethtool feature set can be enabled by upgrading
|
||||
ethtool to ethtool-1.8.1.
|
||||
|
||||
Enabling Wake on LAN* (WoL)
|
||||
---------------------------
|
||||
WoL is configured through the Ethtool* utility. Ethtool is included with
|
||||
all versions of Red Hat after Red Hat 7.2. For other Linux distributions,
|
||||
download and install Ethtool from the following website:
|
||||
http://sourceforge.net/projects/gkernel.
|
||||
|
||||
For instructions on enabling WoL with Ethtool, refer to the website listed
|
||||
above.
|
||||
WoL is configured through the Ethtool* utility.
|
||||
|
||||
WoL will be enabled on the system during the next shut down or reboot.
|
||||
For this driver version, in order to enable WoL, the e1000 driver must be
|
||||
loaded when shutting down or rebooting the system.
|
||||
|
||||
Wake On LAN is only supported on port A for the following devices:
|
||||
Intel(R) PRO/1000 PT Dual Port Network Connection
|
||||
Intel(R) PRO/1000 PT Dual Port Server Connection
|
||||
Intel(R) PRO/1000 PT Dual Port Server Adapter
|
||||
Intel(R) PRO/1000 PF Dual Port Server Adapter
|
||||
Intel(R) PRO/1000 PT Quad Port Server Adapter
|
||||
|
||||
NAPI
|
||||
----
|
||||
NAPI (Rx polling mode) is enabled in the e1000 driver.
|
||||
|
||||
See www.cyberus.ca/~hadi/usenix-paper.tgz for more information on NAPI.
|
||||
|
||||
|
||||
Known Issues
|
||||
============
|
||||
|
||||
Dropped Receive Packets on Half-duplex 10/100 Networks
|
||||
------------------------------------------------------
|
||||
If you have an Intel PCI Express adapter running at 10mbps or 100mbps, half-
|
||||
duplex, you may observe occasional dropped receive packets. There are no
|
||||
workarounds for this problem in this network configuration. The network must
|
||||
be updated to operate in full-duplex, and/or 1000mbps only.
|
||||
|
||||
Jumbo Frames System Requirement
|
||||
-------------------------------
|
||||
Memory allocation failures have been observed on Linux systems with 64 MB
|
||||
of RAM or less that are running Jumbo Frames. If you are using Jumbo
|
||||
Frames, your system may require more than the advertised minimum
|
||||
requirement of 64 MB of system memory.
|
||||
|
||||
Performance Degradation with Jumbo Frames
|
||||
-----------------------------------------
|
||||
Degradation in throughput performance may be observed in some Jumbo frames
|
||||
environments. If this is observed, increasing the application's socket
|
||||
buffer size and/or increasing the /proc/sys/net/ipv4/tcp_*mem entry values
|
||||
may help. See the specific application manual and
|
||||
/usr/src/linux*/Documentation/
|
||||
networking/ip-sysctl.txt for more details.
|
||||
|
||||
Jumbo Frames on Foundry BigIron 8000 switch
|
||||
-------------------------------------------
|
||||
There is a known issue using Jumbo frames when connected to a Foundry
|
||||
BigIron 8000 switch. This is a 3rd party limitation. If you experience
|
||||
loss of packets, lower the MTU size.
|
||||
|
||||
Allocating Rx Buffers when Using Jumbo Frames
|
||||
---------------------------------------------
|
||||
Allocating Rx buffers when using Jumbo Frames on 2.6.x kernels may fail if
|
||||
the available memory is heavily fragmented. This issue may be seen with PCI-X
|
||||
adapters or with packet split disabled. This can be reduced or eliminated
|
||||
by changing the amount of available memory for receive buffer allocation, by
|
||||
increasing /proc/sys/vm/min_free_kbytes.
|
||||
|
||||
Multiple Interfaces on Same Ethernet Broadcast Network
|
||||
------------------------------------------------------
|
||||
Due to the default ARP behavior on Linux, it is not possible to have
|
||||
one system on two IP networks in the same Ethernet broadcast domain
|
||||
(non-partitioned switch) behave as expected. All Ethernet interfaces
|
||||
will respond to IP traffic for any IP address assigned to the system.
|
||||
This results in unbalanced receive traffic.
|
||||
|
||||
If you have multiple interfaces in a server, either turn on ARP
|
||||
filtering by entering:
|
||||
|
||||
echo 1 > /proc/sys/net/ipv4/conf/all/arp_filter
|
||||
(this only works if your kernel's version is higher than 2.4.5),
|
||||
|
||||
NOTE: This setting is not saved across reboots. The configuration
|
||||
change can be made permanent by adding the line:
|
||||
net.ipv4.conf.all.arp_filter = 1
|
||||
to the file /etc/sysctl.conf
|
||||
|
||||
or,
|
||||
|
||||
install the interfaces in separate broadcast domains (either in
|
||||
different switches or in a switch partitioned to VLANs).
|
||||
|
||||
82541/82547 can't link or are slow to link with some link partners
|
||||
-----------------------------------------------------------------
|
||||
There is a known compatibility issue with 82541/82547 and some
|
||||
low-end switches where the link will not be established, or will
|
||||
be slow to establish. In particular, these switches are known to
|
||||
be incompatible with 82541/82547:
|
||||
|
||||
Planex FXG-08TE
|
||||
I-O Data ETG-SH8
|
||||
|
||||
To workaround this issue, the driver can be compiled with an override
|
||||
of the PHY's master/slave setting. Forcing master or forcing slave
|
||||
mode will improve time-to-link.
|
||||
|
||||
# make CFLAGS_EXTRA=-DE1000_MASTER_SLAVE=<n>
|
||||
|
||||
Where <n> is:
|
||||
|
||||
0 = Hardware default
|
||||
1 = Master mode
|
||||
2 = Slave mode
|
||||
3 = Auto master/slave
|
||||
|
||||
Disable rx flow control with ethtool
|
||||
------------------------------------
|
||||
In order to disable receive flow control using ethtool, you must turn
|
||||
off auto-negotiation on the same command line.
|
||||
|
||||
For example:
|
||||
|
||||
ethtool -A eth? autoneg off rx off
|
||||
|
||||
Unplugging network cable while ethtool -p is running
|
||||
----------------------------------------------------
|
||||
In kernel versions 2.5.50 and later (including 2.6 kernel), unplugging
|
||||
the network cable while ethtool -p is running will cause the system to
|
||||
become unresponsive to keyboard commands, except for control-alt-delete.
|
||||
Restarting the system appears to be the only remedy.
|
||||
|
||||
|
||||
Support
|
||||
=======
|
||||
|
||||
|
|
|
@ -0,0 +1,302 @@
|
|||
Linux* Driver for Intel(R) Network Connection
|
||||
===============================================================
|
||||
|
||||
Intel Gigabit Linux driver.
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
|
||||
Contents
|
||||
========
|
||||
|
||||
- Identifying Your Adapter
|
||||
- Command Line Parameters
|
||||
- Additional Configurations
|
||||
- Support
|
||||
|
||||
Identifying Your Adapter
|
||||
========================
|
||||
|
||||
The e1000e driver supports all PCI Express Intel(R) Gigabit Network
|
||||
Connections, except those that are 82575, 82576 and 82580-based*.
|
||||
|
||||
* NOTE: The Intel(R) PRO/1000 P Dual Port Server Adapter is supported by
|
||||
the e1000 driver, not the e1000e driver due to the 82546 part being used
|
||||
behind a PCI Express bridge.
|
||||
|
||||
For more information on how to identify your adapter, go to the Adapter &
|
||||
Driver ID Guide at:
|
||||
|
||||
http://support.intel.com/support/go/network/adapter/idguide.htm
|
||||
|
||||
For the latest Intel network drivers for Linux, refer to the following
|
||||
website. In the search field, enter your adapter name or type, or use the
|
||||
networking link on the left to search for your adapter:
|
||||
|
||||
http://support.intel.com/support/go/network/adapter/home.htm
|
||||
|
||||
Command Line Parameters
|
||||
=======================
|
||||
|
||||
The default value for each parameter is generally the recommended setting,
|
||||
unless otherwise noted.
|
||||
|
||||
NOTES: For more information about the InterruptThrottleRate,
|
||||
RxIntDelay, TxIntDelay, RxAbsIntDelay, and TxAbsIntDelay
|
||||
parameters, see the application note at:
|
||||
http://www.intel.com/design/network/applnots/ap450.htm
|
||||
|
||||
InterruptThrottleRate
|
||||
---------------------
|
||||
Valid Range: 0,1,3,4,100-100000 (0=off, 1=dynamic, 3=dynamic conservative,
|
||||
4=simplified balancing)
|
||||
Default Value: 3
|
||||
|
||||
The driver can limit the amount of interrupts per second that the adapter
|
||||
will generate for incoming packets. It does this by writing a value to the
|
||||
adapter that is based on the maximum amount of interrupts that the adapter
|
||||
will generate per second.
|
||||
|
||||
Setting InterruptThrottleRate to a value greater or equal to 100
|
||||
will program the adapter to send out a maximum of that many interrupts
|
||||
per second, even if more packets have come in. This reduces interrupt
|
||||
load on the system and can lower CPU utilization under heavy load,
|
||||
but will increase latency as packets are not processed as quickly.
|
||||
|
||||
The driver has two adaptive modes (setting 1 or 3) in which
|
||||
it dynamically adjusts the InterruptThrottleRate value based on the traffic
|
||||
that it receives. After determining the type of incoming traffic in the last
|
||||
timeframe, it will adjust the InterruptThrottleRate to an appropriate value
|
||||
for that traffic.
|
||||
|
||||
The algorithm classifies the incoming traffic every interval into
|
||||
classes. Once the class is determined, the InterruptThrottleRate value is
|
||||
adjusted to suit that traffic type the best. There are three classes defined:
|
||||
"Bulk traffic", for large amounts of packets of normal size; "Low latency",
|
||||
for small amounts of traffic and/or a significant percentage of small
|
||||
packets; and "Lowest latency", for almost completely small packets or
|
||||
minimal traffic.
|
||||
|
||||
In dynamic conservative mode, the InterruptThrottleRate value is set to 4000
|
||||
for traffic that falls in class "Bulk traffic". If traffic falls in the "Low
|
||||
latency" or "Lowest latency" class, the InterruptThrottleRate is increased
|
||||
stepwise to 20000. This default mode is suitable for most applications.
|
||||
|
||||
For situations where low latency is vital such as cluster or
|
||||
grid computing, the algorithm can reduce latency even more when
|
||||
InterruptThrottleRate is set to mode 1. In this mode, which operates
|
||||
the same as mode 3, the InterruptThrottleRate will be increased stepwise to
|
||||
70000 for traffic in class "Lowest latency".
|
||||
|
||||
In simplified mode the interrupt rate is based on the ratio of Tx and
|
||||
Rx traffic. If the bytes per second rate is approximately equal the
|
||||
interrupt rate will drop as low as 2000 interrupts per second. If the
|
||||
traffic is mostly transmit or mostly receive, the interrupt rate could
|
||||
be as high as 8000.
|
||||
|
||||
Setting InterruptThrottleRate to 0 turns off any interrupt moderation
|
||||
and may improve small packet latency, but is generally not suitable
|
||||
for bulk throughput traffic.
|
||||
|
||||
NOTE: InterruptThrottleRate takes precedence over the TxAbsIntDelay and
|
||||
RxAbsIntDelay parameters. In other words, minimizing the receive
|
||||
and/or transmit absolute delays does not force the controller to
|
||||
generate more interrupts than what the Interrupt Throttle Rate
|
||||
allows.
|
||||
|
||||
NOTE: When e1000e is loaded with default settings and multiple adapters
|
||||
are in use simultaneously, the CPU utilization may increase non-
|
||||
linearly. In order to limit the CPU utilization without impacting
|
||||
the overall throughput, we recommend that you load the driver as
|
||||
follows:
|
||||
|
||||
modprobe e1000e InterruptThrottleRate=3000,3000,3000
|
||||
|
||||
This sets the InterruptThrottleRate to 3000 interrupts/sec for
|
||||
the first, second, and third instances of the driver. The range
|
||||
of 2000 to 3000 interrupts per second works on a majority of
|
||||
systems and is a good starting point, but the optimal value will
|
||||
be platform-specific. If CPU utilization is not a concern, use
|
||||
RX_POLLING (NAPI) and default driver settings.
|
||||
|
||||
RxIntDelay
|
||||
----------
|
||||
Valid Range: 0-65535 (0=off)
|
||||
Default Value: 0
|
||||
|
||||
This value delays the generation of receive interrupts in units of 1.024
|
||||
microseconds. Receive interrupt reduction can improve CPU efficiency if
|
||||
properly tuned for specific network traffic. Increasing this value adds
|
||||
extra latency to frame reception and can end up decreasing the throughput
|
||||
of TCP traffic. If the system is reporting dropped receives, this value
|
||||
may be set too high, causing the driver to run out of available receive
|
||||
descriptors.
|
||||
|
||||
CAUTION: When setting RxIntDelay to a value other than 0, adapters may
|
||||
hang (stop transmitting) under certain network conditions. If
|
||||
this occurs a NETDEV WATCHDOG message is logged in the system
|
||||
event log. In addition, the controller is automatically reset,
|
||||
restoring the network connection. To eliminate the potential
|
||||
for the hang ensure that RxIntDelay is set to 0.
|
||||
|
||||
RxAbsIntDelay
|
||||
-------------
|
||||
Valid Range: 0-65535 (0=off)
|
||||
Default Value: 8
|
||||
|
||||
This value, in units of 1.024 microseconds, limits the delay in which a
|
||||
receive interrupt is generated. Useful only if RxIntDelay is non-zero,
|
||||
this value ensures that an interrupt is generated after the initial
|
||||
packet is received within the set amount of time. Proper tuning,
|
||||
along with RxIntDelay, may improve traffic throughput in specific network
|
||||
conditions.
|
||||
|
||||
TxIntDelay
|
||||
----------
|
||||
Valid Range: 0-65535 (0=off)
|
||||
Default Value: 8
|
||||
|
||||
This value delays the generation of transmit interrupts in units of
|
||||
1.024 microseconds. Transmit interrupt reduction can improve CPU
|
||||
efficiency if properly tuned for specific network traffic. If the
|
||||
system is reporting dropped transmits, this value may be set too high
|
||||
causing the driver to run out of available transmit descriptors.
|
||||
|
||||
TxAbsIntDelay
|
||||
-------------
|
||||
Valid Range: 0-65535 (0=off)
|
||||
Default Value: 32
|
||||
|
||||
This value, in units of 1.024 microseconds, limits the delay in which a
|
||||
transmit interrupt is generated. Useful only if TxIntDelay is non-zero,
|
||||
this value ensures that an interrupt is generated after the initial
|
||||
packet is sent on the wire within the set amount of time. Proper tuning,
|
||||
along with TxIntDelay, may improve traffic throughput in specific
|
||||
network conditions.
|
||||
|
||||
Copybreak
|
||||
---------
|
||||
Valid Range: 0-xxxxxxx (0=off)
|
||||
Default Value: 256
|
||||
|
||||
Driver copies all packets below or equaling this size to a fresh Rx
|
||||
buffer before handing it up the stack.
|
||||
|
||||
This parameter is different than other parameters, in that it is a
|
||||
single (not 1,1,1 etc.) parameter applied to all driver instances and
|
||||
it is also available during runtime at
|
||||
/sys/module/e1000e/parameters/copybreak
|
||||
|
||||
SmartPowerDownEnable
|
||||
--------------------
|
||||
Valid Range: 0-1
|
||||
Default Value: 0 (disabled)
|
||||
|
||||
Allows PHY to turn off in lower power states. The user can set this parameter
|
||||
in supported chipsets.
|
||||
|
||||
KumeranLockLoss
|
||||
---------------
|
||||
Valid Range: 0-1
|
||||
Default Value: 1 (enabled)
|
||||
|
||||
This workaround skips resetting the PHY at shutdown for the initial
|
||||
silicon releases of ICH8 systems.
|
||||
|
||||
IntMode
|
||||
-------
|
||||
Valid Range: 0-2 (0=legacy, 1=MSI, 2=MSI-X)
|
||||
Default Value: 2
|
||||
|
||||
Allows changing the interrupt mode at module load time, without requiring a
|
||||
recompile. If the driver load fails to enable a specific interrupt mode, the
|
||||
driver will try other interrupt modes, from least to most compatible. The
|
||||
interrupt order is MSI-X, MSI, Legacy. If specifying MSI (IntMode=1)
|
||||
interrupts, only MSI and Legacy will be attempted.
|
||||
|
||||
CrcStripping
|
||||
------------
|
||||
Valid Range: 0-1
|
||||
Default Value: 1 (enabled)
|
||||
|
||||
Strip the CRC from received packets before sending up the network stack. If
|
||||
you have a machine with a BMC enabled but cannot receive IPMI traffic after
|
||||
loading or enabling the driver, try disabling this feature.
|
||||
|
||||
WriteProtectNVM
|
||||
---------------
|
||||
Valid Range: 0-1
|
||||
Default Value: 1 (enabled)
|
||||
|
||||
Set the hardware to ignore all write/erase cycles to the GbE region in the
|
||||
ICHx NVM (non-volatile memory). This feature can be disabled by the
|
||||
WriteProtectNVM module parameter (enabled by default) only after a hardware
|
||||
reset, but the machine must be power cycled before trying to enable writes.
|
||||
|
||||
Note: the kernel boot option iomem=relaxed may need to be set if the kernel
|
||||
config option CONFIG_STRICT_DEVMEM=y, if the root user wants to write the
|
||||
NVM from user space via ethtool.
|
||||
|
||||
Additional Configurations
|
||||
=========================
|
||||
|
||||
Jumbo Frames
|
||||
------------
|
||||
Jumbo Frames support is enabled by changing the MTU to a value larger than
|
||||
the default of 1500. Use the ifconfig command to increase the MTU size.
|
||||
For example:
|
||||
|
||||
ifconfig eth<x> mtu 9000 up
|
||||
|
||||
This setting is not saved across reboots.
|
||||
|
||||
Notes:
|
||||
|
||||
- The maximum MTU setting for Jumbo Frames is 9216. This value coincides
|
||||
with the maximum Jumbo Frames size of 9234 bytes.
|
||||
|
||||
- Using Jumbo Frames at 10 or 100 Mbps is not supported and may result in
|
||||
poor performance or loss of link.
|
||||
|
||||
- Some adapters limit Jumbo Frames sized packets to a maximum of
|
||||
4096 bytes and some adapters do not support Jumbo Frames.
|
||||
|
||||
|
||||
Ethtool
|
||||
-------
|
||||
The driver utilizes the ethtool interface for driver configuration and
|
||||
diagnostics, as well as displaying statistical information. We
|
||||
strongly recommend downloading the latest version of Ethtool at:
|
||||
|
||||
http://sourceforge.net/projects/gkernel.
|
||||
|
||||
Speed and Duplex
|
||||
----------------
|
||||
Speed and Duplex are configured through the Ethtool* utility. For
|
||||
instructions, refer to the Ethtool man page.
|
||||
|
||||
Enabling Wake on LAN* (WoL)
|
||||
---------------------------
|
||||
WoL is configured through the Ethtool* utility. For instructions on
|
||||
enabling WoL with Ethtool, refer to the Ethtool man page.
|
||||
|
||||
WoL will be enabled on the system during the next shut down or reboot.
|
||||
For this driver version, in order to enable WoL, the e1000e driver must be
|
||||
loaded when shutting down or rebooting the system.
|
||||
|
||||
In most cases Wake On LAN is only supported on port A for multiple port
|
||||
adapters. To verify if a port supports Wake on LAN run ethtool eth<X>.
|
||||
|
||||
|
||||
Support
|
||||
=======
|
||||
|
||||
For general information, go to the Intel support website at:
|
||||
|
||||
www.intel.com/support/
|
||||
|
||||
or the Intel Wired Networking project hosted by Sourceforge at:
|
||||
|
||||
http://sourceforge.net/projects/e1000
|
||||
|
||||
If an issue is identified with the released source code on the supported
|
||||
kernel with a supported adapter, email the specific information related
|
||||
to the issue to e1000-devel@lists.sf.net
|
|
@ -1,19 +1,16 @@
|
|||
Linux* Base Driver for Intel(R) Network Connection
|
||||
==================================================
|
||||
|
||||
November 24, 2009
|
||||
Intel Gigabit Linux driver.
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
|
||||
Contents
|
||||
========
|
||||
|
||||
- In This Release
|
||||
- Identifying Your Adapter
|
||||
- Known Issues/Troubleshooting
|
||||
- Support
|
||||
|
||||
In This Release
|
||||
===============
|
||||
|
||||
This file describes the ixgbevf Linux* Base Driver for Intel Network
|
||||
Connection.
|
||||
|
||||
|
@ -33,7 +30,7 @@ Identifying Your Adapter
|
|||
For more information on how to identify your adapter, go to the Adapter &
|
||||
Driver ID Guide at:
|
||||
|
||||
http://support.intel.com/support/network/sb/CS-008441.htm
|
||||
http://support.intel.com/support/go/network/adapter/idguide.htm
|
||||
|
||||
Known Issues/Troubleshooting
|
||||
============================
|
||||
|
@ -57,34 +54,3 @@ or the Intel Wired Networking project hosted by Sourceforge at:
|
|||
If an issue is identified with the released source code on the supported
|
||||
kernel with a supported adapter, email the specific information related
|
||||
to the issue to e1000-devel@lists.sf.net
|
||||
|
||||
License
|
||||
=======
|
||||
|
||||
Intel 10 Gigabit Linux driver.
|
||||
Copyright(c) 1999 - 2009 Intel Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms and conditions of the GNU General Public License,
|
||||
version 2, as published by the Free Software Foundation.
|
||||
|
||||
This program is distributed in the hope it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along with
|
||||
this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
The full GNU General Public License is included in this distribution in
|
||||
the file called "COPYING".
|
||||
|
||||
Trademarks
|
||||
==========
|
||||
|
||||
Intel, Itanium, and Pentium are trademarks or registered trademarks of
|
||||
Intel Corporation or its subsidiaries in the United States and other
|
||||
countries.
|
||||
|
||||
* Other names and brands may be claimed as the property of others.
|
||||
|
|
16
MAINTAINERS
16
MAINTAINERS
|
@ -3073,16 +3073,27 @@ L: netdev@vger.kernel.org
|
|||
S: Maintained
|
||||
F: drivers/net/ixp2000/
|
||||
|
||||
INTEL ETHERNET DRIVERS (e100/e1000/e1000e/igb/igbvf/ixgb/ixgbe)
|
||||
INTEL ETHERNET DRIVERS (e100/e1000/e1000e/igb/igbvf/ixgb/ixgbe/ixgbevf)
|
||||
M: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
|
||||
M: Jesse Brandeburg <jesse.brandeburg@intel.com>
|
||||
M: Bruce Allan <bruce.w.allan@intel.com>
|
||||
M: Alex Duyck <alexander.h.duyck@intel.com>
|
||||
M: Carolyn Wyborny <carolyn.wyborny@intel.com>
|
||||
M: Don Skidmore <donald.c.skidmore@intel.com>
|
||||
M: Greg Rose <gregory.v.rose@intel.com>
|
||||
M: PJ Waskiewicz <peter.p.waskiewicz.jr@intel.com>
|
||||
M: Alex Duyck <alexander.h.duyck@intel.com>
|
||||
M: John Ronciak <john.ronciak@intel.com>
|
||||
L: e1000-devel@lists.sourceforge.net
|
||||
W: http://e1000.sourceforge.net/
|
||||
S: Supported
|
||||
F: Documentation/networking/e100.txt
|
||||
F: Documentation/networking/e1000.txt
|
||||
F: Documentation/networking/e1000e.txt
|
||||
F: Documentation/networking/igb.txt
|
||||
F: Documentation/networking/igbvf.txt
|
||||
F: Documentation/networking/ixgb.txt
|
||||
F: Documentation/networking/ixgbe.txt
|
||||
F: Documentation/networking/ixgbevf.txt
|
||||
F: drivers/net/e100.c
|
||||
F: drivers/net/e1000/
|
||||
F: drivers/net/e1000e/
|
||||
|
@ -3090,6 +3101,7 @@ F: drivers/net/igb/
|
|||
F: drivers/net/igbvf/
|
||||
F: drivers/net/ixgb/
|
||||
F: drivers/net/ixgbe/
|
||||
F: drivers/net/ixgbevf/
|
||||
|
||||
INTEL PRO/WIRELESS 2100 NETWORK CONNECTION SUPPORT
|
||||
L: linux-wireless@vger.kernel.org
|
||||
|
|
|
@ -112,11 +112,19 @@ irqreturn_t interrupt_handler(int dummy, void *card_inst)
|
|||
}
|
||||
else if(callid>=0x0000 && callid<=0x7FFF)
|
||||
{
|
||||
int len;
|
||||
|
||||
pr_debug("%s: Got Incoming Call\n",
|
||||
sc_adapter[card]->devicename);
|
||||
strcpy(setup.phone,&(rcvmsg.msg_data.byte_array[4]));
|
||||
strcpy(setup.eazmsn,
|
||||
sc_adapter[card]->channel[rcvmsg.phy_link_no-1].dn);
|
||||
len = strlcpy(setup.phone, &(rcvmsg.msg_data.byte_array[4]),
|
||||
sizeof(setup.phone));
|
||||
if (len >= sizeof(setup.phone))
|
||||
continue;
|
||||
len = strlcpy(setup.eazmsn,
|
||||
sc_adapter[card]->channel[rcvmsg.phy_link_no - 1].dn,
|
||||
sizeof(setup.eazmsn));
|
||||
if (len >= sizeof(setup.eazmsn))
|
||||
continue;
|
||||
setup.si1 = 7;
|
||||
setup.si2 = 0;
|
||||
setup.plan = 0;
|
||||
|
@ -176,7 +184,9 @@ irqreturn_t interrupt_handler(int dummy, void *card_inst)
|
|||
* Handle a GetMyNumber Rsp
|
||||
*/
|
||||
if (IS_CE_MESSAGE(rcvmsg,Call,0,GetMyNumber)){
|
||||
strcpy(sc_adapter[card]->channel[rcvmsg.phy_link_no-1].dn,rcvmsg.msg_data.byte_array);
|
||||
strlcpy(sc_adapter[card]->channel[rcvmsg.phy_link_no - 1].dn,
|
||||
rcvmsg.msg_data.byte_array,
|
||||
sizeof(rcvmsg.msg_data.byte_array));
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
|
@ -2428,7 +2428,7 @@ config UGETH_TX_ON_DEMAND
|
|||
|
||||
config MV643XX_ETH
|
||||
tristate "Marvell Discovery (643XX) and Orion ethernet support"
|
||||
depends on MV64X60 || PPC32 || PLAT_ORION
|
||||
depends on (MV64X60 || PPC32 || PLAT_ORION) && INET
|
||||
select INET_LRO
|
||||
select PHYLIB
|
||||
help
|
||||
|
@ -2803,7 +2803,7 @@ config NIU
|
|||
|
||||
config PASEMI_MAC
|
||||
tristate "PA Semi 1/10Gbit MAC"
|
||||
depends on PPC_PASEMI && PCI
|
||||
depends on PPC_PASEMI && PCI && INET
|
||||
select PHYLIB
|
||||
select INET_LRO
|
||||
help
|
||||
|
|
|
@ -5164,6 +5164,15 @@ int bond_create(struct net *net, const char *name)
|
|||
res = dev_alloc_name(bond_dev, "bond%d");
|
||||
if (res < 0)
|
||||
goto out;
|
||||
} else {
|
||||
/*
|
||||
* If we're given a name to register
|
||||
* we need to ensure that its not already
|
||||
* registered
|
||||
*/
|
||||
res = -EEXIST;
|
||||
if (__dev_get_by_name(net, name) != NULL)
|
||||
goto out;
|
||||
}
|
||||
|
||||
res = register_netdevice(bond_dev);
|
||||
|
|
|
@ -43,6 +43,7 @@
|
|||
#include <linux/seq_file.h>
|
||||
#include <linux/mii.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/dmi.h>
|
||||
#include <asm/irq.h>
|
||||
|
||||
#include "skge.h"
|
||||
|
@ -3868,6 +3869,8 @@ static void __devinit skge_show_addr(struct net_device *dev)
|
|||
netif_info(skge, probe, skge->netdev, "addr %pM\n", dev->dev_addr);
|
||||
}
|
||||
|
||||
static int only_32bit_dma;
|
||||
|
||||
static int __devinit skge_probe(struct pci_dev *pdev,
|
||||
const struct pci_device_id *ent)
|
||||
{
|
||||
|
@ -3889,7 +3892,7 @@ static int __devinit skge_probe(struct pci_dev *pdev,
|
|||
|
||||
pci_set_master(pdev);
|
||||
|
||||
if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) {
|
||||
if (!only_32bit_dma && !pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) {
|
||||
using_dac = 1;
|
||||
err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64));
|
||||
} else if (!(err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32)))) {
|
||||
|
@ -4147,8 +4150,21 @@ static struct pci_driver skge_driver = {
|
|||
.shutdown = skge_shutdown,
|
||||
};
|
||||
|
||||
static struct dmi_system_id skge_32bit_dma_boards[] = {
|
||||
{
|
||||
.ident = "Gigabyte nForce boards",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "Gigabyte Technology Co"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "nForce"),
|
||||
},
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
static int __init skge_init_module(void)
|
||||
{
|
||||
if (dmi_check_system(skge_32bit_dma_boards))
|
||||
only_32bit_dma = 1;
|
||||
skge_debug_init();
|
||||
return pci_register_driver(&skge_driver);
|
||||
}
|
||||
|
|
|
@ -543,7 +543,7 @@ static u8 ath9k_hw_chan_2_clockrate_mhz(struct ath_hw *ah)
|
|||
if (conf_is_ht40(conf))
|
||||
return clockrate * 2;
|
||||
|
||||
return clockrate * 2;
|
||||
return clockrate;
|
||||
}
|
||||
|
||||
static int32_t ath9k_hw_ani_get_listen_time(struct ath_hw *ah)
|
||||
|
|
|
@ -161,12 +161,30 @@ static inline struct sk_buff *bt_skb_send_alloc(struct sock *sk, unsigned long l
|
|||
{
|
||||
struct sk_buff *skb;
|
||||
|
||||
release_sock(sk);
|
||||
if ((skb = sock_alloc_send_skb(sk, len + BT_SKB_RESERVE, nb, err))) {
|
||||
skb_reserve(skb, BT_SKB_RESERVE);
|
||||
bt_cb(skb)->incoming = 0;
|
||||
}
|
||||
lock_sock(sk);
|
||||
|
||||
if (!skb && *err)
|
||||
return NULL;
|
||||
|
||||
*err = sock_error(sk);
|
||||
if (*err)
|
||||
goto out;
|
||||
|
||||
if (sk->sk_shutdown) {
|
||||
*err = -ECONNRESET;
|
||||
goto out;
|
||||
}
|
||||
|
||||
return skb;
|
||||
|
||||
out:
|
||||
kfree_skb(skb);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int bt_err(__u16 code);
|
||||
|
|
|
@ -1441,33 +1441,23 @@ static inline void l2cap_do_send(struct sock *sk, struct sk_buff *skb)
|
|||
|
||||
static void l2cap_streaming_send(struct sock *sk)
|
||||
{
|
||||
struct sk_buff *skb, *tx_skb;
|
||||
struct sk_buff *skb;
|
||||
struct l2cap_pinfo *pi = l2cap_pi(sk);
|
||||
u16 control, fcs;
|
||||
|
||||
while ((skb = sk->sk_send_head)) {
|
||||
tx_skb = skb_clone(skb, GFP_ATOMIC);
|
||||
|
||||
control = get_unaligned_le16(tx_skb->data + L2CAP_HDR_SIZE);
|
||||
while ((skb = skb_dequeue(TX_QUEUE(sk)))) {
|
||||
control = get_unaligned_le16(skb->data + L2CAP_HDR_SIZE);
|
||||
control |= pi->next_tx_seq << L2CAP_CTRL_TXSEQ_SHIFT;
|
||||
put_unaligned_le16(control, tx_skb->data + L2CAP_HDR_SIZE);
|
||||
put_unaligned_le16(control, skb->data + L2CAP_HDR_SIZE);
|
||||
|
||||
if (pi->fcs == L2CAP_FCS_CRC16) {
|
||||
fcs = crc16(0, (u8 *)tx_skb->data, tx_skb->len - 2);
|
||||
put_unaligned_le16(fcs, tx_skb->data + tx_skb->len - 2);
|
||||
fcs = crc16(0, (u8 *)skb->data, skb->len - 2);
|
||||
put_unaligned_le16(fcs, skb->data + skb->len - 2);
|
||||
}
|
||||
|
||||
l2cap_do_send(sk, tx_skb);
|
||||
l2cap_do_send(sk, skb);
|
||||
|
||||
pi->next_tx_seq = (pi->next_tx_seq + 1) % 64;
|
||||
|
||||
if (skb_queue_is_last(TX_QUEUE(sk), skb))
|
||||
sk->sk_send_head = NULL;
|
||||
else
|
||||
sk->sk_send_head = skb_queue_next(TX_QUEUE(sk), skb);
|
||||
|
||||
skb = skb_dequeue(TX_QUEUE(sk));
|
||||
kfree_skb(skb);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1960,6 +1950,11 @@ static int l2cap_sock_setsockopt_old(struct socket *sock, int optname, char __us
|
|||
|
||||
switch (optname) {
|
||||
case L2CAP_OPTIONS:
|
||||
if (sk->sk_state == BT_CONNECTED) {
|
||||
err = -EINVAL;
|
||||
break;
|
||||
}
|
||||
|
||||
opts.imtu = l2cap_pi(sk)->imtu;
|
||||
opts.omtu = l2cap_pi(sk)->omtu;
|
||||
opts.flush_to = l2cap_pi(sk)->flush_to;
|
||||
|
@ -2771,10 +2766,10 @@ static int l2cap_parse_conf_rsp(struct sock *sk, void *rsp, int len, void *data,
|
|||
case L2CAP_CONF_MTU:
|
||||
if (val < L2CAP_DEFAULT_MIN_MTU) {
|
||||
*result = L2CAP_CONF_UNACCEPT;
|
||||
pi->omtu = L2CAP_DEFAULT_MIN_MTU;
|
||||
pi->imtu = L2CAP_DEFAULT_MIN_MTU;
|
||||
} else
|
||||
pi->omtu = val;
|
||||
l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, pi->omtu);
|
||||
pi->imtu = val;
|
||||
l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, pi->imtu);
|
||||
break;
|
||||
|
||||
case L2CAP_CONF_FLUSH_TO:
|
||||
|
@ -3071,6 +3066,17 @@ static inline int l2cap_connect_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hd
|
|||
return 0;
|
||||
}
|
||||
|
||||
static inline void set_default_fcs(struct l2cap_pinfo *pi)
|
||||
{
|
||||
/* FCS is enabled only in ERTM or streaming mode, if one or both
|
||||
* sides request it.
|
||||
*/
|
||||
if (pi->mode != L2CAP_MODE_ERTM && pi->mode != L2CAP_MODE_STREAMING)
|
||||
pi->fcs = L2CAP_FCS_NONE;
|
||||
else if (!(pi->conf_state & L2CAP_CONF_NO_FCS_RECV))
|
||||
pi->fcs = L2CAP_FCS_CRC16;
|
||||
}
|
||||
|
||||
static inline int l2cap_config_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u16 cmd_len, u8 *data)
|
||||
{
|
||||
struct l2cap_conf_req *req = (struct l2cap_conf_req *) data;
|
||||
|
@ -3088,14 +3094,8 @@ static inline int l2cap_config_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr
|
|||
if (!sk)
|
||||
return -ENOENT;
|
||||
|
||||
if (sk->sk_state != BT_CONFIG) {
|
||||
struct l2cap_cmd_rej rej;
|
||||
|
||||
rej.reason = cpu_to_le16(0x0002);
|
||||
l2cap_send_cmd(conn, cmd->ident, L2CAP_COMMAND_REJ,
|
||||
sizeof(rej), &rej);
|
||||
if (sk->sk_state == BT_DISCONN)
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
/* Reject if config buffer is too small. */
|
||||
len = cmd_len - sizeof(*req);
|
||||
|
@ -3135,9 +3135,7 @@ static inline int l2cap_config_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr
|
|||
goto unlock;
|
||||
|
||||
if (l2cap_pi(sk)->conf_state & L2CAP_CONF_INPUT_DONE) {
|
||||
if (!(l2cap_pi(sk)->conf_state & L2CAP_CONF_NO_FCS_RECV) ||
|
||||
l2cap_pi(sk)->fcs != L2CAP_FCS_NONE)
|
||||
l2cap_pi(sk)->fcs = L2CAP_FCS_CRC16;
|
||||
set_default_fcs(l2cap_pi(sk));
|
||||
|
||||
sk->sk_state = BT_CONNECTED;
|
||||
|
||||
|
@ -3225,9 +3223,7 @@ static inline int l2cap_config_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hdr
|
|||
l2cap_pi(sk)->conf_state |= L2CAP_CONF_INPUT_DONE;
|
||||
|
||||
if (l2cap_pi(sk)->conf_state & L2CAP_CONF_OUTPUT_DONE) {
|
||||
if (!(l2cap_pi(sk)->conf_state & L2CAP_CONF_NO_FCS_RECV) ||
|
||||
l2cap_pi(sk)->fcs != L2CAP_FCS_NONE)
|
||||
l2cap_pi(sk)->fcs = L2CAP_FCS_CRC16;
|
||||
set_default_fcs(l2cap_pi(sk));
|
||||
|
||||
sk->sk_state = BT_CONNECTED;
|
||||
l2cap_pi(sk)->next_tx_seq = 0;
|
||||
|
|
|
@ -82,11 +82,14 @@ static void rfcomm_sk_data_ready(struct rfcomm_dlc *d, struct sk_buff *skb)
|
|||
static void rfcomm_sk_state_change(struct rfcomm_dlc *d, int err)
|
||||
{
|
||||
struct sock *sk = d->owner, *parent;
|
||||
unsigned long flags;
|
||||
|
||||
if (!sk)
|
||||
return;
|
||||
|
||||
BT_DBG("dlc %p state %ld err %d", d, d->state, err);
|
||||
|
||||
local_irq_save(flags);
|
||||
bh_lock_sock(sk);
|
||||
|
||||
if (err)
|
||||
|
@ -108,6 +111,7 @@ static void rfcomm_sk_state_change(struct rfcomm_dlc *d, int err)
|
|||
}
|
||||
|
||||
bh_unlock_sock(sk);
|
||||
local_irq_restore(flags);
|
||||
|
||||
if (parent && sock_flag(sk, SOCK_ZAPPED)) {
|
||||
/* We have to drop DLC lock here, otherwise
|
||||
|
|
|
@ -827,6 +827,7 @@ static int caif_connect(struct socket *sock, struct sockaddr *uaddr,
|
|||
long timeo;
|
||||
int err;
|
||||
int ifindex, headroom, tailroom;
|
||||
unsigned int mtu;
|
||||
struct net_device *dev;
|
||||
|
||||
lock_sock(sk);
|
||||
|
@ -896,15 +897,23 @@ static int caif_connect(struct socket *sock, struct sockaddr *uaddr,
|
|||
cf_sk->sk.sk_state = CAIF_DISCONNECTED;
|
||||
goto out;
|
||||
}
|
||||
dev = dev_get_by_index(sock_net(sk), ifindex);
|
||||
|
||||
err = -ENODEV;
|
||||
rcu_read_lock();
|
||||
dev = dev_get_by_index_rcu(sock_net(sk), ifindex);
|
||||
if (!dev) {
|
||||
rcu_read_unlock();
|
||||
goto out;
|
||||
}
|
||||
cf_sk->headroom = LL_RESERVED_SPACE_EXTRA(dev, headroom);
|
||||
mtu = dev->mtu;
|
||||
rcu_read_unlock();
|
||||
|
||||
cf_sk->tailroom = tailroom;
|
||||
cf_sk->maxframe = dev->mtu - (headroom + tailroom);
|
||||
dev_put(dev);
|
||||
cf_sk->maxframe = mtu - (headroom + tailroom);
|
||||
if (cf_sk->maxframe < 1) {
|
||||
pr_warning("CAIF: %s(): CAIF Interface MTU too small (%d)\n",
|
||||
__func__, dev->mtu);
|
||||
err = -ENODEV;
|
||||
pr_warning("CAIF: %s(): CAIF Interface MTU too small (%u)\n",
|
||||
__func__, mtu);
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
|
|
@ -348,7 +348,7 @@ static noinline_for_stack int ethtool_get_rxnfc(struct net_device *dev,
|
|||
if (info.cmd == ETHTOOL_GRXCLSRLALL) {
|
||||
if (info.rule_cnt > 0) {
|
||||
if (info.rule_cnt <= KMALLOC_MAX_SIZE / sizeof(u32))
|
||||
rule_buf = kmalloc(info.rule_cnt * sizeof(u32),
|
||||
rule_buf = kzalloc(info.rule_cnt * sizeof(u32),
|
||||
GFP_USER);
|
||||
if (!rule_buf)
|
||||
return -ENOMEM;
|
||||
|
|
|
@ -141,10 +141,10 @@ int sk_stream_wait_memory(struct sock *sk, long *timeo_p)
|
|||
|
||||
set_bit(SOCK_NOSPACE, &sk->sk_socket->flags);
|
||||
sk->sk_write_pending++;
|
||||
sk_wait_event(sk, ¤t_timeo, !sk->sk_err &&
|
||||
!(sk->sk_shutdown & SEND_SHUTDOWN) &&
|
||||
sk_stream_memory_free(sk) &&
|
||||
vm_wait);
|
||||
sk_wait_event(sk, ¤t_timeo, sk->sk_err ||
|
||||
(sk->sk_shutdown & SEND_SHUTDOWN) ||
|
||||
(sk_stream_memory_free(sk) &&
|
||||
!vm_wait));
|
||||
sk->sk_write_pending--;
|
||||
|
||||
if (vm_wait) {
|
||||
|
|
|
@ -413,7 +413,7 @@ config INET_XFRM_MODE_BEET
|
|||
If unsure, say Y.
|
||||
|
||||
config INET_LRO
|
||||
bool "Large Receive Offload (ipv4/tcp)"
|
||||
tristate "Large Receive Offload (ipv4/tcp)"
|
||||
default y
|
||||
---help---
|
||||
Support for Large Receive Offload (ipv4/tcp).
|
||||
|
|
|
@ -834,7 +834,7 @@ static void igmp_heard_query(struct in_device *in_dev, struct sk_buff *skb,
|
|||
int mark = 0;
|
||||
|
||||
|
||||
if (len == 8 || IGMP_V2_SEEN(in_dev)) {
|
||||
if (len == 8) {
|
||||
if (ih->code == 0) {
|
||||
/* Alas, old v1 router presents here. */
|
||||
|
||||
|
@ -856,6 +856,18 @@ static void igmp_heard_query(struct in_device *in_dev, struct sk_buff *skb,
|
|||
igmpv3_clear_delrec(in_dev);
|
||||
} else if (len < 12) {
|
||||
return; /* ignore bogus packet; freed by caller */
|
||||
} else if (IGMP_V1_SEEN(in_dev)) {
|
||||
/* This is a v3 query with v1 queriers present */
|
||||
max_delay = IGMP_Query_Response_Interval;
|
||||
group = 0;
|
||||
} else if (IGMP_V2_SEEN(in_dev)) {
|
||||
/* this is a v3 query with v2 queriers present;
|
||||
* Interpretation of the max_delay code is problematic here.
|
||||
* A real v2 host would use ih_code directly, while v3 has a
|
||||
* different encoding. We use the v3 encoding as more likely
|
||||
* to be intended in a v3 query.
|
||||
*/
|
||||
max_delay = IGMPV3_MRC(ih3->code)*(HZ/IGMP_TIMER_SCALE);
|
||||
} else { /* v3 */
|
||||
if (!pskb_may_pull(skb, sizeof(struct igmpv3_query)))
|
||||
return;
|
||||
|
|
|
@ -1556,14 +1556,13 @@ void rt6_redirect(struct in6_addr *dest, struct in6_addr *src,
|
|||
* i.e. Path MTU discovery
|
||||
*/
|
||||
|
||||
void rt6_pmtu_discovery(struct in6_addr *daddr, struct in6_addr *saddr,
|
||||
struct net_device *dev, u32 pmtu)
|
||||
static void rt6_do_pmtu_disc(struct in6_addr *daddr, struct in6_addr *saddr,
|
||||
struct net *net, u32 pmtu, int ifindex)
|
||||
{
|
||||
struct rt6_info *rt, *nrt;
|
||||
struct net *net = dev_net(dev);
|
||||
int allfrag = 0;
|
||||
|
||||
rt = rt6_lookup(net, daddr, saddr, dev->ifindex, 0);
|
||||
rt = rt6_lookup(net, daddr, saddr, ifindex, 0);
|
||||
if (rt == NULL)
|
||||
return;
|
||||
|
||||
|
@ -1631,6 +1630,27 @@ void rt6_pmtu_discovery(struct in6_addr *daddr, struct in6_addr *saddr,
|
|||
dst_release(&rt->dst);
|
||||
}
|
||||
|
||||
void rt6_pmtu_discovery(struct in6_addr *daddr, struct in6_addr *saddr,
|
||||
struct net_device *dev, u32 pmtu)
|
||||
{
|
||||
struct net *net = dev_net(dev);
|
||||
|
||||
/*
|
||||
* RFC 1981 states that a node "MUST reduce the size of the packets it
|
||||
* is sending along the path" that caused the Packet Too Big message.
|
||||
* Since it's not possible in the general case to determine which
|
||||
* interface was used to send the original packet, we update the MTU
|
||||
* on the interface that will be used to send future packets. We also
|
||||
* update the MTU on the interface that received the Packet Too Big in
|
||||
* case the original packet was forced out that interface with
|
||||
* SO_BINDTODEVICE or similar. This is the next best thing to the
|
||||
* correct behaviour, which would be to update the MTU on all
|
||||
* interfaces.
|
||||
*/
|
||||
rt6_do_pmtu_disc(daddr, saddr, net, pmtu, 0);
|
||||
rt6_do_pmtu_disc(daddr, saddr, net, pmtu, dev->ifindex);
|
||||
}
|
||||
|
||||
/*
|
||||
* Misc support functions
|
||||
*/
|
||||
|
|
|
@ -175,6 +175,8 @@ int ___ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid,
|
|||
|
||||
set_bit(HT_AGG_STATE_STOPPING, &tid_tx->state);
|
||||
|
||||
del_timer_sync(&tid_tx->addba_resp_timer);
|
||||
|
||||
/*
|
||||
* After this packets are no longer handed right through
|
||||
* to the driver but are put onto tid_tx->pending instead,
|
||||
|
|
|
@ -377,7 +377,7 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb)
|
|||
skb2 = skb_clone(skb, GFP_ATOMIC);
|
||||
if (skb2) {
|
||||
skb2->dev = prev_dev;
|
||||
netif_receive_skb(skb2);
|
||||
netif_rx(skb2);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -386,7 +386,7 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb)
|
|||
}
|
||||
if (prev_dev) {
|
||||
skb->dev = prev_dev;
|
||||
netif_receive_skb(skb);
|
||||
netif_rx(skb);
|
||||
skb = NULL;
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
|
|
@ -137,7 +137,7 @@ static int u32_classify(struct sk_buff *skb, struct tcf_proto *tp, struct tcf_re
|
|||
int toff = off + key->off + (off2 & key->offmask);
|
||||
__be32 *data, _data;
|
||||
|
||||
if (skb_headroom(skb) + toff < 0)
|
||||
if (skb_headroom(skb) + toff > INT_MAX)
|
||||
goto out;
|
||||
|
||||
data = skb_header_pointer(skb, toff, 4, &_data);
|
||||
|
|
|
@ -543,16 +543,20 @@ struct sctp_hmac *sctp_auth_asoc_get_hmac(const struct sctp_association *asoc)
|
|||
id = ntohs(hmacs->hmac_ids[i]);
|
||||
|
||||
/* Check the id is in the supported range */
|
||||
if (id > SCTP_AUTH_HMAC_ID_MAX)
|
||||
if (id > SCTP_AUTH_HMAC_ID_MAX) {
|
||||
id = 0;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* See is we support the id. Supported IDs have name and
|
||||
* length fields set, so that we can allocated and use
|
||||
* them. We can safely just check for name, for without the
|
||||
* name, we can't allocate the TFM.
|
||||
*/
|
||||
if (!sctp_hmac_list[id].hmac_name)
|
||||
if (!sctp_hmac_list[id].hmac_name) {
|
||||
id = 0;
|
||||
continue;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -916,6 +916,11 @@ SCTP_STATIC int sctp_setsockopt_bindx(struct sock* sk,
|
|||
/* Walk through the addrs buffer and count the number of addresses. */
|
||||
addr_buf = kaddrs;
|
||||
while (walk_size < addrs_size) {
|
||||
if (walk_size + sizeof(sa_family_t) > addrs_size) {
|
||||
kfree(kaddrs);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
sa_addr = (struct sockaddr *)addr_buf;
|
||||
af = sctp_get_af_specific(sa_addr->sa_family);
|
||||
|
||||
|
@ -1002,9 +1007,13 @@ static int __sctp_connect(struct sock* sk,
|
|||
/* Walk through the addrs buffer and count the number of addresses. */
|
||||
addr_buf = kaddrs;
|
||||
while (walk_size < addrs_size) {
|
||||
if (walk_size + sizeof(sa_family_t) > addrs_size) {
|
||||
err = -EINVAL;
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
sa_addr = (union sctp_addr *)addr_buf;
|
||||
af = sctp_get_af_specific(sa_addr->sa.sa_family);
|
||||
port = ntohs(sa_addr->v4.sin_port);
|
||||
|
||||
/* If the address family is not supported or if this address
|
||||
* causes the address buffer to overflow return EINVAL.
|
||||
|
@ -1014,6 +1023,8 @@ static int __sctp_connect(struct sock* sk,
|
|||
goto out_free;
|
||||
}
|
||||
|
||||
port = ntohs(sa_addr->v4.sin_port);
|
||||
|
||||
/* Save current address so we can work with it */
|
||||
memcpy(&to, sa_addr, af->sockaddr_len);
|
||||
|
||||
|
|
Loading…
Reference in New Issue