Lines Matching refs:h

326 static int dvb_net_ule_new_ts_cell(struct dvb_net_ule_handle *h)  in dvb_net_ule_new_ts_cell()  argument
333 memcpy(ule_where, h->ts, TS_SZ); in dvb_net_ule_new_ts_cell()
345 if ((h->ts[0] != TS_SYNC) || (h->ts[1] & TS_TEI) || in dvb_net_ule_new_ts_cell()
346 ((h->ts[3] & TS_SC) != 0)) { in dvb_net_ule_new_ts_cell()
348 h->priv->ts_count, h->ts[0], in dvb_net_ule_new_ts_cell()
349 (h->ts[1] & TS_TEI) >> 7, in dvb_net_ule_new_ts_cell()
350 (h->ts[3] & TS_SC) >> 6); in dvb_net_ule_new_ts_cell()
353 if (h->priv->ule_skb) { in dvb_net_ule_new_ts_cell()
354 dev_kfree_skb(h->priv->ule_skb); in dvb_net_ule_new_ts_cell()
356 h->dev->stats.rx_errors++; in dvb_net_ule_new_ts_cell()
357 h->dev->stats.rx_frame_errors++; in dvb_net_ule_new_ts_cell()
359 reset_ule(h->priv); in dvb_net_ule_new_ts_cell()
360 h->priv->need_pusi = 1; in dvb_net_ule_new_ts_cell()
363 h->ts += TS_SZ; in dvb_net_ule_new_ts_cell()
364 h->priv->ts_count++; in dvb_net_ule_new_ts_cell()
368 h->ts_remain = 184; in dvb_net_ule_new_ts_cell()
369 h->from_where = h->ts + 4; in dvb_net_ule_new_ts_cell()
374 static int dvb_net_ule_ts_pusi(struct dvb_net_ule_handle *h) in dvb_net_ule_ts_pusi() argument
376 if (h->ts[1] & TS_PUSI) { in dvb_net_ule_ts_pusi()
379 h->priv->tscc = h->ts[3] & 0x0F; in dvb_net_ule_ts_pusi()
381 if (h->ts[4] > h->ts_remain) { in dvb_net_ule_ts_pusi()
383 h->priv->ts_count, h->ts[4]); in dvb_net_ule_ts_pusi()
384 h->ts += TS_SZ; in dvb_net_ule_ts_pusi()
385 h->priv->ts_count++; in dvb_net_ule_ts_pusi()
389 h->from_where = &h->ts[5] + h->ts[4]; in dvb_net_ule_ts_pusi()
390 h->ts_remain -= 1 + h->ts[4]; in dvb_net_ule_ts_pusi()
391 h->skipped = 0; in dvb_net_ule_ts_pusi()
393 h->skipped++; in dvb_net_ule_ts_pusi()
394 h->ts += TS_SZ; in dvb_net_ule_ts_pusi()
395 h->priv->ts_count++; in dvb_net_ule_ts_pusi()
402 static int dvb_net_ule_new_ts(struct dvb_net_ule_handle *h) in dvb_net_ule_new_ts() argument
405 if ((h->ts[3] & 0x0F) == h->priv->tscc) in dvb_net_ule_new_ts()
406 h->priv->tscc = (h->priv->tscc + 1) & 0x0F; in dvb_net_ule_new_ts()
410 h->priv->ts_count, h->ts[3] & 0x0F, in dvb_net_ule_new_ts()
411 h->priv->tscc); in dvb_net_ule_new_ts()
413 if (h->priv->ule_skb) { in dvb_net_ule_new_ts()
414 dev_kfree_skb(h->priv->ule_skb); in dvb_net_ule_new_ts()
417 h->dev->stats.rx_errors++; in dvb_net_ule_new_ts()
418 h->dev->stats.rx_frame_errors++; in dvb_net_ule_new_ts()
420 reset_ule(h->priv); in dvb_net_ule_new_ts()
422 h->priv->need_pusi = 1; in dvb_net_ule_new_ts()
431 if (h->ts[1] & TS_PUSI) { in dvb_net_ule_new_ts()
432 if (!h->priv->need_pusi) { in dvb_net_ule_new_ts()
433 if (!(*h->from_where < (h->ts_remain-1)) || in dvb_net_ule_new_ts()
434 *h->from_where != h->priv->ule_sndu_remain) { in dvb_net_ule_new_ts()
440 h->priv->ts_count, in dvb_net_ule_new_ts()
441 *h->from_where); in dvb_net_ule_new_ts()
447 if (h->priv->ule_skb) { in dvb_net_ule_new_ts()
448 h->error = true; in dvb_net_ule_new_ts()
449 dev_kfree_skb(h->priv->ule_skb); in dvb_net_ule_new_ts()
452 if (h->error || h->priv->ule_sndu_remain) { in dvb_net_ule_new_ts()
453 h->dev->stats.rx_errors++; in dvb_net_ule_new_ts()
454 h->dev->stats.rx_frame_errors++; in dvb_net_ule_new_ts()
455 h->error = false; in dvb_net_ule_new_ts()
458 reset_ule(h->priv); in dvb_net_ule_new_ts()
459 h->priv->need_pusi = 1; in dvb_net_ule_new_ts()
466 h->from_where += 1; in dvb_net_ule_new_ts()
467 h->ts_remain -= 1; in dvb_net_ule_new_ts()
469 h->priv->need_pusi = 0; in dvb_net_ule_new_ts()
471 if (h->priv->ule_sndu_remain > 183) { in dvb_net_ule_new_ts()
476 h->dev->stats.rx_errors++; in dvb_net_ule_new_ts()
477 h->dev->stats.rx_length_errors++; in dvb_net_ule_new_ts()
479 h->priv->ts_count, in dvb_net_ule_new_ts()
480 h->priv->ule_sndu_remain, in dvb_net_ule_new_ts()
481 h->ts[4], h->ts_remain); in dvb_net_ule_new_ts()
482 dev_kfree_skb(h->priv->ule_skb); in dvb_net_ule_new_ts()
484 reset_ule(h->priv); in dvb_net_ule_new_ts()
489 h->from_where += h->ts[4]; in dvb_net_ule_new_ts()
490 h->ts_remain -= h->ts[4]; in dvb_net_ule_new_ts()
504 static int dvb_net_ule_new_payload(struct dvb_net_ule_handle *h) in dvb_net_ule_new_payload() argument
506 if (h->ts_remain < 2) { in dvb_net_ule_new_payload()
508 h->ts_remain); in dvb_net_ule_new_payload()
509 h->priv->ule_sndu_len = 0; in dvb_net_ule_new_payload()
510 h->priv->need_pusi = 1; in dvb_net_ule_new_payload()
511 h->ts += TS_SZ; in dvb_net_ule_new_payload()
515 if (!h->priv->ule_sndu_len) { in dvb_net_ule_new_payload()
517 h->priv->ule_sndu_len = h->from_where[0] << 8 | in dvb_net_ule_new_payload()
518 h->from_where[1]; in dvb_net_ule_new_payload()
519 if (h->priv->ule_sndu_len & 0x8000) { in dvb_net_ule_new_payload()
521 h->priv->ule_sndu_len &= 0x7FFF; in dvb_net_ule_new_payload()
522 h->priv->ule_dbit = 1; in dvb_net_ule_new_payload()
524 h->priv->ule_dbit = 0; in dvb_net_ule_new_payload()
526 if (h->priv->ule_sndu_len < 5) { in dvb_net_ule_new_payload()
528 h->priv->ts_count, in dvb_net_ule_new_payload()
529 h->priv->ule_sndu_len); in dvb_net_ule_new_payload()
530 h->dev->stats.rx_errors++; in dvb_net_ule_new_payload()
531 h->dev->stats.rx_length_errors++; in dvb_net_ule_new_payload()
532 h->priv->ule_sndu_len = 0; in dvb_net_ule_new_payload()
533 h->priv->need_pusi = 1; in dvb_net_ule_new_payload()
534 h->new_ts = 1; in dvb_net_ule_new_payload()
535 h->ts += TS_SZ; in dvb_net_ule_new_payload()
536 h->priv->ts_count++; in dvb_net_ule_new_payload()
539 h->ts_remain -= 2; /* consume the 2 bytes SNDU length. */ in dvb_net_ule_new_payload()
540 h->from_where += 2; in dvb_net_ule_new_payload()
543 h->priv->ule_sndu_remain = h->priv->ule_sndu_len + 2; in dvb_net_ule_new_payload()
551 switch (h->ts_remain) { in dvb_net_ule_new_payload()
553 h->priv->ule_sndu_remain--; in dvb_net_ule_new_payload()
554 h->priv->ule_sndu_type = h->from_where[0] << 8; in dvb_net_ule_new_payload()
557 h->priv->ule_sndu_type_1 = 1; in dvb_net_ule_new_payload()
558 h->ts_remain -= 1; in dvb_net_ule_new_payload()
559 h->from_where += 1; in dvb_net_ule_new_payload()
562 h->new_ts = 1; in dvb_net_ule_new_payload()
563 h->ts += TS_SZ; in dvb_net_ule_new_payload()
564 h->priv->ts_count++; in dvb_net_ule_new_payload()
569 if (h->priv->ule_sndu_type_1) { in dvb_net_ule_new_payload()
570 h->priv->ule_sndu_type_1 = 0; in dvb_net_ule_new_payload()
571 h->priv->ule_sndu_type |= h->from_where[0]; in dvb_net_ule_new_payload()
572 h->from_where += 1; /* points to payload start. */ in dvb_net_ule_new_payload()
573 h->ts_remain -= 1; in dvb_net_ule_new_payload()
576 h->priv->ule_sndu_type = h->from_where[0] << 8 | in dvb_net_ule_new_payload()
577 h->from_where[1]; in dvb_net_ule_new_payload()
578 h->from_where += 2; /* points to payload start. */ in dvb_net_ule_new_payload()
579 h->ts_remain -= 2; in dvb_net_ule_new_payload()
591 h->priv->ule_skb = dev_alloc_skb(h->priv->ule_sndu_len + in dvb_net_ule_new_payload()
593 if (!h->priv->ule_skb) { in dvb_net_ule_new_payload()
595 h->dev->name); in dvb_net_ule_new_payload()
596 h->dev->stats.rx_dropped++; in dvb_net_ule_new_payload()
601 h->priv->ule_sndu_remain = h->priv->ule_sndu_len; in dvb_net_ule_new_payload()
602 h->priv->ule_skb->dev = h->dev; in dvb_net_ule_new_payload()
607 skb_reserve(h->priv->ule_skb, ETH_HLEN + ETH_ALEN); in dvb_net_ule_new_payload()
613 static int dvb_net_ule_should_drop(struct dvb_net_ule_handle *h) in dvb_net_ule_should_drop() argument
623 if (h->priv->rx_mode == RX_MODE_PROMISC) in dvb_net_ule_should_drop()
626 if (h->priv->ule_skb->data[0] & 0x01) { in dvb_net_ule_should_drop()
628 if (!ether_addr_equal(h->priv->ule_skb->data, bc_addr)) { in dvb_net_ule_should_drop()
630 if (h->priv->rx_mode == RX_MODE_MULTI) { in dvb_net_ule_should_drop()
633 for (i = 0; i < h->priv->multi_num && in dvb_net_ule_should_drop()
634 !ether_addr_equal(h->priv->ule_skb->data, in dvb_net_ule_should_drop()
635 h->priv->multi_macs[i]); in dvb_net_ule_should_drop()
638 if (i == h->priv->multi_num) in dvb_net_ule_should_drop()
640 } else if (h->priv->rx_mode != RX_MODE_ALL_MULTI) in dvb_net_ule_should_drop()
648 } else if (!ether_addr_equal(h->priv->ule_skb->data, h->dev->dev_addr)) in dvb_net_ule_should_drop()
655 static void dvb_net_ule_check_crc(struct dvb_net_ule_handle *h, in dvb_net_ule_check_crc() argument
663 h->priv->ts_count, ule_crc, expected_crc, in dvb_net_ule_check_crc()
664 h->priv->ule_sndu_len, h->priv->ule_sndu_type, in dvb_net_ule_check_crc()
665 h->ts_remain, in dvb_net_ule_check_crc()
666 h->ts_remain > 2 ? in dvb_net_ule_check_crc()
667 *(unsigned short *)h->from_where : 0); in dvb_net_ule_check_crc()
687 h->dev->stats.rx_errors++; in dvb_net_ule_check_crc()
688 h->dev->stats.rx_crc_errors++; in dvb_net_ule_check_crc()
689 dev_kfree_skb(h->priv->ule_skb); in dvb_net_ule_check_crc()
697 h->priv->ule_skb->tail -= 4; in dvb_net_ule_check_crc()
698 h->priv->ule_skb->len -= 4; in dvb_net_ule_check_crc()
700 if (!h->priv->ule_dbit) { in dvb_net_ule_check_crc()
701 if (dvb_net_ule_should_drop(h)) { in dvb_net_ule_check_crc()
702 netdev_dbg(h->dev, in dvb_net_ule_check_crc()
704 h->priv->ule_skb->data, h->dev->dev_addr); in dvb_net_ule_check_crc()
705 dev_kfree_skb(h->priv->ule_skb); in dvb_net_ule_check_crc()
709 skb_copy_from_linear_data(h->priv->ule_skb, dest_addr, in dvb_net_ule_check_crc()
711 skb_pull(h->priv->ule_skb, ETH_ALEN); in dvb_net_ule_check_crc()
718 if (h->priv->ule_sndu_type < ETH_P_802_3_MIN) { in dvb_net_ule_check_crc()
720 int l = handle_ule_extensions(h->priv); in dvb_net_ule_check_crc()
729 dev_kfree_skb(h->priv->ule_skb); in dvb_net_ule_check_crc()
732 skb_pull(h->priv->ule_skb, l); in dvb_net_ule_check_crc()
743 if (!h->priv->ule_bridged) { in dvb_net_ule_check_crc()
744 skb_push(h->priv->ule_skb, ETH_HLEN); in dvb_net_ule_check_crc()
745 h->ethh = (struct ethhdr *)h->priv->ule_skb->data; in dvb_net_ule_check_crc()
746 memcpy(h->ethh->h_dest, dest_addr, ETH_ALEN); in dvb_net_ule_check_crc()
747 eth_zero_addr(h->ethh->h_source); in dvb_net_ule_check_crc()
748 h->ethh->h_proto = htons(h->priv->ule_sndu_type); in dvb_net_ule_check_crc()
751 h->priv->ule_bridged = 0; in dvb_net_ule_check_crc()
754 h->priv->ule_skb->protocol = dvb_net_eth_type_trans(h->priv->ule_skb, in dvb_net_ule_check_crc()
755 h->dev); in dvb_net_ule_check_crc()
761 if (h->priv->ule_dbit && skb->pkt_type == PACKET_OTHERHOST) in dvb_net_ule_check_crc()
762 h->priv->ule_skb->pkt_type = PACKET_HOST; in dvb_net_ule_check_crc()
764 h->dev->stats.rx_packets++; in dvb_net_ule_check_crc()
765 h->dev->stats.rx_bytes += h->priv->ule_skb->len; in dvb_net_ule_check_crc()
766 netif_rx(h->priv->ule_skb); in dvb_net_ule_check_crc()
772 struct dvb_net_ule_handle h = { in dvb_net_ule() local
792 for (h.ts = h.buf, h.ts_end = h.buf + h.buf_len; in dvb_net_ule()
793 h.ts < h.ts_end; /* no incr. */) { in dvb_net_ule()
794 if (h.new_ts) { in dvb_net_ule()
796 if (dvb_net_ule_new_ts_cell(&h)) in dvb_net_ule()
801 if (h.priv->need_pusi) { in dvb_net_ule()
802 if (dvb_net_ule_ts_pusi(&h)) in dvb_net_ule()
806 if (h.new_ts) { in dvb_net_ule()
807 if (dvb_net_ule_new_ts(&h)) in dvb_net_ule()
812 if (h.priv->ule_skb == NULL) { in dvb_net_ule()
813 ret = dvb_net_ule_new_payload(&h); in dvb_net_ule()
821 h.how_much = min(h.priv->ule_sndu_remain, (int)h.ts_remain); in dvb_net_ule()
822 skb_put_data(h.priv->ule_skb, h.from_where, h.how_much); in dvb_net_ule()
823 h.priv->ule_sndu_remain -= h.how_much; in dvb_net_ule()
824 h.ts_remain -= h.how_much; in dvb_net_ule()
825 h.from_where += h.how_much; in dvb_net_ule()
828 if (h.priv->ule_sndu_remain <= 0) { in dvb_net_ule()
830 __be16 ulen = htons(h.priv->ule_sndu_len); in dvb_net_ule()
831 __be16 utype = htons(h.priv->ule_sndu_type); in dvb_net_ule()
836 { h.priv->ule_skb->data, in dvb_net_ule()
837 h.priv->ule_skb->len - 4 } in dvb_net_ule()
840 if (h.priv->ule_dbit) { in dvb_net_ule()
847 tail = skb_tail_pointer(h.priv->ule_skb); in dvb_net_ule()
853 dvb_net_ule_check_crc(&h, iov, ule_crc, expected_crc); in dvb_net_ule()
856 reset_ule(h.priv); in dvb_net_ule()
860 if (h.ts_remain >= 2 && *((unsigned short *)h.from_where) != 0xFFFF) { in dvb_net_ule()
862 h.new_ts = 0; in dvb_net_ule()
863 h.priv->ule_skb = NULL; in dvb_net_ule()
864 h.priv->ule_sndu_type_1 = 0; in dvb_net_ule()
865 h.priv->ule_sndu_len = 0; in dvb_net_ule()
872 h.new_ts = 1; in dvb_net_ule()
873 h.ts += TS_SZ; in dvb_net_ule()
874 h.priv->ts_count++; in dvb_net_ule()
875 if (h.priv->ule_skb == NULL) { in dvb_net_ule()
876 h.priv->need_pusi = 1; in dvb_net_ule()
877 h.priv->ule_sndu_type_1 = 0; in dvb_net_ule()
878 h.priv->ule_sndu_len = 0; in dvb_net_ule()