Merge tag 'bug-for-3.4' of git://git.kernel.org/pub/scm/linux/kernel/git/paulg/linux
[linux-2.6.git] / include / linux / skbuff.h
index 773ae98..3fcb204 100644 (file)
  *                       about CHECKSUM_UNNECESSARY. 8)
  *     NETIF_F_IPV6_CSUM about as dumb as the last one but does IPv6 instead.
  *
+ *     UNNECESSARY: device will do per protocol specific csum. Protocol drivers
+ *     that do not want net to perform the checksum calculation should use
+ *     this flag in their outgoing skbs.
+ *     NETIF_F_FCOE_CRC  this indicates the device can do FCoE FC CRC
+ *                       offload. Correspondingly, the FCoE protocol driver
+ *                       stack should use CHECKSUM_UNNECESSARY.
+ *
  *     Any questions? No questions, good.              --ANK
  */
 
@@ -362,6 +369,7 @@ typedef unsigned char *sk_buff_data_t;
  *             ports.
  *     @wifi_acked_valid: wifi_acked was set
  *     @wifi_acked: whether frame was acked on wifi or not
+ *     @no_fcs:  Request NIC to treat last 4 bytes as Ethernet FCS
  *     @dma_cookie: a cookie to one of several possible DMA operations
  *             done by skb DMA functions
  *     @secmark: security marking
@@ -439,6 +447,11 @@ struct sk_buff {
 #endif
 
        int                     skb_iif;
+
+       __u32                   rxhash;
+
+       __u16                   vlan_tci;
+
 #ifdef CONFIG_NET_SCHED
        __u16                   tc_index;       /* traffic control index */
 #ifdef CONFIG_NET_CLS_ACT
@@ -446,8 +459,6 @@ struct sk_buff {
 #endif
 #endif
 
-       __u32                   rxhash;
-
        __u16                   queue_mapping;
        kmemcheck_bitfield_begin(flags2);
 #ifdef CONFIG_IPV6_NDISC_NODETYPE
@@ -457,7 +468,8 @@ struct sk_buff {
        __u8                    l4_rxhash:1;
        __u8                    wifi_acked_valid:1;
        __u8                    wifi_acked:1;
-       /* 10/12 bit hole (depending on ndisc_nodetype presence) */
+       __u8                    no_fcs:1;
+       /* 9/11 bit hole (depending on ndisc_nodetype presence) */
        kmemcheck_bitfield_end(flags2);
 
 #ifdef CONFIG_NET_DMA
@@ -471,8 +483,6 @@ struct sk_buff {
                __u32           dropcount;
        };
 
-       __u16                   vlan_tci;
-
        sk_buff_data_t          transport_header;
        sk_buff_data_t          network_header;
        sk_buff_data_t          mac_header;
@@ -877,6 +887,24 @@ static inline struct sk_buff *skb_peek(const struct sk_buff_head *list_)
 }
 
 /**
+ *     skb_peek_next - peek skb following the given one from a queue
+ *     @skb: skb to start from
+ *     @list_: list to peek at
+ *
+ *     Returns %NULL when the end of the list is met or a pointer to the
+ *     next element. The reference count is not incremented and the
+ *     reference is therefore volatile. Use with caution.
+ */
+static inline struct sk_buff *skb_peek_next(struct sk_buff *skb,
+               const struct sk_buff_head *list_)
+{
+       struct sk_buff *next = skb->next;
+       if (next == (struct sk_buff *)list_)
+               next = NULL;
+       return next;
+}
+
+/**
  *     skb_peek_tail - peek at the tail of an &sk_buff_head
  *     @list_: list to peek at
  *
@@ -1153,7 +1181,7 @@ static inline struct sk_buff *__skb_dequeue_tail(struct sk_buff_head *list)
 }
 
 
-static inline int skb_is_nonlinear(const struct sk_buff *skb)
+static inline bool skb_is_nonlinear(const struct sk_buff *skb)
 {
        return skb->data_len;
 }
@@ -1466,6 +1494,16 @@ static inline void skb_set_mac_header(struct sk_buff *skb, const int offset)
 }
 #endif /* NET_SKBUFF_DATA_USES_OFFSET */
 
+static inline void skb_mac_header_rebuild(struct sk_buff *skb)
+{
+       if (skb_mac_header_was_set(skb)) {
+               const unsigned char *old_mac = skb_mac_header(skb);
+
+               skb_set_mac_header(skb, -skb->mac_len);
+               memmove(skb_mac_header(skb), old_mac, skb->mac_len);
+       }
+}
+
 static inline int skb_checksum_start_offset(const struct sk_buff *skb)
 {
        return skb->csum_start - skb_headroom(skb);
@@ -2046,7 +2084,7 @@ static inline void skb_frag_add_head(struct sk_buff *skb, struct sk_buff *frag)
        for (iter = skb_shinfo(skb)->frag_list; iter; iter = iter->next)
 
 extern struct sk_buff *__skb_recv_datagram(struct sock *sk, unsigned flags,
-                                          int *peeked, int *err);
+                                          int *peeked, int *off, int *err);
 extern struct sk_buff *skb_recv_datagram(struct sock *sk, unsigned flags,
                                         int noblock, int *err);
 extern unsigned int    datagram_poll(struct file *file, struct socket *sock,
@@ -2439,12 +2477,12 @@ static inline struct sec_path *skb_sec_path(struct sk_buff *skb)
 }
 #endif
 
-static inline int skb_is_gso(const struct sk_buff *skb)
+static inline bool skb_is_gso(const struct sk_buff *skb)
 {
        return skb_shinfo(skb)->gso_size;
 }
 
-static inline int skb_is_gso_v6(const struct sk_buff *skb)
+static inline bool skb_is_gso_v6(const struct sk_buff *skb)
 {
        return skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6;
 }