Lines Matching +full:apr +full:- +full:v2
1 // SPDX-License-Identifier: GPL-2.0-or-later
10 * Copyright (C) 2003, 2004 gcs - Global Communication & Services GmbH.
21 * Feb 2004: hl/ws v1: Implementing draft-fair-ipdvb-ule-01.txt
23 * Dec 2004: hl/ws v2: Implementing draft-ietf-ipdvb-ule-03.txt:
29 * Filtering on dest MAC addresses, if present (D-Bit = 0)
30 * DVB_ULE_DEBUG compile-time option.
31 * Apr 2006: cp v3: Bugfixes and compliency with RFC 4326 (ULE) by
109 unsigned short ule_sndu_len; /* ULE SNDU length in bytes, w/o D-Bit. */
126 * stolen from eth.c out of the linux kernel, hacked for dvb-device
136 skb_pull(skb,dev->hard_header_len); in dvb_net_eth_type_trans()
139 if (*eth->h_dest & 1) { in dvb_net_eth_type_trans()
140 if(ether_addr_equal(eth->h_dest,dev->broadcast)) in dvb_net_eth_type_trans()
141 skb->pkt_type=PACKET_BROADCAST; in dvb_net_eth_type_trans()
143 skb->pkt_type=PACKET_MULTICAST; in dvb_net_eth_type_trans()
146 if (ntohs(eth->h_proto) >= ETH_P_802_3_MIN) in dvb_net_eth_type_trans()
147 return eth->h_proto; in dvb_net_eth_type_trans()
149 rawp = skb->data; in dvb_net_eth_type_trans()
183 return -1; in ule_test_sndu()
188 struct ethhdr *hdr = (struct ethhdr*) p->ule_next_hdr; in ule_bridged_sndu()
189 if(ntohs(hdr->h_proto) < ETH_P_802_3_MIN) { in ule_bridged_sndu()
190 int framelen = p->ule_sndu_len - ((p->ule_next_hdr+sizeof(struct ethhdr)) - p->ule_skb->data); in ule_bridged_sndu()
192 if(framelen != ntohs(hdr->h_proto)) { in ule_bridged_sndu()
193 return -1; in ule_bridged_sndu()
202 p->ule_bridged = 1; in ule_bridged_sndu()
215 * -1: Mandatory extension header that is not recognized or TEST SNDU; discard.
228 unsigned char hlen = (p->ule_sndu_type & 0x0700) >> 8; in handle_one_ule_extension()
229 unsigned char htype = p->ule_sndu_type & 0x00FF; in handle_one_ule_extension()
237 p->ule_next_hdr += ext_len; in handle_one_ule_extension()
238 if (!p->ule_bridged) { in handle_one_ule_extension()
239 p->ule_sndu_type = ntohs(*(__be16 *)p->ule_next_hdr); in handle_one_ule_extension()
240 p->ule_next_hdr += 2; in handle_one_ule_extension()
242 p->ule_sndu_type = ntohs(*(__be16 *)(p->ule_next_hdr + ((p->ule_dbit ? 2 : 3) * ETH_ALEN))); in handle_one_ule_extension()
248 ext_len = -1; /* SNDU has to be discarded. */ in handle_one_ule_extension()
255 p->ule_next_hdr += ext_len; in handle_one_ule_extension()
256 p->ule_sndu_type = ntohs( *(__be16 *)(p->ule_next_hdr-2) ); in handle_one_ule_extension()
270 p->ule_next_hdr = p->ule_skb->data; in handle_ule_extensions()
277 p->ule_next_hdr, (int)p->ule_sndu_type, in handle_ule_extensions()
280 } while (p->ule_sndu_type < ETH_P_802_3_MIN); in handle_ule_extensions()
289 p->ule_skb = NULL; in reset_ule()
290 p->ule_next_hdr = NULL; in reset_ule()
291 p->ule_sndu_len = 0; in reset_ule()
292 p->ule_sndu_type = 0; in reset_ule()
293 p->ule_sndu_type_1 = 0; in reset_ule()
294 p->ule_sndu_remain = 0; in reset_ule()
295 p->ule_dbit = 0xFF; in reset_ule()
296 p->ule_bridged = 0; in reset_ule()
300 * Decode ULE SNDUs according to draft-ietf-ipdvb-ule-03.txt from a sequence of
323 memcpy(ule_where, h->ts, TS_SZ); in dvb_net_ule_new_ts_cell()
332 * Check TS h->error conditions: sync_byte, transport_error_indicator, in dvb_net_ule_new_ts_cell()
335 if ((h->ts[0] != TS_SYNC) || (h->ts[1] & TS_TEI) || in dvb_net_ule_new_ts_cell()
336 ((h->ts[3] & TS_SC) != 0)) { in dvb_net_ule_new_ts_cell()
338 h->priv->ts_count, h->ts[0], in dvb_net_ule_new_ts_cell()
339 (h->ts[1] & TS_TEI) >> 7, in dvb_net_ule_new_ts_cell()
340 (h->ts[3] & TS_SC) >> 6); in dvb_net_ule_new_ts_cell()
343 if (h->priv->ule_skb) { in dvb_net_ule_new_ts_cell()
344 dev_kfree_skb(h->priv->ule_skb); in dvb_net_ule_new_ts_cell()
346 h->dev->stats.rx_errors++; in dvb_net_ule_new_ts_cell()
347 h->dev->stats.rx_frame_errors++; in dvb_net_ule_new_ts_cell()
349 reset_ule(h->priv); in dvb_net_ule_new_ts_cell()
350 h->priv->need_pusi = 1; in dvb_net_ule_new_ts_cell()
353 h->ts += TS_SZ; in dvb_net_ule_new_ts_cell()
354 h->priv->ts_count++; in dvb_net_ule_new_ts_cell()
358 h->ts_remain = 184; in dvb_net_ule_new_ts_cell()
359 h->from_where = h->ts + 4; in dvb_net_ule_new_ts_cell()
366 if (h->ts[1] & TS_PUSI) { in dvb_net_ule_ts_pusi()
369 h->priv->tscc = h->ts[3] & 0x0F; in dvb_net_ule_ts_pusi()
371 if (h->ts[4] > h->ts_remain) { in dvb_net_ule_ts_pusi()
373 h->priv->ts_count, h->ts[4]); in dvb_net_ule_ts_pusi()
374 h->ts += TS_SZ; in dvb_net_ule_ts_pusi()
375 h->priv->ts_count++; in dvb_net_ule_ts_pusi()
379 h->from_where = &h->ts[5] + h->ts[4]; in dvb_net_ule_ts_pusi()
380 h->ts_remain -= 1 + h->ts[4]; in dvb_net_ule_ts_pusi()
381 h->skipped = 0; in dvb_net_ule_ts_pusi()
383 h->skipped++; 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()
395 if ((h->ts[3] & 0x0F) == h->priv->tscc) in dvb_net_ule_new_ts()
396 h->priv->tscc = (h->priv->tscc + 1) & 0x0F; in dvb_net_ule_new_ts()
400 h->priv->ts_count, h->ts[3] & 0x0F, in dvb_net_ule_new_ts()
401 h->priv->tscc); in dvb_net_ule_new_ts()
403 if (h->priv->ule_skb) { in dvb_net_ule_new_ts()
404 dev_kfree_skb(h->priv->ule_skb); in dvb_net_ule_new_ts()
406 // reset_ule(h->priv); moved to below. in dvb_net_ule_new_ts()
407 h->dev->stats.rx_errors++; in dvb_net_ule_new_ts()
408 h->dev->stats.rx_frame_errors++; in dvb_net_ule_new_ts()
410 reset_ule(h->priv); in dvb_net_ule_new_ts()
412 h->priv->need_pusi = 1; in dvb_net_ule_new_ts()
421 if (h->ts[1] & TS_PUSI) { in dvb_net_ule_new_ts()
422 if (!h->priv->need_pusi) { in dvb_net_ule_new_ts()
423 if (!(*h->from_where < (h->ts_remain-1)) || in dvb_net_ule_new_ts()
424 *h->from_where != h->priv->ule_sndu_remain) { in dvb_net_ule_new_ts()
430 h->priv->ts_count, in dvb_net_ule_new_ts()
431 *h->from_where); in dvb_net_ule_new_ts()
437 if (h->priv->ule_skb) { in dvb_net_ule_new_ts()
438 h->error = true; in dvb_net_ule_new_ts()
439 dev_kfree_skb(h->priv->ule_skb); in dvb_net_ule_new_ts()
442 if (h->error || h->priv->ule_sndu_remain) { in dvb_net_ule_new_ts()
443 h->dev->stats.rx_errors++; in dvb_net_ule_new_ts()
444 h->dev->stats.rx_frame_errors++; in dvb_net_ule_new_ts()
445 h->error = false; in dvb_net_ule_new_ts()
448 reset_ule(h->priv); in dvb_net_ule_new_ts()
449 h->priv->need_pusi = 1; in dvb_net_ule_new_ts()
456 h->from_where += 1; in dvb_net_ule_new_ts()
457 h->ts_remain -= 1; in dvb_net_ule_new_ts()
459 h->priv->need_pusi = 0; in dvb_net_ule_new_ts()
461 if (h->priv->ule_sndu_remain > 183) { in dvb_net_ule_new_ts()
466 h->dev->stats.rx_errors++; in dvb_net_ule_new_ts()
467 h->dev->stats.rx_length_errors++; in dvb_net_ule_new_ts()
468 …pr_warn("%lu: Expected %d more SNDU bytes, but got PUSI (pf %d, h->ts_remain %d). Flushing incomp… in dvb_net_ule_new_ts()
469 h->priv->ts_count, in dvb_net_ule_new_ts()
470 h->priv->ule_sndu_remain, in dvb_net_ule_new_ts()
471 h->ts[4], h->ts_remain); in dvb_net_ule_new_ts()
472 dev_kfree_skb(h->priv->ule_skb); in dvb_net_ule_new_ts()
474 reset_ule(h->priv); in dvb_net_ule_new_ts()
479 h->from_where += h->ts[4]; in dvb_net_ule_new_ts()
480 h->ts_remain -= h->ts[4]; in dvb_net_ule_new_ts()
496 if (h->ts_remain < 2) { in dvb_net_ule_new_payload()
498 h->ts_remain); in dvb_net_ule_new_payload()
499 h->priv->ule_sndu_len = 0; in dvb_net_ule_new_payload()
500 h->priv->need_pusi = 1; in dvb_net_ule_new_payload()
501 h->ts += TS_SZ; in dvb_net_ule_new_payload()
505 if (!h->priv->ule_sndu_len) { in dvb_net_ule_new_payload()
507 h->priv->ule_sndu_len = h->from_where[0] << 8 | in dvb_net_ule_new_payload()
508 h->from_where[1]; in dvb_net_ule_new_payload()
509 if (h->priv->ule_sndu_len & 0x8000) { in dvb_net_ule_new_payload()
510 /* D-Bit is set: no dest mac present. */ in dvb_net_ule_new_payload()
511 h->priv->ule_sndu_len &= 0x7FFF; in dvb_net_ule_new_payload()
512 h->priv->ule_dbit = 1; in dvb_net_ule_new_payload()
514 h->priv->ule_dbit = 0; in dvb_net_ule_new_payload()
516 if (h->priv->ule_sndu_len < 5) { in dvb_net_ule_new_payload()
518 h->priv->ts_count, in dvb_net_ule_new_payload()
519 h->priv->ule_sndu_len); in dvb_net_ule_new_payload()
520 h->dev->stats.rx_errors++; in dvb_net_ule_new_payload()
521 h->dev->stats.rx_length_errors++; in dvb_net_ule_new_payload()
522 h->priv->ule_sndu_len = 0; in dvb_net_ule_new_payload()
523 h->priv->need_pusi = 1; in dvb_net_ule_new_payload()
524 h->new_ts = 1; in dvb_net_ule_new_payload()
525 h->ts += TS_SZ; in dvb_net_ule_new_payload()
526 h->priv->ts_count++; in dvb_net_ule_new_payload()
529 h->ts_remain -= 2; /* consume the 2 bytes SNDU length. */ in dvb_net_ule_new_payload()
530 h->from_where += 2; in dvb_net_ule_new_payload()
533 h->priv->ule_sndu_remain = h->priv->ule_sndu_len + 2; in dvb_net_ule_new_payload()
536 * h->ts_remain (remaining bytes in the current TS cell) in dvb_net_ule_new_payload()
541 switch (h->ts_remain) { in dvb_net_ule_new_payload()
543 h->priv->ule_sndu_remain--; in dvb_net_ule_new_payload()
544 h->priv->ule_sndu_type = h->from_where[0] << 8; in dvb_net_ule_new_payload()
547 h->priv->ule_sndu_type_1 = 1; in dvb_net_ule_new_payload()
548 h->ts_remain -= 1; in dvb_net_ule_new_payload()
549 h->from_where += 1; in dvb_net_ule_new_payload()
552 h->new_ts = 1; in dvb_net_ule_new_payload()
553 h->ts += TS_SZ; in dvb_net_ule_new_payload()
554 h->priv->ts_count++; in dvb_net_ule_new_payload()
559 if (h->priv->ule_sndu_type_1) { in dvb_net_ule_new_payload()
560 h->priv->ule_sndu_type_1 = 0; in dvb_net_ule_new_payload()
561 h->priv->ule_sndu_type |= h->from_where[0]; in dvb_net_ule_new_payload()
562 h->from_where += 1; /* points to payload start. */ in dvb_net_ule_new_payload()
563 h->ts_remain -= 1; in dvb_net_ule_new_payload()
566 h->priv->ule_sndu_type = h->from_where[0] << 8 | in dvb_net_ule_new_payload()
567 h->from_where[1]; in dvb_net_ule_new_payload()
568 h->from_where += 2; /* points to payload start. */ in dvb_net_ule_new_payload()
569 h->ts_remain -= 2; in dvb_net_ule_new_payload()
581 h->priv->ule_skb = dev_alloc_skb(h->priv->ule_sndu_len + in dvb_net_ule_new_payload()
583 if (!h->priv->ule_skb) { in dvb_net_ule_new_payload()
585 h->dev->name); in dvb_net_ule_new_payload()
586 h->dev->stats.rx_dropped++; in dvb_net_ule_new_payload()
587 return -1; in dvb_net_ule_new_payload()
591 h->priv->ule_sndu_remain = h->priv->ule_sndu_len; in dvb_net_ule_new_payload()
592 h->priv->ule_skb->dev = h->dev; in dvb_net_ule_new_payload()
597 skb_reserve(h->priv->ule_skb, ETH_HLEN + ETH_ALEN); in dvb_net_ule_new_payload()
605 static const u8 bc_addr[ETH_ALEN] = { [0 ... ETH_ALEN - 1] = 0xff }; in dvb_net_ule_should_drop()
613 if (h->priv->rx_mode == RX_MODE_PROMISC) in dvb_net_ule_should_drop()
616 if (h->priv->ule_skb->data[0] & 0x01) { in dvb_net_ule_should_drop()
618 if (!ether_addr_equal(h->priv->ule_skb->data, bc_addr)) { in dvb_net_ule_should_drop()
620 if (h->priv->rx_mode == RX_MODE_MULTI) { in dvb_net_ule_should_drop()
623 for (i = 0; i < h->priv->multi_num && in dvb_net_ule_should_drop()
624 !ether_addr_equal(h->priv->ule_skb->data, in dvb_net_ule_should_drop()
625 h->priv->multi_macs[i]); in dvb_net_ule_should_drop()
628 if (i == h->priv->multi_num) in dvb_net_ule_should_drop()
630 } else if (h->priv->rx_mode != RX_MODE_ALL_MULTI) in dvb_net_ule_should_drop()
638 } else if (!ether_addr_equal(h->priv->ule_skb->data, h->dev->dev_addr)) in dvb_net_ule_should_drop()
653 h->priv->ts_count, ule_crc, expected_crc, in dvb_net_ule_check_crc()
654 h->priv->ule_sndu_len, h->priv->ule_sndu_type, in dvb_net_ule_check_crc()
655 h->ts_remain, in dvb_net_ule_check_crc()
656 h->ts_remain > 2 ? in dvb_net_ule_check_crc()
657 *(unsigned short *)h->from_where : 0); in dvb_net_ule_check_crc()
671 hexdump(ule_where - TS_SZ - TS_SZ, TS_SZ); in dvb_net_ule_check_crc()
672 hexdump(ule_where - TS_SZ, TS_SZ); in dvb_net_ule_check_crc()
677 h->dev->stats.rx_errors++; in dvb_net_ule_check_crc()
678 h->dev->stats.rx_crc_errors++; in dvb_net_ule_check_crc()
679 dev_kfree_skb(h->priv->ule_skb); in dvb_net_ule_check_crc()
687 h->priv->ule_skb->tail -= 4; in dvb_net_ule_check_crc()
688 h->priv->ule_skb->len -= 4; in dvb_net_ule_check_crc()
690 if (!h->priv->ule_dbit) { in dvb_net_ule_check_crc()
692 netdev_dbg(h->dev, in dvb_net_ule_check_crc()
693 "Dropping SNDU: MAC destination address does not match: dest addr: %pM, h->dev addr: %pM\n", in dvb_net_ule_check_crc()
694 h->priv->ule_skb->data, h->dev->dev_addr); in dvb_net_ule_check_crc()
695 dev_kfree_skb(h->priv->ule_skb); in dvb_net_ule_check_crc()
699 skb_copy_from_linear_data(h->priv->ule_skb, dest_addr, in dvb_net_ule_check_crc()
701 skb_pull(h->priv->ule_skb, ETH_ALEN); in dvb_net_ule_check_crc()
703 /* dest_addr buffer is only valid if h->priv->ule_dbit == 0 */ in dvb_net_ule_check_crc()
708 if (h->priv->ule_sndu_type < ETH_P_802_3_MIN) { in dvb_net_ule_check_crc()
710 int l = handle_ule_extensions(h->priv); in dvb_net_ule_check_crc()
719 dev_kfree_skb(h->priv->ule_skb); in dvb_net_ule_check_crc()
722 skb_pull(h->priv->ule_skb, l); in dvb_net_ule_check_crc()
727 * Note: in bridged mode (h->priv->ule_bridged != 0) in dvb_net_ule_check_crc()
733 if (!h->priv->ule_bridged) { in dvb_net_ule_check_crc()
734 skb_push(h->priv->ule_skb, ETH_HLEN); in dvb_net_ule_check_crc()
735 h->ethh = (struct ethhdr *)h->priv->ule_skb->data; in dvb_net_ule_check_crc()
736 memcpy(h->ethh->h_dest, dest_addr, ETH_ALEN); in dvb_net_ule_check_crc()
737 eth_zero_addr(h->ethh->h_source); in dvb_net_ule_check_crc()
738 h->ethh->h_proto = htons(h->priv->ule_sndu_type); in dvb_net_ule_check_crc()
741 h->priv->ule_bridged = 0; in dvb_net_ule_check_crc()
744 h->priv->ule_skb->protocol = dvb_net_eth_type_trans(h->priv->ule_skb, in dvb_net_ule_check_crc()
745 h->dev); in dvb_net_ule_check_crc()
747 * If D-bit is set (i.e. destination MAC address not present), in dvb_net_ule_check_crc()
751 if (h->priv->ule_dbit && skb->pkt_type == PACKET_OTHERHOST) in dvb_net_ule_check_crc()
752 h->priv->ule_skb->pkt_type = PACKET_HOST; in dvb_net_ule_check_crc()
754 h->dev->stats.rx_packets++; in dvb_net_ule_check_crc()
755 h->dev->stats.rx_bytes += h->priv->ule_skb->len; in dvb_net_ule_check_crc()
756 netif_rx(h->priv->ule_skb); in dvb_net_ule_check_crc()
791 if (h.priv->need_pusi) { in dvb_net_ule()
802 if (h.priv->ule_skb == NULL) { in dvb_net_ule()
811 h.how_much = min(h.priv->ule_sndu_remain, (int)h.ts_remain); in dvb_net_ule()
812 skb_put_data(h.priv->ule_skb, h.from_where, h.how_much); in dvb_net_ule()
813 h.priv->ule_sndu_remain -= h.how_much; in dvb_net_ule()
814 h.ts_remain -= h.how_much; in dvb_net_ule()
818 if (h.priv->ule_sndu_remain <= 0) { in dvb_net_ule()
820 __be16 ulen = htons(h.priv->ule_sndu_len); in dvb_net_ule()
821 __be16 utype = htons(h.priv->ule_sndu_type); in dvb_net_ule()
826 { h.priv->ule_skb->data, in dvb_net_ule()
827 h.priv->ule_skb->len - 4 } in dvb_net_ule()
830 if (h.priv->ule_dbit) { in dvb_net_ule()
831 /* Set D-bit for CRC32 verification, in dvb_net_ule()
837 tail = skb_tail_pointer(h.priv->ule_skb); in dvb_net_ule()
838 expected_crc = *(tail - 4) << 24 | in dvb_net_ule()
839 *(tail - 3) << 16 | in dvb_net_ule()
840 *(tail - 2) << 8 | in dvb_net_ule()
841 *(tail - 1); in dvb_net_ule()
853 h.priv->ule_skb = NULL; in dvb_net_ule()
854 h.priv->ule_sndu_type_1 = 0; in dvb_net_ule()
855 h.priv->ule_sndu_len = 0; in dvb_net_ule()
864 h.priv->ts_count++; in dvb_net_ule()
865 if (h.priv->ule_skb == NULL) { in dvb_net_ule()
866 h.priv->need_pusi = 1; in dvb_net_ule()
867 h.priv->ule_sndu_type_1 = 0; in dvb_net_ule()
868 h.priv->ule_sndu_len = 0; in dvb_net_ule()
879 struct net_device *dev = feed->priv; in dvb_net_ts_callback()
897 struct net_device_stats *stats = &dev->stats;
903 dev->name, pkt_len);
904 stats->rx_errors++;
905 stats->rx_length_errors++;
917 stats->rx_errors++;
918 stats->rx_crc_errors++;
922 /* handle LLC/SNAP, see rfc-1042 */
924 stats->rx_dropped++;
931 stats->rx_errors++;
932 stats->rx_frame_errors++;
939 if (!(skb = dev_alloc_skb(pkt_len - 4 - 12 + 14 + 2 - snap))) {
940 //pr_notice("%s: Memory squeeze, dropping packet.\n", dev->name);
941 stats->rx_dropped++;
945 skb->dev = dev;
948 eth = skb_put(skb, pkt_len - 12 - 4 + 14 - snap);
949 memcpy(eth + 14, pkt + 12 + snap, pkt_len - 12 - 4 - snap);
965 /* protocol numbers are from rfc-1700 or
966 * http://www.iana.org/assignments/ethernet-numbers
977 skb->protocol = dvb_net_eth_type_trans(skb, dev);
979 stats->rx_packets++;
980 stats->rx_bytes+=skb->len;
988 struct net_device *dev = filter->priv;
1017 ret = priv->secfeed->allocate_filter(priv->secfeed, secfilter);
1019 pr_err("%s: could not get filter\n", dev->name);
1023 (*secfilter)->priv=(void *) dev;
1025 memset((*secfilter)->filter_value, 0x00, DMX_MAX_FILTER_SIZE);
1026 memset((*secfilter)->filter_mask, 0x00, DMX_MAX_FILTER_SIZE);
1027 memset((*secfilter)->filter_mode, 0xff, DMX_MAX_FILTER_SIZE);
1029 (*secfilter)->filter_value[0]=0x3e;
1030 (*secfilter)->filter_value[3]=mac[5];
1031 (*secfilter)->filter_value[4]=mac[4];
1032 (*secfilter)->filter_value[8]=mac[3];
1033 (*secfilter)->filter_value[9]=mac[2];
1034 (*secfilter)->filter_value[10]=mac[1];
1035 (*secfilter)->filter_value[11]=mac[0];
1037 (*secfilter)->filter_mask[0] = 0xff;
1038 (*secfilter)->filter_mask[3] = mac_mask[5];
1039 (*secfilter)->filter_mask[4] = mac_mask[4];
1040 (*secfilter)->filter_mask[8] = mac_mask[3];
1041 (*secfilter)->filter_mask[9] = mac_mask[2];
1042 (*secfilter)->filter_mask[10] = mac_mask[1];
1043 (*secfilter)->filter_mask[11]=mac_mask[0];
1054 struct dmx_demux *demux = priv->demux;
1055 const unsigned char *mac = (const unsigned char *) dev->dev_addr;
1057 netdev_dbg(dev, "rx_mode %i\n", priv->rx_mode);
1058 mutex_lock(&priv->mutex);
1059 if (priv->tsfeed || priv->secfeed || priv->secfilter || priv->multi_secfilter[0])
1062 priv->secfeed=NULL;
1063 priv->secfilter=NULL;
1064 priv->tsfeed = NULL;
1066 if (priv->feedtype == DVB_NET_FEEDTYPE_MPE) {
1068 ret=demux->allocate_section_feed(demux, &priv->secfeed,
1072 dev->name);
1076 ret = priv->secfeed->set(priv->secfeed, priv->pid, 1);
1079 pr_err("%s: could not set section feed\n", dev->name);
1080 priv->demux->release_section_feed(priv->demux, priv->secfeed);
1081 priv->secfeed=NULL;
1085 if (priv->rx_mode != RX_MODE_PROMISC) {
1087 dvb_net_filter_sec_set(dev, &priv->secfilter, mac, mask_normal);
1090 switch (priv->rx_mode) {
1092 for (i = 0; i < priv->multi_num; i++) {
1094 dvb_net_filter_sec_set(dev, &priv->multi_secfilter[i],
1095 priv->multi_macs[i], mask_normal);
1099 priv->multi_num=1;
1101 dvb_net_filter_sec_set(dev, &priv->multi_secfilter[0],
1105 priv->multi_num=0;
1107 dvb_net_filter_sec_set(dev, &priv->secfilter, mac, mask_promisc);
1112 priv->secfeed->start_filtering(priv->secfeed);
1113 } else if (priv->feedtype == DVB_NET_FEEDTYPE_ULE) {
1118 ret = demux->allocate_ts_feed(demux, &priv->tsfeed, dvb_net_ts_callback);
1120 pr_err("%s: could not allocate ts feed\n", dev->name);
1125 priv->tsfeed->priv = (void *)dev;
1126 ret = priv->tsfeed->set(priv->tsfeed,
1127 priv->pid, /* pid */
1134 pr_err("%s: could not set ts feed\n", dev->name);
1135 priv->demux->release_ts_feed(priv->demux, priv->tsfeed);
1136 priv->tsfeed = NULL;
1141 priv->tsfeed->start_filtering(priv->tsfeed);
1143 ret = -EINVAL;
1146 mutex_unlock(&priv->mutex);
1155 mutex_lock(&priv->mutex);
1156 if (priv->feedtype == DVB_NET_FEEDTYPE_MPE) {
1157 if (priv->secfeed) {
1158 if (priv->secfeed->is_filtering) {
1160 priv->secfeed->stop_filtering(priv->secfeed);
1163 if (priv->secfilter) {
1165 priv->secfeed->release_filter(priv->secfeed,
1166 priv->secfilter);
1167 priv->secfilter=NULL;
1170 for (i=0; i<priv->multi_num; i++) {
1171 if (priv->multi_secfilter[i]) {
1174 priv->secfeed->release_filter(priv->secfeed,
1175 priv->multi_secfilter[i]);
1176 priv->multi_secfilter[i] = NULL;
1180 priv->demux->release_section_feed(priv->demux, priv->secfeed);
1181 priv->secfeed = NULL;
1183 pr_err("%s: no feed to stop\n", dev->name);
1184 } else if (priv->feedtype == DVB_NET_FEEDTYPE_ULE) {
1185 if (priv->tsfeed) {
1186 if (priv->tsfeed->is_filtering) {
1188 priv->tsfeed->stop_filtering(priv->tsfeed);
1190 priv->demux->release_ts_feed(priv->demux, priv->tsfeed);
1191 priv->tsfeed = NULL;
1194 pr_err("%s: no ts feed to stop\n", dev->name);
1196 ret = -EINVAL;
1197 mutex_unlock(&priv->mutex);
1206 if (priv->multi_num == DVB_NET_MULTICAST_MAX)
1207 return -ENOMEM;
1209 memcpy(priv->multi_macs[priv->multi_num], addr, ETH_ALEN);
1211 priv->multi_num++;
1220 struct net_device *dev = priv->net;
1223 priv->rx_mode = RX_MODE_UNI;
1226 if (dev->flags & IFF_PROMISC) {
1228 priv->rx_mode = RX_MODE_PROMISC;
1229 } else if ((dev->flags & IFF_ALLMULTI)) {
1231 priv->rx_mode = RX_MODE_ALL_MULTI;
1238 priv->rx_mode = RX_MODE_MULTI;
1239 priv->multi_num = 0;
1242 dvb_set_mc_filter(dev, ha->addr);
1253 schedule_work(&priv->set_multicast_list_wq);
1261 struct net_device *dev = priv->net;
1275 eth_hw_addr_set(dev, addr->sa_data);
1278 schedule_work(&priv->restart_net_feed_wq);
1288 priv->in_use++;
1298 priv->in_use--;
1321 dev->header_ops = &dvb_header_ops;
1322 dev->netdev_ops = &dvb_netdev_ops;
1323 dev->mtu = 4096;
1324 dev->max_mtu = 4096;
1326 dev->flags |= IFF_NOARP;
1334 if (!dvbnet->state[i])
1338 return -1;
1340 dvbnet->state[i]=1;
1352 return -EINVAL;
1354 return -EINVAL;
1359 return -ENOMEM;
1361 if (dvbnet->dvbdev->id)
1362 snprintf(net->name, IFNAMSIZ, "dvb%d%u%d",
1363 dvbnet->dvbdev->adapter->num, dvbnet->dvbdev->id, if_num);
1366 snprintf(net->name, IFNAMSIZ, "dvb%d_%d",
1367 dvbnet->dvbdev->adapter->num, if_num);
1369 net->addr_len = 6;
1370 eth_hw_addr_set(net, dvbnet->dvbdev->adapter->proposed_mac);
1372 dvbnet->device[if_num] = net;
1375 priv->net = net;
1376 priv->demux = dvbnet->demux;
1377 priv->pid = pid;
1378 priv->rx_mode = RX_MODE_UNI;
1379 priv->need_pusi = 1;
1380 priv->tscc = 0;
1381 priv->feedtype = feedtype;
1384 INIT_WORK(&priv->set_multicast_list_wq, wq_set_multicast_list);
1385 INIT_WORK(&priv->restart_net_feed_wq, wq_restart_net_feed);
1386 mutex_init(&priv->mutex);
1388 net->base_addr = pid;
1391 dvbnet->device[if_num] = NULL;
1395 pr_info("created network interface %s\n", net->name);
1402 struct net_device *net = dvbnet->device[num];
1405 if (!dvbnet->state[num])
1406 return -EINVAL;
1408 if (priv->in_use)
1409 return -EBUSY;
1412 flush_work(&priv->set_multicast_list_wq);
1413 flush_work(&priv->restart_net_feed_wq);
1414 pr_info("removed network interface %s\n", net->name);
1416 dvbnet->state[num]=0;
1417 dvbnet->device[num] = NULL;
1426 struct dvb_device *dvbdev = file->private_data;
1427 struct dvb_net *dvbnet = dvbdev->priv;
1430 if (((file->f_flags&O_ACCMODE)==O_RDONLY))
1431 return -EPERM;
1433 if (mutex_lock_interruptible(&dvbnet->ioctl_mutex))
1434 return -ERESTARTSYS;
1443 ret = -EPERM;
1447 if (!try_module_get(dvbdev->adapter->module)) {
1448 ret = -EPERM;
1452 result=dvb_net_add_if(dvbnet, dvbnetif->pid, dvbnetif->feedtype);
1454 module_put(dvbdev->adapter->module);
1458 dvbnetif->if_num=result;
1466 int if_num = dvbnetif->if_num;
1469 ret = -EINVAL;
1474 if (!dvbnet->state[if_num]) {
1475 ret = -EINVAL;
1479 netdev = dvbnet->device[if_num];
1482 dvbnetif->pid=priv_data->pid;
1483 dvbnetif->feedtype=priv_data->feedtype;
1489 ret = -EPERM;
1493 ret = -EINVAL;
1498 module_put(dvbdev->adapter->module);
1509 ret = -EPERM;
1513 if (!try_module_get(dvbdev->adapter->module)) {
1514 ret = -EPERM;
1518 result=dvb_net_add_if(dvbnet, dvbnetif->pid, DVB_NET_FEEDTYPE_MPE);
1520 module_put(dvbdev->adapter->module);
1524 dvbnetif->if_num=result;
1532 int if_num = dvbnetif->if_num;
1535 ret = -EINVAL;
1540 if (!dvbnet->state[if_num]) {
1541 ret = -EINVAL;
1545 netdev = dvbnet->device[if_num];
1548 dvbnetif->pid=priv_data->pid;
1552 ret = -ENOTTY;
1557 mutex_unlock(&dvbnet->ioctl_mutex);
1569 struct dvb_device *dvbdev = file->private_data;
1570 struct dvb_net *dvbnet = dvbdev->priv;
1573 if (mutex_lock_interruptible(&dvbnet->remove_mutex))
1574 return -ERESTARTSYS;
1576 if (dvbnet->exit) {
1577 mutex_unlock(&dvbnet->remove_mutex);
1578 return -ENODEV;
1583 mutex_unlock(&dvbnet->remove_mutex);
1590 struct dvb_device *dvbdev = file->private_data;
1591 struct dvb_net *dvbnet = dvbdev->priv;
1593 mutex_lock(&dvbnet->remove_mutex);
1597 if (dvbdev->users == 1 && dvbnet->exit == 1) {
1598 mutex_unlock(&dvbnet->remove_mutex);
1599 wake_up(&dvbdev->wait_queue);
1601 mutex_unlock(&dvbnet->remove_mutex);
1621 .name = "dvb-net",
1630 mutex_lock(&dvbnet->remove_mutex);
1631 dvbnet->exit = 1;
1632 mutex_unlock(&dvbnet->remove_mutex);
1634 if (dvbnet->dvbdev->users < 1)
1635 wait_event(dvbnet->dvbdev->wait_queue,
1636 dvbnet->dvbdev->users == 1);
1638 dvb_unregister_device(dvbnet->dvbdev);
1641 if (!dvbnet->state[i])
1654 mutex_init(&dvbnet->ioctl_mutex);
1655 mutex_init(&dvbnet->remove_mutex);
1656 dvbnet->demux = dmx;
1659 dvbnet->state[i] = 0;
1661 return dvb_register_device(adap, &dvbnet->dvbdev, &dvbdev_net,