mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 02:21:52 +09:00
net: add pskb_may_pull_reason() helper
[ Upstream commit 1fb2d41501 ]
pskb_may_pull() can fail for two different reasons.
Provide pskb_may_pull_reason() helper to distinguish
between these reasons.
It returns:
SKB_NOT_DROPPED_YET : Success
SKB_DROP_REASON_PKT_TOO_SMALL : packet too small
SKB_DROP_REASON_NOMEM : skb->head could not be resized
Signed-off-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: David Ahern <dsahern@kernel.org>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Stable-dep-of: 8bd67ebb50c0 ("net: bridge: xmit: make sure we have at least eth header len bytes")
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
43504dae4d
commit
ce83060743
@@ -2636,15 +2636,26 @@ void *skb_pull_data(struct sk_buff *skb, size_t len);
|
||||
|
||||
void *__pskb_pull_tail(struct sk_buff *skb, int delta);
|
||||
|
||||
static inline bool pskb_may_pull(struct sk_buff *skb, unsigned int len)
|
||||
static inline enum skb_drop_reason
|
||||
pskb_may_pull_reason(struct sk_buff *skb, unsigned int len)
|
||||
{
|
||||
DEBUG_NET_WARN_ON_ONCE(len > INT_MAX);
|
||||
|
||||
if (likely(len <= skb_headlen(skb)))
|
||||
return true;
|
||||
return SKB_NOT_DROPPED_YET;
|
||||
|
||||
if (unlikely(len > skb->len))
|
||||
return false;
|
||||
return __pskb_pull_tail(skb, len - skb_headlen(skb)) != NULL;
|
||||
return SKB_DROP_REASON_PKT_TOO_SMALL;
|
||||
|
||||
if (unlikely(!__pskb_pull_tail(skb, len - skb_headlen(skb))))
|
||||
return SKB_DROP_REASON_NOMEM;
|
||||
|
||||
return SKB_NOT_DROPPED_YET;
|
||||
}
|
||||
|
||||
static inline bool pskb_may_pull(struct sk_buff *skb, unsigned int len)
|
||||
{
|
||||
return pskb_may_pull_reason(skb, len) == SKB_NOT_DROPPED_YET;
|
||||
}
|
||||
|
||||
static inline void *pskb_pull(struct sk_buff *skb, unsigned int len)
|
||||
|
||||
Reference in New Issue
Block a user