fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / net / irda / irlap_frame.c
index 388f4ea..dba349c 100644 (file)
@@ -43,6 +43,9 @@
 #include <net/irda/irlap_frame.h>
 #include <net/irda/qos.h>
 
+static void irlap_send_i_frame(struct irlap_cb *self, struct sk_buff *skb,
+                              int command);
+
 /*
  * Function irlap_insert_info (self, skb)
  *
@@ -110,11 +113,13 @@ void irlap_send_snrm_frame(struct irlap_cb *self, struct qos_info *qos)
        struct snrm_frame *frame;
        int ret;
 
-       ASSERT(self != NULL, return;);
-       ASSERT(self->magic == LAP_MAGIC, return;);
+       IRDA_ASSERT(self != NULL, return;);
+       IRDA_ASSERT(self->magic == LAP_MAGIC, return;);
 
        /* Allocate frame */
-       tx_skb = dev_alloc_skb(64);
+       tx_skb = alloc_skb(sizeof(struct snrm_frame) +
+                          IRLAP_NEGOCIATION_PARAMS_LEN,
+                          GFP_ATOMIC);
        if (!tx_skb)
                return;
 
@@ -133,7 +138,7 @@ void irlap_send_snrm_frame(struct irlap_cb *self, struct qos_info *qos)
         *  If we are establishing a connection then insert QoS paramerters
         */
        if (qos) {
-               skb_put(tx_skb, 9); /* 21 left */
+               skb_put(tx_skb, 9); /* 25 left */
                frame->saddr = cpu_to_le32(self->saddr);
                frame->daddr = cpu_to_le32(self->daddr);
 
@@ -203,11 +208,13 @@ void irlap_send_ua_response_frame(struct irlap_cb *self, struct qos_info *qos)
 
        IRDA_DEBUG(2, "%s() <%ld>\n", __FUNCTION__, jiffies);
 
-       ASSERT(self != NULL, return;);
-       ASSERT(self->magic == LAP_MAGIC, return;);
+       IRDA_ASSERT(self != NULL, return;);
+       IRDA_ASSERT(self->magic == LAP_MAGIC, return;);
 
        /* Allocate frame */
-       tx_skb = dev_alloc_skb(64);
+       tx_skb = alloc_skb(sizeof(struct ua_frame) +
+                          IRLAP_NEGOCIATION_PARAMS_LEN,
+                          GFP_ATOMIC);
        if (!tx_skb)
                return;
 
@@ -242,23 +249,23 @@ void irlap_send_ua_response_frame(struct irlap_cb *self, struct qos_info *qos)
 void irlap_send_dm_frame( struct irlap_cb *self)
 {
        struct sk_buff *tx_skb = NULL;
-       __u8 *frame;
+       struct dm_frame *frame;
 
-       ASSERT(self != NULL, return;);
-       ASSERT(self->magic == LAP_MAGIC, return;);
+       IRDA_ASSERT(self != NULL, return;);
+       IRDA_ASSERT(self->magic == LAP_MAGIC, return;);
 
-       tx_skb = dev_alloc_skb(32);
+       tx_skb = alloc_skb(sizeof(struct dm_frame), GFP_ATOMIC);
        if (!tx_skb)
                return;
 
-       frame = skb_put(tx_skb, 2);
+       frame = (struct dm_frame *)skb_put(tx_skb, 2);
 
        if (self->state == LAP_NDM)
-               frame[0] = CBROADCAST;
+               frame->caddr = CBROADCAST;
        else
-               frame[0] = self->caddr;
+               frame->caddr = self->caddr;
 
-       frame[1] = DM_RSP | PF_BIT;
+       frame->control = DM_RSP | PF_BIT;
 
        irlap_queue_xmit(self, tx_skb);
 }
@@ -272,21 +279,21 @@ void irlap_send_dm_frame( struct irlap_cb *self)
 void irlap_send_disc_frame(struct irlap_cb *self)
 {
        struct sk_buff *tx_skb = NULL;
-       __u8 *frame;
+       struct disc_frame *frame;
 
        IRDA_DEBUG(3, "%s()\n", __FUNCTION__);
 
-       ASSERT(self != NULL, return;);
-       ASSERT(self->magic == LAP_MAGIC, return;);
+       IRDA_ASSERT(self != NULL, return;);
+       IRDA_ASSERT(self->magic == LAP_MAGIC, return;);
 
-       tx_skb = dev_alloc_skb(16);
+       tx_skb = alloc_skb(sizeof(struct disc_frame), GFP_ATOMIC);
        if (!tx_skb)
                return;
 
-       frame = skb_put(tx_skb, 2);
+       frame = (struct disc_frame *)skb_put(tx_skb, 2);
 
-       frame[0] = self->caddr | CMD_FRAME;
-       frame[1] = DISC_CMD | PF_BIT;
+       frame->caddr = self->caddr | CMD_FRAME;
+       frame->control = DISC_CMD | PF_BIT;
 
        irlap_queue_xmit(self, tx_skb);
 }
@@ -308,11 +315,12 @@ void irlap_send_discovery_xid_frame(struct irlap_cb *self, int S, __u8 s,
        IRDA_DEBUG(4, "%s(), s=%d, S=%d, command=%d\n", __FUNCTION__,
                   s, S, command);
 
-       ASSERT(self != NULL, return;);
-       ASSERT(self->magic == LAP_MAGIC, return;);
-       ASSERT(discovery != NULL, return;);
+       IRDA_ASSERT(self != NULL, return;);
+       IRDA_ASSERT(self->magic == LAP_MAGIC, return;);
+       IRDA_ASSERT(discovery != NULL, return;);
 
-       tx_skb = dev_alloc_skb(64);
+       tx_skb = alloc_skb(sizeof(struct xid_frame) + IRLAP_DISCOVERY_INFO_LEN,
+                          GFP_ATOMIC);
        if (!tx_skb)
                return;
 
@@ -399,11 +407,11 @@ static void irlap_recv_discovery_xid_rsp(struct irlap_cb *self,
 
        IRDA_DEBUG(4, "%s()\n", __FUNCTION__);
 
-       ASSERT(self != NULL, return;);
-       ASSERT(self->magic == LAP_MAGIC, return;);
+       IRDA_ASSERT(self != NULL, return;);
+       IRDA_ASSERT(self->magic == LAP_MAGIC, return;);
 
        if (!pskb_may_pull(skb, sizeof(struct xid_frame))) {
-               ERROR("%s: frame to short!\n", __FUNCTION__);
+               IRDA_ERROR("%s: frame to short!\n", __FUNCTION__);
                return;
        }
                
@@ -419,11 +427,10 @@ static void irlap_recv_discovery_xid_rsp(struct irlap_cb *self,
                return;
        }
 
-       if ((discovery = kmalloc(sizeof(discovery_t), GFP_ATOMIC)) == NULL) {
-               WARNING("%s: kmalloc failed!\n", __FUNCTION__);
+       if ((discovery = kzalloc(sizeof(discovery_t), GFP_ATOMIC)) == NULL) {
+               IRDA_WARNING("%s: kmalloc failed!\n", __FUNCTION__);
                return;
        }
-       memset(discovery, 0, sizeof(discovery_t));
 
        discovery->data.daddr = info->daddr;
        discovery->data.saddr = self->saddr;
@@ -475,7 +482,7 @@ static void irlap_recv_discovery_xid_cmd(struct irlap_cb *self,
        char *text;
 
        if (!pskb_may_pull(skb, sizeof(struct xid_frame))) {
-               ERROR("%s: frame to short!\n", __FUNCTION__);
+               IRDA_ERROR("%s: frame to short!\n", __FUNCTION__);
                return;
        }
        
@@ -519,7 +526,8 @@ static void irlap_recv_discovery_xid_cmd(struct irlap_cb *self,
                /* Check if things are sane at this point... */
                if((discovery_info == NULL) || 
                   !pskb_may_pull(skb, 3)) {
-                       ERROR("%s: discovery frame to short!\n", __FUNCTION__);
+                       IRDA_ERROR("%s: discovery frame to short!\n",
+                                  __FUNCTION__);
                        return;
                }
 
@@ -528,7 +536,7 @@ static void irlap_recv_discovery_xid_cmd(struct irlap_cb *self,
                 */
                discovery = kmalloc(sizeof(discovery_t), GFP_ATOMIC);
                if (!discovery) {
-                       WARNING("%s: unable to malloc!\n", __FUNCTION__);
+                       IRDA_WARNING("%s: unable to malloc!\n", __FUNCTION__);
                        return;
                }
 
@@ -570,18 +578,18 @@ static void irlap_recv_discovery_xid_cmd(struct irlap_cb *self,
 void irlap_send_rr_frame(struct irlap_cb *self, int command)
 {
        struct sk_buff *tx_skb;
-       __u8 *frame;
+       struct rr_frame *frame;
 
-       tx_skb = dev_alloc_skb(16);
+       tx_skb = alloc_skb(sizeof(struct rr_frame), GFP_ATOMIC);
        if (!tx_skb)
                return;
 
-       frame = skb_put(tx_skb, 2);
+       frame = (struct rr_frame *)skb_put(tx_skb, 2);
 
-       frame[0] = self->caddr;
-       frame[0] |= (command) ? CMD_FRAME : 0;
+       frame->caddr = self->caddr;
+       frame->caddr |= (command) ? CMD_FRAME : 0;
 
-       frame[1] = RR | PF_BIT | (self->vr << 5);
+       frame->control = RR | PF_BIT | (self->vr << 5);
 
        irlap_queue_xmit(self, tx_skb);
 }
@@ -595,16 +603,16 @@ void irlap_send_rr_frame(struct irlap_cb *self, int command)
 void irlap_send_rd_frame(struct irlap_cb *self)
 {
        struct sk_buff *tx_skb;
-       __u8 *frame;
+       struct rd_frame *frame;
 
-       tx_skb = dev_alloc_skb(16);
+       tx_skb = alloc_skb(sizeof(struct rd_frame), GFP_ATOMIC);
        if (!tx_skb)
                return;
 
-       frame = skb_put(tx_skb, 2);
+       frame = (struct rd_frame *)skb_put(tx_skb, 2);
 
-       frame[0] = self->caddr;
-       frame[1] = RD_RSP | PF_BIT;
+       frame->caddr = self->caddr;
+       frame->caddr = RD_RSP | PF_BIT;
 
        irlap_queue_xmit(self, tx_skb);
 }
@@ -629,34 +637,6 @@ static inline void irlap_recv_rr_frame(struct irlap_cb *self,
                irlap_do_event(self, RECV_RR_RSP, skb, info);
 }
 
-void irlap_send_frmr_frame( struct irlap_cb *self, int command)
-{
-       struct sk_buff *tx_skb = NULL;
-       __u8 *frame;
-
-       ASSERT( self != NULL, return;);
-       ASSERT( self->magic == LAP_MAGIC, return;);
-
-       tx_skb = dev_alloc_skb( 32);
-       if (!tx_skb)
-               return;
-
-       frame = skb_put(tx_skb, 2);
-
-       frame[0] = self->caddr;
-       frame[0] |= (command) ? CMD_FRAME : 0;
-
-       frame[1]  = (self->vs << 1);
-       frame[1] |= PF_BIT;
-       frame[1] |= (self->vr << 5);
-
-       frame[2] = 0;
-
-       IRDA_DEBUG(4, "%s(), vr=%d, %ld\n", __FUNCTION__, self->vr, jiffies);
-
-       irlap_queue_xmit(self, tx_skb);
-}
-
 /*
  * Function irlap_recv_rnr_frame (self, skb, info)
  *
@@ -886,9 +866,9 @@ void irlap_send_data_secondary_final(struct irlap_cb *self,
 {
        struct sk_buff *tx_skb = NULL;
 
-       ASSERT(self != NULL, return;);
-       ASSERT(self->magic == LAP_MAGIC, return;);
-       ASSERT(skb != NULL, return;);
+       IRDA_ASSERT(self != NULL, return;);
+       IRDA_ASSERT(self->magic == LAP_MAGIC, return;);
+       IRDA_ASSERT(skb != NULL, return;);
 
        /* Is this reliable or unreliable data? */
        if (skb->data[1] == I_FRAME) {
@@ -992,8 +972,8 @@ void irlap_resend_rejected_frames(struct irlap_cb *self, int command)
        struct sk_buff *skb;
        int count;
 
-       ASSERT(self != NULL, return;);
-       ASSERT(self->magic == LAP_MAGIC, return;);
+       IRDA_ASSERT(self != NULL, return;);
+       IRDA_ASSERT(self->magic == LAP_MAGIC, return;);
 
        /* Initialize variables */
        count = skb_queue_len(&self->wx_list);
@@ -1012,9 +992,6 @@ void irlap_resend_rejected_frames(struct irlap_cb *self, int command)
                        IRDA_DEBUG(0, "%s(), unable to copy\n", __FUNCTION__);
                        return;
                }
-               /* Unlink tx_skb from list */
-               tx_skb->next = tx_skb->prev = NULL;
-               tx_skb->list = NULL;
 
                /* Clear old Nr field + poll bit */
                tx_skb->data[1] &= 0x0f;
@@ -1042,21 +1019,19 @@ void irlap_resend_rejected_frames(struct irlap_cb *self, int command)
        /*
         *  We can now fill the window with additional data frames
         */
-       while (skb_queue_len( &self->txq) > 0) {
+       while (!skb_queue_empty(&self->txq)) {
 
                IRDA_DEBUG(0, "%s(), sending additional frames!\n", __FUNCTION__);
-               if ((skb_queue_len( &self->txq) > 0) &&
-                   (self->window > 0)) {
+               if (self->window > 0) {
                        skb = skb_dequeue( &self->txq);
-                       ASSERT(skb != NULL, return;);
+                       IRDA_ASSERT(skb != NULL, return;);
 
                        /*
                         *  If send window > 1 then send frame with pf
                         *  bit cleared
                         */
                        if ((self->window > 1) &&
-                           skb_queue_len(&self->txq) > 0)
-                       {
+                           !skb_queue_empty(&self->txq)) {
                                irlap_send_data_primary(self, skb);
                        } else {
                                irlap_send_data_primary_poll(self, skb);
@@ -1072,8 +1047,8 @@ void irlap_resend_rejected_frame(struct irlap_cb *self, int command)
        struct sk_buff *tx_skb;
        struct sk_buff *skb;
 
-       ASSERT(self != NULL, return;);
-       ASSERT(self->magic == LAP_MAGIC, return;);
+       IRDA_ASSERT(self != NULL, return;);
+       IRDA_ASSERT(self->magic == LAP_MAGIC, return;);
 
        /*  Resend unacknowledged frame(s) */
        skb = skb_peek(&self->wx_list);
@@ -1089,9 +1064,6 @@ void irlap_resend_rejected_frame(struct irlap_cb *self, int command)
                        IRDA_DEBUG(0, "%s(), unable to copy\n", __FUNCTION__);
                        return;
                }
-               /* Unlink tx_skb from list */
-               tx_skb->next = tx_skb->prev = NULL;
-               tx_skb->list = NULL;
 
                /* Clear old Nr field + poll bit */
                tx_skb->data[1] &= 0x0f;
@@ -1114,9 +1086,9 @@ void irlap_send_ui_frame(struct irlap_cb *self, struct sk_buff *skb,
 {
        IRDA_DEBUG(4, "%s()\n", __FUNCTION__);
 
-       ASSERT(self != NULL, return;);
-       ASSERT(self->magic == LAP_MAGIC, return;);
-       ASSERT(skb != NULL, return;);
+       IRDA_ASSERT(self != NULL, return;);
+       IRDA_ASSERT(self->magic == LAP_MAGIC, return;);
+       IRDA_ASSERT(skb != NULL, return;);
 
        /* Insert connection address */
        skb->data[0] = caddr | ((command) ? CMD_FRAME : 0);
@@ -1129,8 +1101,8 @@ void irlap_send_ui_frame(struct irlap_cb *self, struct sk_buff *skb,
  *
  *    Contruct and transmit Information (I) frame
  */
-void irlap_send_i_frame(struct irlap_cb *self, struct sk_buff *skb,
-                       int command)
+static void irlap_send_i_frame(struct irlap_cb *self, struct sk_buff *skb,
+                              int command)
 {
        /* Insert connection address */
        skb->data[0] = self->caddr;
@@ -1193,13 +1165,13 @@ static void irlap_recv_frmr_frame(struct irlap_cb *self, struct sk_buff *skb,
 
        IRDA_DEBUG(0, "%s()\n", __FUNCTION__);
 
-       ASSERT(self != NULL, return;);
-       ASSERT(self->magic == LAP_MAGIC, return;);
-       ASSERT(skb != NULL, return;);
-       ASSERT(info != NULL, return;);
+       IRDA_ASSERT(self != NULL, return;);
+       IRDA_ASSERT(self->magic == LAP_MAGIC, return;);
+       IRDA_ASSERT(skb != NULL, return;);
+       IRDA_ASSERT(info != NULL, return;);
 
        if (!pskb_may_pull(skb, 4)) {
-               ERROR("%s: frame to short!\n", __FUNCTION__);
+               IRDA_ERROR("%s: frame to short!\n", __FUNCTION__);
                return;
        }
 
@@ -1247,7 +1219,7 @@ void irlap_send_test_frame(struct irlap_cb *self, __u8 caddr, __u32 daddr,
        struct test_frame *frame;
        __u8 *info;
 
-       tx_skb = dev_alloc_skb(cmd->len+sizeof(struct test_frame));
+       tx_skb = alloc_skb(cmd->len + sizeof(struct test_frame), GFP_ATOMIC);
        if (!tx_skb)
                return;
 
@@ -1288,7 +1260,7 @@ static void irlap_recv_test_frame(struct irlap_cb *self, struct sk_buff *skb,
        IRDA_DEBUG(2, "%s()\n", __FUNCTION__);
 
        if (!pskb_may_pull(skb, sizeof(*frame))) {
-               ERROR("%s: frame to short!\n", __FUNCTION__);
+               IRDA_ERROR("%s: frame to short!\n", __FUNCTION__);
                return;
        }
        frame = (struct test_frame *) skb->data;
@@ -1335,7 +1307,7 @@ static void irlap_recv_test_frame(struct irlap_cb *self, struct sk_buff *skb,
  * Jean II
  */
 int irlap_driver_rcv(struct sk_buff *skb, struct net_device *dev,
-                    struct packet_type *ptype)
+                    struct packet_type *ptype, struct net_device *orig_dev)
 {
        struct irlap_info info;
        struct irlap_cb *self;
@@ -1355,14 +1327,14 @@ int irlap_driver_rcv(struct sk_buff *skb, struct net_device *dev,
         * share and non linear skbs. This should never happen, so
         * we don't need to be clever about it. Jean II */
        if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL) {
-               ERROR("%s: can't clone shared skb!\n", __FUNCTION__);
+               IRDA_ERROR("%s: can't clone shared skb!\n", __FUNCTION__);
                dev_kfree_skb(skb);
                return -1;
        }
 
        /* Check if frame is large enough for parsing */
        if (!pskb_may_pull(skb, 2)) {
-               ERROR("%s: frame to short!\n", __FUNCTION__);
+               IRDA_ERROR("%s: frame to short!\n", __FUNCTION__);
                dev_kfree_skb(skb);
                return -1;
        }
@@ -1412,7 +1384,7 @@ int irlap_driver_rcv(struct sk_buff *skb, struct net_device *dev,
                        irlap_recv_srej_frame(self, skb, &info, command);
                        break;
                default:
-                       WARNING("%s: Unknown S-frame %02x received!\n",
+                       IRDA_WARNING("%s: Unknown S-frame %02x received!\n",
                                __FUNCTION__, info.control);
                        break;
                }
@@ -1450,7 +1422,7 @@ int irlap_driver_rcv(struct sk_buff *skb, struct net_device *dev,
                irlap_recv_ui_frame(self, skb, &info);
                break;
        default:
-               WARNING("%s: Unknown frame %02x received!\n",
+               IRDA_WARNING("%s: Unknown frame %02x received!\n",
                                __FUNCTION__, info.control);
                break;
        }