[802.11] Recognize retransmitted packets
authorJoshua Oreman <oremanj@xenon.get-linux.org>
Wed, 17 Jun 2009 07:46:39 +0000 (00:46 -0700)
committerJoshua Oreman <oremanj@xenon.get-linux.org>
Wed, 17 Jun 2009 07:46:39 +0000 (00:46 -0700)
This functionality will be needed by the rate-control function when it
is implemented; it can also be useful for debugging.

src/include/gpxe/net80211.h
src/net/net80211.c

index 250fdc0..f16d380 100644 (file)
@@ -859,37 +859,6 @@ struct net80211_wlan
 };
 
 
 };
 
 
-/** Indicate an error in receiving a packet
- *
- * @v dev      802.11 device
- * @v iob      I/O buffer with received packet, or NULL
- * @v rc       Error code
- *
- * This logs the error with the wrapping net_device, and frees iob if
- * it is passed.
- */
-static inline void net80211_rx_err ( struct net80211_device *dev,
-                                    struct io_buffer *iob, int rc )
-{
-       netdev_rx_err ( dev->netdev, iob, rc );
-}
-
-/** Indicate the completed transmission of a packet
- *
- * @v dev      802.11 device
- * @v iob      I/O buffer of transmitted packet
- * @v rc       Error code, or 0 for success
- *
- * This logs an error with the wrapping net_device if one occurred,
- * and removes and frees the I/O buffer from its TX queue.
- */
-static inline void net80211_tx_complete ( struct net80211_device *dev,
-                                         struct io_buffer *iob, int rc )
-{
-       netdev_tx_complete_err ( dev->netdev, iob, rc );
-}
-
-
 /* Associate with the best or user-specified network: */
 void net80211_autoassociate ( struct net80211_device *dev );
 
 /* Associate with the best or user-specified network: */
 void net80211_autoassociate ( struct net80211_device *dev );
 
@@ -925,6 +894,10 @@ int net80211_register ( struct net80211_device *dev,
                        struct net80211_hw_info *hw );
 void net80211_rx ( struct net80211_device *dev, struct io_buffer *iob,
                   int signal );
                        struct net80211_hw_info *hw );
 void net80211_rx ( struct net80211_device *dev, struct io_buffer *iob,
                   int signal );
+void net80211_rx_err ( struct net80211_device *dev,
+                      struct io_buffer *iob, int rc );
+void net80211_tx_complete ( struct net80211_device *dev,
+                           struct io_buffer *iob, int retries, int rc );
 void net80211_unregister ( struct net80211_device *dev );
 void net80211_free ( struct net80211_device *dev );
 
 void net80211_unregister ( struct net80211_device *dev );
 void net80211_free ( struct net80211_device *dev );
 
index 5d70dd7..e7870ac 100644 (file)
@@ -2148,6 +2148,14 @@ void net80211_rx ( struct net80211_device *dev, struct io_buffer *iob,
        if ( ( hdr->fc & IEEE80211_FC_SUBTYPE ) != IEEE80211_STYPE_DATA )
                goto drop;      /* drop QoS, CFP, or null data packets */
 
        if ( ( hdr->fc & IEEE80211_FC_SUBTYPE ) != IEEE80211_STYPE_DATA )
                goto drop;      /* drop QoS, CFP, or null data packets */
 
+       if ( hdr->fc & IEEE80211_FC_RETRY ) {
+               DBGCP ( dev, "802.11 %p rx RETX packet %04x\n",
+                       dev, hdr->seq );
+       } else {
+               DBGCP ( dev, "802.11 %p rx ok   packet %04x\n",
+                       dev, hdr->seq );
+       }
+
        if ( dev->netdev->state & NETDEV_LINK_UP ) {
                netdev_rx ( dev->netdev, iob );
                return;
        if ( dev->netdev->state & NETDEV_LINK_UP ) {
                netdev_rx ( dev->netdev, iob );
                return;
@@ -2159,3 +2167,53 @@ void net80211_rx ( struct net80211_device *dev, struct io_buffer *iob,
        free_iob ( iob );
        return;
 }
        free_iob ( iob );
        return;
 }
+
+/** Indicate an error in receiving a packet
+ *
+ * @v dev      802.11 device
+ * @v iob      I/O buffer with received packet, or NULL
+ * @v rc       Error code
+ *
+ * This logs the error with the wrapping net_device, and frees iob if
+ * it is passed.
+ */
+void net80211_rx_err ( struct net80211_device *dev,
+                      struct io_buffer *iob, int rc )
+{
+       DBGCP ( dev, "802.11 %p rx FAIL\n", dev );
+       netdev_rx_err ( dev->netdev, iob, rc );
+}
+
+/** Indicate the completed transmission of a packet
+ *
+ * @v dev      802.11 device
+ * @v iob      I/O buffer of transmitted packet
+ * @v retries  Number of times this packet was retransmitted
+ * @v rc       Error code, or 0 for success
+ *
+ * This logs an error with the wrapping net_device if one occurred,
+ * and removes and frees the I/O buffer from its TX queue.
+ *
+ * If the packet did not need to be retransmitted because it was
+ * properly ACKed the first time, @a retries should be 0.
+ */
+void net80211_tx_complete ( struct net80211_device *dev,
+                           struct io_buffer *iob, int retries, int rc )
+{
+       if ( retries ) {
+               if ( rc ) {
+                       DBGCP ( dev, "802.11 %p tx FAIL after %d retx\n", dev,
+                               retries );
+               } else {
+                       DBGCP ( dev, "802.11 %p tx RETX %d times\n", dev,
+                               retries );
+               }
+       } else {
+               if ( rc ) {
+                       DBGCP ( dev, "802.11 %p tx FAIL outright\n", dev );
+               } else {
+                       DBGCP ( dev, "802.11 %p tx ok\n", dev );
+               }
+       }
+       netdev_tx_complete_err ( dev->netdev, iob, rc );
+}