Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 368323
b: refs/heads/master
c: f77668d
h: refs/heads/master
i:
  368321: 327c105
  368319: 99fe734
v: v3
  • Loading branch information
Daniel Borkmann authored and David S. Miller committed Mar 20, 2013
1 parent 6cc5c54 commit ed8f5b4
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 61816596d1c9026d0ecb20c44f90452c41596ffe
refs/heads/master: f77668dc25b27270fe589031b22c432c3462b1d8
2 changes: 2 additions & 0 deletions trunk/include/linux/skbuff.h
Original file line number Diff line number Diff line change
Expand Up @@ -2840,6 +2840,8 @@ static inline void skb_checksum_none_assert(const struct sk_buff *skb)

bool skb_partial_csum_set(struct sk_buff *skb, u16 start, u16 off);

u32 __skb_get_poff(const struct sk_buff *skb);

/**
* skb_head_is_locked - Determine if the skb->head is locked down
* @skb: skb to check
Expand Down
57 changes: 57 additions & 0 deletions trunk/net/core/flow_dissector.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@
#include <linux/if_vlan.h>
#include <net/ip.h>
#include <net/ipv6.h>
#include <linux/igmp.h>
#include <linux/icmp.h>
#include <linux/sctp.h>
#include <linux/dccp.h>
#include <linux/if_tunnel.h>
#include <linux/if_pppox.h>
#include <linux/ppp_defs.h>
Expand Down Expand Up @@ -228,6 +232,59 @@ u16 __skb_tx_hash(const struct net_device *dev, const struct sk_buff *skb,
}
EXPORT_SYMBOL(__skb_tx_hash);

/* __skb_get_poff() returns the offset to the payload as far as it could
* be dissected. The main user is currently BPF, so that we can dynamically
* truncate packets without needing to push actual payload to the user
* space and can analyze headers only, instead.
*/
u32 __skb_get_poff(const struct sk_buff *skb)
{
struct flow_keys keys;
u32 poff = 0;

if (!skb_flow_dissect(skb, &keys))
return 0;

poff += keys.thoff;
switch (keys.ip_proto) {
case IPPROTO_TCP: {
const struct tcphdr *tcph;
struct tcphdr _tcph;

tcph = skb_header_pointer(skb, poff, sizeof(_tcph), &_tcph);
if (!tcph)
return poff;

poff += max_t(u32, sizeof(struct tcphdr), tcph->doff * 4);
break;
}
case IPPROTO_UDP:
case IPPROTO_UDPLITE:
poff += sizeof(struct udphdr);
break;
/* For the rest, we do not really care about header
* extensions at this point for now.
*/
case IPPROTO_ICMP:
poff += sizeof(struct icmphdr);
break;
case IPPROTO_ICMPV6:
poff += sizeof(struct icmp6hdr);
break;
case IPPROTO_IGMP:
poff += sizeof(struct igmphdr);
break;
case IPPROTO_DCCP:
poff += sizeof(struct dccp_hdr);
break;
case IPPROTO_SCTP:
poff += sizeof(struct sctphdr);
break;
}

return poff;
}

static inline u16 dev_cap_txqueue(struct net_device *dev, u16 queue_index)
{
if (unlikely(queue_index >= dev->real_num_tx_queues)) {
Expand Down

0 comments on commit ed8f5b4

Please sign in to comment.