Networkspeed

How to change the network speed and Duplex settings?

Solaris is often unable to correctly auto-negotiate duplex settings with a link partner. You can force the NIC into 100Mbit full-duplex by disabling auto-negotiation and 100Mbit half-duplex capability.

Example with hme0:

1. Make the changes to the running system.

 ndd -set /dev/hme adv_100hdx_cap 0
 ndd -set /dev/hme adv_100fdx_cap 1
 ndd -set /dev/hme adv_autoneg_cap 0

2. Make kernel parameter changes to preserve the speed and duplex settings after a reboot.

 vi /etc/system

Add:

 set hme:hme_adv_autoneg_cap=0
 set hme:hme_adv_100hdx_cap=0
 set hme:hme_adv_100fdx_cap=1

Note: the /etc/system change affects all hme interfaces if multiple NICs are present (ex. hme0, hme1).

More information:
http://www.science.uva.nl/pub/solaris/solaris2/Q4.13.html

The /etc/system settings listed above are not supported for configuring "ce" Ethernet adapters during system startup; you may either use ndd commands in an /etc/rc?.d script or create a /platform/sun4u/kernel/drv/ce.conf file detailed here.

Example: /etc/init.d/nddconfig

 #!/bin/sh

 ndd -set /dev/ce instance 0
 ndd -set /dev/ce adv_1000fdx_cap 0
 ndd -set /dev/ce adv_1000hdx_cap 0
 ndd -set /dev/ce adv_100fdx_cap 1
 ndd -set /dev/ce adv_100hdx_cap 0
 ndd -set /dev/ce adv_10fdx_cap 0
 ndd -set /dev/ce adv_10hdx_cap 0
 ndd -set /dev/ce adv_autoneg_cap 0

 ln -s /etc/init.d/nddconfig /etc/rc2.d/S31nddconfig

dmesg | grep ce0
Jan 20 11:05:01 crmmdb22 genunix: [ID 611667 kern.info] NOTICE: ce0: xcvr addr:0x01 - link up 100 Mbps half duplex
Jan 20 11:05:15 crmmdb22 genunix: [ID 408822 kern.info] NOTICE: ce0: no fault external to device; service available
Jan 20 11:05:15 crmmdb22 genunix: [ID 611667 kern.info] NOTICE: ce0: xcvr addr:0x01 - link up 100 Mbps full duplex

Manually determining NIC speed and duplex
If you have ce or bge interfaces, use kstat ce and kstat bge, respectively, to return NIC settings. All other interfaces may use ndd to determine NIC settings.

ndd example with hme0, assuming "instance" is 0:

  1. ndd -get /dev/hme link_mode

Interpretation:
0 -- half-duplex
1 -- full-duplex

  1. ndd -get /dev/hme link_speed

Interpretation:
0 -- 10 Mbit
1 -- 100 Mbit
1000 -- 1 Gbit

To query a different NIC, such as hme1, set the "instance" to 1, and then perform the link_mode and link_speed queries above.

  1. ndd -set /dev/hme instance 1

Note: the ndd commands above must be run as root. Otherwise, you will receive errors such as "couldn't push module 'hme0', No such device or address."

ce Ethernet adapters
Older versions of the Sun GigaSwift Ethernet 1.0 driver do not support the ndd link_mode and link_speed parameters. You may either install the latest Sun GigaSwift Ethernet adapter patch (111883) or you may use kstat ce ce_device to get speed and duplex information for "ce" Ethernet adapters.

For example (from http://www.samag.com/documents/s=9142/sam0405l/0405l.htm):

netstat -k ce | egrep 'link_speed|link_status|link_duplex'

The output has the following meaning:

link_up - 0 down, 1 up
link_speed - speed in Mbit/s
link_duplex - 1 half duplex, 2 full duplex, 0 down


 

#!/sbin/sh
# /etc/rc2.d/S68net-tune /etc/init.d/net-tune
# Copyright (c) 2000 by Sun Microsystems, Inc.
# All rights reserved.
#
#ident "@(#)net-tune 1.6.4 030416 SMI ES-PTS-NET/Lor"
#
# Edit the following example code to suit your needs.
# Depending on your changes, this script overwrites the Sun recommended default
# values (To use the default values, you do not need this script). See Product
# Documentation and SunSolve Infodocs for proper use first (e.g. Infodocs 17416,
# 23041, 41665). Most parameters must be set on both sides to have effect
# (e.g. check switch and IP partner settings).
# To install:
# 1) cp S68net-tune to /etc/rc2.d
# 2) perform edits on the sript as required
# 3) chmod 744 /etc/rc2.d/S68net-tune
# 4) chown root:sys /etc/rc2.d/S68net-tune
# 5) ln /etc/rc2.d/S68net-tune /etc/init.d/net-tune

PATH=/usr/bin:/usr/sbin

case "$1" in
'start')
echo "Implementing Solaris Network Tuning."

