Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
0d202675
Commit
0d202675
authored
Nov 23, 2007
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Import 0.99.14z
parent
f614125e
Changes
20
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
141 additions
and
113 deletions
+141
-113
Makefile
Makefile
+1
-1
drivers/char/pty.c
drivers/char/pty.c
+5
-3
drivers/net/3c501.c
drivers/net/3c501.c
+3
-3
drivers/net/3c507.c
drivers/net/3c507.c
+4
-4
drivers/net/3c509.c
drivers/net/3c509.c
+4
-4
drivers/net/8390.c
drivers/net/8390.c
+5
-5
drivers/net/at1700.c
drivers/net/at1700.c
+5
-5
drivers/net/atp.c
drivers/net/atp.c
+5
-5
drivers/net/d_link.c
drivers/net/d_link.c
+4
-4
drivers/net/eexpress.c
drivers/net/eexpress.c
+3
-3
drivers/net/lance.c
drivers/net/lance.c
+6
-6
drivers/net/plip.c
drivers/net/plip.c
+4
-4
drivers/net/skeleton.c
drivers/net/skeleton.c
+5
-5
drivers/net/slip.c
drivers/net/slip.c
+8
-4
kernel/sched.c
kernel/sched.c
+2
-2
net/inet/arp.c
net/inet/arp.c
+26
-20
net/inet/sock.c
net/inet/sock.c
+4
-4
net/inet/sock.h
net/inet/sock.h
+2
-1
net/inet/tcp.c
net/inet/tcp.c
+42
-30
net/inet/tcp.h
net/inet/tcp.h
+3
-0
No files found.
Makefile
View file @
0d202675
VERSION
=
0.99
VERSION
=
0.99
PATCHLEVEL
=
14
PATCHLEVEL
=
14
ALPHA
=
y
ALPHA
=
z
all
:
Version zImage
all
:
Version zImage
...
...
drivers/char/pty.c
View file @
0d202675
...
@@ -55,12 +55,14 @@ static inline void pty_copy(struct tty_struct * from, struct tty_struct * to)
...
@@ -55,12 +55,14 @@ static inline void pty_copy(struct tty_struct * from, struct tty_struct * to)
{
{
unsigned
long
count
,
n
;
unsigned
long
count
,
n
;
struct
tty_queue
*
fq
,
*
tq
;
struct
tty_queue
*
fq
,
*
tq
;
int
skip_readq
;
if
(
from
->
stopped
||
EMPTY
(
&
from
->
write_q
))
if
(
from
->
stopped
||
EMPTY
(
&
from
->
write_q
))
return
;
return
;
fq
=
&
from
->
write_q
;
fq
=
&
from
->
write_q
;
/* Bypass the read_q if this is a pty master. */
/* Bypass the read_q if this is a pty master. */
tq
=
IS_A_PTY_MASTER
(
to
->
line
)
?
&
to
->
secondary
:
&
to
->
read_q
;
skip_readq
=
IS_A_PTY_MASTER
(
to
->
line
)
&&
to
->
disc
==
N_TTY
;
tq
=
skip_readq
?
&
to
->
secondary
:
&
to
->
read_q
;
count
=
MIN
(
CHARS
(
fq
),
LEFT
(
tq
));
count
=
MIN
(
CHARS
(
fq
),
LEFT
(
tq
));
while
(
count
)
{
while
(
count
)
{
n
=
MIN
(
MIN
(
TTY_BUF_SIZE
-
fq
->
tail
,
TTY_BUF_SIZE
-
tq
->
head
),
n
=
MIN
(
MIN
(
TTY_BUF_SIZE
-
fq
->
tail
,
TTY_BUF_SIZE
-
tq
->
head
),
...
@@ -70,8 +72,8 @@ static inline void pty_copy(struct tty_struct * from, struct tty_struct * to)
...
@@ -70,8 +72,8 @@ static inline void pty_copy(struct tty_struct * from, struct tty_struct * to)
fq
->
tail
=
(
fq
->
tail
+
n
)
&
(
TTY_BUF_SIZE
-
1
);
fq
->
tail
=
(
fq
->
tail
+
n
)
&
(
TTY_BUF_SIZE
-
1
);
tq
->
head
=
(
tq
->
head
+
n
)
&
(
TTY_BUF_SIZE
-
1
);
tq
->
head
=
(
tq
->
head
+
n
)
&
(
TTY_BUF_SIZE
-
1
);
}
}
if
(
IS_A_PTY_MASTER
(
to
->
line
)
)
if
(
skip_readq
)
wake_up_interruptible
(
&
t
q
->
proc_list
);
wake_up_interruptible
(
&
t
o
->
secondary
.
proc_list
);
else
else
TTY_READ_FLUSH
(
to
);
TTY_READ_FLUSH
(
to
);
if
(
LEFT
(
fq
)
>
WAKEUP_CHARS
)
if
(
LEFT
(
fq
)
>
WAKEUP_CHARS
)
...
...
drivers/net/3c501.c
View file @
0d202675
...
@@ -292,7 +292,7 @@ el_start_xmit(struct sk_buff *skb, struct device *dev)
...
@@ -292,7 +292,7 @@ el_start_xmit(struct sk_buff *skb, struct device *dev)
}
}
/* Fill in the ethernet header. */
/* Fill in the ethernet header. */
if
(
!
skb
->
arp
&&
dev
->
rebuild_header
(
skb
+
1
,
dev
))
{
if
(
!
skb
->
arp
&&
dev
->
rebuild_header
(
skb
->
data
,
dev
))
{
skb
->
dev
=
dev
;
skb
->
dev
=
dev
;
arp_queue
(
skb
);
arp_queue
(
skb
);
return
0
;
return
0
;
...
@@ -310,7 +310,7 @@ el_start_xmit(struct sk_buff *skb, struct device *dev)
...
@@ -310,7 +310,7 @@ el_start_xmit(struct sk_buff *skb, struct device *dev)
printk
(
"%s: Transmitter access conflict.
\n
"
,
dev
->
name
);
printk
(
"%s: Transmitter access conflict.
\n
"
,
dev
->
name
);
else
{
else
{
int
gp_start
=
0x800
-
(
ETH_ZLEN
<
skb
->
len
?
skb
->
len
:
ETH_ZLEN
);
int
gp_start
=
0x800
-
(
ETH_ZLEN
<
skb
->
len
?
skb
->
len
:
ETH_ZLEN
);
unsigned
char
*
buf
=
(
void
*
)(
skb
+
1
)
;
unsigned
char
*
buf
=
skb
->
data
;
el_status
.
tx_pkt_start
=
gp_start
;
el_status
.
tx_pkt_start
=
gp_start
;
el_status
.
collisions
=
0
;
el_status
.
collisions
=
0
;
...
@@ -463,7 +463,7 @@ el_receive(struct device *dev)
...
@@ -463,7 +463,7 @@ el_receive(struct device *dev)
skb
->
len
=
pkt_len
;
skb
->
len
=
pkt_len
;
skb
->
dev
=
dev
;
skb
->
dev
=
dev
;
insb
(
DATAPORT
,
(
void
*
)(
skb
+
1
)
,
pkt_len
);
insb
(
DATAPORT
,
skb
->
data
,
pkt_len
);
#ifdef HAVE_NETIF_RX
#ifdef HAVE_NETIF_RX
netif_rx
(
skb
);
netif_rx
(
skb
);
...
...
drivers/net/3c507.c
View file @
0d202675
...
@@ -484,7 +484,7 @@ el16_send_packet(struct sk_buff *skb, struct device *dev)
...
@@ -484,7 +484,7 @@ el16_send_packet(struct sk_buff *skb, struct device *dev)
/* For ethernet, fill in the header. This should really be done by a
/* For ethernet, fill in the header. This should really be done by a
higher level, rather than duplicated for each ethernet adaptor. */
higher level, rather than duplicated for each ethernet adaptor. */
if
(
!
skb
->
arp
&&
dev
->
rebuild_header
(
skb
+
1
,
dev
))
{
if
(
!
skb
->
arp
&&
dev
->
rebuild_header
(
skb
->
data
,
dev
))
{
skb
->
dev
=
dev
;
skb
->
dev
=
dev
;
arp_queue
(
skb
);
arp_queue
(
skb
);
return
0
;
return
0
;
...
@@ -496,7 +496,7 @@ el16_send_packet(struct sk_buff *skb, struct device *dev)
...
@@ -496,7 +496,7 @@ el16_send_packet(struct sk_buff *skb, struct device *dev)
printk
(
"%s: Transmitter access conflict.
\n
"
,
dev
->
name
);
printk
(
"%s: Transmitter access conflict.
\n
"
,
dev
->
name
);
else
{
else
{
short
length
=
ETH_ZLEN
<
skb
->
len
?
skb
->
len
:
ETH_ZLEN
;
short
length
=
ETH_ZLEN
<
skb
->
len
?
skb
->
len
:
ETH_ZLEN
;
unsigned
char
*
buf
=
(
void
*
)(
skb
+
1
)
;
unsigned
char
*
buf
=
skb
->
data
;
/* Disable the 82586's input to the interrupt line. */
/* Disable the 82586's input to the interrupt line. */
outb
(
0x80
,
ioaddr
+
MISC_CTRL
);
outb
(
0x80
,
ioaddr
+
MISC_CTRL
);
...
@@ -855,8 +855,8 @@ el16_rx(struct device *dev)
...
@@ -855,8 +855,8 @@ el16_rx(struct device *dev)
skb
->
len
=
pkt_len
;
skb
->
len
=
pkt_len
;
skb
->
dev
=
dev
;
skb
->
dev
=
dev
;
/* 'skb
+1
' points to the start of sk_buff data area. */
/* 'skb
->data
' points to the start of sk_buff data area. */
memcpy
(
(
unsigned
char
*
)
(
skb
+
1
)
,
data_frame
+
5
,
pkt_len
);
memcpy
(
skb
->
data
,
data_frame
+
5
,
pkt_len
);
#ifdef HAVE_NETIF_RX
#ifdef HAVE_NETIF_RX
netif_rx
(
skb
);
netif_rx
(
skb
);
...
...
drivers/net/3c509.c
View file @
0d202675
...
@@ -366,7 +366,7 @@ el3_start_xmit(struct sk_buff *skb, struct device *dev)
...
@@ -366,7 +366,7 @@ el3_start_xmit(struct sk_buff *skb, struct device *dev)
}
}
/* Fill in the ethernet header. */
/* Fill in the ethernet header. */
if
(
!
skb
->
arp
&&
dev
->
rebuild_header
(
skb
+
1
,
dev
))
{
if
(
!
skb
->
arp
&&
dev
->
rebuild_header
(
skb
->
data
,
dev
))
{
skb
->
dev
=
dev
;
skb
->
dev
=
dev
;
arp_queue
(
skb
);
arp_queue
(
skb
);
return
0
;
return
0
;
...
@@ -404,7 +404,7 @@ el3_start_xmit(struct sk_buff *skb, struct device *dev)
...
@@ -404,7 +404,7 @@ el3_start_xmit(struct sk_buff *skb, struct device *dev)
outw
(
skb
->
len
,
ioaddr
+
TX_FIFO
);
outw
(
skb
->
len
,
ioaddr
+
TX_FIFO
);
outw
(
0x00
,
ioaddr
+
TX_FIFO
);
outw
(
0x00
,
ioaddr
+
TX_FIFO
);
/* ... and the packet rounded to a doubleword. */
/* ... and the packet rounded to a doubleword. */
outsl
(
ioaddr
+
TX_FIFO
,
(
void
*
)(
skb
+
1
)
,
(
skb
->
len
+
3
)
>>
2
);
outsl
(
ioaddr
+
TX_FIFO
,
skb
->
data
,
(
skb
->
len
+
3
)
>>
2
);
dev
->
trans_start
=
jiffies
;
dev
->
trans_start
=
jiffies
;
if
(
inw
(
ioaddr
+
TX_FREE
)
>
1536
)
{
if
(
inw
(
ioaddr
+
TX_FREE
)
>
1536
)
{
...
@@ -576,8 +576,8 @@ el3_rx(struct device *dev)
...
@@ -576,8 +576,8 @@ el3_rx(struct device *dev)
skb
->
len
=
pkt_len
;
skb
->
len
=
pkt_len
;
skb
->
dev
=
dev
;
skb
->
dev
=
dev
;
/* 'skb
+1
' points to the start of sk_buff data area. */
/* 'skb
->data
' points to the start of sk_buff data area. */
insl
(
ioaddr
+
RX_FIFO
,
(
void
*
)(
skb
+
1
)
,
insl
(
ioaddr
+
RX_FIFO
,
skb
->
data
,
(
pkt_len
+
3
)
>>
2
);
(
pkt_len
+
3
)
>>
2
);
#ifdef HAVE_NETIF_RX
#ifdef HAVE_NETIF_RX
...
...
drivers/net/8390.c
View file @
0d202675
...
@@ -160,7 +160,7 @@ static int ei_start_xmit(struct sk_buff *skb, struct device *dev)
...
@@ -160,7 +160,7 @@ static int ei_start_xmit(struct sk_buff *skb, struct device *dev)
return
0
;
return
0
;
}
}
/* Fill in the ethernet header. */
/* Fill in the ethernet header. */
if
(
!
skb
->
arp
&&
dev
->
rebuild_header
(
skb
+
1
,
dev
))
{
if
(
!
skb
->
arp
&&
dev
->
rebuild_header
(
skb
->
data
,
dev
))
{
skb
->
dev
=
dev
;
skb
->
dev
=
dev
;
arp_queue
(
skb
);
arp_queue
(
skb
);
return
0
;
return
0
;
...
@@ -219,7 +219,7 @@ static int ei_start_xmit(struct sk_buff *skb, struct device *dev)
...
@@ -219,7 +219,7 @@ static int ei_start_xmit(struct sk_buff *skb, struct device *dev)
return
1
;
return
1
;
}
}
dev
->
trans_start
=
jiffies
;
dev
->
trans_start
=
jiffies
;
ei_block_output
(
dev
,
length
,
(
unsigned
char
*
)(
skb
+
1
)
,
output_page
);
ei_block_output
(
dev
,
length
,
skb
->
data
,
output_page
);
if
(
!
ei_local
->
txing
)
{
if
(
!
ei_local
->
txing
)
{
NS8390_trigger_send
(
dev
,
send_length
,
output_page
);
NS8390_trigger_send
(
dev
,
send_length
,
output_page
);
if
(
output_page
==
ei_local
->
tx_start_page
)
if
(
output_page
==
ei_local
->
tx_start_page
)
...
@@ -233,7 +233,7 @@ static int ei_start_xmit(struct sk_buff *skb, struct device *dev)
...
@@ -233,7 +233,7 @@ static int ei_start_xmit(struct sk_buff *skb, struct device *dev)
tmp_tbusy
=
1
;
tmp_tbusy
=
1
;
}
else
{
}
else
{
dev
->
trans_start
=
jiffies
;
dev
->
trans_start
=
jiffies
;
ei_block_output
(
dev
,
length
,
(
unsigned
char
*
)(
skb
+
1
)
,
ei_block_output
(
dev
,
length
,
skb
->
data
,
ei_local
->
tx_start_page
);
ei_local
->
tx_start_page
);
NS8390_trigger_send
(
dev
,
send_length
,
ei_local
->
tx_start_page
);
NS8390_trigger_send
(
dev
,
send_length
,
ei_local
->
tx_start_page
);
tmp_tbusy
=
1
;
tmp_tbusy
=
1
;
...
@@ -495,8 +495,8 @@ static void ei_receive(struct device *dev)
...
@@ -495,8 +495,8 @@ static void ei_receive(struct device *dev)
skb
->
len
=
pkt_len
;
skb
->
len
=
pkt_len
;
skb
->
dev
=
dev
;
skb
->
dev
=
dev
;
/* 'skb
+1
' points to the start of sk_buff data area. */
/* 'skb
->data
' points to the start of sk_buff data area. */
ei_block_input
(
dev
,
pkt_len
,
(
char
*
)
(
skb
+
1
)
,
ei_block_input
(
dev
,
pkt_len
,
(
char
*
)
skb
->
data
,
current_offset
+
sizeof
(
rx_frame
));
current_offset
+
sizeof
(
rx_frame
));
#ifdef HAVE_NETIF_RX
#ifdef HAVE_NETIF_RX
netif_rx
(
skb
);
netif_rx
(
skb
);
...
...
drivers/net/at1700.c
View file @
0d202675
...
@@ -402,7 +402,7 @@ net_send_packet(struct sk_buff *skb, struct device *dev)
...
@@ -402,7 +402,7 @@ net_send_packet(struct sk_buff *skb, struct device *dev)
/* For ethernet, fill in the header. This should really be done by a
/* For ethernet, fill in the header. This should really be done by a
higher level, rather than duplicated for each ethernet adaptor. */
higher level, rather than duplicated for each ethernet adaptor. */
if
(
!
skb
->
arp
&&
dev
->
rebuild_header
(
skb
+
1
,
dev
))
{
if
(
!
skb
->
arp
&&
dev
->
rebuild_header
(
skb
->
data
,
dev
))
{
skb
->
dev
=
dev
;
skb
->
dev
=
dev
;
arp_queue
(
skb
);
arp_queue
(
skb
);
return
0
;
return
0
;
...
@@ -415,7 +415,7 @@ net_send_packet(struct sk_buff *skb, struct device *dev)
...
@@ -415,7 +415,7 @@ net_send_packet(struct sk_buff *skb, struct device *dev)
printk
(
"%s: Transmitter access conflict.
\n
"
,
dev
->
name
);
printk
(
"%s: Transmitter access conflict.
\n
"
,
dev
->
name
);
else
{
else
{
short
length
=
ETH_ZLEN
<
skb
->
len
?
skb
->
len
:
ETH_ZLEN
;
short
length
=
ETH_ZLEN
<
skb
->
len
?
skb
->
len
:
ETH_ZLEN
;
unsigned
char
*
buf
=
(
void
*
)(
skb
+
1
)
;
unsigned
char
*
buf
=
skb
->
data
;
if
(
net_debug
>
4
)
if
(
net_debug
>
4
)
printk
(
"%s: Transmitting a packet of length %d.
\n
"
,
dev
->
name
,
printk
(
"%s: Transmitting a packet of length %d.
\n
"
,
dev
->
name
,
...
@@ -551,14 +551,14 @@ net_rx(struct device *dev)
...
@@ -551,14 +551,14 @@ net_rx(struct device *dev)
skb
->
len
=
pkt_len
;
skb
->
len
=
pkt_len
;
skb
->
dev
=
dev
;
skb
->
dev
=
dev
;
/* 'skb
+1
' points to the start of sk_buff data area. */
/* 'skb
->data
' points to the start of sk_buff data area. */
insw
(
ioaddr
+
DATAPORT
,
(
void
*
)(
skb
+
1
)
,
(
pkt_len
+
1
)
>>
1
);
insw
(
ioaddr
+
DATAPORT
,
skb
->
data
,
(
pkt_len
+
1
)
>>
1
);
if
(
net_debug
>
5
)
{
if
(
net_debug
>
5
)
{
int
i
;
int
i
;
printk
(
"%s: Rxed packet of length %d: "
,
dev
->
name
,
pkt_len
);
printk
(
"%s: Rxed packet of length %d: "
,
dev
->
name
,
pkt_len
);
for
(
i
=
0
;
i
<
14
;
i
++
)
for
(
i
=
0
;
i
<
14
;
i
++
)
printk
(
" %02x"
,
((
unsigned
char
*
)(
skb
+
1
))
[
i
]);
printk
(
" %02x"
,
skb
->
data
[
i
]);
printk
(
".
\n
"
);
printk
(
".
\n
"
);
}
}
...
...
drivers/net/atp.c
View file @
0d202675
...
@@ -477,7 +477,7 @@ net_send_packet(struct sk_buff *skb, struct device *dev)
...
@@ -477,7 +477,7 @@ net_send_packet(struct sk_buff *skb, struct device *dev)
/* For ethernet, fill in the header. This should really be done by a
/* For ethernet, fill in the header. This should really be done by a
higher level, rather than duplicated for each ethernet adaptor. */
higher level, rather than duplicated for each ethernet adaptor. */
if
(
!
skb
->
arp
&&
dev
->
rebuild_header
(
skb
+
1
,
dev
))
{
if
(
!
skb
->
arp
&&
dev
->
rebuild_header
(
skb
->
data
,
dev
))
{
skb
->
dev
=
dev
;
skb
->
dev
=
dev
;
arp_queue
(
skb
);
arp_queue
(
skb
);
return
0
;
return
0
;
...
@@ -490,7 +490,7 @@ net_send_packet(struct sk_buff *skb, struct device *dev)
...
@@ -490,7 +490,7 @@ net_send_packet(struct sk_buff *skb, struct device *dev)
printk
(
"%s: Transmitter access conflict.
\n
"
,
dev
->
name
);
printk
(
"%s: Transmitter access conflict.
\n
"
,
dev
->
name
);
else
{
else
{
short
length
=
ETH_ZLEN
<
skb
->
len
?
skb
->
len
:
ETH_ZLEN
;
short
length
=
ETH_ZLEN
<
skb
->
len
?
skb
->
len
:
ETH_ZLEN
;
unsigned
char
*
buf
=
(
void
*
)(
skb
+
1
)
;
unsigned
char
*
buf
=
skb
->
data
;
int
flags
;
int
flags
;
/* Disable interrupts by writing 0x00 to the Interrupt Mask Register.
/* Disable interrupts by writing 0x00 to the Interrupt Mask Register.
...
@@ -686,11 +686,11 @@ static void net_rx(struct device *dev)
...
@@ -686,11 +686,11 @@ static void net_rx(struct device *dev)
skb
->
len
=
pkt_len
;
skb
->
len
=
pkt_len
;
skb
->
dev
=
dev
;
skb
->
dev
=
dev
;
/* 'skb
+1
' points to the start of sk_buff data area. */
/* 'skb
->data
' points to the start of sk_buff data area. */
read_block
(
ioaddr
,
pkt_len
,
(
unsigned
char
*
)(
skb
+
1
)
,
dev
->
if_port
);
read_block
(
ioaddr
,
pkt_len
,
skb
->
data
,
dev
->
if_port
);
if
(
net_debug
>
6
)
{
if
(
net_debug
>
6
)
{
unsigned
char
*
data
=
(
unsigned
char
*
)(
skb
+
1
)
;
unsigned
char
*
data
=
skb
->
data
;
printk
(
" data %02x%02x%02x %02x%02x%02x %02x%02x%02x %02x%02x%02x %02x%02x.."
,
printk
(
" data %02x%02x%02x %02x%02x%02x %02x%02x%02x %02x%02x%02x %02x%02x.."
,
data
[
0
],
data
[
1
],
data
[
2
],
data
[
3
],
data
[
4
],
data
[
5
],
data
[
0
],
data
[
1
],
data
[
2
],
data
[
3
],
data
[
4
],
data
[
5
],
data
[
6
],
data
[
7
],
data
[
8
],
data
[
9
],
data
[
10
],
data
[
11
],
data
[
6
],
data
[
7
],
data
[
8
],
data
[
9
],
data
[
10
],
data
[
11
],
...
...
drivers/net/d_link.c
View file @
0d202675
...
@@ -386,7 +386,7 @@ d_link_start_xmit(struct sk_buff *skb, struct device *dev)
...
@@ -386,7 +386,7 @@ d_link_start_xmit(struct sk_buff *skb, struct device *dev)
int
transmit_from
;
int
transmit_from
;
int
len
;
int
len
;
int
tickssofar
;
int
tickssofar
;
unsigned
char
*
buffer
=
(
unsigned
char
*
)(
skb
+
1
)
;
unsigned
char
*
buffer
=
skb
->
data
;
/*
/*
* If some higher layer thinks we've missed a
* If some higher layer thinks we've missed a
...
@@ -401,7 +401,7 @@ d_link_start_xmit(struct sk_buff *skb, struct device *dev)
...
@@ -401,7 +401,7 @@ d_link_start_xmit(struct sk_buff *skb, struct device *dev)
/* For ethernet, fill in the header (hardware addresses) with an arp. */
/* For ethernet, fill in the header (hardware addresses) with an arp. */
if
(
!
skb
->
arp
)
if
(
!
skb
->
arp
)
if
(
dev
->
rebuild_header
(
skb
+
1
,
dev
))
{
if
(
dev
->
rebuild_header
(
skb
->
data
,
dev
))
{
skb
->
dev
=
dev
;
skb
->
dev
=
dev
;
arp_queue
(
skb
);
arp_queue
(
skb
);
return
0
;
return
0
;
...
@@ -590,8 +590,8 @@ d_link_rx_intr(struct device *dev)
...
@@ -590,8 +590,8 @@ d_link_rx_intr(struct device *dev)
skb
->
lock
=
0
;
skb
->
lock
=
0
;
skb
->
mem_len
=
sksize
;
skb
->
mem_len
=
sksize
;
skb
->
mem_addr
=
skb
;
skb
->
mem_addr
=
skb
;
/* 'skb
+ 1
' points to the start of sk_buff data area. */
/* 'skb
->data
' points to the start of sk_buff data area. */
buffer
=
(
unsigned
char
*
)(
skb
+
1
)
;
buffer
=
skb
->
data
;
/* copy the packet into the buffer */
/* copy the packet into the buffer */
d_link_setup_address
(
read_from
,
RW_ADDR
);
d_link_setup_address
(
read_from
,
RW_ADDR
);
...
...
drivers/net/eexpress.c
View file @
0d202675
...
@@ -511,7 +511,7 @@ eexp_send_packet(struct sk_buff *skb, struct device *dev)
...
@@ -511,7 +511,7 @@ eexp_send_packet(struct sk_buff *skb, struct device *dev)
/* For ethernet, fill in the header. This should really be done by a
/* For ethernet, fill in the header. This should really be done by a
higher level, rather than duplicated for each ethernet adaptor. */
higher level, rather than duplicated for each ethernet adaptor. */
if
(
!
skb
->
arp
&&
dev
->
rebuild_header
(
skb
+
1
,
dev
))
{
if
(
!
skb
->
arp
&&
dev
->
rebuild_header
(
skb
->
data
,
dev
))
{
skb
->
dev
=
dev
;
skb
->
dev
=
dev
;
arp_queue
(
skb
);
arp_queue
(
skb
);
return
0
;
return
0
;
...
@@ -523,7 +523,7 @@ eexp_send_packet(struct sk_buff *skb, struct device *dev)
...
@@ -523,7 +523,7 @@ eexp_send_packet(struct sk_buff *skb, struct device *dev)
printk
(
"%s: Transmitter access conflict.
\n
"
,
dev
->
name
);
printk
(
"%s: Transmitter access conflict.
\n
"
,
dev
->
name
);
else
{
else
{
short
length
=
ETH_ZLEN
<
skb
->
len
?
skb
->
len
:
ETH_ZLEN
;
short
length
=
ETH_ZLEN
<
skb
->
len
?
skb
->
len
:
ETH_ZLEN
;
unsigned
char
*
buf
=
(
void
*
)(
skb
+
1
)
;
unsigned
char
*
buf
=
skb
->
data
;
/* Disable the 82586's input to the interrupt line. */
/* Disable the 82586's input to the interrupt line. */
outb
(
irqrmap
[
dev
->
irq
],
ioaddr
+
SET_IRQ
);
outb
(
irqrmap
[
dev
->
irq
],
ioaddr
+
SET_IRQ
);
...
@@ -960,7 +960,7 @@ eexp_rx(struct device *dev)
...
@@ -960,7 +960,7 @@ eexp_rx(struct device *dev)
outw
(
data_buffer_addr
+
10
,
ioaddr
+
READ_PTR
);
outw
(
data_buffer_addr
+
10
,
ioaddr
+
READ_PTR
);
insw
(
ioaddr
,
(
void
*
)(
skb
+
1
)
,
(
pkt_len
+
1
)
>>
1
);
insw
(
ioaddr
,
skb
->
data
,
(
pkt_len
+
1
)
>>
1
);
#ifdef HAVE_NETIF_RX
#ifdef HAVE_NETIF_RX
netif_rx
(
skb
);
netif_rx
(
skb
);
...
...
drivers/net/lance.c
View file @
0d202675
...
@@ -512,7 +512,7 @@ lance_start_xmit(struct sk_buff *skb, struct device *dev)
...
@@ -512,7 +512,7 @@ lance_start_xmit(struct sk_buff *skb, struct device *dev)
}
}
/* Fill in the ethernet header. */
/* Fill in the ethernet header. */
if
(
!
skb
->
arp
&&
dev
->
rebuild_header
(
skb
+
1
,
dev
))
{
if
(
!
skb
->
arp
&&
dev
->
rebuild_header
(
skb
->
data
,
dev
))
{
skb
->
dev
=
dev
;
skb
->
dev
=
dev
;
arp_queue
(
skb
);
arp_queue
(
skb
);
return
0
;
return
0
;
...
@@ -553,11 +553,11 @@ lance_start_xmit(struct sk_buff *skb, struct device *dev)
...
@@ -553,11 +553,11 @@ lance_start_xmit(struct sk_buff *skb, struct device *dev)
/* If any part of this buffer is >16M we must copy it to a low-memory
/* If any part of this buffer is >16M we must copy it to a low-memory
buffer. */
buffer. */
if
((
int
)(
skb
+
1
)
+
skb
->
len
>
0x01000000
)
{
if
((
int
)(
skb
->
data
)
+
skb
->
len
>
0x01000000
)
{
if
(
lance_debug
>
5
)
if
(
lance_debug
>
5
)
printk
(
"%s: bouncing a high-memory packet (%#x).
\n
"
,
printk
(
"%s: bouncing a high-memory packet (%#x).
\n
"
,
dev
->
name
,
(
int
)
(
skb
+
1
)
);
dev
->
name
,
(
int
)
skb
->
data
);
memcpy
(
&
lp
->
tx_bounce_buffs
[
entry
],
skb
+
1
,
skb
->
len
);
memcpy
(
&
lp
->
tx_bounce_buffs
[
entry
],
skb
->
data
,
skb
->
len
);
lp
->
tx_ring
[
entry
].
base
=
lp
->
tx_ring
[
entry
].
base
=
(
int
)(
lp
->
tx_bounce_buffs
+
entry
)
|
0x83000000
;
(
int
)(
lp
->
tx_bounce_buffs
+
entry
)
|
0x83000000
;
if
(
skb
->
free
)
if
(
skb
->
free
)
...
@@ -567,7 +567,7 @@ lance_start_xmit(struct sk_buff *skb, struct device *dev)
...
@@ -567,7 +567,7 @@ lance_start_xmit(struct sk_buff *skb, struct device *dev)
/* Gimme!!! */
/* Gimme!!! */
if
(
skb
->
free
==
0
)
if
(
skb
->
free
==
0
)
skb_kept_by_device
(
skb
);
skb_kept_by_device
(
skb
);
lp
->
tx_ring
[
entry
].
base
=
(
int
)
(
skb
+
1
)
|
0x83000000
;
lp
->
tx_ring
[
entry
].
base
=
(
int
)
skb
->
data
|
0x83000000
;
}
}
lp
->
cur_tx
++
;
lp
->
cur_tx
++
;
...
@@ -726,7 +726,7 @@ lance_rx(struct device *dev)
...
@@ -726,7 +726,7 @@ lance_rx(struct device *dev)
skb
->
mem_addr
=
skb
;
skb
->
mem_addr
=
skb
;
skb
->
len
=
pkt_len
;
skb
->
len
=
pkt_len
;
skb
->
dev
=
dev
;
skb
->
dev
=
dev
;
memcpy
(
(
unsigned
char
*
)
(
skb
+
1
)
,
memcpy
(
skb
->
data
,
(
unsigned
char
*
)(
lp
->
rx_ring
[
entry
].
base
&
0x00ffffff
),
(
unsigned
char
*
)(
lp
->
rx_ring
[
entry
].
base
&
0x00ffffff
),
pkt_len
);
pkt_len
);
#ifdef HAVE_NETIF_RX
#ifdef HAVE_NETIF_RX
...
...
drivers/net/plip.c
View file @
0d202675
...
@@ -285,7 +285,7 @@ plip_tx_packet(struct sk_buff *skb, struct device *dev)
...
@@ -285,7 +285,7 @@ plip_tx_packet(struct sk_buff *skb, struct device *dev)
/* Pretend we are an ethernet and fill in the header. This could use
/* Pretend we are an ethernet and fill in the header. This could use
a simplified routine someday. */
a simplified routine someday. */
if
(
!
skb
->
arp
&&
dev
->
rebuild_header
(
skb
+
1
,
dev
))
{
if
(
!
skb
->
arp
&&
dev
->
rebuild_header
(
skb
->
data
,
dev
))
{
skb
->
dev
=
dev
;
skb
->
dev
=
dev
;
arp_queue
(
skb
);
arp_queue
(
skb
);
return
0
;
return
0
;
...
@@ -293,7 +293,7 @@ plip_tx_packet(struct sk_buff *skb, struct device *dev)
...
@@ -293,7 +293,7 @@ plip_tx_packet(struct sk_buff *skb, struct device *dev)
skb
->
arp
=
1
;
skb
->
arp
=
1
;
dev
->
trans_start
=
jiffies
;
dev
->
trans_start
=
jiffies
;
ret_val
=
plip_send_packet
(
dev
,
(
unsigned
char
*
)(
skb
+
1
)
,
skb
->
len
);
ret_val
=
plip_send_packet
(
dev
,
skb
->
data
,
skb
->
len
);
if
(
skb
->
free
)
if
(
skb
->
free
)
kfree_skb
(
skb
,
FREE_WRITE
);
kfree_skb
(
skb
,
FREE_WRITE
);
dev
->
tbusy
=
0
;
dev
->
tbusy
=
0
;
...
@@ -483,8 +483,8 @@ plip_receive_packet(struct device *dev)
...
@@ -483,8 +483,8 @@ plip_receive_packet(struct device *dev)
}
}
{
{
/* phase of receiving the data */
/* phase of receiving the data */
/* 'skb
+1
' points to the start of sk_buff data area. */
/* 'skb
->data
' points to the start of sk_buff data area. */
unsigned
char
*
buf
=
(
unsigned
char
*
)
(
skb
+
1
)
;
unsigned
char
*
buf
=
skb
->
data
;
unsigned
char
*
eth_p
=
(
unsigned
char
*
)
&
eth
;
unsigned
char
*
eth_p
=
(
unsigned
char
*
)
&
eth
;
int
i
;
int
i
;
for
(
i
=
0
;
i
<
sizeof
(
eth
);
i
++
)
{
for
(
i
=
0
;
i
<
sizeof
(
eth
);
i
++
)
{
...
...
drivers/net/skeleton.c
View file @
0d202675
...
@@ -316,7 +316,7 @@ net_send_packet(struct sk_buff *skb, struct device *dev)
...
@@ -316,7 +316,7 @@ net_send_packet(struct sk_buff *skb, struct device *dev)
/* For ethernet, fill in the header. This should really be done by a
/* For ethernet, fill in the header. This should really be done by a
higher level, rather than duplicated for each ethernet adaptor. */
higher level, rather than duplicated for each ethernet adaptor. */
if
(
!
skb
->
arp
&&
dev
->
rebuild_header
(
skb
+
1
,
dev
))
{
if
(
!
skb
->
arp
&&
dev
->
rebuild_header
(
skb
->
data
,
dev
))
{
skb
->
dev
=
dev
;
skb
->
dev
=
dev
;
arp_queue
(
skb
);
arp_queue
(
skb
);
return
0
;
return
0
;
...
@@ -329,7 +329,7 @@ net_send_packet(struct sk_buff *skb, struct device *dev)
...
@@ -329,7 +329,7 @@ net_send_packet(struct sk_buff *skb, struct device *dev)
printk
(
"%s: Transmitter access conflict.
\n
"
,
dev
->
name
);
printk
(
"%s: Transmitter access conflict.
\n
"
,
dev
->
name
);
else
{
else
{
short
length
=
ETH_ZLEN
<
skb
->
len
?
skb
->
len
:
ETH_ZLEN
;
short
length
=
ETH_ZLEN
<
skb
->
len
?
skb
->
len
:
ETH_ZLEN
;
unsigned
char
*
buf
=
(
void
*
)(
skb
+
1
)
;
unsigned
char
*
buf
=
skb
->
data
;
hardware_send_packet
(
ioaddr
,
buf
,
length
);
hardware_send_packet
(
ioaddr
,
buf
,
length
);
dev
->
trans_start
=
jiffies
;
dev
->
trans_start
=
jiffies
;
...
@@ -420,11 +420,11 @@ net_rx(struct device *dev)
...
@@ -420,11 +420,11 @@ net_rx(struct device *dev)
skb
->
len
=
pkt_len
;
skb
->
len
=
pkt_len
;
skb
->
dev
=
dev
;
skb
->
dev
=
dev
;
/* 'skb
+1
' points to the start of sk_buff data area. */
/* 'skb
->data
' points to the start of sk_buff data area. */
memcpy
(
(
unsigned
char
*
)
(
skb
+
1
)
,
(
void
*
)
dev
->
rmem_start
,
memcpy
(
skb
->
data
,
(
void
*
)
dev
->
rmem_start
,
pkt_len
);
pkt_len
);
/* or */
/* or */
insw
(
ioaddr
,
(
void
*
)(
skb
+
1
)
,
(
pkt_len
+
1
)
>>
1
);
insw
(
ioaddr
,
skb
->
data
,
(
pkt_len
+
1
)
>>
1
);
#ifdef HAVE_NETIF_RX
#ifdef HAVE_NETIF_RX
netif_rx
(
skb
);
netif_rx
(
skb
);
...
...
drivers/net/slip.c
View file @
0d202675
...
@@ -545,7 +545,7 @@ sl_xmit(struct sk_buff *skb, struct device *dev)
...
@@ -545,7 +545,7 @@ sl_xmit(struct sk_buff *skb, struct device *dev)
#ifdef CONFIG_AX25
#ifdef CONFIG_AX25
if
(
sl
->
mode
&
SL_MODE_AX25
)
if
(
sl
->
mode
&
SL_MODE_AX25
)
{
{
if
(
!
skb
->
arp
&&
dev
->
rebuild_header
(
skb
+
1
,
dev
))
if
(
!
skb
->
arp
&&
dev
->
rebuild_header
(
skb
->
data
,
dev
))
{
{
skb
->
dev
=
dev
;
skb
->
dev
=
dev
;
arp_queue
(
skb
);
arp_queue
(
skb
);
...
@@ -555,8 +555,8 @@ sl_xmit(struct sk_buff *skb, struct device *dev)
...
@@ -555,8 +555,8 @@ sl_xmit(struct sk_buff *skb, struct device *dev)
}
}
#endif
#endif
sl_lock
(
sl
);
sl_lock
(
sl
);
/* sl_hex_dump(
(unsigned char *)(skb+1)
,skb->len);*/
/* sl_hex_dump(
skb->data
,skb->len);*/
sl_encaps
(
sl
,
(
unsigned
char
*
)
(
skb
+
1
)
,
skb
->
len
);
sl_encaps
(
sl
,
skb
->
data
,
skb
->
len
);
if
(
skb
->
free
)
kfree_skb
(
skb
,
FREE_WRITE
);
if
(
skb
->
free
)
kfree_skb
(
skb
,
FREE_WRITE
);
}
}
return
(
0
);
return
(
0
);
...
@@ -599,7 +599,7 @@ sl_add_arp(unsigned long addr, struct sk_buff *skb, struct device *dev)
...
@@ -599,7 +599,7 @@ sl_add_arp(unsigned long addr, struct sk_buff *skb, struct device *dev)
struct
slip
*
sl
=&
sl_ctrl
[
dev
->
base_addr
];
struct
slip
*
sl
=&
sl_ctrl
[
dev
->
base_addr
];
if
(
sl
->
mode
&
SL_MODE_AX25
)
if
(
sl
->
mode
&
SL_MODE_AX25
)
arp_add
(
addr
,((
char
*
)
(
skb
+
1
)
)
+
8
,
dev
);
arp_add
(
addr
,((
char
*
)
skb
->
data
)
+
8
,
dev
);
#endif
#endif
}
}
...
@@ -686,6 +686,10 @@ sl_open(struct device *dev)
...
@@ -686,6 +686,10 @@ sl_open(struct device *dev)
return
(
-
ENOMEM
);
return
(
-
ENOMEM
);
}
}
dev
->
flags
|=
IFF_UP
;
/* Needed because address '0' is special */
if
(
dev
->
pa_addr
==
0
)
dev
->
pa_addr
=
ntohl
(
0xC0000001
);
DPRINTF
((
DBG_SLIP
,
"SLIP: channel %d opened.
\n
"
,
sl
->
line
));
DPRINTF
((
DBG_SLIP
,
"SLIP: channel %d opened.
\n
"
,
sl
->
line
));
return
(
0
);
return
(
0
);
}
}
...
...
kernel/sched.c
View file @
0d202675
...
@@ -642,8 +642,8 @@ static void do_timer(struct pt_regs * regs)
...
@@ -642,8 +642,8 @@ static void do_timer(struct pt_regs * regs)
calc_load
();
calc_load
();
if
((
VM_MASK
&
regs
->
eflags
)
||
(
3
&
regs
->
cs
))
{
if
((
VM_MASK
&
regs
->
eflags
)
||
(
3
&
regs
->
cs
))
{
current
->
utime
++
;
current
->
utime
++
;
if
(
current
!=
task
[
0
])
{
if
(
current
!=
task
[
0
])
{
if
(
current
->
priority
!=
15
)
if
(
current
->
priority
<
15
)
kstat
.
cpu_nice
++
;
kstat
.
cpu_nice
++
;
else
else
kstat
.
cpu_user
++
;
kstat
.
cpu_user
++
;
...
...
net/inet/arp.c
View file @
0d202675
...
@@ -251,14 +251,19 @@ arp_send_q(void)
...
@@ -251,14 +251,19 @@ arp_send_q(void)
/* Create and send our response to an ARP request. */
/* Create and send our response to an ARP request. */
static
int
arp_response
(
struct
arphdr
*
arp1
,
struct
device
*
dev
,
int
addrtype
)
/*
* We are now a bit smarter. We know the old buffer must be big enough
* so why allocate a new one for the reply ?
*/
static
int
arp_response
(
struct
sk_buff
*
skb
,
struct
arphdr
*
arp1
,
struct
device
*
dev
,
int
addrtype
)
{
{
struct
arphdr
*
arp2
;
struct
arphdr
*
arp2
;
struct
sk_buff
*
skb
;
unsigned
long
src
,
dst
;
unsigned
long
src
,
dst
;
unsigned
char
*
ptr1
,
*
ptr2
;
unsigned
char
*
ptr1
,
*
ptr2
;
int
hlen
;
int
hlen
;
int
len
;
struct
arp_table
*
apt
=
NULL
;
/* =NULL otherwise the compiler gives warnings */
struct
arp_table
*
apt
=
NULL
;
/* =NULL otherwise the compiler gives warnings */
/* Decode the source (REQUEST) message. */
/* Decode the source (REQUEST) message. */
...
@@ -270,24 +275,28 @@ arp_response(struct arphdr *arp1, struct device *dev, int addrtype)
...
@@ -270,24 +275,28 @@ arp_response(struct arphdr *arp1, struct device *dev, int addrtype)
{
{
apt
=
arp_lookup_proxy
(
dst
);
apt
=
arp_lookup_proxy
(
dst
);
if
(
apt
==
NULL
)
if
(
apt
==
NULL
)
{
kfree_skb
(
skb
,
FREE_READ
);
return
(
1
);
return
(
1
);
}
}
}
/* Get some mem and initialize it for the return trip. */
skb
->
h
.
raw
=
skb
->
data
;
skb
=
alloc_skb
(
sizeof
(
struct
sk_buff
)
+
skb
->
len
+=
dev
->
hard_header_len
;
/* Grow the packet back to its original form */
sizeof
(
struct
arphdr
)
+
(
2
*
arp1
->
ar_hln
)
+
(
2
*
arp1
->
ar_pln
)
+
/* Can't check for exceeding the size - some people pad. */
dev
->
hard_header_len
,
GFP_ATOMIC
);
len
=
sizeof
(
struct
arphdr
)
+
(
2
*
arp1
->
ar_hln
)
+
(
2
*
arp1
->
ar_pln
)
+
dev
->
hard_header_len
;
if
(
skb
==
NULL
)
{
if
(
len
>
skb
->
len
)
printk
(
"ARP: no memory available for ARP REPLY!
\n
"
);
{
return
(
1
);
printk
(
"Received runt ARP request!
\n
"
);
kfree_skb
(
skb
,
FREE_READ
);
return
1
;
}
}
skb
->
mem_addr
=
skb
;
skb
->
len
=
len
;
skb
->
len
=
sizeof
(
struct
arphdr
)
+
(
2
*
arp1
->
ar_hln
)
+
(
2
*
arp1
->
ar_pln
)
+
dev
->
hard_header_len
;
skb
->
mem_len
=
sizeof
(
struct
sk_buff
)
+
skb
->
len
;
hlen
=
dev
->
hard_header
(
skb
->
data
,
dev
,
ETH_P_ARP
,
src
,
dst
,
skb
->
len
);
hlen
=
dev
->
hard_header
(
skb
->
data
,
dev
,
ETH_P_ARP
,
src
,
dst
,
skb
->
len
);
if
(
hlen
<
0
)
{
if
(
hlen
<
0
)
{
printk
(
"ARP: cannot create HW frame header for REPLY !
\n
"
);
printk
(
"ARP: cannot create HW frame header for REPLY !
\n
"
);
kfree_skb
(
skb
,
FREE_WRITE
);
kfree_skb
(
skb
,
FREE_WRITE
);
...
@@ -578,8 +587,7 @@ arp_rcv(struct sk_buff *skb, struct device *dev, struct packet_type *pt)
...
@@ -578,8 +587,7 @@ arp_rcv(struct sk_buff *skb, struct device *dev, struct packet_type *pt)
* Yes, it is for us.
* Yes, it is for us.
* Allocate, fill in and send an ARP REPLY packet.
* Allocate, fill in and send an ARP REPLY packet.
*/
*/
ret
=
arp_response
(
arp
,
dev
,
addr_hint
);
ret
=
arp_response
(
skb
,
arp
,
dev
,
addr_hint
);
kfree_skb
(
skb
,
FREE_READ
);
return
(
ret
);
return
(
ret
);
}
}
...
@@ -608,14 +616,12 @@ arp_send(unsigned long paddr, struct device *dev, unsigned long saddr)
...
@@ -608,14 +616,12 @@ arp_send(unsigned long paddr, struct device *dev, unsigned long saddr)
/* Fill in the request. */
/* Fill in the request. */
skb
->
sk
=
NULL
;
skb
->
sk
=
NULL
;
skb
->
mem_addr
=
skb
;
skb
->
len
=
sizeof
(
struct
arphdr
)
+
skb
->
len
=
sizeof
(
struct
arphdr
)
+
dev
->
hard_header_len
+
(
2
*
dev
->
addr_len
)
+
8
;
dev
->
hard_header_len
+
(
2
*
dev
->
addr_len
)
+
8
;
skb
->
mem_len
=
sizeof
(
struct
sk_buff
)
+
skb
->
len
;
skb
->
arp
=
1
;
skb
->
arp
=
1
;
skb
->
dev
=
dev
;
skb
->
dev
=
dev
;
skb
->
next
=
NULL
;
skb
->
free
=
1
;
skb
->
free
=
1
;
skb
->
next
=
NULL
;
tmp
=
dev
->
hard_header
(
skb
->
data
,
dev
,
ETH_P_ARP
,
0
,
saddr
,
skb
->
len
);
tmp
=
dev
->
hard_header
(
skb
->
data
,
dev
,
ETH_P_ARP
,
0
,
saddr
,
skb
->
len
);
if
(
tmp
<
0
)
{
if
(
tmp
<
0
)
{
kfree_skb
(
skb
,
FREE_WRITE
);
kfree_skb
(
skb
,
FREE_WRITE
);
...
...
net/inet/sock.c
View file @
0d202675
...
@@ -324,10 +324,10 @@ destroy_sock(struct sock *sk)
...
@@ -324,10 +324,10 @@ destroy_sock(struct sock *sk)
delete_timer
(
sk
);
delete_timer
(
sk
);
if
(
sk
->
send_tmp
!=
NULL
)
while
((
skb
=
tcp_dequeue_partial
(
sk
))
!=
NULL
)
{
{
IS_SKB
(
sk
->
send_tmp
);
IS_SKB
(
sk
b
);
kfree_skb
(
sk
->
send_tmp
,
FREE_WRITE
);
kfree_skb
(
sk
b
,
FREE_WRITE
);
}
}
/* Cleanup up the write buffer. */
/* Cleanup up the write buffer. */
...
@@ -869,7 +869,7 @@ inet_create(struct socket *sock, int protocol)
...
@@ -869,7 +869,7 @@ inet_create(struct socket *sock, int protocol)
sk
->
state
=
TCP_CLOSE
;
sk
->
state
=
TCP_CLOSE
;
sk
->
dead
=
0
;
sk
->
dead
=
0
;
sk
->
ack_timed
=
0
;
sk
->
ack_timed
=
0
;
sk
->
send_tmp
=
NULL
;
sk
->
partial
=
NULL
;
sk
->
user_mss
=
0
;
sk
->
user_mss
=
0
;
sk
->
debug
=
0
;
sk
->
debug
=
0
;
...
...
net/inet/sock.h
View file @
0d202675
...
@@ -89,7 +89,8 @@ struct sock {
...
@@ -89,7 +89,8 @@ struct sock {
struct
sk_buff
*
volatile
send_tail
;
struct
sk_buff
*
volatile
send_tail
;
struct
sk_buff
*
volatile
send_head
;
struct
sk_buff
*
volatile
send_head
;
struct
sk_buff
*
volatile
back_log
;
struct
sk_buff
*
volatile
back_log
;
struct
sk_buff
*
send_tmp
;
struct
sk_buff
*
partial
;
struct
timer_list
partial_timer
;
long
retransmits
;
long
retransmits
;
struct
sk_buff
*
volatile
wback
,
struct
sk_buff
*
volatile
wback
,
*
volatile
wfront
,
*
volatile
wfront
,
...
...
net/inet/tcp.c
View file @
0d202675
...
@@ -648,43 +648,52 @@ static void tcp_send_skb(struct sock *sk, struct sk_buff *skb)
...
@@ -648,43 +648,52 @@ static void tcp_send_skb(struct sock *sk, struct sk_buff *skb)
}
}
}
}
st
atic
struct
sk_buff
*
dequeue_partial
(
struct
sock
*
sk
)
st
ruct
sk_buff
*
tcp_
dequeue_partial
(
struct
sock
*
sk
)
{
{
struct
sk_buff
*
skb
;
struct
sk_buff
*
skb
;
unsigned
long
flags
;
unsigned
long
flags
;
save_flags
(
flags
);
save_flags
(
flags
);
cli
();
cli
();
skb
=
sk
->
send_tmp
;
skb
=
sk
->
partial
;
sk
->
send_tmp
=
NULL
;
if
(
skb
)
{
sk
->
partial
=
NULL
;
del_timer
(
&
sk
->
partial_timer
);
}
restore_flags
(
flags
);
restore_flags
(
flags
);
return
skb
;
return
skb
;
}
}
static
void
enqueue_partial
(
struct
sk_buff
*
skb
,
struct
sock
*
sk
)
static
void
tcp_send_partial
(
struct
sock
*
sk
)
{
struct
sk_buff
*
skb
;
if
(
sk
==
NULL
)
return
;
while
((
skb
=
tcp_dequeue_partial
(
sk
))
!=
NULL
)
tcp_send_skb
(
sk
,
skb
);
}
void
tcp_enqueue_partial
(
struct
sk_buff
*
skb
,
struct
sock
*
sk
)
{
{
struct
sk_buff
*
tmp
;
struct
sk_buff
*
tmp
;
unsigned
long
flags
;
unsigned
long
flags
;
save_flags
(
flags
);
save_flags
(
flags
);
cli
();
cli
();
tmp
=
sk
->
send_tmp
;
tmp
=
sk
->
partial
;
sk
->
send_tmp
=
skb
;
if
(
tmp
)
del_timer
(
&
sk
->
partial_timer
);
sk
->
partial
=
skb
;
sk
->
partial_timer
.
expires
=
5
*
HZ
;
sk
->
partial_timer
.
function
=
(
void
(
*
)(
unsigned
long
))
tcp_send_partial
;
sk
->
partial_timer
.
data
=
(
unsigned
long
)
sk
;
add_timer
(
&
sk
->
partial_timer
);
restore_flags
(
flags
);
restore_flags
(
flags
);
if
(
tmp
)
if
(
tmp
)
tcp_send_skb
(
sk
,
tmp
);
tcp_send_skb
(
sk
,
tmp
);
}
}
static
void
tcp_send_partial
(
struct
sock
*
sk
)
{
struct
sk_buff
*
skb
;
if
(
sk
==
NULL
)
return
;
while
((
skb
=
dequeue_partial
(
sk
))
!=
NULL
)
tcp_send_skb
(
sk
,
skb
);
}
/* This routine sends an ack and also updates the window. */
/* This routine sends an ack and also updates the window. */
static
void
static
void
...
@@ -897,7 +906,7 @@ tcp_write(struct sock *sk, unsigned char *from,
...
@@ -897,7 +906,7 @@ tcp_write(struct sock *sk, unsigned char *from,
*/
*/
/* Now we need to check if we have a half built packet. */
/* Now we need to check if we have a half built packet. */
if
((
skb
=
dequeue_partial
(
sk
))
!=
NULL
)
{
if
((
skb
=
tcp_
dequeue_partial
(
sk
))
!=
NULL
)
{
int
hdrlen
;
int
hdrlen
;
/* IP header + TCP header */
/* IP header + TCP header */
...
@@ -920,10 +929,12 @@ tcp_write(struct sock *sk, unsigned char *from,
...
@@ -920,10 +929,12 @@ tcp_write(struct sock *sk, unsigned char *from,
len
-=
copy
;
len
-=
copy
;
sk
->
send_seq
+=
copy
;
sk
->
send_seq
+=
copy
;
}
}
enqueue_partial
(
skb
,
sk
);
if
((
skb
->
len
-
hdrlen
)
>=
sk
->
mss
||
if
((
skb
->
len
-
hdrlen
)
>=
sk
->
mss
||
(
flags
&
MSG_OOB
))
{
(
flags
&
MSG_OOB
)
||
tcp_send_partial
(
sk
);
!
sk
->
packets_out
)
}
tcp_send_skb
(
sk
,
skb
);
else
tcp_enqueue_partial
(
skb
,
sk
);
continue
;
continue
;
}
}
...
@@ -949,7 +960,8 @@ tcp_write(struct sock *sk, unsigned char *from,
...
@@ -949,7 +960,8 @@ tcp_write(struct sock *sk, unsigned char *from,
copy
=
min
(
copy
,
len
);
copy
=
min
(
copy
,
len
);
/* We should really check the window here also. */
/* We should really check the window here also. */
if
(
sk
->
packets_out
&&
copy
<
sk
->
mss
&&
!
(
flags
&
MSG_OOB
))
{
send_tmp
=
NULL
;
if
(
copy
<
sk
->
mss
&&
!
(
flags
&
MSG_OOB
))
{
/* We will release the socket incase we sleep here. */
/* We will release the socket incase we sleep here. */
release_sock
(
sk
);
release_sock
(
sk
);
/* NB: following must be mtu, because mss can be increased.
/* NB: following must be mtu, because mss can be increased.
...
@@ -962,7 +974,6 @@ tcp_write(struct sock *sk, unsigned char *from,
...
@@ -962,7 +974,6 @@ tcp_write(struct sock *sk, unsigned char *from,
release_sock
(
sk
);
release_sock
(
sk
);
skb
=
prot
->
wmalloc
(
sk
,
copy
+
prot
->
max_header
+
sizeof
(
*
skb
),
0
,
GFP_KERNEL
);
skb
=
prot
->
wmalloc
(
sk
,
copy
+
prot
->
max_header
+
sizeof
(
*
skb
),
0
,
GFP_KERNEL
);
sk
->
inuse
=
1
;
sk
->
inuse
=
1
;
send_tmp
=
NULL
;
}
}
/* If we didn't get any memory, we need to sleep. */
/* If we didn't get any memory, we need to sleep. */
...
@@ -1041,8 +1052,8 @@ tcp_write(struct sock *sk, unsigned char *from,
...
@@ -1041,8 +1052,8 @@ tcp_write(struct sock *sk, unsigned char *from,
skb
->
free
=
0
;
skb
->
free
=
0
;
sk
->
send_seq
+=
copy
;
sk
->
send_seq
+=
copy
;
if
(
send_tmp
!=
NULL
)
{
if
(
send_tmp
!=
NULL
&&
sk
->
packets_out
)
{
enqueue_partial
(
send_tmp
,
sk
);
tcp_
enqueue_partial
(
send_tmp
,
sk
);
continue
;
continue
;
}
}
tcp_send_skb
(
sk
,
skb
);
tcp_send_skb
(
sk
,
skb
);
...
@@ -1057,7 +1068,7 @@ tcp_write(struct sock *sk, unsigned char *from,
...
@@ -1057,7 +1068,7 @@ tcp_write(struct sock *sk, unsigned char *from,
*/
*/
/* Avoid possible race on send_tmp - c/o Johannes Stille */
/* Avoid possible race on send_tmp - c/o Johannes Stille */
if
(
sk
->
send_tmp
&&
if
(
sk
->
partial
&&
((
!
sk
->
packets_out
)
((
!
sk
->
packets_out
)
/* If not nagling we can send on the before case too.. */
/* If not nagling we can send on the before case too.. */
||
(
sk
->
nonagle
&&
before
(
sk
->
send_seq
,
sk
->
window_seq
))
||
(
sk
->
nonagle
&&
before
(
sk
->
send_seq
,
sk
->
window_seq
))
...
@@ -1585,7 +1596,8 @@ tcp_shutdown(struct sock *sk, int how)
...
@@ -1585,7 +1596,8 @@ tcp_shutdown(struct sock *sk, int how)
sk
->
inuse
=
1
;
sk
->
inuse
=
1
;
/* Clear out any half completed packets. */
/* Clear out any half completed packets. */
if
(
sk
->
send_tmp
)
tcp_send_partial
(
sk
);
if
(
sk
->
partial
)
tcp_send_partial
(
sk
);
prot
=
(
struct
proto
*
)
sk
->
prot
;
prot
=
(
struct
proto
*
)
sk
->
prot
;
th
=
(
struct
tcphdr
*
)
&
sk
->
dummy_th
;
th
=
(
struct
tcphdr
*
)
&
sk
->
dummy_th
;
...
@@ -1898,7 +1910,7 @@ tcp_conn_request(struct sock *sk, struct sk_buff *skb,
...
@@ -1898,7 +1910,7 @@ tcp_conn_request(struct sock *sk, struct sk_buff *skb,
newsk
->
intr
=
0
;
newsk
->
intr
=
0
;
newsk
->
proc
=
0
;
newsk
->
proc
=
0
;
newsk
->
done
=
0
;
newsk
->
done
=
0
;
newsk
->
send_tmp
=
NULL
;
newsk
->
partial
=
NULL
;
newsk
->
pair
=
NULL
;
newsk
->
pair
=
NULL
;
newsk
->
wmem_alloc
=
0
;
newsk
->
wmem_alloc
=
0
;
newsk
->
rmem_alloc
=
0
;
newsk
->
rmem_alloc
=
0
;
...
@@ -2081,7 +2093,7 @@ tcp_close(struct sock *sk, int timeout)
...
@@ -2081,7 +2093,7 @@ tcp_close(struct sock *sk, int timeout)
sk
->
rqueue
=
NULL
;
sk
->
rqueue
=
NULL
;
/* Get rid off any half-completed packets. */
/* Get rid off any half-completed packets. */
if
(
sk
->
send_tmp
)
{
if
(
sk
->
partial
)
{
tcp_send_partial
(
sk
);
tcp_send_partial
(
sk
);
}
}
...
@@ -2565,7 +2577,7 @@ tcp_ack(struct sock *sk, struct tcphdr *th, unsigned long saddr, int len)
...
@@ -2565,7 +2577,7 @@ tcp_ack(struct sock *sk, struct tcphdr *th, unsigned long saddr, int len)
}
}
}
}
if
(
sk
->
packets_out
==
0
&&
sk
->
send_tmp
!=
NULL
&&
if
(
sk
->
packets_out
==
0
&&
sk
->
partial
!=
NULL
&&
sk
->
wfront
==
NULL
&&
sk
->
send_head
==
NULL
)
{
sk
->
wfront
==
NULL
&&
sk
->
send_head
==
NULL
)
{
flag
|=
1
;
flag
|=
1
;
tcp_send_partial
(
sk
);
tcp_send_partial
(
sk
);
...
...
net/inet/tcp.h
View file @
0d202675
...
@@ -124,5 +124,8 @@ extern int tcp_rcv(struct sk_buff *skb, struct device *dev,
...
@@ -124,5 +124,8 @@ extern int tcp_rcv(struct sk_buff *skb, struct device *dev,
extern
int
tcp_ioctl
(
struct
sock
*
sk
,
int
cmd
,
unsigned
long
arg
);
extern
int
tcp_ioctl
(
struct
sock
*
sk
,
int
cmd
,
unsigned
long
arg
);
extern
void
tcp_enqueue_partial
(
struct
sk_buff
*
,
struct
sock
*
);
extern
struct
sk_buff
*
tcp_dequeue_partial
(
struct
sock
*
);
#endif
/* _TCP_H */
#endif
/* _TCP_H */
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment