diff --git a/scapy.py b/scapy.py
index 1700370ffc40f5a0701a45ec2712fced80114c51..fae0fb1d2ec118387464a251ed21f64b5673442a 100755
--- a/scapy.py
+++ b/scapy.py
@@ -312,6 +312,7 @@ SIOCGIFFLAGS   = 0x8913          # get flags
 SIOCSIFFLAGS   = 0x8914          # set flags               
 SIOCGIFINDEX   = 0x8933          # name -> if_index mapping
 SIOCGIFCOUNT   = 0x8938          # get number of devices
+SIOCGSTAMP     = 0x8906          # get packet timestamp (as a timeval)
 
 
 # From if.h
@@ -1281,6 +1282,10 @@ else:
     def get_if_index(iff):
         return int(struct.unpack("I",get_if(iff, SIOCGIFINDEX)[16:20])[0])
 
+    def get_last_packet_timestamp(sock):
+        ts = ioctl(sock, SIOCGSTAMP, "12345678")
+        s,us = struct.unpack("II",ts)
+        return s+us/1000000.0
 
     
 def get_if_addr(iff):
@@ -9373,6 +9378,9 @@ class L3PacketSocket(SuperSocket):
             pkt = Raw(pkt)
         if lvl == 2:
             pkt = pkt.payload
+            
+        if pkt is not None:
+            pkt.time = get_last_packet_timestamp(self.ins)
         return pkt
     
     def send(self, x):
@@ -9445,6 +9453,7 @@ class L2Socket(SuperSocket):
             if conf.debug_dissector:
                 raise
             q = Raw(pkt)
+        q.time = get_last_packet_timestamp(self.ins)
         return q
 
 
@@ -9503,6 +9512,7 @@ class L2ListenSocket(SuperSocket):
             if conf.debug_dissector:
                 raise
             pkt = Raw(pkt)
+        pkt.time = get_last_packet_timestamp(self.ins)
         return pkt
     
     def send(self, x):
@@ -9563,7 +9573,7 @@ class L3dnetSocket(SuperSocket):
 
         pkt = self.ins.next()
         if pkt is not None:
-            pkt = pkt[1]
+            l,pkt,ts = pkt
         if pkt is None:
             return
 
@@ -9575,6 +9585,7 @@ class L3dnetSocket(SuperSocket):
             if conf.debug_dissector:
                 raise
             pkt = Raw(pkt)
+        pkt.time = ts
         return pkt.payload
 
     def nonblock_recv(self):
@@ -9629,7 +9640,7 @@ class L2dnetSocket(SuperSocket):
 
         pkt = self.ins.next()
         if pkt is not None:
-            pkt = pkt[1]        
+            l,pkt,ts = pkt
         if pkt is None:
             return
         
@@ -9641,6 +9652,7 @@ class L2dnetSocket(SuperSocket):
             if conf.debug_dissector:
                 raise
             pkt = Raw(pkt)
+        pkt.time = ts
         return pkt
 
     def nonblock_recv(self):
@@ -9699,7 +9711,7 @@ class L2pcapListenSocket(SuperSocket):
         while pkt is None:
             pkt = self.ins.next()
             if pkt is not None:
-                pkt = pkt[1]
+                l,pkt,ts = pkt
         
         try:
             pkt = cls(pkt)
@@ -9709,6 +9721,7 @@ class L2pcapListenSocket(SuperSocket):
             if conf.debug_dissector:
                 raise
             pkt = Raw(pkt)
+        pkt.time = ts
         return pkt
 
     def send(self, x):