Lines Matching refs:h

315 static int dvb_net_ule_new_ts_cell(struct dvb_net_ule_handle *h)  in dvb_net_ule_new_ts_cell()  argument
322 memcpy(ule_where, h->ts, TS_SZ); in dvb_net_ule_new_ts_cell()
334 if ((h->ts[0] != TS_SYNC) || (h->ts[1] & TS_TEI) || in dvb_net_ule_new_ts_cell()
335 ((h->ts[3] & TS_SC) != 0)) { in dvb_net_ule_new_ts_cell()
337 h->priv->ts_count, h->ts[0], in dvb_net_ule_new_ts_cell()
338 (h->ts[1] & TS_TEI) >> 7, in dvb_net_ule_new_ts_cell()
339 (h->ts[3] & TS_SC) >> 6); in dvb_net_ule_new_ts_cell()
342 if (h->priv->ule_skb) { in dvb_net_ule_new_ts_cell()
343 dev_kfree_skb(h->priv->ule_skb); in dvb_net_ule_new_ts_cell()
345 h->dev->stats.rx_errors++; in dvb_net_ule_new_ts_cell()
346 h->dev->stats.rx_frame_errors++; in dvb_net_ule_new_ts_cell()
348 reset_ule(h->priv); in dvb_net_ule_new_ts_cell()
349 h->priv->need_pusi = 1; in dvb_net_ule_new_ts_cell()
352 h->ts += TS_SZ; in dvb_net_ule_new_ts_cell()
353 h->priv->ts_count++; in dvb_net_ule_new_ts_cell()
357 h->ts_remain = 184; in dvb_net_ule_new_ts_cell()
358 h->from_where = h->ts + 4; in dvb_net_ule_new_ts_cell()
363 static int dvb_net_ule_ts_pusi(struct dvb_net_ule_handle *h) in dvb_net_ule_ts_pusi() argument
365 if (h->ts[1] & TS_PUSI) { in dvb_net_ule_ts_pusi()
368 h->priv->tscc = h->ts[3] & 0x0F; in dvb_net_ule_ts_pusi()
370 if (h->ts[4] > h->ts_remain) { in dvb_net_ule_ts_pusi()
372 h->priv->ts_count, h->ts[4]); in dvb_net_ule_ts_pusi()
373 h->ts += TS_SZ; in dvb_net_ule_ts_pusi()
374 h->priv->ts_count++; in dvb_net_ule_ts_pusi()
378 h->from_where = &h->ts[5] + h->ts[4]; in dvb_net_ule_ts_pusi()
379 h->ts_remain -= 1 + h->ts[4]; in dvb_net_ule_ts_pusi()
380 h->skipped = 0; in dvb_net_ule_ts_pusi()
382 h->skipped++; in dvb_net_ule_ts_pusi()
383 h->ts += TS_SZ; in dvb_net_ule_ts_pusi()
384 h->priv->ts_count++; in dvb_net_ule_ts_pusi()
391 static int dvb_net_ule_new_ts(struct dvb_net_ule_handle *h) in dvb_net_ule_new_ts() argument
394 if ((h->ts[3] & 0x0F) == h->priv->tscc) in dvb_net_ule_new_ts()
395 h->priv->tscc = (h->priv->tscc + 1) & 0x0F; in dvb_net_ule_new_ts()
399 h->priv->ts_count, h->ts[3] & 0x0F, in dvb_net_ule_new_ts()
400 h->priv->tscc); in dvb_net_ule_new_ts()
402 if (h->priv->ule_skb) { in dvb_net_ule_new_ts()
403 dev_kfree_skb(h->priv->ule_skb); in dvb_net_ule_new_ts()
406 h->dev->stats.rx_errors++; in dvb_net_ule_new_ts()
407 h->dev->stats.rx_frame_errors++; in dvb_net_ule_new_ts()
409 reset_ule(h->priv); in dvb_net_ule_new_ts()
411 h->priv->need_pusi = 1; in dvb_net_ule_new_ts()
420 if (h->ts[1] & TS_PUSI) { in dvb_net_ule_new_ts()
421 if (!h->priv->need_pusi) { in dvb_net_ule_new_ts()
422 if (!(*h->from_where < (h->ts_remain-1)) || in dvb_net_ule_new_ts()
423 *h->from_where != h->priv->ule_sndu_remain) { in dvb_net_ule_new_ts()
429 h->priv->ts_count, in dvb_net_ule_new_ts()
430 *h->from_where); in dvb_net_ule_new_ts()
436 if (h->priv->ule_skb) { in dvb_net_ule_new_ts()
437 h->error = true; in dvb_net_ule_new_ts()
438 dev_kfree_skb(h->priv->ule_skb); in dvb_net_ule_new_ts()
441 if (h->error || h->priv->ule_sndu_remain) { in dvb_net_ule_new_ts()
442 h->dev->stats.rx_errors++; in dvb_net_ule_new_ts()
443 h->dev->stats.rx_frame_errors++; in dvb_net_ule_new_ts()
444 h->error = false; in dvb_net_ule_new_ts()
447 reset_ule(h->priv); in dvb_net_ule_new_ts()
448 h->priv->need_pusi = 1; in dvb_net_ule_new_ts()
455 h->from_where += 1; in dvb_net_ule_new_ts()
456 h->ts_remain -= 1; in dvb_net_ule_new_ts()
458 h->priv->need_pusi = 0; in dvb_net_ule_new_ts()
460 if (h->priv->ule_sndu_remain > 183) { in dvb_net_ule_new_ts()
465 h->dev->stats.rx_errors++; in dvb_net_ule_new_ts()
466 h->dev->stats.rx_length_errors++; in dvb_net_ule_new_ts()
468 h->priv->ts_count, in dvb_net_ule_new_ts()
469 h->priv->ule_sndu_remain, in dvb_net_ule_new_ts()
470 h->ts[4], h->ts_remain); in dvb_net_ule_new_ts()
471 dev_kfree_skb(h->priv->ule_skb); in dvb_net_ule_new_ts()
473 reset_ule(h->priv); in dvb_net_ule_new_ts()
478 h->from_where += h->ts[4]; in dvb_net_ule_new_ts()
479 h->ts_remain -= h->ts[4]; in dvb_net_ule_new_ts()
493 static int dvb_net_ule_new_payload(struct dvb_net_ule_handle *h) in dvb_net_ule_new_payload() argument
495 if (h->ts_remain < 2) { in dvb_net_ule_new_payload()
497 h->ts_remain); in dvb_net_ule_new_payload()
498 h->priv->ule_sndu_len = 0; in dvb_net_ule_new_payload()
499 h->priv->need_pusi = 1; in dvb_net_ule_new_payload()
500 h->ts += TS_SZ; in dvb_net_ule_new_payload()
504 if (!h->priv->ule_sndu_len) { in dvb_net_ule_new_payload()
506 h->priv->ule_sndu_len = h->from_where[0] << 8 | in dvb_net_ule_new_payload()
507 h->from_where[1]; in dvb_net_ule_new_payload()
508 if (h->priv->ule_sndu_len & 0x8000) { in dvb_net_ule_new_payload()
510 h->priv->ule_sndu_len &= 0x7FFF; in dvb_net_ule_new_payload()
511 h->priv->ule_dbit = 1; in dvb_net_ule_new_payload()
513 h->priv->ule_dbit = 0; in dvb_net_ule_new_payload()
515 if (h->priv->ule_sndu_len < 5) { in dvb_net_ule_new_payload()
517 h->priv->ts_count, in dvb_net_ule_new_payload()
518 h->priv->ule_sndu_len); in dvb_net_ule_new_payload()
519 h->dev->stats.rx_errors++; in dvb_net_ule_new_payload()
520 h->dev->stats.rx_length_errors++; in dvb_net_ule_new_payload()
521 h->priv->ule_sndu_len = 0; in dvb_net_ule_new_payload()
522 h->priv->need_pusi = 1; in dvb_net_ule_new_payload()
523 h->new_ts = 1; in dvb_net_ule_new_payload()
524 h->ts += TS_SZ; in dvb_net_ule_new_payload()
525 h->priv->ts_count++; in dvb_net_ule_new_payload()
528 h->ts_remain -= 2; /* consume the 2 bytes SNDU length. */ in dvb_net_ule_new_payload()
529 h->from_where += 2; in dvb_net_ule_new_payload()
532 h->priv->ule_sndu_remain = h->priv->ule_sndu_len + 2; in dvb_net_ule_new_payload()
540 switch (h->ts_remain) { in dvb_net_ule_new_payload()
542 h->priv->ule_sndu_remain--; in dvb_net_ule_new_payload()
543 h->priv->ule_sndu_type = h->from_where[0] << 8; in dvb_net_ule_new_payload()
546 h->priv->ule_sndu_type_1 = 1; in dvb_net_ule_new_payload()
547 h->ts_remain -= 1; in dvb_net_ule_new_payload()
548 h->from_where += 1; in dvb_net_ule_new_payload()
551 h->new_ts = 1; in dvb_net_ule_new_payload()
552 h->ts += TS_SZ; in dvb_net_ule_new_payload()
553 h->priv->ts_count++; in dvb_net_ule_new_payload()
558 if (h->priv->ule_sndu_type_1) { in dvb_net_ule_new_payload()
559 h->priv->ule_sndu_type_1 = 0; in dvb_net_ule_new_payload()
560 h->priv->ule_sndu_type |= h->from_where[0]; in dvb_net_ule_new_payload()
561 h->from_where += 1; /* points to payload start. */ in dvb_net_ule_new_payload()
562 h->ts_remain -= 1; in dvb_net_ule_new_payload()
565 h->priv->ule_sndu_type = h->from_where[0] << 8 | in dvb_net_ule_new_payload()
566 h->from_where[1]; in dvb_net_ule_new_payload()
567 h->from_where += 2; /* points to payload start. */ in dvb_net_ule_new_payload()
568 h->ts_remain -= 2; in dvb_net_ule_new_payload()
580 h->priv->ule_skb = dev_alloc_skb(h->priv->ule_sndu_len + in dvb_net_ule_new_payload()
582 if (!h->priv->ule_skb) { in dvb_net_ule_new_payload()
584 h->dev->name); in dvb_net_ule_new_payload()
585 h->dev->stats.rx_dropped++; in dvb_net_ule_new_payload()
590 h->priv->ule_sndu_remain = h->priv->ule_sndu_len; in dvb_net_ule_new_payload()
591 h->priv->ule_skb->dev = h->dev; in dvb_net_ule_new_payload()
596 skb_reserve(h->priv->ule_skb, ETH_HLEN + ETH_ALEN); in dvb_net_ule_new_payload()
602 static int dvb_net_ule_should_drop(struct dvb_net_ule_handle *h) in dvb_net_ule_should_drop() argument
612 if (h->priv->rx_mode == RX_MODE_PROMISC) in dvb_net_ule_should_drop()
615 if (h->priv->ule_skb->data[0] & 0x01) { in dvb_net_ule_should_drop()
617 if (!ether_addr_equal(h->priv->ule_skb->data, bc_addr)) { in dvb_net_ule_should_drop()
619 if (h->priv->rx_mode == RX_MODE_MULTI) { in dvb_net_ule_should_drop()
622 for (i = 0; i < h->priv->multi_num && in dvb_net_ule_should_drop()
623 !ether_addr_equal(h->priv->ule_skb->data, in dvb_net_ule_should_drop()
624 h->priv->multi_macs[i]); in dvb_net_ule_should_drop()
627 if (i == h->priv->multi_num) in dvb_net_ule_should_drop()
629 } else if (h->priv->rx_mode != RX_MODE_ALL_MULTI) in dvb_net_ule_should_drop()
637 } else if (!ether_addr_equal(h->priv->ule_skb->data, h->dev->dev_addr)) in dvb_net_ule_should_drop()
644 static void dvb_net_ule_check_crc(struct dvb_net_ule_handle *h, in dvb_net_ule_check_crc() argument
652 h->priv->ts_count, ule_crc, expected_crc, in dvb_net_ule_check_crc()
653 h->priv->ule_sndu_len, h->priv->ule_sndu_type, in dvb_net_ule_check_crc()
654 h->ts_remain, in dvb_net_ule_check_crc()
655 h->ts_remain > 2 ? in dvb_net_ule_check_crc()
656 *(unsigned short *)h->from_where : 0); in dvb_net_ule_check_crc()
676 h->dev->stats.rx_errors++; in dvb_net_ule_check_crc()
677 h->dev->stats.rx_crc_errors++; in dvb_net_ule_check_crc()
678 dev_kfree_skb(h->priv->ule_skb); in dvb_net_ule_check_crc()
686 h->priv->ule_skb->tail -= 4; in dvb_net_ule_check_crc()
687 h->priv->ule_skb->len -= 4; in dvb_net_ule_check_crc()
689 if (!h->priv->ule_dbit) { in dvb_net_ule_check_crc()
690 if (dvb_net_ule_should_drop(h)) { in dvb_net_ule_check_crc()
691 netdev_dbg(h->dev, in dvb_net_ule_check_crc()
693 h->priv->ule_skb->data, h->dev->dev_addr); in dvb_net_ule_check_crc()
694 dev_kfree_skb(h->priv->ule_skb); in dvb_net_ule_check_crc()
698 skb_copy_from_linear_data(h->priv->ule_skb, dest_addr, in dvb_net_ule_check_crc()
700 skb_pull(h->priv->ule_skb, ETH_ALEN); in dvb_net_ule_check_crc()
707 if (h->priv->ule_sndu_type < ETH_P_802_3_MIN) { in dvb_net_ule_check_crc()
709 int l = handle_ule_extensions(h->priv); in dvb_net_ule_check_crc()
718 dev_kfree_skb(h->priv->ule_skb); in dvb_net_ule_check_crc()
721 skb_pull(h->priv->ule_skb, l); in dvb_net_ule_check_crc()
732 if (!h->priv->ule_bridged) { in dvb_net_ule_check_crc()
733 skb_push(h->priv->ule_skb, ETH_HLEN); in dvb_net_ule_check_crc()
734 h->ethh = (struct ethhdr *)h->priv->ule_skb->data; in dvb_net_ule_check_crc()
735 memcpy(h->ethh->h_dest, dest_addr, ETH_ALEN); in dvb_net_ule_check_crc()
736 eth_zero_addr(h->ethh->h_source); in dvb_net_ule_check_crc()
737 h->ethh->h_proto = htons(h->priv->ule_sndu_type); in dvb_net_ule_check_crc()
740 h->priv->ule_bridged = 0; in dvb_net_ule_check_crc()
743 h->priv->ule_skb->protocol = dvb_net_eth_type_trans(h->priv->ule_skb, in dvb_net_ule_check_crc()
744 h->dev); in dvb_net_ule_check_crc()
750 if (h->priv->ule_dbit && skb->pkt_type == PACKET_OTHERHOST) in dvb_net_ule_check_crc()
751 h->priv->ule_skb->pkt_type = PACKET_HOST; in dvb_net_ule_check_crc()
753 h->dev->stats.rx_packets++; in dvb_net_ule_check_crc()
754 h->dev->stats.rx_bytes += h->priv->ule_skb->len; in dvb_net_ule_check_crc()
755 netif_rx(h->priv->ule_skb); in dvb_net_ule_check_crc()
761 struct dvb_net_ule_handle h = { in dvb_net_ule() local
781 for (h.ts = h.buf, h.ts_end = h.buf + h.buf_len; in dvb_net_ule()
782 h.ts < h.ts_end; /* no incr. */) { in dvb_net_ule()
783 if (h.new_ts) { in dvb_net_ule()
785 if (dvb_net_ule_new_ts_cell(&h)) in dvb_net_ule()
790 if (h.priv->need_pusi) { in dvb_net_ule()
791 if (dvb_net_ule_ts_pusi(&h)) in dvb_net_ule()
795 if (h.new_ts) { in dvb_net_ule()
796 if (dvb_net_ule_new_ts(&h)) in dvb_net_ule()
801 if (h.priv->ule_skb == NULL) { in dvb_net_ule()
802 ret = dvb_net_ule_new_payload(&h); in dvb_net_ule()
810 h.how_much = min(h.priv->ule_sndu_remain, (int)h.ts_remain); in dvb_net_ule()
811 skb_put_data(h.priv->ule_skb, h.from_where, h.how_much); in dvb_net_ule()
812 h.priv->ule_sndu_remain -= h.how_much; in dvb_net_ule()
813 h.ts_remain -= h.how_much; in dvb_net_ule()
814 h.from_where += h.how_much; in dvb_net_ule()
817 if (h.priv->ule_sndu_remain <= 0) { in dvb_net_ule()
819 __be16 ulen = htons(h.priv->ule_sndu_len); in dvb_net_ule()
820 __be16 utype = htons(h.priv->ule_sndu_type); in dvb_net_ule()
825 { h.priv->ule_skb->data, in dvb_net_ule()
826 h.priv->ule_skb->len - 4 } in dvb_net_ule()
829 if (h.priv->ule_dbit) { in dvb_net_ule()
836 tail = skb_tail_pointer(h.priv->ule_skb); in dvb_net_ule()
842 dvb_net_ule_check_crc(&h, iov, ule_crc, expected_crc); in dvb_net_ule()
845 reset_ule(h.priv); in dvb_net_ule()
849 if (h.ts_remain >= 2 && *((unsigned short *)h.from_where) != 0xFFFF) { in dvb_net_ule()
851 h.new_ts = 0; in dvb_net_ule()
852 h.priv->ule_skb = NULL; in dvb_net_ule()
853 h.priv->ule_sndu_type_1 = 0; in dvb_net_ule()
854 h.priv->ule_sndu_len = 0; in dvb_net_ule()
861 h.new_ts = 1; in dvb_net_ule()
862 h.ts += TS_SZ; in dvb_net_ule()
863 h.priv->ts_count++; in dvb_net_ule()
864 if (h.priv->ule_skb == NULL) { in dvb_net_ule()
865 h.priv->need_pusi = 1; in dvb_net_ule()
866 h.priv->ule_sndu_type_1 = 0; in dvb_net_ule()
867 h.priv->ule_sndu_len = 0; in dvb_net_ule()