Skip to content

Commit

Permalink
[Bluetooth]: Move packet type into the SKB control buffer
Browse files Browse the repository at this point in the history
This patch moves the usage of packet type into the SKB control
buffer. After this patch it is now possible to shrink the sk_buff
structure and redefine its pkt_type.

Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
holtmann authored and David S. Miller committed Aug 29, 2005
1 parent 2eb25a6 commit 0d48d93
Show file tree
Hide file tree
Showing 15 changed files with 96 additions and 92 deletions.
8 changes: 4 additions & 4 deletions drivers/bluetooth/bfusb.c
Original file line number Diff line number Diff line change
Expand Up @@ -330,7 +330,7 @@ static inline int bfusb_recv_block(struct bfusb *bfusb, int hdr, unsigned char *
}

skb->dev = (void *) bfusb->hdev;
skb->pkt_type = pkt_type;
bt_cb(skb)->pkt_type = pkt_type;

bfusb->reassembly = skb;
} else {
Expand Down Expand Up @@ -485,7 +485,7 @@ static int bfusb_send_frame(struct sk_buff *skb)
unsigned char buf[3];
int sent = 0, size, count;

BT_DBG("hdev %p skb %p type %d len %d", hdev, skb, skb->pkt_type, skb->len);
BT_DBG("hdev %p skb %p type %d len %d", hdev, skb, bt_cb(skb)->pkt_type, skb->len);

if (!hdev) {
BT_ERR("Frame for unknown HCI device (hdev=NULL)");
Expand All @@ -497,7 +497,7 @@ static int bfusb_send_frame(struct sk_buff *skb)

bfusb = (struct bfusb *) hdev->driver_data;

switch (skb->pkt_type) {
switch (bt_cb(skb)->pkt_type) {
case HCI_COMMAND_PKT:
hdev->stat.cmd_tx++;
break;
Expand All @@ -510,7 +510,7 @@ static int bfusb_send_frame(struct sk_buff *skb)
};

/* Prepend skb with frame type */
memcpy(skb_push(skb, 1), &(skb->pkt_type), 1);
memcpy(skb_push(skb, 1), &bt_cb(skb)->pkt_type, 1);

count = skb->len;

Expand Down
24 changes: 12 additions & 12 deletions drivers/bluetooth/bluecard_cs.c
Original file line number Diff line number Diff line change
Expand Up @@ -270,7 +270,7 @@ static void bluecard_write_wakeup(bluecard_info_t *info)
if (!(skb = skb_dequeue(&(info->txq))))
break;

if (skb->pkt_type & 0x80) {
if (bt_cb(skb)->pkt_type & 0x80) {
/* Disable RTS */
info->ctrl_reg |= REG_CONTROL_RTS;
outb(info->ctrl_reg, iobase + REG_CONTROL);
Expand All @@ -288,13 +288,13 @@ static void bluecard_write_wakeup(bluecard_info_t *info)
/* Mark the buffer as dirty */
clear_bit(ready_bit, &(info->tx_state));

if (skb->pkt_type & 0x80) {
if (bt_cb(skb)->pkt_type & 0x80) {
DECLARE_WAIT_QUEUE_HEAD(wq);
DEFINE_WAIT(wait);

unsigned char baud_reg;

switch (skb->pkt_type) {
switch (bt_cb(skb)->pkt_type) {
case PKT_BAUD_RATE_460800:
baud_reg = REG_CONTROL_BAUD_RATE_460800;
break;
Expand Down Expand Up @@ -410,9 +410,9 @@ static void bluecard_receive(bluecard_info_t *info, unsigned int offset)
if (info->rx_state == RECV_WAIT_PACKET_TYPE) {

info->rx_skb->dev = (void *) info->hdev;
info->rx_skb->pkt_type = buf[i];
bt_cb(info->rx_skb)->pkt_type = buf[i];

switch (info->rx_skb->pkt_type) {
switch (bt_cb(info->rx_skb)->pkt_type) {

case 0x00:
/* init packet */
Expand Down Expand Up @@ -444,7 +444,7 @@ static void bluecard_receive(bluecard_info_t *info, unsigned int offset)

default:
/* unknown packet */
BT_ERR("Unknown HCI packet with type 0x%02x received", info->rx_skb->pkt_type);
BT_ERR("Unknown HCI packet with type 0x%02x received", bt_cb(info->rx_skb)->pkt_type);
info->hdev->stat.err_rx++;

kfree_skb(info->rx_skb);
Expand Down Expand Up @@ -586,21 +586,21 @@ static int bluecard_hci_set_baud_rate(struct hci_dev *hdev, int baud)
switch (baud) {
case 460800:
cmd[4] = 0x00;
skb->pkt_type = PKT_BAUD_RATE_460800;
bt_cb(skb)->pkt_type = PKT_BAUD_RATE_460800;
break;
case 230400:
cmd[4] = 0x01;
skb->pkt_type = PKT_BAUD_RATE_230400;
bt_cb(skb)->pkt_type = PKT_BAUD_RATE_230400;
break;
case 115200:
cmd[4] = 0x02;
skb->pkt_type = PKT_BAUD_RATE_115200;
bt_cb(skb)->pkt_type = PKT_BAUD_RATE_115200;
break;
case 57600:
/* Fall through... */
default:
cmd[4] = 0x03;
skb->pkt_type = PKT_BAUD_RATE_57600;
bt_cb(skb)->pkt_type = PKT_BAUD_RATE_57600;
break;
}

Expand Down Expand Up @@ -680,7 +680,7 @@ static int bluecard_hci_send_frame(struct sk_buff *skb)

info = (bluecard_info_t *)(hdev->driver_data);

switch (skb->pkt_type) {
switch (bt_cb(skb)->pkt_type) {
case HCI_COMMAND_PKT:
hdev->stat.cmd_tx++;
break;
Expand All @@ -693,7 +693,7 @@ static int bluecard_hci_send_frame(struct sk_buff *skb)
};

/* Prepend skb with frame type */
memcpy(skb_push(skb, 1), &(skb->pkt_type), 1);
memcpy(skb_push(skb, 1), &bt_cb(skb)->pkt_type, 1);
skb_queue_tail(&(info->txq), skb);

bluecard_write_wakeup(info);
Expand Down
14 changes: 7 additions & 7 deletions drivers/bluetooth/bpa10x.c
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ static void bpa10x_recv_bulk(struct bpa10x_data *data, unsigned char *buf, int c
if (skb) {
memcpy(skb_put(skb, len), buf, len);
skb->dev = (void *) data->hdev;
skb->pkt_type = HCI_ACLDATA_PKT;
bt_cb(skb)->pkt_type = HCI_ACLDATA_PKT;
hci_recv_frame(skb);
}
break;
Expand All @@ -117,7 +117,7 @@ static void bpa10x_recv_bulk(struct bpa10x_data *data, unsigned char *buf, int c
if (skb) {
memcpy(skb_put(skb, len), buf, len);
skb->dev = (void *) data->hdev;
skb->pkt_type = HCI_SCODATA_PKT;
bt_cb(skb)->pkt_type = HCI_SCODATA_PKT;
hci_recv_frame(skb);
}
break;
Expand All @@ -129,7 +129,7 @@ static void bpa10x_recv_bulk(struct bpa10x_data *data, unsigned char *buf, int c
if (skb) {
memcpy(skb_put(skb, len), buf, len);
skb->dev = (void *) data->hdev;
skb->pkt_type = HCI_VENDOR_PKT;
bt_cb(skb)->pkt_type = HCI_VENDOR_PKT;
hci_recv_frame(skb);
}
break;
Expand Down Expand Up @@ -190,7 +190,7 @@ static int bpa10x_recv_event(struct bpa10x_data *data, unsigned char *buf, int s
}

skb->dev = (void *) data->hdev;
skb->pkt_type = pkt_type;
bt_cb(skb)->pkt_type = pkt_type;

memcpy(skb_put(skb, size), buf, size);

Expand Down Expand Up @@ -488,7 +488,7 @@ static int bpa10x_send_frame(struct sk_buff *skb)
struct hci_dev *hdev = (struct hci_dev *) skb->dev;
struct bpa10x_data *data;

BT_DBG("hdev %p skb %p type %d len %d", hdev, skb, skb->pkt_type, skb->len);
BT_DBG("hdev %p skb %p type %d len %d", hdev, skb, bt_cb(skb)->pkt_type, skb->len);

if (!hdev) {
BT_ERR("Frame for unknown HCI device");
Expand All @@ -501,9 +501,9 @@ static int bpa10x_send_frame(struct sk_buff *skb)
data = hdev->driver_data;

/* Prepend skb with frame type */
memcpy(skb_push(skb, 1), &(skb->pkt_type), 1);
memcpy(skb_push(skb, 1), &bt_cb(skb)->pkt_type, 1);

switch (skb->pkt_type) {
switch (bt_cb(skb)->pkt_type) {
case HCI_COMMAND_PKT:
hdev->stat.cmd_tx++;
skb_queue_tail(&data->cmd_queue, skb);
Expand Down
12 changes: 6 additions & 6 deletions drivers/bluetooth/bt3c_cs.c
Original file line number Diff line number Diff line change
Expand Up @@ -259,11 +259,11 @@ static void bt3c_receive(bt3c_info_t *info)
if (info->rx_state == RECV_WAIT_PACKET_TYPE) {

info->rx_skb->dev = (void *) info->hdev;
info->rx_skb->pkt_type = inb(iobase + DATA_L);
bt_cb(info->rx_skb)->pkt_type = inb(iobase + DATA_L);
inb(iobase + DATA_H);
//printk("bt3c: PACKET_TYPE=%02x\n", info->rx_skb->pkt_type);
//printk("bt3c: PACKET_TYPE=%02x\n", bt_cb(info->rx_skb)->pkt_type);

switch (info->rx_skb->pkt_type) {
switch (bt_cb(info->rx_skb)->pkt_type) {

case HCI_EVENT_PKT:
info->rx_state = RECV_WAIT_EVENT_HEADER;
Expand All @@ -282,7 +282,7 @@ static void bt3c_receive(bt3c_info_t *info)

default:
/* Unknown packet */
BT_ERR("Unknown HCI packet with type 0x%02x received", info->rx_skb->pkt_type);
BT_ERR("Unknown HCI packet with type 0x%02x received", bt_cb(info->rx_skb)->pkt_type);
info->hdev->stat.err_rx++;
clear_bit(HCI_RUNNING, &(info->hdev->flags));

Expand Down Expand Up @@ -439,7 +439,7 @@ static int bt3c_hci_send_frame(struct sk_buff *skb)

info = (bt3c_info_t *) (hdev->driver_data);

switch (skb->pkt_type) {
switch (bt_cb(skb)->pkt_type) {
case HCI_COMMAND_PKT:
hdev->stat.cmd_tx++;
break;
Expand All @@ -452,7 +452,7 @@ static int bt3c_hci_send_frame(struct sk_buff *skb)
};

/* Prepend skb with frame type */
memcpy(skb_push(skb, 1), &(skb->pkt_type), 1);
memcpy(skb_push(skb, 1), &bt_cb(skb)->pkt_type, 1);
skb_queue_tail(&(info->txq), skb);

spin_lock_irqsave(&(info->lock), flags);
Expand Down
10 changes: 5 additions & 5 deletions drivers/bluetooth/btuart_cs.c
Original file line number Diff line number Diff line change
Expand Up @@ -211,9 +211,9 @@ static void btuart_receive(btuart_info_t *info)
if (info->rx_state == RECV_WAIT_PACKET_TYPE) {

info->rx_skb->dev = (void *) info->hdev;
info->rx_skb->pkt_type = inb(iobase + UART_RX);
bt_cb(info->rx_skb)->pkt_type = inb(iobase + UART_RX);

switch (info->rx_skb->pkt_type) {
switch (bt_cb(info->rx_skb)->pkt_type) {

case HCI_EVENT_PKT:
info->rx_state = RECV_WAIT_EVENT_HEADER;
Expand All @@ -232,7 +232,7 @@ static void btuart_receive(btuart_info_t *info)

default:
/* Unknown packet */
BT_ERR("Unknown HCI packet with type 0x%02x received", info->rx_skb->pkt_type);
BT_ERR("Unknown HCI packet with type 0x%02x received", bt_cb(info->rx_skb)->pkt_type);
info->hdev->stat.err_rx++;
clear_bit(HCI_RUNNING, &(info->hdev->flags));

Expand Down Expand Up @@ -447,7 +447,7 @@ static int btuart_hci_send_frame(struct sk_buff *skb)

info = (btuart_info_t *)(hdev->driver_data);

switch (skb->pkt_type) {
switch (bt_cb(skb)->pkt_type) {
case HCI_COMMAND_PKT:
hdev->stat.cmd_tx++;
break;
Expand All @@ -460,7 +460,7 @@ static int btuart_hci_send_frame(struct sk_buff *skb)
};

/* Prepend skb with frame type */
memcpy(skb_push(skb, 1), &(skb->pkt_type), 1);
memcpy(skb_push(skb, 1), &bt_cb(skb)->pkt_type, 1);
skb_queue_tail(&(info->txq), skb);

btuart_write_wakeup(info);
Expand Down
10 changes: 5 additions & 5 deletions drivers/bluetooth/dtl1_cs.c
Original file line number Diff line number Diff line change
Expand Up @@ -251,7 +251,7 @@ static void dtl1_receive(dtl1_info_t *info)
info->rx_count = nsh->len + (nsh->len & 0x0001);
break;
case RECV_WAIT_DATA:
info->rx_skb->pkt_type = nsh->type;
bt_cb(info->rx_skb)->pkt_type = nsh->type;

/* remove PAD byte if it exists */
if (nsh->len & 0x0001) {
Expand All @@ -262,7 +262,7 @@ static void dtl1_receive(dtl1_info_t *info)
/* remove NSH */
skb_pull(info->rx_skb, NSHL);

switch (info->rx_skb->pkt_type) {
switch (bt_cb(info->rx_skb)->pkt_type) {
case 0x80:
/* control data for the Nokia Card */
dtl1_control(info, info->rx_skb);
Expand All @@ -272,12 +272,12 @@ static void dtl1_receive(dtl1_info_t *info)
case 0x84:
/* send frame to the HCI layer */
info->rx_skb->dev = (void *) info->hdev;
info->rx_skb->pkt_type &= 0x0f;
bt_cb(info->rx_skb)->pkt_type &= 0x0f;
hci_recv_frame(info->rx_skb);
break;
default:
/* unknown packet */
BT_ERR("Unknown HCI packet with type 0x%02x received", info->rx_skb->pkt_type);
BT_ERR("Unknown HCI packet with type 0x%02x received", bt_cb(info->rx_skb)->pkt_type);
kfree_skb(info->rx_skb);
break;
}
Expand Down Expand Up @@ -410,7 +410,7 @@ static int dtl1_hci_send_frame(struct sk_buff *skb)

info = (dtl1_info_t *)(hdev->driver_data);

switch (skb->pkt_type) {
switch (bt_cb(skb)->pkt_type) {
case HCI_COMMAND_PKT:
hdev->stat.cmd_tx++;
nsh.type = 0x81;
Expand Down
18 changes: 9 additions & 9 deletions drivers/bluetooth/hci_bcsp.c
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ static int bcsp_enqueue(struct hci_uart *hu, struct sk_buff *skb)
return 0;
}

switch (skb->pkt_type) {
switch (bt_cb(skb)->pkt_type) {
case HCI_ACLDATA_PKT:
case HCI_COMMAND_PKT:
skb_queue_tail(&bcsp->rel, skb);
Expand Down Expand Up @@ -227,7 +227,7 @@ static struct sk_buff *bcsp_prepare_pkt(struct bcsp_struct *bcsp, u8 *data,
if (!nskb)
return NULL;

nskb->pkt_type = pkt_type;
bt_cb(nskb)->pkt_type = pkt_type;

bcsp_slip_msgdelim(nskb);

Expand Down Expand Up @@ -286,7 +286,7 @@ static struct sk_buff *bcsp_dequeue(struct hci_uart *hu)
since they have priority */

if ((skb = skb_dequeue(&bcsp->unrel)) != NULL) {
struct sk_buff *nskb = bcsp_prepare_pkt(bcsp, skb->data, skb->len, skb->pkt_type);
struct sk_buff *nskb = bcsp_prepare_pkt(bcsp, skb->data, skb->len, bt_cb(skb)->pkt_type);
if (nskb) {
kfree_skb(skb);
return nskb;
Expand All @@ -303,7 +303,7 @@ static struct sk_buff *bcsp_dequeue(struct hci_uart *hu)
spin_lock_irqsave(&bcsp->unack.lock, flags);

if (bcsp->unack.qlen < BCSP_TXWINSIZE && (skb = skb_dequeue(&bcsp->rel)) != NULL) {
struct sk_buff *nskb = bcsp_prepare_pkt(bcsp, skb->data, skb->len, skb->pkt_type);
struct sk_buff *nskb = bcsp_prepare_pkt(bcsp, skb->data, skb->len, bt_cb(skb)->pkt_type);
if (nskb) {
__skb_queue_tail(&bcsp->unack, skb);
mod_timer(&bcsp->tbcsp, jiffies + HZ / 4);
Expand Down Expand Up @@ -401,7 +401,7 @@ static void bcsp_handle_le_pkt(struct hci_uart *hu)
if (!nskb)
return;
memcpy(skb_put(nskb, 4), conf_rsp_pkt, 4);
nskb->pkt_type = BCSP_LE_PKT;
bt_cb(nskb)->pkt_type = BCSP_LE_PKT;

skb_queue_head(&bcsp->unrel, nskb);
hci_uart_tx_wakeup(hu);
Expand Down Expand Up @@ -483,14 +483,14 @@ static inline void bcsp_complete_rx_pkt(struct hci_uart *hu)
bcsp_pkt_cull(bcsp);
if ((bcsp->rx_skb->data[1] & 0x0f) == 6 &&
bcsp->rx_skb->data[0] & 0x80) {
bcsp->rx_skb->pkt_type = HCI_ACLDATA_PKT;
bt_cb(bcsp->rx_skb)->pkt_type = HCI_ACLDATA_PKT;
pass_up = 1;
} else if ((bcsp->rx_skb->data[1] & 0x0f) == 5 &&
bcsp->rx_skb->data[0] & 0x80) {
bcsp->rx_skb->pkt_type = HCI_EVENT_PKT;
bt_cb(bcsp->rx_skb)->pkt_type = HCI_EVENT_PKT;
pass_up = 1;
} else if ((bcsp->rx_skb->data[1] & 0x0f) == 7) {
bcsp->rx_skb->pkt_type = HCI_SCODATA_PKT;
bt_cb(bcsp->rx_skb)->pkt_type = HCI_SCODATA_PKT;
pass_up = 1;
} else if ((bcsp->rx_skb->data[1] & 0x0f) == 1 &&
!(bcsp->rx_skb->data[0] & 0x80)) {
Expand All @@ -512,7 +512,7 @@ static inline void bcsp_complete_rx_pkt(struct hci_uart *hu)
hdr.evt = 0xff;
hdr.plen = bcsp->rx_skb->len;
memcpy(skb_push(bcsp->rx_skb, HCI_EVENT_HDR_SIZE), &hdr, HCI_EVENT_HDR_SIZE);
bcsp->rx_skb->pkt_type = HCI_EVENT_PKT;
bt_cb(bcsp->rx_skb)->pkt_type = HCI_EVENT_PKT;

hci_recv_frame(bcsp->rx_skb);
} else {
Expand Down
4 changes: 2 additions & 2 deletions drivers/bluetooth/hci_h4.c
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ static int h4_enqueue(struct hci_uart *hu, struct sk_buff *skb)
BT_DBG("hu %p skb %p", hu, skb);

/* Prepend skb with frame type */
memcpy(skb_push(skb, 1), &skb->pkt_type, 1);
memcpy(skb_push(skb, 1), &bt_cb(skb)->pkt_type, 1);
skb_queue_tail(&h4->txq, skb);
return 0;
}
Expand Down Expand Up @@ -239,7 +239,7 @@ static int h4_recv(struct hci_uart *hu, void *data, int count)
return 0;
}
h4->rx_skb->dev = (void *) hu->hdev;
h4->rx_skb->pkt_type = type;
bt_cb(h4->rx_skb)->pkt_type = type;
}
return count;
}
Expand Down
Loading

0 comments on commit 0d48d93

Please sign in to comment.