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
Kirill Smelkov
linux
Commits
fbb398a8
Commit
fbb398a8
authored
Jun 09, 2009
by
David S. Miller
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
net/core/skbuff.c: Use frag list abstraction interfaces.
Signed-off-by:
David S. Miller
<
davem@davemloft.net
>
parent
4cf704fb
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
106 additions
and
124 deletions
+106
-124
net/core/skbuff.c
net/core/skbuff.c
+106
-124
No files found.
net/core/skbuff.c
View file @
fbb398a8
...
...
@@ -210,7 +210,7 @@ struct sk_buff *__alloc_skb(unsigned int size, gfp_t gfp_mask,
shinfo
->
gso_type
=
0
;
shinfo
->
ip6_frag_id
=
0
;
shinfo
->
tx_flags
.
flags
=
0
;
s
hinfo
->
frag_list
=
NULL
;
s
kb_frag_list_init
(
skb
)
;
memset
(
&
shinfo
->
hwtstamps
,
0
,
sizeof
(
shinfo
->
hwtstamps
));
if
(
fclone
)
{
...
...
@@ -323,7 +323,7 @@ static void skb_clone_fraglist(struct sk_buff *skb)
{
struct
sk_buff
*
list
;
for
(
list
=
skb_shinfo
(
skb
)
->
frag_list
;
list
;
list
=
list
->
nex
t
)
skb_walk_frags
(
skb
,
lis
t
)
skb_get
(
list
);
}
...
...
@@ -338,7 +338,7 @@ static void skb_release_data(struct sk_buff *skb)
put_page
(
skb_shinfo
(
skb
)
->
frags
[
i
].
page
);
}
if
(
skb_
shinfo
(
skb
)
->
frag_list
)
if
(
skb_
has_frags
(
skb
)
)
skb_drop_fraglist
(
skb
);
kfree
(
skb
->
head
);
...
...
@@ -503,7 +503,7 @@ int skb_recycle_check(struct sk_buff *skb, int skb_size)
shinfo
->
gso_type
=
0
;
shinfo
->
ip6_frag_id
=
0
;
shinfo
->
tx_flags
.
flags
=
0
;
s
hinfo
->
frag_list
=
NULL
;
s
kb_frag_list_init
(
skb
)
;
memset
(
&
shinfo
->
hwtstamps
,
0
,
sizeof
(
shinfo
->
hwtstamps
));
memset
(
skb
,
0
,
offsetof
(
struct
sk_buff
,
tail
));
...
...
@@ -758,7 +758,7 @@ struct sk_buff *pskb_copy(struct sk_buff *skb, gfp_t gfp_mask)
skb_shinfo
(
n
)
->
nr_frags
=
i
;
}
if
(
skb_
shinfo
(
skb
)
->
frag_list
)
{
if
(
skb_
has_frags
(
skb
)
)
{
skb_shinfo
(
n
)
->
frag_list
=
skb_shinfo
(
skb
)
->
frag_list
;
skb_clone_fraglist
(
n
);
}
...
...
@@ -821,7 +821,7 @@ int pskb_expand_head(struct sk_buff *skb, int nhead, int ntail,
for
(
i
=
0
;
i
<
skb_shinfo
(
skb
)
->
nr_frags
;
i
++
)
get_page
(
skb_shinfo
(
skb
)
->
frags
[
i
].
page
);
if
(
skb_
shinfo
(
skb
)
->
frag_list
)
if
(
skb_
has_frags
(
skb
)
)
skb_clone_fraglist
(
skb
);
skb_release_data
(
skb
);
...
...
@@ -1093,7 +1093,7 @@ int ___pskb_trim(struct sk_buff *skb, unsigned int len)
for
(;
i
<
nfrags
;
i
++
)
put_page
(
skb_shinfo
(
skb
)
->
frags
[
i
].
page
);
if
(
skb_
shinfo
(
skb
)
->
frag_list
)
if
(
skb_
has_frags
(
skb
)
)
skb_drop_fraglist
(
skb
);
goto
done
;
}
...
...
@@ -1188,7 +1188,7 @@ unsigned char *__pskb_pull_tail(struct sk_buff *skb, int delta)
/* Optimization: no fragments, no reasons to preestimate
* size of pulled pages. Superb.
*/
if
(
!
skb_
shinfo
(
skb
)
->
frag_list
)
if
(
!
skb_
has_frags
(
skb
)
)
goto
pull_pages
;
/* Estimate size of pulled pages. */
...
...
@@ -1285,8 +1285,9 @@ EXPORT_SYMBOL(__pskb_pull_tail);
int
skb_copy_bits
(
const
struct
sk_buff
*
skb
,
int
offset
,
void
*
to
,
int
len
)
{
int
i
,
copy
;
int
start
=
skb_headlen
(
skb
);
struct
sk_buff
*
frag_iter
;
int
i
,
copy
;
if
(
offset
>
(
int
)
skb
->
len
-
len
)
goto
fault
;
...
...
@@ -1328,20 +1329,16 @@ int skb_copy_bits(const struct sk_buff *skb, int offset, void *to, int len)
start
=
end
;
}
if
(
skb_shinfo
(
skb
)
->
frag_list
)
{
struct
sk_buff
*
list
=
skb_shinfo
(
skb
)
->
frag_list
;
for
(;
list
;
list
=
list
->
next
)
{
skb_walk_frags
(
skb
,
frag_iter
)
{
int
end
;
WARN_ON
(
start
>
offset
+
len
);
end
=
start
+
list
->
len
;
end
=
start
+
frag_iter
->
len
;
if
((
copy
=
end
-
offset
)
>
0
)
{
if
(
copy
>
len
)
copy
=
len
;
if
(
skb_copy_bits
(
list
,
offset
-
start
,
to
,
copy
))
if
(
skb_copy_bits
(
frag_iter
,
offset
-
start
,
to
,
copy
))
goto
fault
;
if
((
len
-=
copy
)
==
0
)
return
0
;
...
...
@@ -1350,7 +1347,6 @@ int skb_copy_bits(const struct sk_buff *skb, int offset, void *to, int len)
}
start
=
end
;
}
}
if
(
!
len
)
return
0
;
...
...
@@ -1534,6 +1530,7 @@ int skb_splice_bits(struct sk_buff *skb, unsigned int offset,
.
ops
=
&
sock_pipe_buf_ops
,
.
spd_release
=
sock_spd_release
,
};
struct
sk_buff
*
frag_iter
;
struct
sock
*
sk
=
skb
->
sk
;
/*
...
...
@@ -1548,13 +1545,11 @@ int skb_splice_bits(struct sk_buff *skb, unsigned int offset,
/*
* now see if we have a frag_list to map
*/
if
(
skb_shinfo
(
skb
)
->
frag_list
)
{
struct
sk_buff
*
list
=
skb_shinfo
(
skb
)
->
frag_list
;
for
(;
list
&&
tlen
;
list
=
list
->
next
)
{
if
(
__skb_splice_bits
(
list
,
&
offset
,
&
tlen
,
&
spd
,
sk
))
skb_walk_frags
(
skb
,
frag_iter
)
{
if
(
!
tlen
)
break
;
if
(
__skb_splice_bits
(
frag_iter
,
&
offset
,
&
tlen
,
&
spd
,
sk
))
break
;
}
}
done:
...
...
@@ -1593,8 +1588,9 @@ int skb_splice_bits(struct sk_buff *skb, unsigned int offset,
int
skb_store_bits
(
struct
sk_buff
*
skb
,
int
offset
,
const
void
*
from
,
int
len
)
{
int
i
,
copy
;
int
start
=
skb_headlen
(
skb
);
struct
sk_buff
*
frag_iter
;
int
i
,
copy
;
if
(
offset
>
(
int
)
skb
->
len
-
len
)
goto
fault
;
...
...
@@ -1635,19 +1631,16 @@ int skb_store_bits(struct sk_buff *skb, int offset, const void *from, int len)
start
=
end
;
}
if
(
skb_shinfo
(
skb
)
->
frag_list
)
{
struct
sk_buff
*
list
=
skb_shinfo
(
skb
)
->
frag_list
;
for
(;
list
;
list
=
list
->
next
)
{
skb_walk_frags
(
skb
,
frag_iter
)
{
int
end
;
WARN_ON
(
start
>
offset
+
len
);
end
=
start
+
list
->
len
;
end
=
start
+
frag_iter
->
len
;
if
((
copy
=
end
-
offset
)
>
0
)
{
if
(
copy
>
len
)
copy
=
len
;
if
(
skb_store_bits
(
list
,
offset
-
start
,
if
(
skb_store_bits
(
frag_iter
,
offset
-
start
,
from
,
copy
))
goto
fault
;
if
((
len
-=
copy
)
==
0
)
...
...
@@ -1657,7 +1650,6 @@ int skb_store_bits(struct sk_buff *skb, int offset, const void *from, int len)
}
start
=
end
;
}
}
if
(
!
len
)
return
0
;
...
...
@@ -1673,6 +1665,7 @@ __wsum skb_checksum(const struct sk_buff *skb, int offset,
{
int
start
=
skb_headlen
(
skb
);
int
i
,
copy
=
start
-
offset
;
struct
sk_buff
*
frag_iter
;
int
pos
=
0
;
/* Checksum header. */
...
...
@@ -1712,20 +1705,17 @@ __wsum skb_checksum(const struct sk_buff *skb, int offset,
start
=
end
;
}
if
(
skb_shinfo
(
skb
)
->
frag_list
)
{
struct
sk_buff
*
list
=
skb_shinfo
(
skb
)
->
frag_list
;
for
(;
list
;
list
=
list
->
next
)
{
skb_walk_frags
(
skb
,
frag_iter
)
{
int
end
;
WARN_ON
(
start
>
offset
+
len
);
end
=
start
+
list
->
len
;
end
=
start
+
frag_iter
->
len
;
if
((
copy
=
end
-
offset
)
>
0
)
{
__wsum
csum2
;
if
(
copy
>
len
)
copy
=
len
;
csum2
=
skb_checksum
(
list
,
offset
-
start
,
csum2
=
skb_checksum
(
frag_iter
,
offset
-
start
,
copy
,
0
);
csum
=
csum_block_add
(
csum
,
csum2
,
pos
);
if
((
len
-=
copy
)
==
0
)
...
...
@@ -1735,7 +1725,6 @@ __wsum skb_checksum(const struct sk_buff *skb, int offset,
}
start
=
end
;
}
}
BUG_ON
(
len
);
return
csum
;
...
...
@@ -1749,6 +1738,7 @@ __wsum skb_copy_and_csum_bits(const struct sk_buff *skb, int offset,
{
int
start
=
skb_headlen
(
skb
);
int
i
,
copy
=
start
-
offset
;
struct
sk_buff
*
frag_iter
;
int
pos
=
0
;
/* Copy header. */
...
...
@@ -1793,20 +1783,17 @@ __wsum skb_copy_and_csum_bits(const struct sk_buff *skb, int offset,
start
=
end
;
}
if
(
skb_shinfo
(
skb
)
->
frag_list
)
{
struct
sk_buff
*
list
=
skb_shinfo
(
skb
)
->
frag_list
;
for
(;
list
;
list
=
list
->
next
)
{
skb_walk_frags
(
skb
,
frag_iter
)
{
__wsum
csum2
;
int
end
;
WARN_ON
(
start
>
offset
+
len
);
end
=
start
+
list
->
len
;
end
=
start
+
frag_iter
->
len
;
if
((
copy
=
end
-
offset
)
>
0
)
{
if
(
copy
>
len
)
copy
=
len
;
csum2
=
skb_copy_and_csum_bits
(
list
,
csum2
=
skb_copy_and_csum_bits
(
frag_iter
,
offset
-
start
,
to
,
copy
,
0
);
csum
=
csum_block_add
(
csum
,
csum2
,
pos
);
...
...
@@ -1818,7 +1805,6 @@ __wsum skb_copy_and_csum_bits(const struct sk_buff *skb, int offset,
}
start
=
end
;
}
}
BUG_ON
(
len
);
return
csum
;
}
...
...
@@ -2327,8 +2313,7 @@ unsigned int skb_seq_read(unsigned int consumed, const u8 **data,
st
->
frag_data
=
NULL
;
}
if
(
st
->
root_skb
==
st
->
cur_skb
&&
skb_shinfo
(
st
->
root_skb
)
->
frag_list
)
{
if
(
st
->
root_skb
==
st
->
cur_skb
&&
skb_has_frags
(
st
->
root_skb
))
{
st
->
cur_skb
=
skb_shinfo
(
st
->
root_skb
)
->
frag_list
;
st
->
frag_idx
=
0
;
goto
next_skb
;
...
...
@@ -2639,7 +2624,7 @@ struct sk_buff *skb_segment(struct sk_buff *skb, int features)
}
else
skb_get
(
fskb2
);
BUG_ON
(
skb_shinfo
(
nskb
)
->
frag_list
);
SKB_FRAG_ASSERT
(
nskb
);
skb_shinfo
(
nskb
)
->
frag_list
=
fskb2
;
}
...
...
@@ -2796,6 +2781,7 @@ __skb_to_sgvec(struct sk_buff *skb, struct scatterlist *sg, int offset, int len)
{
int
start
=
skb_headlen
(
skb
);
int
i
,
copy
=
start
-
offset
;
struct
sk_buff
*
frag_iter
;
int
elt
=
0
;
if
(
copy
>
0
)
{
...
...
@@ -2829,19 +2815,16 @@ __skb_to_sgvec(struct sk_buff *skb, struct scatterlist *sg, int offset, int len)
start
=
end
;
}
if
(
skb_shinfo
(
skb
)
->
frag_list
)
{
struct
sk_buff
*
list
=
skb_shinfo
(
skb
)
->
frag_list
;
for
(;
list
;
list
=
list
->
next
)
{
skb_walk_frags
(
skb
,
frag_iter
)
{
int
end
;
WARN_ON
(
start
>
offset
+
len
);
end
=
start
+
list
->
len
;
end
=
start
+
frag_iter
->
len
;
if
((
copy
=
end
-
offset
)
>
0
)
{
if
(
copy
>
len
)
copy
=
len
;
elt
+=
__skb_to_sgvec
(
list
,
sg
+
elt
,
offset
-
start
,
elt
+=
__skb_to_sgvec
(
frag_iter
,
sg
+
elt
,
offset
-
start
,
copy
);
if
((
len
-=
copy
)
==
0
)
return
elt
;
...
...
@@ -2849,7 +2832,6 @@ __skb_to_sgvec(struct sk_buff *skb, struct scatterlist *sg, int offset, int len)
}
start
=
end
;
}
}
BUG_ON
(
len
);
return
elt
;
}
...
...
@@ -2896,7 +2878,7 @@ int skb_cow_data(struct sk_buff *skb, int tailbits, struct sk_buff **trailer)
return
-
ENOMEM
;
/* Easy case. Most of packets will go this way. */
if
(
!
skb_
shinfo
(
skb
)
->
frag_list
)
{
if
(
!
skb_
has_frags
(
skb
)
)
{
/* A little of trouble, not enough of space for trailer.
* This should not happen, when stack is tuned to generate
* good frames. OK, on miss we reallocate and reserve even more
...
...
@@ -2931,7 +2913,7 @@ int skb_cow_data(struct sk_buff *skb, int tailbits, struct sk_buff **trailer)
if
(
skb1
->
next
==
NULL
&&
tailbits
)
{
if
(
skb_shinfo
(
skb1
)
->
nr_frags
||
skb_
shinfo
(
skb1
)
->
frag_list
||
skb_
has_frags
(
skb1
)
||
skb_tailroom
(
skb1
)
<
tailbits
)
ntail
=
tailbits
+
128
;
}
...
...
@@ -2940,7 +2922,7 @@ int skb_cow_data(struct sk_buff *skb, int tailbits, struct sk_buff **trailer)
skb_cloned
(
skb1
)
||
ntail
||
skb_shinfo
(
skb1
)
->
nr_frags
||
skb_
shinfo
(
skb1
)
->
frag_list
)
{
skb_
has_frags
(
skb1
)
)
{
struct
sk_buff
*
skb2
;
/* Fuck, we are miserable poor guys... */
...
...
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