diff options
author | David S. Miller <davem@davemloft.net> | 2009-06-09 03:22:47 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-06-09 03:24:07 -0400 |
commit | d4fd3bc101909802f9ed083093cce688cc3416aa (patch) | |
tree | 5b69ca6437f871ae581ae7b7ca3e9149615b7486 /net/xfrm | |
parent | 1b003be39e91a6cd013c9ea580ccc24d1fac9959 (diff) |
xfrm: Use frag list abstraction interfaces.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/xfrm')
-rw-r--r-- | net/xfrm/xfrm_algo.c | 41 |
1 files changed, 19 insertions, 22 deletions
diff --git a/net/xfrm/xfrm_algo.c b/net/xfrm/xfrm_algo.c index 96036cf2216d..d31ccb487730 100644 --- a/net/xfrm/xfrm_algo.c +++ b/net/xfrm/xfrm_algo.c | |||
@@ -696,8 +696,9 @@ int skb_icv_walk(const struct sk_buff *skb, struct hash_desc *desc, | |||
696 | { | 696 | { |
697 | int start = skb_headlen(skb); | 697 | int start = skb_headlen(skb); |
698 | int i, copy = start - offset; | 698 | int i, copy = start - offset; |
699 | int err; | 699 | struct sk_buff *frag_iter; |
700 | struct scatterlist sg; | 700 | struct scatterlist sg; |
701 | int err; | ||
701 | 702 | ||
702 | /* Checksum header. */ | 703 | /* Checksum header. */ |
703 | if (copy > 0) { | 704 | if (copy > 0) { |
@@ -742,28 +743,24 @@ int skb_icv_walk(const struct sk_buff *skb, struct hash_desc *desc, | |||
742 | start = end; | 743 | start = end; |
743 | } | 744 | } |
744 | 745 | ||
745 | if (skb_shinfo(skb)->frag_list) { | 746 | skb_walk_frags(skb, frag_iter) { |
746 | struct sk_buff *list = skb_shinfo(skb)->frag_list; | 747 | int end; |
747 | 748 | ||
748 | for (; list; list = list->next) { | 749 | WARN_ON(start > offset + len); |
749 | int end; | 750 | |
750 | 751 | end = start + frag_iter->len; | |
751 | WARN_ON(start > offset + len); | 752 | if ((copy = end - offset) > 0) { |
752 | 753 | if (copy > len) | |
753 | end = start + list->len; | 754 | copy = len; |
754 | if ((copy = end - offset) > 0) { | 755 | err = skb_icv_walk(frag_iter, desc, offset-start, |
755 | if (copy > len) | 756 | copy, icv_update); |
756 | copy = len; | 757 | if (unlikely(err)) |
757 | err = skb_icv_walk(list, desc, offset-start, | 758 | return err; |
758 | copy, icv_update); | 759 | if ((len -= copy) == 0) |
759 | if (unlikely(err)) | 760 | return 0; |
760 | return err; | 761 | offset += copy; |
761 | if ((len -= copy) == 0) | ||
762 | return 0; | ||
763 | offset += copy; | ||
764 | } | ||
765 | start = end; | ||
766 | } | 762 | } |
763 | start = end; | ||
767 | } | 764 | } |
768 | BUG_ON(len); | 765 | BUG_ON(len); |
769 | return 0; | 766 | return 0; |