static void dhd_bta_flush_hcidata(dhd_pub_t *pub, uint16 llh) { int prec; struct pktq *q; uint count = 0; q = dhd_bus_txq(pub->bus); if (q == NULL) return; DHD_BTA(("dhd: flushing HCI ACL data for logical link %u...\n", llh)); dhd_os_sdlock_txq(pub); /* Walk through the txq and toss all HCI ACL data packets */ PKTQ_PREC_ITER(q, prec) { void *head_pkt = NULL; while (pktq_ppeek(q, prec) != head_pkt) { void *pkt = pktq_pdeq(q, prec); int ifidx; PKTPULL(pub->osh, pkt, dhd_bus_hdrlen(pub->bus)); dhd_prot_hdrpull(pub, &ifidx, pkt); if (PKTLEN(pub->osh, pkt) >= RFC1042_HDR_LEN) { struct ether_header *eh = (struct ether_header *)PKTDATA(pub->osh, pkt); if (ntoh16(eh->ether_type) < ETHER_TYPE_MIN) { struct dot11_llc_snap_header *lsh = (struct dot11_llc_snap_header *)&eh[1]; if (bcmp(lsh, BT_SIG_SNAP_MPROT, DOT11_LLC_SNAP_HDR_LEN - 2) == 0 && ntoh16(lsh->type) == BTA_PROT_L2CAP) { amp_hci_ACL_data_t *ACL_data = (amp_hci_ACL_data_t *)&lsh[1]; uint16 handle = ltoh16(ACL_data->handle); if (HCI_ACL_DATA_HANDLE(handle) == llh) { PKTFREE(pub->osh, pkt, TRUE); count ++; continue; } } } } dhd_prot_hdrpush(pub, ifidx, pkt); PKTPUSH(pub->osh, pkt, dhd_bus_hdrlen(pub->bus)); if (head_pkt == NULL) head_pkt = pkt; pktq_penq(q, prec, pkt); } }
static void bcm_rpc_tp_tx_encap(rpc_tp_info_t * rpcb, rpc_buf_t *b) { uint32 *tp_lenp; uint32 rpc_len; rpc_len = PKTLEN(rpcb->osh, b); tp_lenp = (uint32*)PKTPUSH(rpcb->osh, b, BCM_RPC_TP_ENCAP_LEN); *tp_lenp = rpc_len; }
void dhd_prot_hdrpush(dhd_pub_t *dhd, int ifidx, void *pktbuf) { #ifdef BDC struct bdc_header *h; #ifdef APSTA_PINGTEST struct ether_header *eh; int i; #ifdef DHD_DEBUG char eabuf1[ETHER_ADDR_STR_LEN]; char eabuf2[ETHER_ADDR_STR_LEN]; #endif /* DHD_DEBUG */ #endif /* APSTA_PINGTEST */ #endif /* BDC */ DHD_TRACE(("%s: Enter\n", __FUNCTION__)); #ifdef BDC /* Push BDC header used to convey priority for buses that don't */ #ifdef APSTA_PINGTEST eh = (struct ether_header *)PKTDATA(dhd->osh, pktbuf); #endif PKTPUSH(dhd->osh, pktbuf, BDC_HEADER_LEN); h = (struct bdc_header *)PKTDATA(dhd->osh, pktbuf); h->flags = (BDC_PROTO_VER << BDC_FLAG_VER_SHIFT); if (PKTSUMNEEDED(pktbuf)) h->flags |= BDC_FLAG_SUM_NEEDED; h->priority = (PKTPRIO(pktbuf) & BDC_PRIORITY_MASK); h->flags2 = 0; #ifdef APSTA_PINGTEST for (i = 0; i < MAX_GUEST; ++i) { if (!ETHER_ISNULLADDR(eh->ether_dhost) && bcmp(eh->ether_dhost, guest_eas[i].octet, ETHER_ADDR_LEN) == 0) { DHD_TRACE(("send on if 1; sa %s, da %s\n", bcm_ether_ntoa((struct ether_addr *)(eh->ether_shost), eabuf1), bcm_ether_ntoa((struct ether_addr *)(eh->ether_dhost), eabuf2))); /* assume all guest STAs are on interface 1 */ h->flags2 = 1; break; } } #endif /* APSTA_PINGTEST */ h->rssi = 0; #endif /* BDC */ BDC_SET_IF_IDX(h, ifidx); }
unsigned char* bcm_rpc_buf_push(rpc_tp_info_t * rpc_th, rpc_buf_t* b, uint bytes) { return PKTPUSH(rpc_th->osh, b, bytes); }