# hme-Interfaces
# hme0
#ndd -set /dev/hme instance 0
#ndd -set /dev/hme adv_100T4_cap 0
#ndd -set /dev/hme adv_100fdx_cap 1
#ndd -set /dev/hme adv_100hdx_cap 0
#ndd -set /dev/hme adv_10fdx_cap 0
#ndd -set /dev/hme adv_10hdx_cap 0
#ndd -set /dev/hme adv_autoneg_cap 0
# hme1
#ndd -set /dev/hme instance 1
#ndd -set /dev/hme adv_100T4_cap 0
#ndd -set /dev/hme adv_100fdx_cap 1
#ndd -set /dev/hme adv_100hdx_cap 0
#ndd -set /dev/hme adv_10fdx_cap 0
#ndd -set /dev/hme adv_10hdx_cap 0
#ndd -set /dev/hme adv_autoneg_cap 0

# eri-Interfaces
# eri0
#ndd -set /dev/eri instance 0
#ndd -set /dev/eri adv_100T4_cap 0
#ndd -set /dev/eri adv_100fdx_cap 1
#ndd -set /dev/eri adv_100hdx_cap 0
#ndd -set /dev/eri adv_10fdx_cap 0
#ndd -set /dev/eri adv_10hdx_cap 0
#ndd -set /dev/eri adv_autoneg_cap 0

# qfe-Interfaces
# qfe0
#ndd -set /dev/qfe instance 0
#ndd -set /dev/qfe adv_100T4_cap 0
#ndd -set /dev/qfe adv_100fdx_cap 1
#ndd -set /dev/qfe adv_100hdx_cap 0
#ndd -set /dev/qfe adv_10fdx_cap 0
#ndd -set /dev/qfe adv_10hdx_cap 0
#ndd -set /dev/qfe adv_autoneg_cap 0
# qfe1
#ndd -set /dev/qfe instance 1
#ndd -set /dev/qfe adv_100T4_cap 0
#ndd -set /dev/qfe adv_100fdx_cap 1
#ndd -set /dev/qfe adv_100hdx_cap 0
#ndd -set /dev/qfe adv_10fdx_cap 0
#ndd -set /dev/qfe adv_10hdx_cap 0
#ndd -set /dev/qfe adv_autoneg_cap 0

# dmfe-Interfaces (Netra X1)
# dmfe0
#ndd -set /dev/dmfe0 adv_100fdx_cap 1
#ndd -set /dev/dmfe0 adv_100hdx_cap 0
#ndd -set /dev/dmfe0 adv_10fdx_cap 0
#ndd -set /dev/dmfe0 adv_10hdx_cap 0
#ndd -set /dev/dmfe0 adv_autoneg_cap 0
# dmfe1
#ndd -set /dev/dmfe1 adv_100fdx_cap 1
#ndd -set /dev/dmfe1 adv_100hdx_cap 0
#ndd -set /dev/dmfe1 adv_10fdx_cap 0
#ndd -set /dev/dmfe1 adv_10hdx_cap 0
#ndd -set /dev/dmfe1 adv_autoneg_cap 0

# vge-Interfaces (Gigabit 1.x)
# vge0
#ndd -set /dev/vge instance 0
#ndd -set /dev/vge fdr_filter 1
#ndd -set /dev/vge link_negotiation 0
# vge1
#ndd -set /dev/vge instance 1
#ndd -set /dev/vge fdr_filter 1
#ndd -set /dev/vge link_negotiation 0

