提交 1d19f176 编写于 作者: L Linus Torvalds

Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6

* master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6:
  [ATM] CLIP: Do not refer freed skbuff in clip_mkip().
  [NET]: Drop tx lock in dev_watchdog_up
  [PACKET]: Don't truncate non-linear skbs with mmaped IO
  [NET]: Mark frame diverter for future removal.
  [NETFILTER]: Add secmark headers to header-y
  [ATM]: linux-atm-general mailing list is subscribers only
  [ATM]: [he] when transmit fails, unmap the dma regions
  [TCP] tcp-lp: update information to MAINTAINERS
  [TCP] tcp-lp: bug fix for oops in 2.6.18-rc6
  [BRIDGE]: random extra bytes on STP TCN packet
  [IPV6]: Accept -1 for IPV6_TCLASS
  [IPV6]: Fix tclass setting for raw sockets.
  [IPVS]: remove the debug option go ip_vs_ftp
  [IPVS]: Make sure ip_vs_ftp ports are valid
  [IPVS]: auto-help for ip_vs_ftp
  [IPVS]: Document the ports option to ip_vs_ftp in kernel-parameters.txt
  [TCP]: Turn ABC off.
  [NEIGH]: neigh_table_clear() doesn't free stats
...@@ -281,3 +281,16 @@ Why: The deferred output hooks are a layering violation causing unusual ...@@ -281,3 +281,16 @@ Why: The deferred output hooks are a layering violation causing unusual
Who: Patrick McHardy <kaber@trash.net> Who: Patrick McHardy <kaber@trash.net>
--------------------------- ---------------------------
What: frame diverter
When: November 2006
Why: The frame diverter is included in most distribution kernels, but is
broken. It does not correctly handle many things:
- IPV6
- non-linear skb's
- network device RCU on removal
- input frames not correctly checked for protocol errors
It also adds allocation overhead even if not enabled.
It is not clear if anyone is still using it.
Who: Stephen Hemminger <shemminger@osdl.org>
...@@ -697,6 +697,12 @@ running once the system is up. ...@@ -697,6 +697,12 @@ running once the system is up.
ips= [HW,SCSI] Adaptec / IBM ServeRAID controller ips= [HW,SCSI] Adaptec / IBM ServeRAID controller
See header of drivers/scsi/ips.c. See header of drivers/scsi/ips.c.
ports= [IP_VS_FTP] IPVS ftp helper module
Default is 21.
Up to 8 (IP_VS_APP_MAX_PORTS) ports
may be specified.
Format: <port>,<port>....
irqfixup [HW] irqfixup [HW]
When an interrupt is not handled search all handlers When an interrupt is not handled search all handlers
for it. Intended to get systems with badly broken for it. Intended to get systems with badly broken
......
...@@ -102,9 +102,15 @@ inet_peer_gc_maxtime - INTEGER ...@@ -102,9 +102,15 @@ inet_peer_gc_maxtime - INTEGER
TCP variables: TCP variables:
tcp_abc - INTEGER tcp_abc - INTEGER
Controls Appropriate Byte Count defined in RFC3465. If set to Controls Appropriate Byte Count (ABC) defined in RFC3465.
0 then does congestion avoid once per ack. 1 is conservative ABC is a way of increasing congestion window (cwnd) more slowly
value, and 2 is more agressive. in response to partial acknowledgments.
Possible values are:
0 increase cwnd once per acknowledgment (no ABC)
1 increase cwnd once per acknowledgment of full sized segment
2 allow increase cwnd by two if acknowledgment is
of two segments to compensate for delayed acknowledgments.
Default: 0 (off)
tcp_syn_retries - INTEGER tcp_syn_retries - INTEGER
Number of times initial SYNs for an active TCP connection attempt Number of times initial SYNs for an active TCP connection attempt
......
...@@ -416,7 +416,7 @@ S: Supported ...@@ -416,7 +416,7 @@ S: Supported
ATM ATM
P: Chas Williams P: Chas Williams
M: chas@cmf.nrl.navy.mil M: chas@cmf.nrl.navy.mil
L: linux-atm-general@lists.sourceforge.net L: linux-atm-general@lists.sourceforge.net (subscribers-only)
W: http://linux-atm.sourceforge.net W: http://linux-atm.sourceforge.net
S: Maintained S: Maintained
...@@ -2810,6 +2810,14 @@ M: hadi@cyberus.ca ...@@ -2810,6 +2810,14 @@ M: hadi@cyberus.ca
L: netdev@vger.kernel.org L: netdev@vger.kernel.org
S: Maintained S: Maintained
TCP LOW PRIORITY MODULE
P: Wong Hoi Sing, Edison
M: hswong3i@gmail.com
P: Hung Hing Lun, Mike
M: hlhung3i@gmail.com
W: http://tcp-lp-mod.sourceforge.net/
S: Maintained
TI OMAP RANDOM NUMBER GENERATOR SUPPORT TI OMAP RANDOM NUMBER GENERATOR SUPPORT
P: Deepak Saxena P: Deepak Saxena
M: dsaxena@plexity.net M: dsaxena@plexity.net
......
...@@ -2282,6 +2282,8 @@ __enqueue_tpd(struct he_dev *he_dev, struct he_tpd *tpd, unsigned cid) ...@@ -2282,6 +2282,8 @@ __enqueue_tpd(struct he_dev *he_dev, struct he_tpd *tpd, unsigned cid)
TPDRQ_MASK(he_readl(he_dev, TPDRQ_B_H))); TPDRQ_MASK(he_readl(he_dev, TPDRQ_B_H)));
if (new_tail == he_dev->tpdrq_head) { if (new_tail == he_dev->tpdrq_head) {
int slot;
hprintk("tpdrq full (cid 0x%x)\n", cid); hprintk("tpdrq full (cid 0x%x)\n", cid);
/* /*
* FIXME * FIXME
...@@ -2289,6 +2291,13 @@ __enqueue_tpd(struct he_dev *he_dev, struct he_tpd *tpd, unsigned cid) ...@@ -2289,6 +2291,13 @@ __enqueue_tpd(struct he_dev *he_dev, struct he_tpd *tpd, unsigned cid)
* after service_tbrq, service the backlog * after service_tbrq, service the backlog
* for now, we just drop the pdu * for now, we just drop the pdu
*/ */
for (slot = 0; slot < TPD_MAXIOV; ++slot) {
if (tpd->iovec[slot].addr)
pci_unmap_single(he_dev->pci_dev,
tpd->iovec[slot].addr,
tpd->iovec[slot].len & TPD_LEN_MASK,
PCI_DMA_TODEVICE);
}
if (tpd->skb) { if (tpd->skb) {
if (tpd->vcc->pop) if (tpd->vcc->pop)
tpd->vcc->pop(tpd->vcc, tpd->skb); tpd->vcc->pop(tpd->vcc, tpd->skb);
......
...@@ -5,7 +5,7 @@ header-y := nf_conntrack_sctp.h nf_conntrack_tuple_common.h \ ...@@ -5,7 +5,7 @@ header-y := nf_conntrack_sctp.h nf_conntrack_tuple_common.h \
xt_helper.h xt_length.h xt_limit.h xt_mac.h xt_mark.h \ xt_helper.h xt_length.h xt_limit.h xt_mac.h xt_mark.h \
xt_MARK.h xt_multiport.h xt_NFQUEUE.h xt_pkttype.h \ xt_MARK.h xt_multiport.h xt_NFQUEUE.h xt_pkttype.h \
xt_policy.h xt_realm.h xt_sctp.h xt_state.h xt_string.h \ xt_policy.h xt_realm.h xt_sctp.h xt_state.h xt_string.h \
xt_tcpmss.h xt_tcpudp.h xt_tcpmss.h xt_tcpudp.h xt_SECMARK.h xt_CONNSECMARK.h
unifdef-y := nf_conntrack_common.h nf_conntrack_ftp.h \ unifdef-y := nf_conntrack_common.h nf_conntrack_ftp.h \
nf_conntrack_tcp.h nfnetlink.h x_tables.h xt_physdev.h nf_conntrack_tcp.h nfnetlink.h x_tables.h xt_physdev.h
...@@ -177,7 +177,7 @@ source "net/lapb/Kconfig" ...@@ -177,7 +177,7 @@ source "net/lapb/Kconfig"
config NET_DIVERT config NET_DIVERT
bool "Frame Diverter (EXPERIMENTAL)" bool "Frame Diverter (EXPERIMENTAL)"
depends on EXPERIMENTAL depends on EXPERIMENTAL && BROKEN
---help--- ---help---
The Frame Diverter allows you to divert packets from the The Frame Diverter allows you to divert packets from the
network, that are not aimed at the interface receiving it (in network, that are not aimed at the interface receiving it (in
......
...@@ -500,9 +500,11 @@ static int clip_mkip(struct atm_vcc *vcc, int timeout) ...@@ -500,9 +500,11 @@ static int clip_mkip(struct atm_vcc *vcc, int timeout)
} else { } else {
unsigned int len = skb->len; unsigned int len = skb->len;
skb_get(skb);
clip_push(vcc, skb); clip_push(vcc, skb);
PRIV(skb->dev)->stats.rx_packets--; PRIV(skb->dev)->stats.rx_packets--;
PRIV(skb->dev)->stats.rx_bytes -= len; PRIV(skb->dev)->stats.rx_bytes -= len;
kfree_skb(skb);
} }
return 0; return 0;
} }
......
...@@ -121,7 +121,7 @@ void br_send_tcn_bpdu(struct net_bridge_port *p) ...@@ -121,7 +121,7 @@ void br_send_tcn_bpdu(struct net_bridge_port *p)
buf[1] = 0; buf[1] = 0;
buf[2] = 0; buf[2] = 0;
buf[3] = BPDU_TYPE_TCN; buf[3] = BPDU_TYPE_TCN;
br_send_bpdu(p, buf, 7); br_send_bpdu(p, buf, 4);
} }
/* /*
......
...@@ -1432,6 +1432,9 @@ int neigh_table_clear(struct neigh_table *tbl) ...@@ -1432,6 +1432,9 @@ int neigh_table_clear(struct neigh_table *tbl)
kfree(tbl->phash_buckets); kfree(tbl->phash_buckets);
tbl->phash_buckets = NULL; tbl->phash_buckets = NULL;
free_percpu(tbl->stats);
tbl->stats = NULL;
return 0; return 0;
} }
......
...@@ -46,14 +46,7 @@ ...@@ -46,14 +46,7 @@
*/ */
static int ports[IP_VS_APP_MAX_PORTS] = {21, 0}; static int ports[IP_VS_APP_MAX_PORTS] = {21, 0};
module_param_array(ports, int, NULL, 0); module_param_array(ports, int, NULL, 0);
MODULE_PARM_DESC(ports, "Ports to monitor for FTP control commands");
/*
* Debug level
*/
#ifdef CONFIG_IP_VS_DEBUG
static int debug=0;
module_param(debug, int, 0);
#endif
/* Dummy variable */ /* Dummy variable */
...@@ -177,7 +170,7 @@ static int ip_vs_ftp_out(struct ip_vs_app *app, struct ip_vs_conn *cp, ...@@ -177,7 +170,7 @@ static int ip_vs_ftp_out(struct ip_vs_app *app, struct ip_vs_conn *cp,
&start, &end) != 1) &start, &end) != 1)
return 1; return 1;
IP_VS_DBG(1-debug, "PASV response (%u.%u.%u.%u:%d) -> " IP_VS_DBG(7, "PASV response (%u.%u.%u.%u:%d) -> "
"%u.%u.%u.%u:%d detected\n", "%u.%u.%u.%u:%d detected\n",
NIPQUAD(from), ntohs(port), NIPQUAD(cp->caddr), 0); NIPQUAD(from), ntohs(port), NIPQUAD(cp->caddr), 0);
...@@ -280,7 +273,7 @@ static int ip_vs_ftp_in(struct ip_vs_app *app, struct ip_vs_conn *cp, ...@@ -280,7 +273,7 @@ static int ip_vs_ftp_in(struct ip_vs_app *app, struct ip_vs_conn *cp,
while (data <= data_limit - 6) { while (data <= data_limit - 6) {
if (strnicmp(data, "PASV\r\n", 6) == 0) { if (strnicmp(data, "PASV\r\n", 6) == 0) {
/* Passive mode on */ /* Passive mode on */
IP_VS_DBG(1-debug, "got PASV at %zd of %zd\n", IP_VS_DBG(7, "got PASV at %zd of %zd\n",
data - data_start, data - data_start,
data_limit - data_start); data_limit - data_start);
cp->app_data = &ip_vs_ftp_pasv; cp->app_data = &ip_vs_ftp_pasv;
...@@ -302,7 +295,7 @@ static int ip_vs_ftp_in(struct ip_vs_app *app, struct ip_vs_conn *cp, ...@@ -302,7 +295,7 @@ static int ip_vs_ftp_in(struct ip_vs_app *app, struct ip_vs_conn *cp,
&start, &end) != 1) &start, &end) != 1)
return 1; return 1;
IP_VS_DBG(1-debug, "PORT %u.%u.%u.%u:%d detected\n", IP_VS_DBG(7, "PORT %u.%u.%u.%u:%d detected\n",
NIPQUAD(to), ntohs(port)); NIPQUAD(to), ntohs(port));
/* Passive mode off */ /* Passive mode off */
...@@ -311,7 +304,7 @@ static int ip_vs_ftp_in(struct ip_vs_app *app, struct ip_vs_conn *cp, ...@@ -311,7 +304,7 @@ static int ip_vs_ftp_in(struct ip_vs_app *app, struct ip_vs_conn *cp,
/* /*
* Now update or create a connection entry for it * Now update or create a connection entry for it
*/ */
IP_VS_DBG(1-debug, "protocol %s %u.%u.%u.%u:%d %u.%u.%u.%u:%d\n", IP_VS_DBG(7, "protocol %s %u.%u.%u.%u:%d %u.%u.%u.%u:%d\n",
ip_vs_proto_name(iph->protocol), ip_vs_proto_name(iph->protocol),
NIPQUAD(to), ntohs(port), NIPQUAD(cp->vaddr), 0); NIPQUAD(to), ntohs(port), NIPQUAD(cp->vaddr), 0);
...@@ -372,11 +365,17 @@ static int __init ip_vs_ftp_init(void) ...@@ -372,11 +365,17 @@ static int __init ip_vs_ftp_init(void)
for (i=0; i<IP_VS_APP_MAX_PORTS; i++) { for (i=0; i<IP_VS_APP_MAX_PORTS; i++) {
if (!ports[i]) if (!ports[i])
continue; continue;
if (ports[i] < 0 || ports[i] > 0xffff) {
IP_VS_WARNING("ip_vs_ftp: Ignoring invalid "
"configuration port[%d] = %d\n",
i, ports[i]);
continue;
}
ret = register_ip_vs_app_inc(app, app->protocol, ports[i]); ret = register_ip_vs_app_inc(app, app->protocol, ports[i]);
if (ret) if (ret)
break; break;
IP_VS_DBG(1-debug, "%s: loaded support on port[%d] = %d\n", IP_VS_INFO("%s: loaded support on port[%d] = %d\n",
app->name, i, ports[i]); app->name, i, ports[i]);
} }
if (ret) if (ret)
......
...@@ -89,7 +89,7 @@ int sysctl_tcp_frto; ...@@ -89,7 +89,7 @@ int sysctl_tcp_frto;
int sysctl_tcp_nometrics_save; int sysctl_tcp_nometrics_save;
int sysctl_tcp_moderate_rcvbuf = 1; int sysctl_tcp_moderate_rcvbuf = 1;
int sysctl_tcp_abc = 1; int sysctl_tcp_abc;
#define FLAG_DATA 0x01 /* Incoming frame contained data. */ #define FLAG_DATA 0x01 /* Incoming frame contained data. */
#define FLAG_WIN_UPDATE 0x02 /* Incoming ACK was a window update. */ #define FLAG_WIN_UPDATE 0x02 /* Incoming ACK was a window update. */
......
...@@ -3,13 +3,8 @@ ...@@ -3,13 +3,8 @@
* *
* TCP Low Priority is a distributed algorithm whose goal is to utilize only * TCP Low Priority is a distributed algorithm whose goal is to utilize only
* the excess network bandwidth as compared to the ``fair share`` of * the excess network bandwidth as compared to the ``fair share`` of
* bandwidth as targeted by TCP. Available from: * bandwidth as targeted by TCP.
* http://www.ece.rice.edu/~akuzma/Doc/akuzma/TCP-LP.pdf
* *
* Original Author:
* Aleksandar Kuzmanovic <akuzma@northwestern.edu>
*
* See http://www-ece.rice.edu/networks/TCP-LP/ for their implementation.
* As of 2.6.13, Linux supports pluggable congestion control algorithms. * As of 2.6.13, Linux supports pluggable congestion control algorithms.
* Due to the limitation of the API, we take the following changes from * Due to the limitation of the API, we take the following changes from
* the original TCP-LP implementation: * the original TCP-LP implementation:
...@@ -24,11 +19,20 @@ ...@@ -24,11 +19,20 @@
* o OWD is handled in relative format, where local time stamp will in * o OWD is handled in relative format, where local time stamp will in
* tcp_time_stamp format. * tcp_time_stamp format.
* *
* Port from 2.4.19 to 2.6.16 as module by: * Original Author:
* Wong Hoi Sing Edison <hswong3i@gmail.com> * Aleksandar Kuzmanovic <akuzma@northwestern.edu>
* Hung Hing Lun <hlhung3i@gmail.com> * Available from:
* http://www.ece.rice.edu/~akuzma/Doc/akuzma/TCP-LP.pdf
* Original implementation for 2.4.19:
* http://www-ece.rice.edu/networks/TCP-LP/
* *
* Version: $Id: tcp_lp.c,v 1.22 2006-05-02 18:18:19 hswong3i Exp $ * 2.6.x module Authors:
* Wong Hoi Sing, Edison <hswong3i@gmail.com>
* Hung Hing Lun, Mike <hlhung3i@gmail.com>
* SourceForge project page:
* http://tcp-lp-mod.sourceforge.net/
*
* Version: $Id: tcp_lp.c,v 1.24 2006/09/05 20:22:53 hswong3i Exp $
*/ */
#include <linux/config.h> #include <linux/config.h>
...@@ -153,16 +157,19 @@ static u32 tcp_lp_remote_hz_estimator(struct sock *sk) ...@@ -153,16 +157,19 @@ static u32 tcp_lp_remote_hz_estimator(struct sock *sk)
if (m < 0) if (m < 0)
m = -m; m = -m;
if (rhz != 0) { if (rhz > 0) {
m -= rhz >> 6; /* m is now error in remote HZ est */ m -= rhz >> 6; /* m is now error in remote HZ est */
rhz += m; /* 63/64 old + 1/64 new */ rhz += m; /* 63/64 old + 1/64 new */
} else } else
rhz = m << 6; rhz = m << 6;
out:
/* record time for successful remote HZ calc */ /* record time for successful remote HZ calc */
lp->flag |= LP_VALID_RHZ; if (rhz > 0)
lp->flag |= LP_VALID_RHZ;
else
lp->flag &= ~LP_VALID_RHZ;
out:
/* record reference time stamp */ /* record reference time stamp */
lp->remote_ref_time = tp->rx_opt.rcv_tsval; lp->remote_ref_time = tp->rx_opt.rcv_tsval;
lp->local_ref_time = tp->rx_opt.rcv_tsecr; lp->local_ref_time = tp->rx_opt.rcv_tsecr;
...@@ -333,6 +340,6 @@ static void __exit tcp_lp_unregister(void) ...@@ -333,6 +340,6 @@ static void __exit tcp_lp_unregister(void)
module_init(tcp_lp_register); module_init(tcp_lp_register);
module_exit(tcp_lp_unregister); module_exit(tcp_lp_unregister);
MODULE_AUTHOR("Wong Hoi Sing Edison, Hung Hing Lun"); MODULE_AUTHOR("Wong Hoi Sing Edison, Hung Hing Lun Mike");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("TCP Low Priority"); MODULE_DESCRIPTION("TCP Low Priority");
...@@ -696,7 +696,7 @@ int datagram_send_ctl(struct msghdr *msg, struct flowi *fl, ...@@ -696,7 +696,7 @@ int datagram_send_ctl(struct msghdr *msg, struct flowi *fl,
} }
tc = *(int *)CMSG_DATA(cmsg); tc = *(int *)CMSG_DATA(cmsg);
if (tc < 0 || tc > 0xff) if (tc < -1 || tc > 0xff)
goto exit_f; goto exit_f;
err = 0; err = 0;
......
...@@ -401,7 +401,7 @@ void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info, ...@@ -401,7 +401,7 @@ void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info,
if (hlimit < 0) if (hlimit < 0)
hlimit = ipv6_get_hoplimit(dst->dev); hlimit = ipv6_get_hoplimit(dst->dev);
tclass = np->cork.tclass; tclass = np->tclass;
if (tclass < 0) if (tclass < 0)
tclass = 0; tclass = 0;
...@@ -497,7 +497,7 @@ static void icmpv6_echo_reply(struct sk_buff *skb) ...@@ -497,7 +497,7 @@ static void icmpv6_echo_reply(struct sk_buff *skb)
if (hlimit < 0) if (hlimit < 0)
hlimit = ipv6_get_hoplimit(dst->dev); hlimit = ipv6_get_hoplimit(dst->dev);
tclass = np->cork.tclass; tclass = np->tclass;
if (tclass < 0) if (tclass < 0)
tclass = 0; tclass = 0;
......
...@@ -362,7 +362,7 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname, ...@@ -362,7 +362,7 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
break; break;
case IPV6_TCLASS: case IPV6_TCLASS:
if (val < 0 || val > 0xff) if (val < -1 || val > 0xff)
goto e_inval; goto e_inval;
np->tclass = val; np->tclass = val;
retv = 0; retv = 0;
...@@ -947,6 +947,8 @@ static int do_ipv6_getsockopt(struct sock *sk, int level, int optname, ...@@ -947,6 +947,8 @@ static int do_ipv6_getsockopt(struct sock *sk, int level, int optname,
case IPV6_TCLASS: case IPV6_TCLASS:
val = np->tclass; val = np->tclass;
if (val < 0)
val = 0;
break; break;
case IPV6_RECVTCLASS: case IPV6_RECVTCLASS:
......
...@@ -781,7 +781,7 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk, ...@@ -781,7 +781,7 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk,
} }
if (tclass < 0) { if (tclass < 0) {
tclass = np->cork.tclass; tclass = np->tclass;
if (tclass < 0) if (tclass < 0)
tclass = 0; tclass = 0;
} }
......
...@@ -626,8 +626,6 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev, struct packe ...@@ -626,8 +626,6 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev, struct packe
if ((int)snaplen < 0) if ((int)snaplen < 0)
snaplen = 0; snaplen = 0;
} }
if (snaplen > skb->len-skb->data_len)
snaplen = skb->len-skb->data_len;
spin_lock(&sk->sk_receive_queue.lock); spin_lock(&sk->sk_receive_queue.lock);
h = (struct tpacket_hdr *)packet_lookup_frame(po, po->head); h = (struct tpacket_hdr *)packet_lookup_frame(po, po->head);
...@@ -644,7 +642,7 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev, struct packe ...@@ -644,7 +642,7 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev, struct packe
status &= ~TP_STATUS_LOSING; status &= ~TP_STATUS_LOSING;
spin_unlock(&sk->sk_receive_queue.lock); spin_unlock(&sk->sk_receive_queue.lock);
memcpy((u8*)h + macoff, skb->data, snaplen); skb_copy_bits(skb, 0, (u8*)h + macoff, snaplen);
h->tp_len = skb->len; h->tp_len = skb->len;
h->tp_snaplen = snaplen; h->tp_snaplen = snaplen;
......
...@@ -238,9 +238,7 @@ void __netdev_watchdog_up(struct net_device *dev) ...@@ -238,9 +238,7 @@ void __netdev_watchdog_up(struct net_device *dev)
static void dev_watchdog_up(struct net_device *dev) static void dev_watchdog_up(struct net_device *dev)
{ {
netif_tx_lock_bh(dev);
__netdev_watchdog_up(dev); __netdev_watchdog_up(dev);
netif_tx_unlock_bh(dev);
} }
static void dev_watchdog_down(struct net_device *dev) static void dev_watchdog_down(struct net_device *dev)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册