Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
linux
linux-davinci
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,
...
@@ -210,7 +210,7 @@ struct sk_buff *__alloc_skb(unsigned int size, gfp_t gfp_mask,
shinfo
->
gso_type
=
0
;
shinfo
->
gso_type
=
0
;
shinfo
->
ip6_frag_id
=
0
;
shinfo
->
ip6_frag_id
=
0
;
shinfo
->
tx_flags
.
flags
=
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
(
&
shinfo
->
hwtstamps
,
0
,
sizeof
(
shinfo
->
hwtstamps
));
if
(
fclone
)
{
if
(
fclone
)
{
...
@@ -323,7 +323,7 @@ static void skb_clone_fraglist(struct sk_buff *skb)
...
@@ -323,7 +323,7 @@ static void skb_clone_fraglist(struct sk_buff *skb)
{
{
struct
sk_buff
*
list
;
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
);
skb_get
(
list
);
}
}
...
@@ -338,7 +338,7 @@ static void skb_release_data(struct sk_buff *skb)
...
@@ -338,7 +338,7 @@ static void skb_release_data(struct sk_buff *skb)
put_page
(
skb_shinfo
(
skb
)
->
frags
[
i
].
page
);
put_page
(
skb_shinfo
(
skb
)
->
frags
[
i
].
page
);
}
}
if
(
skb_
shinfo
(
skb
)
->
frag_list
)
if
(
skb_
has_frags
(
skb
)
)
skb_drop_fraglist
(
skb
);
skb_drop_fraglist
(
skb
);
kfree
(
skb
->
head
);
kfree
(
skb
->
head
);
...
@@ -503,7 +503,7 @@ int skb_recycle_check(struct sk_buff *skb, int skb_size)
...
@@ -503,7 +503,7 @@ int skb_recycle_check(struct sk_buff *skb, int skb_size)
shinfo
->
gso_type
=
0
;
shinfo
->
gso_type
=
0
;
shinfo
->
ip6_frag_id
=
0
;
shinfo
->
ip6_frag_id
=
0
;
shinfo
->
tx_flags
.
flags
=
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
(
&
shinfo
->
hwtstamps
,
0
,
sizeof
(
shinfo
->
hwtstamps
));
memset
(
skb
,
0
,
offsetof
(
struct
sk_buff
,
tail
));
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)
...
@@ -758,7 +758,7 @@ struct sk_buff *pskb_copy(struct sk_buff *skb, gfp_t gfp_mask)
skb_shinfo
(
n
)
->
nr_frags
=
i
;
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_shinfo
(
n
)
->
frag_list
=
skb_shinfo
(
skb
)
->
frag_list
;
skb_clone_fraglist
(
n
);
skb_clone_fraglist
(
n
);
}
}
...
@@ -821,7 +821,7 @@ int pskb_expand_head(struct sk_buff *skb, int nhead, int ntail,
...
@@ -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
++
)
for
(
i
=
0
;
i
<
skb_shinfo
(
skb
)
->
nr_frags
;
i
++
)
get_page
(
skb_shinfo
(
skb
)
->
frags
[
i
].
page
);
get_page
(
skb_shinfo
(
skb
)
->
frags
[
i
].
page
);
if
(
skb_
shinfo
(
skb
)
->
frag_list
)
if
(
skb_
has_frags
(
skb
)
)
skb_clone_fraglist
(
skb
);
skb_clone_fraglist
(
skb
);
skb_release_data
(
skb
);
skb_release_data
(
skb
);
...
@@ -1093,7 +1093,7 @@ drop_pages:
...
@@ -1093,7 +1093,7 @@ drop_pages:
for
(;
i
<
nfrags
;
i
++
)
for
(;
i
<
nfrags
;
i
++
)
put_page
(
skb_shinfo
(
skb
)
->
frags
[
i
].
page
);
put_page
(
skb_shinfo
(
skb
)
->
frags
[
i
].
page
);
if
(
skb_
shinfo
(
skb
)
->
frag_list
)
if
(
skb_
has_frags
(
skb
)
)
skb_drop_fraglist
(
skb
);
skb_drop_fraglist
(
skb
);
goto
done
;
goto
done
;
}
}
...
@@ -1188,7 +1188,7 @@ unsigned char *__pskb_pull_tail(struct sk_buff *skb, int delta)
...
@@ -1188,7 +1188,7 @@ unsigned char *__pskb_pull_tail(struct sk_buff *skb, int delta)
/* Optimization: no fragments, no reasons to preestimate
/* Optimization: no fragments, no reasons to preestimate
* size of pulled pages. Superb.
* size of pulled pages. Superb.
*/
*/
if
(
!
skb_
shinfo
(
skb
)
->
frag_list
)
if
(
!
skb_
has_frags
(
skb
)
)
goto
pull_pages
;
goto
pull_pages
;
/* Estimate size of pulled pages. */
/* Estimate size of pulled pages. */
...
@@ -1285,8 +1285,9 @@ EXPORT_SYMBOL(__pskb_pull_tail);
...
@@ -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
skb_copy_bits
(
const
struct
sk_buff
*
skb
,
int
offset
,
void
*
to
,
int
len
)
{
{
int
i
,
copy
;
int
start
=
skb_headlen
(
skb
);
int
start
=
skb_headlen
(
skb
);
struct
sk_buff
*
frag_iter
;
int
i
,
copy
;
if
(
offset
>
(
int
)
skb
->
len
-
len
)
if
(
offset
>
(
int
)
skb
->
len
-
len
)
goto
fault
;
goto
fault
;
...
@@ -1328,20 +1329,16 @@ int skb_copy_bits(const struct sk_buff *skb, int offset, void *to, int len)
...
@@ -1328,20 +1329,16 @@ int skb_copy_bits(const struct sk_buff *skb, int offset, void *to, int len)
start
=
end
;
start
=
end
;
}
}
if
(
skb_shinfo
(
skb
)
->
frag_list
)
{
skb_walk_frags
(
skb
,
frag_iter
)
{
struct
sk_buff
*
list
=
skb_shinfo
(
skb
)
->
frag_list
;
for
(;
list
;
list
=
list
->
next
)
{
int
end
;
int
end
;
WARN_ON
(
start
>
offset
+
len
);
WARN_ON
(
start
>
offset
+
len
);
end
=
start
+
list
->
len
;
end
=
start
+
frag_iter
->
len
;
if
((
copy
=
end
-
offset
)
>
0
)
{
if
((
copy
=
end
-
offset
)
>
0
)
{
if
(
copy
>
len
)
if
(
copy
>
len
)
copy
=
len
;
copy
=
len
;
if
(
skb_copy_bits
(
list
,
offset
-
start
,
if
(
skb_copy_bits
(
frag_iter
,
offset
-
start
,
to
,
copy
))
to
,
copy
))
goto
fault
;
goto
fault
;
if
((
len
-=
copy
)
==
0
)
if
((
len
-=
copy
)
==
0
)
return
0
;
return
0
;
...
@@ -1350,7 +1347,6 @@ int skb_copy_bits(const struct sk_buff *skb, int offset, void *to, int len)
...
@@ -1350,7 +1347,6 @@ int skb_copy_bits(const struct sk_buff *skb, int offset, void *to, int len)
}
}
start
=
end
;
start
=
end
;
}
}
}
if
(
!
len
)
if
(
!
len
)
return
0
;
return
0
;
...
@@ -1534,6 +1530,7 @@ int skb_splice_bits(struct sk_buff *skb, unsigned int offset,
...
@@ -1534,6 +1530,7 @@ int skb_splice_bits(struct sk_buff *skb, unsigned int offset,
.
ops
=
&
sock_pipe_buf_ops
,
.
ops
=
&
sock_pipe_buf_ops
,
.
spd_release
=
sock_spd_release
,
.
spd_release
=
sock_spd_release
,
};
};
struct
sk_buff
*
frag_iter
;
struct
sock
*
sk
=
skb
->
sk
;
struct
sock
*
sk
=
skb
->
sk
;
/*
/*
...
@@ -1548,13 +1545,11 @@ int skb_splice_bits(struct sk_buff *skb, unsigned int offset,
...
@@ -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
* now see if we have a frag_list to map
*/
*/
if
(
skb_shinfo
(
skb
)
->
frag_list
)
{
skb_walk_frags
(
skb
,
frag_iter
)
{
struct
sk_buff
*
list
=
skb_shinfo
(
skb
)
->
frag_list
;
if
(
!
tlen
)
break
;
for
(;
list
&&
tlen
;
list
=
list
->
next
)
{
if
(
__skb_splice_bits
(
frag_iter
,
&
offset
,
&
tlen
,
&
spd
,
sk
))
if
(
__skb_splice_bits
(
list
,
&
offset
,
&
tlen
,
&
spd
,
sk
))
break
;
break
;
}
}
}
done:
done:
...
@@ -1593,8 +1588,9 @@ done:
...
@@ -1593,8 +1588,9 @@ done:
int
skb_store_bits
(
struct
sk_buff
*
skb
,
int
offset
,
const
void
*
from
,
int
len
)
int
skb_store_bits
(
struct
sk_buff
*
skb
,
int
offset
,
const
void
*
from
,
int
len
)
{
{
int
i
,
copy
;
int
start
=
skb_headlen
(
skb
);
int
start
=
skb_headlen
(
skb
);
struct
sk_buff
*
frag_iter
;
int
i
,
copy
;
if
(
offset
>
(
int
)
skb
->
len
-
len
)
if
(
offset
>
(
int
)
skb
->
len
-
len
)
goto
fault
;
goto
fault
;
...
@@ -1635,19 +1631,16 @@ int skb_store_bits(struct sk_buff *skb, int offset, const void *from, int len)
...
@@ -1635,19 +1631,16 @@ int skb_store_bits(struct sk_buff *skb, int offset, const void *from, int len)
start
=
end
;
start
=
end
;
}
}
if
(
skb_shinfo
(
skb
)
->
frag_list
)
{
skb_walk_frags
(
skb
,
frag_iter
)
{
struct
sk_buff
*
list
=
skb_shinfo
(
skb
)
->
frag_list
;
for
(;
list
;
list
=
list
->
next
)
{
int
end
;
int
end
;
WARN_ON
(
start
>
offset
+
len
);
WARN_ON
(
start
>
offset
+
len
);
end
=
start
+
list
->
len
;
end
=
start
+
frag_iter
->
len
;
if
((
copy
=
end
-
offset
)
>
0
)
{
if
((
copy
=
end
-
offset
)
>
0
)
{
if
(
copy
>
len
)
if
(
copy
>
len
)
copy
=
len
;
copy
=
len
;
if
(
skb_store_bits
(
list
,
offset
-
start
,
if
(
skb_store_bits
(
frag_iter
,
offset
-
start
,
from
,
copy
))
from
,
copy
))
goto
fault
;
goto
fault
;
if
((
len
-=
copy
)
==
0
)
if
((
len
-=
copy
)
==
0
)
...
@@ -1657,7 +1650,6 @@ int skb_store_bits(struct sk_buff *skb, int offset, const void *from, int len)
...
@@ -1657,7 +1650,6 @@ int skb_store_bits(struct sk_buff *skb, int offset, const void *from, int len)
}
}
start
=
end
;
start
=
end
;
}
}
}
if
(
!
len
)
if
(
!
len
)
return
0
;
return
0
;
...
@@ -1673,6 +1665,7 @@ __wsum skb_checksum(const struct sk_buff *skb, int offset,
...
@@ -1673,6 +1665,7 @@ __wsum skb_checksum(const struct sk_buff *skb, int offset,
{
{
int
start
=
skb_headlen
(
skb
);
int
start
=
skb_headlen
(
skb
);
int
i
,
copy
=
start
-
offset
;
int
i
,
copy
=
start
-
offset
;
struct
sk_buff
*
frag_iter
;
int
pos
=
0
;
int
pos
=
0
;
/* Checksum header. */
/* Checksum header. */
...
@@ -1712,20 +1705,17 @@ __wsum skb_checksum(const struct sk_buff *skb, int offset,
...
@@ -1712,20 +1705,17 @@ __wsum skb_checksum(const struct sk_buff *skb, int offset,
start
=
end
;
start
=
end
;
}
}
if
(
skb_shinfo
(
skb
)
->
frag_list
)
{
skb_walk_frags
(
skb
,
frag_iter
)
{
struct
sk_buff
*
list
=
skb_shinfo
(
skb
)
->
frag_list
;
for
(;
list
;
list
=
list
->
next
)
{
int
end
;
int
end
;
WARN_ON
(
start
>
offset
+
len
);
WARN_ON
(
start
>
offset
+
len
);
end
=
start
+
list
->
len
;
end
=
start
+
frag_iter
->
len
;
if
((
copy
=
end
-
offset
)
>
0
)
{
if
((
copy
=
end
-
offset
)
>
0
)
{
__wsum
csum2
;
__wsum
csum2
;
if
(
copy
>
len
)
if
(
copy
>
len
)
copy
=
len
;
copy
=
len
;
csum2
=
skb_checksum
(
list
,
offset
-
start
,
csum2
=
skb_checksum
(
frag_iter
,
offset
-
start
,
copy
,
0
);
copy
,
0
);
csum
=
csum_block_add
(
csum
,
csum2
,
pos
);
csum
=
csum_block_add
(
csum
,
csum2
,
pos
);
if
((
len
-=
copy
)
==
0
)
if
((
len
-=
copy
)
==
0
)
...
@@ -1735,7 +1725,6 @@ __wsum skb_checksum(const struct sk_buff *skb, int offset,
...
@@ -1735,7 +1725,6 @@ __wsum skb_checksum(const struct sk_buff *skb, int offset,
}
}
start
=
end
;
start
=
end
;
}
}
}
BUG_ON
(
len
);
BUG_ON
(
len
);
return
csum
;
return
csum
;
...
@@ -1749,6 +1738,7 @@ __wsum skb_copy_and_csum_bits(const struct sk_buff *skb, int offset,
...
@@ -1749,6 +1738,7 @@ __wsum skb_copy_and_csum_bits(const struct sk_buff *skb, int offset,
{
{
int
start
=
skb_headlen
(
skb
);
int
start
=
skb_headlen
(
skb
);
int
i
,
copy
=
start
-
offset
;
int
i
,
copy
=
start
-
offset
;
struct
sk_buff
*
frag_iter
;
int
pos
=
0
;
int
pos
=
0
;
/* Copy header. */
/* Copy header. */
...
@@ -1793,20 +1783,17 @@ __wsum skb_copy_and_csum_bits(const struct sk_buff *skb, int offset,
...
@@ -1793,20 +1783,17 @@ __wsum skb_copy_and_csum_bits(const struct sk_buff *skb, int offset,
start
=
end
;
start
=
end
;
}
}
if
(
skb_shinfo
(
skb
)
->
frag_list
)
{
skb_walk_frags
(
skb
,
frag_iter
)
{
struct
sk_buff
*
list
=
skb_shinfo
(
skb
)
->
frag_list
;
for
(;
list
;
list
=
list
->
next
)
{
__wsum
csum2
;
__wsum
csum2
;
int
end
;
int
end
;
WARN_ON
(
start
>
offset
+
len
);
WARN_ON
(
start
>
offset
+
len
);
end
=
start
+
list
->
len
;
end
=
start
+
frag_iter
->
len
;
if
((
copy
=
end
-
offset
)
>
0
)
{
if
((
copy
=
end
-
offset
)
>
0
)
{
if
(
copy
>
len
)
if
(
copy
>
len
)
copy
=
len
;
copy
=
len
;
csum2
=
skb_copy_and_csum_bits
(
list
,
csum2
=
skb_copy_and_csum_bits
(
frag_iter
,
offset
-
start
,
offset
-
start
,
to
,
copy
,
0
);
to
,
copy
,
0
);
csum
=
csum_block_add
(
csum
,
csum2
,
pos
);
csum
=
csum_block_add
(
csum
,
csum2
,
pos
);
...
@@ -1818,7 +1805,6 @@ __wsum skb_copy_and_csum_bits(const struct sk_buff *skb, int offset,
...
@@ -1818,7 +1805,6 @@ __wsum skb_copy_and_csum_bits(const struct sk_buff *skb, int offset,
}
}
start
=
end
;
start
=
end
;
}
}
}
BUG_ON
(
len
);
BUG_ON
(
len
);
return
csum
;
return
csum
;
}
}
...
@@ -2327,8 +2313,7 @@ next_skb:
...
@@ -2327,8 +2313,7 @@ next_skb:
st
->
frag_data
=
NULL
;
st
->
frag_data
=
NULL
;
}
}
if
(
st
->
root_skb
==
st
->
cur_skb
&&
if
(
st
->
root_skb
==
st
->
cur_skb
&&
skb_has_frags
(
st
->
root_skb
))
{
skb_shinfo
(
st
->
root_skb
)
->
frag_list
)
{
st
->
cur_skb
=
skb_shinfo
(
st
->
root_skb
)
->
frag_list
;
st
->
cur_skb
=
skb_shinfo
(
st
->
root_skb
)
->
frag_list
;
st
->
frag_idx
=
0
;
st
->
frag_idx
=
0
;
goto
next_skb
;
goto
next_skb
;
...
@@ -2639,7 +2624,7 @@ struct sk_buff *skb_segment(struct sk_buff *skb, int features)
...
@@ -2639,7 +2624,7 @@ struct sk_buff *skb_segment(struct sk_buff *skb, int features)
}
else
}
else
skb_get
(
fskb2
);
skb_get
(
fskb2
);
BUG_ON
(
skb_shinfo
(
nskb
)
->
frag_list
);
SKB_FRAG_ASSERT
(
nskb
);
skb_shinfo
(
nskb
)
->
frag_list
=
fskb2
;
skb_shinfo
(
nskb
)
->
frag_list
=
fskb2
;
}
}
...
@@ -2796,6 +2781,7 @@ __skb_to_sgvec(struct sk_buff *skb, struct scatterlist *sg, int offset, int len)
...
@@ -2796,6 +2781,7 @@ __skb_to_sgvec(struct sk_buff *skb, struct scatterlist *sg, int offset, int len)
{
{
int
start
=
skb_headlen
(
skb
);
int
start
=
skb_headlen
(
skb
);
int
i
,
copy
=
start
-
offset
;
int
i
,
copy
=
start
-
offset
;
struct
sk_buff
*
frag_iter
;
int
elt
=
0
;
int
elt
=
0
;
if
(
copy
>
0
)
{
if
(
copy
>
0
)
{
...
@@ -2829,19 +2815,16 @@ __skb_to_sgvec(struct sk_buff *skb, struct scatterlist *sg, int offset, int len)
...
@@ -2829,19 +2815,16 @@ __skb_to_sgvec(struct sk_buff *skb, struct scatterlist *sg, int offset, int len)
start
=
end
;
start
=
end
;
}
}
if
(
skb_shinfo
(
skb
)
->
frag_list
)
{
skb_walk_frags
(
skb
,
frag_iter
)
{
struct
sk_buff
*
list
=
skb_shinfo
(
skb
)
->
frag_list
;
for
(;
list
;
list
=
list
->
next
)
{
int
end
;
int
end
;
WARN_ON
(
start
>
offset
+
len
);
WARN_ON
(
start
>
offset
+
len
);
end
=
start
+
list
->
len
;
end
=
start
+
frag_iter
->
len
;
if
((
copy
=
end
-
offset
)
>
0
)
{
if
((
copy
=
end
-
offset
)
>
0
)
{
if
(
copy
>
len
)
if
(
copy
>
len
)
copy
=
len
;
copy
=
len
;
elt
+=
__skb_to_sgvec
(
list
,
sg
+
elt
,
offset
-
start
,
elt
+=
__skb_to_sgvec
(
frag_iter
,
sg
+
elt
,
offset
-
start
,
copy
);
copy
);
if
((
len
-=
copy
)
==
0
)
if
((
len
-=
copy
)
==
0
)
return
elt
;
return
elt
;
...
@@ -2849,7 +2832,6 @@ __skb_to_sgvec(struct sk_buff *skb, struct scatterlist *sg, int offset, int len)
...
@@ -2849,7 +2832,6 @@ __skb_to_sgvec(struct sk_buff *skb, struct scatterlist *sg, int offset, int len)
}
}
start
=
end
;
start
=
end
;
}
}
}
BUG_ON
(
len
);
BUG_ON
(
len
);
return
elt
;
return
elt
;
}
}
...
@@ -2896,7 +2878,7 @@ int skb_cow_data(struct sk_buff *skb, int tailbits, struct sk_buff **trailer)
...
@@ -2896,7 +2878,7 @@ int skb_cow_data(struct sk_buff *skb, int tailbits, struct sk_buff **trailer)
return
-
ENOMEM
;
return
-
ENOMEM
;
/* Easy case. Most of packets will go this way. */
/* 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.
/* A little of trouble, not enough of space for trailer.
* This should not happen, when stack is tuned to generate
* This should not happen, when stack is tuned to generate
* good frames. OK, on miss we reallocate and reserve even more
* 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)
...
@@ -2931,7 +2913,7 @@ int skb_cow_data(struct sk_buff *skb, int tailbits, struct sk_buff **trailer)
if
(
skb1
->
next
==
NULL
&&
tailbits
)
{
if
(
skb1
->
next
==
NULL
&&
tailbits
)
{
if
(
skb_shinfo
(
skb1
)
->
nr_frags
||
if
(
skb_shinfo
(
skb1
)
->
nr_frags
||
skb_
shinfo
(
skb1
)
->
frag_list
||
skb_
has_frags
(
skb1
)
||
skb_tailroom
(
skb1
)
<
tailbits
)
skb_tailroom
(
skb1
)
<
tailbits
)
ntail
=
tailbits
+
128
;
ntail
=
tailbits
+
128
;
}
}
...
@@ -2940,7 +2922,7 @@ int skb_cow_data(struct sk_buff *skb, int tailbits, struct sk_buff **trailer)
...
@@ -2940,7 +2922,7 @@ int skb_cow_data(struct sk_buff *skb, int tailbits, struct sk_buff **trailer)
skb_cloned
(
skb1
)
||
skb_cloned
(
skb1
)
||
ntail
||
ntail
||
skb_shinfo
(
skb1
)
->
nr_frags
||
skb_shinfo
(
skb1
)
->
nr_frags
||
skb_
shinfo
(
skb1
)
->
frag_list
)
{
skb_
has_frags
(
skb1
)
)
{
struct
sk_buff
*
skb2
;
struct
sk_buff
*
skb2
;
/* Fuck, we are miserable poor guys... */
/* 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