mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 12:28:41 +08:00
[NET]: Store skb->timestamp as offset to a base timestamp
Reduces skb size by 8 bytes on 64-bit. Signed-off-by: Patrick McHardy <kaber@trash.net> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
25ed891019
commit
a61bbcf28a
@ -513,7 +513,7 @@ static void rx_complete (amb_dev * dev, rx_out * rx) {
|
||||
|
||||
// VC layer stats
|
||||
atomic_inc(&atm_vcc->stats->rx);
|
||||
do_gettimeofday(&skb->stamp);
|
||||
__net_timestamp(skb);
|
||||
// end of our responsability
|
||||
atm_vcc->push (atm_vcc, skb);
|
||||
return;
|
||||
|
@ -325,7 +325,7 @@ static int atmtcp_c_send(struct atm_vcc *vcc,struct sk_buff *skb)
|
||||
result = -ENOBUFS;
|
||||
goto done;
|
||||
}
|
||||
do_gettimeofday(&new_skb->stamp);
|
||||
__net_timestamp(new_skb);
|
||||
memcpy(skb_put(new_skb,skb->len),skb->data,skb->len);
|
||||
out_vcc->push(out_vcc,new_skb);
|
||||
atomic_inc(&vcc->stats->tx);
|
||||
|
@ -537,7 +537,7 @@ static int rx_aal0(struct atm_vcc *vcc)
|
||||
return 0;
|
||||
}
|
||||
skb_put(skb,length);
|
||||
skb->stamp = eni_vcc->timestamp;
|
||||
skb_set_timestamp(skb, &eni_vcc->timestamp);
|
||||
DPRINTK("got len %ld\n",length);
|
||||
if (do_rx_dma(vcc,skb,1,length >> 2,length >> 2)) return 1;
|
||||
eni_vcc->rxing++;
|
||||
|
@ -815,7 +815,7 @@ static void process_incoming (struct fs_dev *dev, struct queue *q)
|
||||
skb_put (skb, qe->p1 & 0xffff);
|
||||
ATM_SKB(skb)->vcc = atm_vcc;
|
||||
atomic_inc(&atm_vcc->stats->rx);
|
||||
do_gettimeofday(&skb->stamp);
|
||||
__net_timestamp(skb);
|
||||
fs_dprintk (FS_DEBUG_ALLOC, "Free rec-skb: %p (pushed)\n", skb);
|
||||
atm_vcc->push (atm_vcc, skb);
|
||||
fs_dprintk (FS_DEBUG_ALLOC, "Free rec-d: %p\n", pe);
|
||||
|
@ -1176,7 +1176,7 @@ fore200e_push_rpd(struct fore200e* fore200e, struct atm_vcc* vcc, struct rpd* rp
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
do_gettimeofday(&skb->stamp);
|
||||
__net_timestamp(skb);
|
||||
|
||||
#ifdef FORE200E_52BYTE_AAL0_SDU
|
||||
if (cell_header) {
|
||||
|
@ -1886,7 +1886,7 @@ he_service_rbrq(struct he_dev *he_dev, int group)
|
||||
if (rx_skb_reserve > 0)
|
||||
skb_reserve(skb, rx_skb_reserve);
|
||||
|
||||
do_gettimeofday(&skb->stamp);
|
||||
__net_timestamp(skb);
|
||||
|
||||
for (iov = he_vcc->iov_head;
|
||||
iov < he_vcc->iov_tail; ++iov) {
|
||||
|
@ -1034,7 +1034,7 @@ static void rx_schedule (hrz_dev * dev, int irq) {
|
||||
struct atm_vcc * vcc = ATM_SKB(skb)->vcc;
|
||||
// VC layer stats
|
||||
atomic_inc(&vcc->stats->rx);
|
||||
do_gettimeofday(&skb->stamp);
|
||||
__net_timestamp(skb);
|
||||
// end of our responsability
|
||||
vcc->push (vcc, skb);
|
||||
}
|
||||
|
@ -1101,7 +1101,7 @@ dequeue_rx(struct idt77252_dev *card, struct rsq_entry *rsqe)
|
||||
cell, ATM_CELL_PAYLOAD);
|
||||
|
||||
ATM_SKB(sb)->vcc = vcc;
|
||||
do_gettimeofday(&sb->stamp);
|
||||
__net_timestamp(sb);
|
||||
vcc->push(vcc, sb);
|
||||
atomic_inc(&vcc->stats->rx);
|
||||
|
||||
@ -1179,7 +1179,7 @@ dequeue_rx(struct idt77252_dev *card, struct rsq_entry *rsqe)
|
||||
|
||||
skb_trim(skb, len);
|
||||
ATM_SKB(skb)->vcc = vcc;
|
||||
do_gettimeofday(&skb->stamp);
|
||||
__net_timestamp(skb);
|
||||
|
||||
vcc->push(vcc, skb);
|
||||
atomic_inc(&vcc->stats->rx);
|
||||
@ -1201,7 +1201,7 @@ dequeue_rx(struct idt77252_dev *card, struct rsq_entry *rsqe)
|
||||
|
||||
skb_trim(skb, len);
|
||||
ATM_SKB(skb)->vcc = vcc;
|
||||
do_gettimeofday(&skb->stamp);
|
||||
__net_timestamp(skb);
|
||||
|
||||
vcc->push(vcc, skb);
|
||||
atomic_inc(&vcc->stats->rx);
|
||||
@ -1340,7 +1340,7 @@ idt77252_rx_raw(struct idt77252_dev *card)
|
||||
ATM_CELL_PAYLOAD);
|
||||
|
||||
ATM_SKB(sb)->vcc = vcc;
|
||||
do_gettimeofday(&sb->stamp);
|
||||
__net_timestamp(sb);
|
||||
vcc->push(vcc, sb);
|
||||
atomic_inc(&vcc->stats->rx);
|
||||
|
||||
|
@ -1427,7 +1427,7 @@ static void vcc_rx_aal5(struct lanai_vcc *lvcc, int endptr)
|
||||
skb_put(skb, size);
|
||||
vcc_rx_memcpy(skb->data, lvcc, size);
|
||||
ATM_SKB(skb)->vcc = lvcc->rx.atmvcc;
|
||||
do_gettimeofday(&skb->stamp);
|
||||
__net_timestamp(skb);
|
||||
lvcc->rx.atmvcc->push(lvcc->rx.atmvcc, skb);
|
||||
atomic_inc(&lvcc->rx.atmvcc->stats->rx);
|
||||
out:
|
||||
|
@ -2213,7 +2213,7 @@ static void dequeue_rx(ns_dev *card, ns_rsqe *rsqe)
|
||||
memcpy(sb->tail, cell, ATM_CELL_PAYLOAD);
|
||||
skb_put(sb, ATM_CELL_PAYLOAD);
|
||||
ATM_SKB(sb)->vcc = vcc;
|
||||
do_gettimeofday(&sb->stamp);
|
||||
__net_timestamp(sb);
|
||||
vcc->push(vcc, sb);
|
||||
atomic_inc(&vcc->stats->rx);
|
||||
cell += ATM_CELL_PAYLOAD;
|
||||
@ -2346,7 +2346,7 @@ static void dequeue_rx(ns_dev *card, ns_rsqe *rsqe)
|
||||
skb->destructor = ns_sb_destructor;
|
||||
#endif /* NS_USE_DESTRUCTORS */
|
||||
ATM_SKB(skb)->vcc = vcc;
|
||||
do_gettimeofday(&skb->stamp);
|
||||
__net_timestamp(skb);
|
||||
vcc->push(vcc, skb);
|
||||
atomic_inc(&vcc->stats->rx);
|
||||
}
|
||||
@ -2373,7 +2373,7 @@ static void dequeue_rx(ns_dev *card, ns_rsqe *rsqe)
|
||||
sb->destructor = ns_sb_destructor;
|
||||
#endif /* NS_USE_DESTRUCTORS */
|
||||
ATM_SKB(sb)->vcc = vcc;
|
||||
do_gettimeofday(&sb->stamp);
|
||||
__net_timestamp(sb);
|
||||
vcc->push(vcc, sb);
|
||||
atomic_inc(&vcc->stats->rx);
|
||||
}
|
||||
@ -2398,7 +2398,7 @@ static void dequeue_rx(ns_dev *card, ns_rsqe *rsqe)
|
||||
memcpy(skb->data, sb->data, NS_SMBUFSIZE);
|
||||
skb_put(skb, len - NS_SMBUFSIZE);
|
||||
ATM_SKB(skb)->vcc = vcc;
|
||||
do_gettimeofday(&skb->stamp);
|
||||
__net_timestamp(skb);
|
||||
vcc->push(vcc, skb);
|
||||
atomic_inc(&vcc->stats->rx);
|
||||
}
|
||||
@ -2505,7 +2505,7 @@ static void dequeue_rx(ns_dev *card, ns_rsqe *rsqe)
|
||||
#ifdef NS_USE_DESTRUCTORS
|
||||
hb->destructor = ns_hb_destructor;
|
||||
#endif /* NS_USE_DESTRUCTORS */
|
||||
do_gettimeofday(&hb->stamp);
|
||||
__net_timestamp(hb);
|
||||
vcc->push(vcc, hb);
|
||||
atomic_inc(&vcc->stats->rx);
|
||||
}
|
||||
|
@ -400,7 +400,7 @@ unsigned long *x;
|
||||
EVENT("error code 0x%x/0x%x\n",(here[3] & uPD98401_AAL5_ES) >>
|
||||
uPD98401_AAL5_ES_SHIFT,error);
|
||||
skb = ((struct rx_buffer_head *) bus_to_virt(here[2]))->skb;
|
||||
do_gettimeofday(&skb->stamp);
|
||||
__net_timestamp(skb);
|
||||
#if 0
|
||||
printk("[-3..0] 0x%08lx 0x%08lx 0x%08lx 0x%08lx\n",((unsigned *) skb->data)[-3],
|
||||
((unsigned *) skb->data)[-2],((unsigned *) skb->data)[-1],
|
||||
|
@ -155,13 +155,20 @@ struct skb_shared_info {
|
||||
#define SKB_DATAREF_SHIFT 16
|
||||
#define SKB_DATAREF_MASK ((1 << SKB_DATAREF_SHIFT) - 1)
|
||||
|
||||
extern struct timeval skb_tv_base;
|
||||
|
||||
struct skb_timeval {
|
||||
u32 off_sec;
|
||||
u32 off_usec;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct sk_buff - socket buffer
|
||||
* @next: Next buffer in list
|
||||
* @prev: Previous buffer in list
|
||||
* @list: List we are on
|
||||
* @sk: Socket we are owned by
|
||||
* @stamp: Time we arrived
|
||||
* @tstamp: Time we arrived stored as offset to skb_tv_base
|
||||
* @dev: Device we arrived on/are leaving by
|
||||
* @input_dev: Device we arrived on
|
||||
* @h: Transport layer header
|
||||
@ -202,7 +209,7 @@ struct sk_buff {
|
||||
struct sk_buff *prev;
|
||||
|
||||
struct sock *sk;
|
||||
struct timeval stamp;
|
||||
struct skb_timeval tstamp;
|
||||
struct net_device *dev;
|
||||
struct net_device *input_dev;
|
||||
|
||||
@ -1213,6 +1220,42 @@ static inline void *skb_header_pointer(const struct sk_buff *skb, int offset,
|
||||
extern void skb_init(void);
|
||||
extern void skb_add_mtu(int mtu);
|
||||
|
||||
/**
|
||||
* skb_get_timestamp - get timestamp from a skb
|
||||
* @skb: skb to get stamp from
|
||||
* @stamp: pointer to struct timeval to store stamp in
|
||||
*
|
||||
* Timestamps are stored in the skb as offsets to a base timestamp.
|
||||
* This function converts the offset back to a struct timeval and stores
|
||||
* it in stamp.
|
||||
*/
|
||||
static inline void skb_get_timestamp(struct sk_buff *skb, struct timeval *stamp)
|
||||
{
|
||||
stamp->tv_sec = skb->tstamp.off_sec;
|
||||
stamp->tv_usec = skb->tstamp.off_usec;
|
||||
if (skb->tstamp.off_sec) {
|
||||
stamp->tv_sec += skb_tv_base.tv_sec;
|
||||
stamp->tv_usec += skb_tv_base.tv_usec;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* skb_set_timestamp - set timestamp of a skb
|
||||
* @skb: skb to set stamp of
|
||||
* @stamp: pointer to struct timeval to get stamp from
|
||||
*
|
||||
* Timestamps are stored in the skb as offsets to a base timestamp.
|
||||
* This function converts a struct timeval to an offset and stores
|
||||
* it in the skb.
|
||||
*/
|
||||
static inline void skb_set_timestamp(struct sk_buff *skb, struct timeval *stamp)
|
||||
{
|
||||
skb->tstamp.off_sec = stamp->tv_sec - skb_tv_base.tv_sec;
|
||||
skb->tstamp.off_usec = stamp->tv_usec - skb_tv_base.tv_usec;
|
||||
}
|
||||
|
||||
extern void __net_timestamp(struct sk_buff *skb);
|
||||
|
||||
#ifdef CONFIG_NETFILTER
|
||||
static inline void nf_conntrack_put(struct nf_conntrack *nfct)
|
||||
{
|
||||
|
@ -404,7 +404,7 @@ static inline int hci_recv_frame(struct sk_buff *skb)
|
||||
bt_cb(skb)->incoming = 1;
|
||||
|
||||
/* Time stamp */
|
||||
do_gettimeofday(&skb->stamp);
|
||||
__net_timestamp(skb);
|
||||
|
||||
/* Queue frame for rx task */
|
||||
skb_queue_tail(&hdev->rx_q, skb);
|
||||
|
@ -363,7 +363,14 @@ __neigh_lookup_errno(struct neigh_table *tbl, const void *pkey,
|
||||
return neigh_create(tbl, pkey, dev);
|
||||
}
|
||||
|
||||
#define LOCALLY_ENQUEUED -2
|
||||
struct neighbour_cb {
|
||||
unsigned long sched_next;
|
||||
unsigned int flags;
|
||||
};
|
||||
|
||||
#define LOCALLY_ENQUEUED 0x1
|
||||
|
||||
#define NEIGH_CB(skb) ((struct neighbour_cb *)(skb)->cb)
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
@ -1282,16 +1282,19 @@ static inline int sock_intr_errno(long timeo)
|
||||
static __inline__ void
|
||||
sock_recv_timestamp(struct msghdr *msg, struct sock *sk, struct sk_buff *skb)
|
||||
{
|
||||
struct timeval *stamp = &skb->stamp;
|
||||
struct timeval stamp;
|
||||
|
||||
skb_get_timestamp(skb, &stamp);
|
||||
if (sock_flag(sk, SOCK_RCVTSTAMP)) {
|
||||
/* Race occurred between timestamp enabling and packet
|
||||
receiving. Fill in the current time for now. */
|
||||
if (stamp->tv_sec == 0)
|
||||
do_gettimeofday(stamp);
|
||||
if (stamp.tv_sec == 0)
|
||||
do_gettimeofday(&stamp);
|
||||
skb_set_timestamp(skb, &stamp);
|
||||
put_cmsg(msg, SOL_SOCKET, SO_TIMESTAMP, sizeof(struct timeval),
|
||||
stamp);
|
||||
&stamp);
|
||||
} else
|
||||
sk->sk_stamp = *stamp;
|
||||
sk->sk_stamp = stamp;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -999,7 +999,7 @@ static int hci_send_frame(struct sk_buff *skb)
|
||||
|
||||
if (atomic_read(&hdev->promisc)) {
|
||||
/* Time stamp */
|
||||
do_gettimeofday(&skb->stamp);
|
||||
__net_timestamp(skb);
|
||||
|
||||
hci_send_to_sock(hdev, skb);
|
||||
}
|
||||
|
@ -1087,7 +1087,7 @@ void hci_si_event(struct hci_dev *hdev, int type, int dlen, void *data)
|
||||
memcpy(ev->data, data, dlen);
|
||||
|
||||
bt_cb(skb)->incoming = 1;
|
||||
do_gettimeofday(&skb->stamp);
|
||||
__net_timestamp(skb);
|
||||
|
||||
bt_cb(skb)->pkt_type = HCI_EVENT_PKT;
|
||||
skb->dev = (void *) hdev;
|
||||
|
@ -332,8 +332,12 @@ static inline void hci_sock_cmsg(struct sock *sk, struct msghdr *msg, struct sk_
|
||||
put_cmsg(msg, SOL_HCI, HCI_CMSG_DIR, sizeof(incoming), &incoming);
|
||||
}
|
||||
|
||||
if (mask & HCI_CMSG_TSTAMP)
|
||||
put_cmsg(msg, SOL_HCI, HCI_CMSG_TSTAMP, sizeof(skb->stamp), &skb->stamp);
|
||||
if (mask & HCI_CMSG_TSTAMP) {
|
||||
struct timeval tv;
|
||||
|
||||
skb_get_timestamp(skb, &tv);
|
||||
put_cmsg(msg, SOL_HCI, HCI_CMSG_TSTAMP, sizeof(tv), &tv);
|
||||
}
|
||||
}
|
||||
|
||||
static int hci_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
|
||||
|
@ -162,7 +162,7 @@ static void ebt_ulog(const struct sk_buff *skb, unsigned int hooknr,
|
||||
pm->version = EBT_ULOG_VERSION;
|
||||
do_gettimeofday(&pm->stamp);
|
||||
if (ub->qlen == 1)
|
||||
ub->skb->stamp = pm->stamp;
|
||||
skb_set_timestamp(ub->skb, &pm->stamp);
|
||||
pm->data_len = copy_len;
|
||||
pm->mark = skb->nfmark;
|
||||
pm->hook = hooknr;
|
||||
|
@ -1009,13 +1009,22 @@ void net_disable_timestamp(void)
|
||||
atomic_dec(&netstamp_needed);
|
||||
}
|
||||
|
||||
static inline void net_timestamp(struct timeval *stamp)
|
||||
void __net_timestamp(struct sk_buff *skb)
|
||||
{
|
||||
struct timeval tv;
|
||||
|
||||
do_gettimeofday(&tv);
|
||||
skb_set_timestamp(skb, &tv);
|
||||
}
|
||||
EXPORT_SYMBOL(__net_timestamp);
|
||||
|
||||
static inline void net_timestamp(struct sk_buff *skb)
|
||||
{
|
||||
if (atomic_read(&netstamp_needed))
|
||||
do_gettimeofday(stamp);
|
||||
__net_timestamp(skb);
|
||||
else {
|
||||
stamp->tv_sec = 0;
|
||||
stamp->tv_usec = 0;
|
||||
skb->tstamp.off_sec = 0;
|
||||
skb->tstamp.off_usec = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1027,7 +1036,8 @@ static inline void net_timestamp(struct timeval *stamp)
|
||||
void dev_queue_xmit_nit(struct sk_buff *skb, struct net_device *dev)
|
||||
{
|
||||
struct packet_type *ptype;
|
||||
net_timestamp(&skb->stamp);
|
||||
|
||||
net_timestamp(skb);
|
||||
|
||||
rcu_read_lock();
|
||||
list_for_each_entry_rcu(ptype, &ptype_all, list) {
|
||||
@ -1379,8 +1389,8 @@ int netif_rx(struct sk_buff *skb)
|
||||
if (netpoll_rx(skb))
|
||||
return NET_RX_DROP;
|
||||
|
||||
if (!skb->stamp.tv_sec)
|
||||
net_timestamp(&skb->stamp);
|
||||
if (!skb->tstamp.off_sec)
|
||||
net_timestamp(skb);
|
||||
|
||||
/*
|
||||
* The code is rearranged so that the path is the most
|
||||
@ -1566,8 +1576,8 @@ int netif_receive_skb(struct sk_buff *skb)
|
||||
if (skb->dev->poll && netpoll_rx(skb))
|
||||
return NET_RX_DROP;
|
||||
|
||||
if (!skb->stamp.tv_sec)
|
||||
net_timestamp(&skb->stamp);
|
||||
if (!skb->tstamp.off_sec)
|
||||
net_timestamp(skb);
|
||||
|
||||
if (!skb->input_dev)
|
||||
skb->input_dev = skb->dev;
|
||||
|
@ -1217,7 +1217,7 @@ static void neigh_proxy_process(unsigned long arg)
|
||||
|
||||
while (skb != (struct sk_buff *)&tbl->proxy_queue) {
|
||||
struct sk_buff *back = skb;
|
||||
long tdif = back->stamp.tv_usec - now;
|
||||
long tdif = NEIGH_CB(back)->sched_next - now;
|
||||
|
||||
skb = skb->next;
|
||||
if (tdif <= 0) {
|
||||
@ -1248,8 +1248,9 @@ void pneigh_enqueue(struct neigh_table *tbl, struct neigh_parms *p,
|
||||
kfree_skb(skb);
|
||||
return;
|
||||
}
|
||||
skb->stamp.tv_sec = LOCALLY_ENQUEUED;
|
||||
skb->stamp.tv_usec = sched_next;
|
||||
|
||||
NEIGH_CB(skb)->sched_next = sched_next;
|
||||
NEIGH_CB(skb)->flags |= LOCALLY_ENQUEUED;
|
||||
|
||||
spin_lock(&tbl->proxy_queue.lock);
|
||||
if (del_timer(&tbl->proxy_timer)) {
|
||||
|
@ -70,6 +70,8 @@
|
||||
|
||||
static kmem_cache_t *skbuff_head_cache;
|
||||
|
||||
struct timeval __read_mostly skb_tv_base;
|
||||
|
||||
/*
|
||||
* Keep out-of-line to prevent kernel bloat.
|
||||
* __builtin_return_address is not used because it is not always
|
||||
@ -331,7 +333,7 @@ struct sk_buff *skb_clone(struct sk_buff *skb, unsigned int __nocast gfp_mask)
|
||||
|
||||
n->next = n->prev = NULL;
|
||||
n->sk = NULL;
|
||||
C(stamp);
|
||||
C(tstamp);
|
||||
C(dev);
|
||||
C(h);
|
||||
C(nh);
|
||||
@ -408,7 +410,7 @@ static void copy_skb_header(struct sk_buff *new, const struct sk_buff *old)
|
||||
memcpy(new->cb, old->cb, sizeof(old->cb));
|
||||
new->local_df = old->local_df;
|
||||
new->pkt_type = old->pkt_type;
|
||||
new->stamp = old->stamp;
|
||||
new->tstamp = old->tstamp;
|
||||
new->destructor = NULL;
|
||||
#ifdef CONFIG_NETFILTER
|
||||
new->nfmark = old->nfmark;
|
||||
@ -1645,6 +1647,7 @@ void __init skb_init(void)
|
||||
NULL, NULL);
|
||||
if (!skbuff_head_cache)
|
||||
panic("cannot create skbuff cache");
|
||||
do_gettimeofday(&skb_tv_base);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(___pskb_trim);
|
||||
@ -1678,3 +1681,4 @@ EXPORT_SYMBOL(skb_prepare_seq_read);
|
||||
EXPORT_SYMBOL(skb_seq_read);
|
||||
EXPORT_SYMBOL(skb_abort_seq_read);
|
||||
EXPORT_SYMBOL(skb_find_text);
|
||||
EXPORT_SYMBOL(skb_tv_base);
|
||||
|
@ -159,7 +159,7 @@ static int econet_recvmsg(struct kiocb *iocb, struct socket *sock,
|
||||
err = memcpy_toiovec(msg->msg_iov, skb->data, copied);
|
||||
if (err)
|
||||
goto out_free;
|
||||
sk->sk_stamp = skb->stamp;
|
||||
skb_get_timestamp(skb, &sk->sk_stamp);
|
||||
|
||||
if (msg->msg_name)
|
||||
memcpy(msg->msg_name, skb->cb, msg->msg_namelen);
|
||||
|
@ -865,7 +865,7 @@ static int arp_process(struct sk_buff *skb)
|
||||
if (n)
|
||||
neigh_release(n);
|
||||
|
||||
if (skb->stamp.tv_sec == LOCALLY_ENQUEUED ||
|
||||
if (NEIGH_CB(skb)->flags & LOCALLY_ENQUEUED ||
|
||||
skb->pkt_type == PACKET_HOST ||
|
||||
in_dev->arp_parms->proxy_delay == 0) {
|
||||
arp_send(ARPOP_REPLY,ETH_P_ARP,sip,dev,tip,sha,dev->dev_addr,sha);
|
||||
@ -948,6 +948,8 @@ int arp_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt,
|
||||
if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL)
|
||||
goto out_of_mem;
|
||||
|
||||
memset(NEIGH_CB(skb), 0, sizeof(struct neighbour_cb));
|
||||
|
||||
return NF_HOOK(NF_ARP, NF_ARP_IN, skb, dev, NULL, arp_process);
|
||||
|
||||
freeskb:
|
||||
|
@ -533,7 +533,7 @@ static void ip_frag_queue(struct ipq *qp, struct sk_buff *skb)
|
||||
if (skb->dev)
|
||||
qp->iif = skb->dev->ifindex;
|
||||
skb->dev = NULL;
|
||||
qp->stamp = skb->stamp;
|
||||
skb_get_timestamp(skb, &qp->stamp);
|
||||
qp->meat += skb->len;
|
||||
atomic_add(skb->truesize, &ip_frag_mem);
|
||||
if (offset == 0)
|
||||
@ -615,7 +615,7 @@ static struct sk_buff *ip_frag_reasm(struct ipq *qp, struct net_device *dev)
|
||||
|
||||
head->next = NULL;
|
||||
head->dev = dev;
|
||||
head->stamp = qp->stamp;
|
||||
skb_set_timestamp(head, &qp->stamp);
|
||||
|
||||
iph = head->nh.iph;
|
||||
iph->frag_off = 0;
|
||||
|
@ -240,8 +240,8 @@ ipq_build_packet_message(struct ipq_queue_entry *entry, int *errp)
|
||||
|
||||
pmsg->packet_id = (unsigned long )entry;
|
||||
pmsg->data_len = data_len;
|
||||
pmsg->timestamp_sec = entry->skb->stamp.tv_sec;
|
||||
pmsg->timestamp_usec = entry->skb->stamp.tv_usec;
|
||||
pmsg->timestamp_sec = skb_tv_base.tv_sec + entry->skb->tstamp.off_sec;
|
||||
pmsg->timestamp_usec = skb_tv_base.tv_usec + entry->skb->tstamp.off_usec;
|
||||
pmsg->mark = entry->skb->nfmark;
|
||||
pmsg->hook = entry->info->hook;
|
||||
pmsg->hw_protocol = entry->skb->protocol;
|
||||
|
@ -220,13 +220,13 @@ static void ipt_ulog_packet(unsigned int hooknum,
|
||||
pm = NLMSG_DATA(nlh);
|
||||
|
||||
/* We might not have a timestamp, get one */
|
||||
if (skb->stamp.tv_sec == 0)
|
||||
do_gettimeofday((struct timeval *)&skb->stamp);
|
||||
if (skb->tstamp.off_sec == 0)
|
||||
__net_timestamp((struct sk_buff *)skb);
|
||||
|
||||
/* copy hook, prefix, timestamp, payload, etc. */
|
||||
pm->data_len = copy_len;
|
||||
pm->timestamp_sec = skb->stamp.tv_sec;
|
||||
pm->timestamp_usec = skb->stamp.tv_usec;
|
||||
pm->timestamp_sec = skb_tv_base.tv_sec + skb->tstamp.off_sec;
|
||||
pm->timestamp_usec = skb_tv_base.tv_usec + skb->tstamp.off_usec;
|
||||
pm->mark = skb->nfmark;
|
||||
pm->hook = hooknum;
|
||||
if (prefix != NULL)
|
||||
|
@ -2097,9 +2097,13 @@ static int tcp_clean_rtx_queue(struct sock *sk, __s32 *seq_rtt_p, s32 *seq_usrtt
|
||||
seq_rtt = -1;
|
||||
} else if (seq_rtt < 0)
|
||||
seq_rtt = now - scb->when;
|
||||
if (seq_usrtt)
|
||||
*seq_usrtt = (usnow.tv_sec - skb->stamp.tv_sec) * 1000000
|
||||
+ (usnow.tv_usec - skb->stamp.tv_usec);
|
||||
if (seq_usrtt) {
|
||||
struct timeval tv;
|
||||
|
||||
skb_get_timestamp(skb, &tv);
|
||||
*seq_usrtt = (usnow.tv_sec - tv.tv_sec) * 1000000
|
||||
+ (usnow.tv_usec - tv.tv_usec);
|
||||
}
|
||||
|
||||
if (sacked & TCPCB_SACKED_ACKED)
|
||||
tp->sacked_out -= tcp_skb_pcount(skb);
|
||||
|
@ -282,7 +282,7 @@ static int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb)
|
||||
|
||||
/* If congestion control is doing timestamping */
|
||||
if (icsk->icsk_ca_ops->rtt_sample)
|
||||
do_gettimeofday(&skb->stamp);
|
||||
__net_timestamp(skb);
|
||||
|
||||
sysctl_flags = 0;
|
||||
if (tcb->flags & TCPCB_FLAG_SYN) {
|
||||
@ -483,7 +483,7 @@ static int tcp_fragment(struct sock *sk, struct sk_buff *skb, u32 len, unsigned
|
||||
* skbs, which it never sent before. --ANK
|
||||
*/
|
||||
TCP_SKB_CB(buff)->when = TCP_SKB_CB(skb)->when;
|
||||
buff->stamp = skb->stamp;
|
||||
buff->tstamp = skb->tstamp;
|
||||
|
||||
if (TCP_SKB_CB(skb)->sacked & TCPCB_LOST) {
|
||||
tp->lost_out -= tcp_skb_pcount(skb);
|
||||
|
@ -812,7 +812,7 @@ static void ndisc_recv_ns(struct sk_buff *skb)
|
||||
if (ipv6_chk_acast_addr(dev, &msg->target) ||
|
||||
(idev->cnf.forwarding &&
|
||||
pneigh_lookup(&nd_tbl, &msg->target, dev, 0))) {
|
||||
if (skb->stamp.tv_sec != LOCALLY_ENQUEUED &&
|
||||
if (!(NEIGH_CB(skb)->flags & LOCALLY_ENQUEUED) &&
|
||||
skb->pkt_type != PACKET_HOST &&
|
||||
inc != 0 &&
|
||||
idev->nd_parms->proxy_delay != 0) {
|
||||
@ -1487,6 +1487,8 @@ int ndisc_rcv(struct sk_buff *skb)
|
||||
return 0;
|
||||
}
|
||||
|
||||
memset(NEIGH_CB(skb), 0, sizeof(struct neighbour_cb));
|
||||
|
||||
switch (msg->icmph.icmp6_type) {
|
||||
case NDISC_NEIGHBOUR_SOLICITATION:
|
||||
ndisc_recv_ns(skb);
|
||||
|
@ -238,8 +238,8 @@ ipq_build_packet_message(struct ipq_queue_entry *entry, int *errp)
|
||||
|
||||
pmsg->packet_id = (unsigned long )entry;
|
||||
pmsg->data_len = data_len;
|
||||
pmsg->timestamp_sec = entry->skb->stamp.tv_sec;
|
||||
pmsg->timestamp_usec = entry->skb->stamp.tv_usec;
|
||||
pmsg->timestamp_sec = skb_tv_base.tv_sec + entry->skb->tstamp.off_sec;
|
||||
pmsg->timestamp_usec = skb_tv_base.tv_usec + entry->skb->tstamp.off_usec;
|
||||
pmsg->mark = entry->skb->nfmark;
|
||||
pmsg->hook = entry->info->hook;
|
||||
pmsg->hw_protocol = entry->skb->protocol;
|
||||
|
@ -562,7 +562,7 @@ static void ip6_frag_queue(struct frag_queue *fq, struct sk_buff *skb,
|
||||
if (skb->dev)
|
||||
fq->iif = skb->dev->ifindex;
|
||||
skb->dev = NULL;
|
||||
fq->stamp = skb->stamp;
|
||||
skb_get_timestamp(skb, &fq->stamp);
|
||||
fq->meat += skb->len;
|
||||
atomic_add(skb->truesize, &ip6_frag_mem);
|
||||
|
||||
@ -664,7 +664,7 @@ static int ip6_frag_reasm(struct frag_queue *fq, struct sk_buff **skb_in,
|
||||
|
||||
head->next = NULL;
|
||||
head->dev = dev;
|
||||
head->stamp = fq->stamp;
|
||||
skb_set_timestamp(head, &fq->stamp);
|
||||
head->nh.ipv6h->payload_len = htons(payload_len);
|
||||
|
||||
*skb_in = head;
|
||||
|
@ -1796,8 +1796,8 @@ static int ipx_recvmsg(struct kiocb *iocb, struct socket *sock,
|
||||
copied);
|
||||
if (rc)
|
||||
goto out_free;
|
||||
if (skb->stamp.tv_sec)
|
||||
sk->sk_stamp = skb->stamp;
|
||||
if (skb->tstamp.off_sec)
|
||||
skb_get_timestamp(skb, &sk->sk_stamp)
|
||||
|
||||
msg->msg_namelen = sizeof(*sipx);
|
||||
|
||||
|
@ -491,11 +491,11 @@ __build_packet_message(struct nfulnl_instance *inst,
|
||||
NFA_PUT(inst->skb, NFULA_HWADDR, sizeof(phw), &phw);
|
||||
}
|
||||
|
||||
if (skb->stamp.tv_sec) {
|
||||
if (skb->tstamp.off_sec) {
|
||||
struct nfulnl_msg_packet_timestamp ts;
|
||||
|
||||
ts.sec = cpu_to_be64(skb->stamp.tv_sec);
|
||||
ts.usec = cpu_to_be64(skb->stamp.tv_usec);
|
||||
ts.sec = cpu_to_be64(skb_tv_base.tv_sec + skb->tstamp.off_sec);
|
||||
ts.usec = cpu_to_be64(skb_tv_base.tv_usec + skb->tstamp.off_usec);
|
||||
|
||||
NFA_PUT(inst->skb, NFULA_TIMESTAMP, sizeof(ts), &ts);
|
||||
}
|
||||
|
@ -494,11 +494,11 @@ nfqnl_build_packet_message(struct nfqnl_instance *queue,
|
||||
NFA_PUT(skb, NFQA_HWADDR, sizeof(phw), &phw);
|
||||
}
|
||||
|
||||
if (entry->skb->stamp.tv_sec) {
|
||||
if (entry->skb->tstamp.off_sec) {
|
||||
struct nfqnl_msg_packet_timestamp ts;
|
||||
|
||||
ts.sec = htonll(entry->skb->stamp.tv_sec);
|
||||
ts.usec = htonll(entry->skb->stamp.tv_usec);
|
||||
ts.sec = htonll(skb_tv_base.tv_sec + entry->skb->tstamp.off_sec);
|
||||
ts.usec = htonll(skb_tv_base.tv_usec + entry->skb->tstamp.off_usec);
|
||||
|
||||
NFA_PUT(skb, NFQA_TIMESTAMP, sizeof(ts), &ts);
|
||||
}
|
||||
|
@ -635,12 +635,12 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev, struct packe
|
||||
h->tp_snaplen = snaplen;
|
||||
h->tp_mac = macoff;
|
||||
h->tp_net = netoff;
|
||||
if (skb->stamp.tv_sec == 0) {
|
||||
do_gettimeofday(&skb->stamp);
|
||||
if (skb->tstamp.off_sec == 0) {
|
||||
__net_timestamp(skb);
|
||||
sock_enable_timestamp(sk);
|
||||
}
|
||||
h->tp_sec = skb->stamp.tv_sec;
|
||||
h->tp_usec = skb->stamp.tv_usec;
|
||||
h->tp_sec = skb_tv_base.tv_sec + skb->tstamp.off_sec;
|
||||
h->tp_usec = skb_tv_base.tv_usec + skb->tstamp.off_usec;
|
||||
|
||||
sll = (struct sockaddr_ll*)((u8*)h + TPACKET_ALIGN(sizeof(*h)));
|
||||
sll->sll_halen = 0;
|
||||
|
@ -236,8 +236,8 @@ int sctp_rcv(struct sk_buff *skb)
|
||||
}
|
||||
|
||||
/* SCTP seems to always need a timestamp right now (FIXME) */
|
||||
if (skb->stamp.tv_sec == 0) {
|
||||
do_gettimeofday(&skb->stamp);
|
||||
if (skb->tstamp.off_sec == 0) {
|
||||
__net_timestamp(skb);
|
||||
sock_enable_timestamp(sk);
|
||||
}
|
||||
|
||||
|
@ -1362,6 +1362,7 @@ struct sctp_association *sctp_unpack_cookie(
|
||||
char *key;
|
||||
sctp_scope_t scope;
|
||||
struct sk_buff *skb = chunk->skb;
|
||||
struct timeval tv;
|
||||
|
||||
headersize = sizeof(sctp_chunkhdr_t) + SCTP_SECRET_SIZE;
|
||||
bodysize = ntohs(chunk->chunk_hdr->length) - headersize;
|
||||
@ -1434,7 +1435,8 @@ no_hmac:
|
||||
* an association, there is no need to check cookie's expiration
|
||||
* for init collision case of lost COOKIE ACK.
|
||||
*/
|
||||
if (!asoc && tv_lt(bear_cookie->expiration, skb->stamp)) {
|
||||
skb_get_timestamp(skb, &tv);
|
||||
if (!asoc && tv_lt(bear_cookie->expiration, tv)) {
|
||||
__u16 len;
|
||||
/*
|
||||
* Section 3.3.10.3 Stale Cookie Error (3)
|
||||
@ -1447,10 +1449,9 @@ no_hmac:
|
||||
len = ntohs(chunk->chunk_hdr->length);
|
||||
*errp = sctp_make_op_error_space(asoc, chunk, len);
|
||||
if (*errp) {
|
||||
suseconds_t usecs = (skb->stamp.tv_sec -
|
||||
suseconds_t usecs = (tv.tv_sec -
|
||||
bear_cookie->expiration.tv_sec) * 1000000L +
|
||||
skb->stamp.tv_usec -
|
||||
bear_cookie->expiration.tv_usec;
|
||||
tv.tv_usec - bear_cookie->expiration.tv_usec;
|
||||
|
||||
usecs = htonl(usecs);
|
||||
sctp_init_cause(*errp, SCTP_ERROR_STALE_COOKIE,
|
||||
|
@ -584,13 +584,16 @@ svc_udp_recvfrom(struct svc_rqst *rqstp)
|
||||
/* possibly an icmp error */
|
||||
dprintk("svc: recvfrom returned error %d\n", -err);
|
||||
}
|
||||
if (skb->stamp.tv_sec == 0) {
|
||||
skb->stamp.tv_sec = xtime.tv_sec;
|
||||
skb->stamp.tv_usec = xtime.tv_nsec / NSEC_PER_USEC;
|
||||
if (skb->tstamp.off_sec == 0) {
|
||||
struct timeval tv;
|
||||
|
||||
tv.tv_sec = xtime.tv_sec;
|
||||
tv.tv_usec = xtime.tv_nsec * 1000;
|
||||
skb_set_timestamp(skb, &tv);
|
||||
/* Don't enable netstamp, sunrpc doesn't
|
||||
need that much accuracy */
|
||||
}
|
||||
svsk->sk_sk->sk_stamp = skb->stamp;
|
||||
skb_get_timestamp(skb, &svsk->sk_sk->sk_stamp);
|
||||
set_bit(SK_DATA, &svsk->sk_flags); /* there may be more data... */
|
||||
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user