|
@@ -2078,13 +2078,27 @@ static inline int sock_intr_errno(long timeo)
|
|
return timeo == MAX_SCHEDULE_TIMEOUT ? -ERESTARTSYS : -EINTR;
|
|
return timeo == MAX_SCHEDULE_TIMEOUT ? -ERESTARTSYS : -EINTR;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+struct sock_skb_cb {
|
|
|
|
+ u32 dropcount;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+/* Store sock_skb_cb at the end of skb->cb[] so protocol families
|
|
|
|
+ * using skb->cb[] would keep using it directly and utilize its
|
|
|
|
+ * alignement guarantee.
|
|
|
|
+ */
|
|
|
|
+#define SOCK_SKB_CB_OFFSET ((FIELD_SIZEOF(struct sk_buff, cb) - \
|
|
|
|
+ sizeof(struct sock_skb_cb)))
|
|
|
|
+
|
|
|
|
+#define SOCK_SKB_CB(__skb) ((struct sock_skb_cb *)((__skb)->cb + \
|
|
|
|
+ SOCK_SKB_CB_OFFSET))
|
|
|
|
+
|
|
#define sock_skb_cb_check_size(size) \
|
|
#define sock_skb_cb_check_size(size) \
|
|
- BUILD_BUG_ON((size) > FIELD_SIZEOF(struct sk_buff, cb))
|
|
|
|
|
|
+ BUILD_BUG_ON((size) > SOCK_SKB_CB_OFFSET)
|
|
|
|
|
|
static inline void
|
|
static inline void
|
|
sock_skb_set_dropcount(const struct sock *sk, struct sk_buff *skb)
|
|
sock_skb_set_dropcount(const struct sock *sk, struct sk_buff *skb)
|
|
{
|
|
{
|
|
- skb->dropcount = atomic_read(&sk->sk_drops);
|
|
|
|
|
|
+ SOCK_SKB_CB(skb)->dropcount = atomic_read(&sk->sk_drops);
|
|
}
|
|
}
|
|
|
|
|
|
void __sock_recv_timestamp(struct msghdr *msg, struct sock *sk,
|
|
void __sock_recv_timestamp(struct msghdr *msg, struct sock *sk,
|