# ge-Interfaces (Gigabit 2.x and 3.x)
# example: forced 1000 Mbit/s, 802.3x Flow Control send and receive
# check if your NIC is 802.3x capable (ndd parameter pause_cap, asm_dir_cap)
# ge0
#ndd -set /dev/ge instance 0
#ndd -set /dev/ge adv_1000fdx_cap 1
#ndd -set /dev/ge adv_1000hdx_cap 0
#ndd -set /dev/ge adv_pauseTX 1
#ndd -set /dev/ge adv_pauseRX 1
#ndd -set /dev/ge adv_1000autoneg_cap 0
# ge1
#ndd -set /dev/ge instance 1
#ndd -set /dev/ge adv_1000fdx_cap 1
#ndd -set /dev/ge adv_1000hdx_cap 0
#ndd -set /dev/ge adv_pauseTX 1
#ndd -set /dev/ge adv_pauseRX 1
#ndd -set /dev/ge adv_1000autoneg_cap 0

# ce-Interfaces (GigaSwift 1.0 UTP)
# example: forced 1000 Mbit/s, 802.3x Flow Control send and receive
ce0
ndd -set /dev/ce instance 0
Master values, change in forced 1000 Mbit/s back-to-back config only:
ndd -set /dev/ce link_master 0 # one link partner 1, the other 0 (ce <=1.118)
ndd -set /dev/ce master_cfg_enable 1 # enable usage of master_cfg_value (ce >1.118)
ndd -set /dev/ce master_cfg_value 0 # one link partner 1, the other 0 (ce >1.118)
Speed/Mode values, set the desired to 1, all other to 0:
ndd -set /dev/ce adv_1000fdx_cap 1
ndd -set /dev/ce adv_1000hdx_cap 0
ndd -set /dev/ce adv_100fdx_cap 0
ndd -set /dev/ce adv_100hdx_cap 0
ndd -set /dev/ce adv_10fdx_cap 0
ndd -set /dev/ce adv_10hdx_cap 0
ndd -set /dev/ce adv_asmpause_cap 0
ndd -set /dev/ce adv_pause_cap 1
ndd -set /dev/ce adv_autoneg_cap 0
ce1
ndd -set /dev/ce instance 1
Master values, change in forced 1000 Mbit/s back-to-back config only:
ndd -set /dev/ce link_master 0 # one link partner 1, the other 0 (ce <=1.118)
ndd -set /dev/ce master_cfg_enable 1 # enable usage of master_cfg_value (ce >1.118)
ndd -set /dev/ce master_cfg_value 0 # one link partner 1, the other 0 (ce >1.118)
Speed/Mode values, set the desired to 1, all other to 0:
ndd -set /dev/ce adv_1000fdx_cap 1
ndd -set /dev/ce adv_1000hdx_cap 0
ndd -set /dev/ce adv_100fdx_cap 0
ndd -set /dev/ce adv_100hdx_cap 0
ndd -set /dev/ce adv_10fdx_cap 0
ndd -set /dev/ce adv_10hdx_cap 0
ndd -set /dev/ce adv_asmpause_cap 0
ndd -set /dev/ce adv_pause_cap 1
ndd -set /dev/ce adv_autoneg_cap 0

# switch MTU path discovery off
#ndd -set /dev/ip ip_path_mtu_discovery 0
# TCP/UDP buffer tunings
#ndd -set /dev/tcp tcp_xmit_hiwat 65536
#ndd -set /dev/tcp tcp_recv_hiwat 65536
#ndd -set /dev/udp udp_xmit_hiwat 65536
#ndd -set /dev/udp udp_recv_hiwat 65536
# TCP congestion window size, for Solaris <= 2.5, only
#ndd -set /dev/tcp tcp_cwnd_max 65535
# Change TCP maximum retransmission interval, for Solaris <= 7, only
#ndd -set /dev/tcp tcp_rexmit_interval_max 60000
# Change number of TCP slow start initial packets to work arround
# slow start bug in BSD stack and Windows. For Solaris <= 7, only
#ndd -set /dev/tcp tcp_slow_start_initial 2 ;;

'stop')
echo "No kernel parameters changed." ;;

*)
echo "Usage: $0 {start|stop}"
;;

esac
exit 0