linux/drivers/media/dvb/dvb-core/dvb_net.c
<<
>>
Prefs
   1/*
   2 * dvb_net.c
   3 *
   4 * Copyright (C) 2001 Convergence integrated media GmbH
   5 *                    Ralph Metzler <ralph@convergence.de>
   6 * Copyright (C) 2002 Ralph Metzler <rjkm@metzlerbros.de>
   7 *
   8 * ULE Decapsulation code:
   9 * Copyright (C) 2003, 2004 gcs - Global Communication & Services GmbH.
  10 *                      and Department of Scientific Computing
  11 *                          Paris Lodron University of Salzburg.
  12 *                          Hilmar Linder <hlinder@cosy.sbg.ac.at>
  13 *                      and Wolfram Stering <wstering@cosy.sbg.ac.at>
  14 *
  15 * ULE Decaps according to RFC 4326.
  16 *
  17 * This program is free software; you can redistribute it and/or
  18 * modify it under the terms of the GNU General Public License
  19 * as published by the Free Software Foundation; either version 2
  20 * of the License, or (at your option) any later version.
  21 *
  22 * This program is distributed in the hope that it will be useful,
  23 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  24 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  25 * GNU General Public License for more details.
  26 *
  27 * You should have received a copy of the GNU General Public License
  28 * along with this program; if not, write to the Free Software
  29 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  30 * Or, point your browser to http://www.gnu.org/copyleft/gpl.html
  31 */
  32
  33/*
  34 * ULE ChangeLog:
  35 * Feb 2004: hl/ws v1: Implementing draft-fair-ipdvb-ule-01.txt
  36 *
  37 * Dec 2004: hl/ws v2: Implementing draft-ietf-ipdvb-ule-03.txt:
  38 *                       ULE Extension header handling.
  39 *                     Bugreports by Moritz Vieth and Hanno Tersteegen,
  40 *                       Fraunhofer Institute for Open Communication Systems
  41 *                       Competence Center for Advanced Satellite Communications.
  42 *                     Bugfixes and robustness improvements.
  43 *                     Filtering on dest MAC addresses, if present (D-Bit = 0)
  44 *                     ULE_DEBUG compile-time option.
  45 * Apr 2006: cp v3:    Bugfixes and compliency with RFC 4326 (ULE) by
  46 *                       Christian Praehauser <cpraehaus@cosy.sbg.ac.at>,
  47 *                       Paris Lodron University of Salzburg.
  48 */
  49
  50/*
  51 * FIXME / TODO (dvb_net.c):
  52 *
  53 * Unloading does not work for 2.6.9 kernels: a refcount doesn't go to zero.
  54 *
  55 */
  56
  57#include <linux/module.h>
  58#include <linux/kernel.h>
  59#include <linux/netdevice.h>
  60#include <linux/etherdevice.h>
  61#include <linux/dvb/net.h>
  62#include <linux/uio.h>
  63#include <asm/uaccess.h>
  64#include <linux/crc32.h>
  65#include <linux/mutex.h>
  66#include <linux/sched.h>
  67
  68#include "dvb_demux.h"
  69#include "dvb_net.h"
  70
  71static int dvb_net_debug;
  72module_param(dvb_net_debug, int, 0444);
  73MODULE_PARM_DESC(dvb_net_debug, "enable debug messages");
  74
  75#define dprintk(x...) do { if (dvb_net_debug) printk(x); } while (0)
  76
  77
  78static inline __u32 iov_crc32( __u32 c, struct kvec *iov, unsigned int cnt )
  79{
  80        unsigned int j;
  81        for (j = 0; j < cnt; j++)
  82                c = crc32_be( c, iov[j].iov_base, iov[j].iov_len );
  83        return c;
  84}
  85
  86
  87#define DVB_NET_MULTICAST_MAX 10
  88
  89#undef ULE_DEBUG
  90
  91#ifdef ULE_DEBUG
  92
  93#define MAC_ADDR_PRINTFMT "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x"
  94#define MAX_ADDR_PRINTFMT_ARGS(macap) (macap)[0],(macap)[1],(macap)[2],(macap)[3],(macap)[4],(macap)[5]
  95
  96#define isprint(c)      ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9'))
  97
  98static void hexdump( const unsigned char *buf, unsigned short len )
  99{
 100        char str[80], octet[10];
 101        int ofs, i, l;
 102
 103        for (ofs = 0; ofs < len; ofs += 16) {
 104                sprintf( str, "%03d: ", ofs );
 105
 106                for (i = 0; i < 16; i++) {
 107                        if ((i + ofs) < len)
 108                                sprintf( octet, "%02x ", buf[ofs + i] );
 109                        else
 110                                strcpy( octet, "   " );
 111
 112                        strcat( str, octet );
 113                }
 114                strcat( str, "  " );
 115                l = strlen( str );
 116
 117                for (i = 0; (i < 16) && ((i + ofs) < len); i++)
 118                        str[l++] = isprint( buf[ofs + i] ) ? buf[ofs + i] : '.';
 119
 120                str[l] = '\0';
 121                printk( KERN_WARNING "%s\n", str );
 122        }
 123}
 124
 125#endif
 126
 127struct dvb_net_priv {
 128        int in_use;
 129        u16 pid;
 130        struct net_device *net;
 131        struct dvb_net *host;
 132        struct dmx_demux *demux;
 133        struct dmx_section_feed *secfeed;
 134        struct dmx_section_filter *secfilter;
 135        struct dmx_ts_feed *tsfeed;
 136        int multi_num;
 137        struct dmx_section_filter *multi_secfilter[DVB_NET_MULTICAST_MAX];
 138        unsigned char multi_macs[DVB_NET_MULTICAST_MAX][6];
 139        int rx_mode;
 140#define RX_MODE_UNI 0
 141#define RX_MODE_MULTI 1
 142#define RX_MODE_ALL_MULTI 2
 143#define RX_MODE_PROMISC 3
 144        struct work_struct set_multicast_list_wq;
 145        struct work_struct restart_net_feed_wq;
 146        unsigned char feedtype;                 /* Either FEED_TYPE_ or FEED_TYPE_ULE */
 147        int need_pusi;                          /* Set to 1, if synchronization on PUSI required. */
 148        unsigned char tscc;                     /* TS continuity counter after sync on PUSI. */
 149        struct sk_buff *ule_skb;                /* ULE SNDU decodes into this buffer. */
 150        unsigned char *ule_next_hdr;            /* Pointer into skb to next ULE extension header. */
 151        unsigned short ule_sndu_len;            /* ULE SNDU length in bytes, w/o D-Bit. */
 152        unsigned short ule_sndu_type;           /* ULE SNDU type field, complete. */
 153        unsigned char ule_sndu_type_1;          /* ULE SNDU type field, if split across 2 TS cells. */
 154        unsigned char ule_dbit;                 /* Whether the DestMAC address present
 155                                                 * or not (bit is set). */
 156        unsigned char ule_bridged;              /* Whether the ULE_BRIDGED extension header was found. */
 157        int ule_sndu_remain;                    /* Nr. of bytes still required for current ULE SNDU. */
 158        unsigned long ts_count;                 /* Current ts cell counter. */
 159        struct mutex mutex;
 160};
 161
 162
 163/**
 164 *      Determine the packet's protocol ID. The rule here is that we
 165 *      assume 802.3 if the type field is short enough to be a length.
 166 *      This is normal practice and works for any 'now in use' protocol.
 167 *
 168 *  stolen from eth.c out of the linux kernel, hacked for dvb-device
 169 *  by Michael Holzt <kju@debian.org>
 170 */
 171static __be16 dvb_net_eth_type_trans(struct sk_buff *skb,
 172                                      struct net_device *dev)
 173{
 174        struct ethhdr *eth;
 175        unsigned char *rawp;
 176
 177        skb_reset_mac_header(skb);
 178        skb_pull(skb,dev->hard_header_len);
 179        eth = eth_hdr(skb);
 180
 181        if (*eth->h_dest & 1) {
 182                if(memcmp(eth->h_dest,dev->broadcast, ETH_ALEN)==0)
 183                        skb->pkt_type=PACKET_BROADCAST;
 184                else
 185                        skb->pkt_type=PACKET_MULTICAST;
 186        }
 187
 188        if (ntohs(eth->h_proto) >= 1536)
 189                return eth->h_proto;
 190
 191        rawp = skb->data;
 192
 193        /**
 194         *      This is a magic hack to spot IPX packets. Older Novell breaks
 195         *      the protocol design and runs IPX over 802.3 without an 802.2 LLC
 196         *      layer. We look for FFFF which isn't a used 802.2 SSAP/DSAP. This
 197         *      won't work for fault tolerant netware but does for the rest.
 198         */
 199        if (*(unsigned short *)rawp == 0xFFFF)
 200                return htons(ETH_P_802_3);
 201
 202        /**
 203         *      Real 802.2 LLC
 204         */
 205        return htons(ETH_P_802_2);
 206}
 207
 208#define TS_SZ   188
 209#define TS_SYNC 0x47
 210#define TS_TEI  0x80
 211#define TS_SC   0xC0
 212#define TS_PUSI 0x40
 213#define TS_AF_A 0x20
 214#define TS_AF_D 0x10
 215
 216/* ULE Extension Header handlers. */
 217
 218#define ULE_TEST        0
 219#define ULE_BRIDGED     1
 220
 221#define ULE_OPTEXTHDR_PADDING 0
 222
 223static int ule_test_sndu( struct dvb_net_priv *p )
 224{
 225        return -1;
 226}
 227
 228static int ule_bridged_sndu( struct dvb_net_priv *p )
 229{
 230        struct ethhdr *hdr = (struct ethhdr*) p->ule_next_hdr;
 231        if(ntohs(hdr->h_proto) < 1536) {
 232                int framelen = p->ule_sndu_len - ((p->ule_next_hdr+sizeof(struct ethhdr)) - p->ule_skb->data);
 233                /* A frame Type < 1536 for a bridged frame, introduces a LLC Length field. */
 234                if(framelen != ntohs(hdr->h_proto)) {
 235                        return -1;
 236                }
 237        }
 238        /* Note:
 239         * From RFC4326:
 240         *  "A bridged SNDU is a Mandatory Extension Header of Type 1.
 241         *   It must be the final (or only) extension header specified in the header chain of a SNDU."
 242         * The 'ule_bridged' flag will cause the extension header processing loop to terminate.
 243         */
 244        p->ule_bridged = 1;
 245        return 0;
 246}
 247
 248static int ule_exthdr_padding(struct dvb_net_priv *p)
 249{
 250        return 0;
 251}
 252
 253/** Handle ULE extension headers.
 254 *  Function is called after a successful CRC32 verification of an ULE SNDU to complete its decoding.
 255 *  Returns: >= 0: nr. of bytes consumed by next extension header
 256 *           -1:   Mandatory extension header that is not recognized or TEST SNDU; discard.
 257 */
 258static int handle_one_ule_extension( struct dvb_net_priv *p )
 259{
 260        /* Table of mandatory extension header handlers.  The header type is the index. */
 261        static int (*ule_mandatory_ext_handlers[255])( struct dvb_net_priv *p ) =
 262                { [0] = ule_test_sndu, [1] = ule_bridged_sndu, [2] = NULL,  };
 263
 264        /* Table of optional extension header handlers.  The header type is the index. */
 265        static int (*ule_optional_ext_handlers[255])( struct dvb_net_priv *p ) =
 266                { [0] = ule_exthdr_padding, [1] = NULL, };
 267
 268        int ext_len = 0;
 269        unsigned char hlen = (p->ule_sndu_type & 0x0700) >> 8;
 270        unsigned char htype = p->ule_sndu_type & 0x00FF;
 271
 272        /* Discriminate mandatory and optional extension headers. */
 273        if (hlen == 0) {
 274                /* Mandatory extension header */
 275                if (ule_mandatory_ext_handlers[htype]) {
 276                        ext_len = ule_mandatory_ext_handlers[htype]( p );
 277                        if(ext_len >= 0) {
 278                                p->ule_next_hdr += ext_len;
 279                                if (!p->ule_bridged) {
 280                                        p->ule_sndu_type = ntohs(*(__be16 *)p->ule_next_hdr);
 281                                        p->ule_next_hdr += 2;
 282                                } else {
 283                                        p->ule_sndu_type = ntohs(*(__be16 *)(p->ule_next_hdr + ((p->ule_dbit ? 2 : 3) * ETH_ALEN)));
 284                                        /* This assures the extension handling loop will terminate. */
 285                                }
 286                        }
 287                        // else: extension handler failed or SNDU should be discarded
 288                } else
 289                        ext_len = -1;   /* SNDU has to be discarded. */
 290        } else {
 291                /* Optional extension header.  Calculate the length. */
 292                ext_len = hlen << 1;
 293                /* Process the optional extension header according to its type. */
 294                if (ule_optional_ext_handlers[htype])
 295                        (void)ule_optional_ext_handlers[htype]( p );
 296                p->ule_next_hdr += ext_len;
 297                p->ule_sndu_type = ntohs( *(__be16 *)(p->ule_next_hdr-2) );
 298                /*
 299                 * note: the length of the next header type is included in the
 300                 * length of THIS optional extension header
 301                 */
 302        }
 303
 304        return ext_len;
 305}
 306
 307static int handle_ule_extensions( struct dvb_net_priv *p )
 308{
 309        int total_ext_len = 0, l;
 310
 311        p->ule_next_hdr = p->ule_skb->data;
 312        do {
 313                l = handle_one_ule_extension( p );
 314                if (l < 0)
 315                        return l;       /* Stop extension header processing and discard SNDU. */
 316                total_ext_len += l;
 317#ifdef ULE_DEBUG
 318                dprintk("handle_ule_extensions: ule_next_hdr=%p, ule_sndu_type=%i, "
 319                        "l=%i, total_ext_len=%i\n", p->ule_next_hdr,
 320                        (int) p->ule_sndu_type, l, total_ext_len);
 321#endif
 322
 323        } while (p->ule_sndu_type < 1536);
 324
 325        return total_ext_len;
 326}
 327
 328
 329/** Prepare for a new ULE SNDU: reset the decoder state. */
 330static inline void reset_ule( struct dvb_net_priv *p )
 331{
 332        p->ule_skb = NULL;
 333        p->ule_next_hdr = NULL;
 334        p->ule_sndu_len = 0;
 335        p->ule_sndu_type = 0;
 336        p->ule_sndu_type_1 = 0;
 337        p->ule_sndu_remain = 0;
 338        p->ule_dbit = 0xFF;
 339        p->ule_bridged = 0;
 340}
 341
 342/**
 343 * Decode ULE SNDUs according to draft-ietf-ipdvb-ule-03.txt from a sequence of
 344 * TS cells of a single PID.
 345 */
 346static void dvb_net_ule( struct net_device *dev, const u8 *buf, size_t buf_len )
 347{
 348        struct dvb_net_priv *priv = netdev_priv(dev);
 349        unsigned long skipped = 0L;
 350        const u8 *ts, *ts_end, *from_where = NULL;
 351        u8 ts_remain = 0, how_much = 0, new_ts = 1;
 352        struct ethhdr *ethh = NULL;
 353        bool error = false;
 354
 355#ifdef ULE_DEBUG
 356        /* The code inside ULE_DEBUG keeps a history of the last 100 TS cells processed. */
 357        static unsigned char ule_hist[100*TS_SZ];
 358        static unsigned char *ule_where = ule_hist, ule_dump;
 359#endif
 360
 361        /* For all TS cells in current buffer.
 362         * Appearently, we are called for every single TS cell.
 363         */
 364        for (ts = buf, ts_end = buf + buf_len; ts < ts_end; /* no default incr. */ ) {
 365
 366                if (new_ts) {
 367                        /* We are about to process a new TS cell. */
 368
 369#ifdef ULE_DEBUG
 370                        if (ule_where >= &ule_hist[100*TS_SZ]) ule_where = ule_hist;
 371                        memcpy( ule_where, ts, TS_SZ );
 372                        if (ule_dump) {
 373                                hexdump( ule_where, TS_SZ );
 374                                ule_dump = 0;
 375                        }
 376                        ule_where += TS_SZ;
 377#endif
 378
 379                        /* Check TS error conditions: sync_byte, transport_error_indicator, scrambling_control . */
 380                        if ((ts[0] != TS_SYNC) || (ts[1] & TS_TEI) || ((ts[3] & TS_SC) != 0)) {
 381                                printk(KERN_WARNING "%lu: Invalid TS cell: SYNC %#x, TEI %u, SC %#x.\n",
 382                                       priv->ts_count, ts[0], ts[1] & TS_TEI >> 7, ts[3] & 0xC0 >> 6);
 383
 384                                /* Drop partly decoded SNDU, reset state, resync on PUSI. */
 385                                if (priv->ule_skb) {
 386                                        dev_kfree_skb( priv->ule_skb );
 387                                        /* Prepare for next SNDU. */
 388                                        dev->stats.rx_errors++;
 389                                        dev->stats.rx_frame_errors++;
 390                                }
 391                                reset_ule(priv);
 392                                priv->need_pusi = 1;
 393
 394                                /* Continue with next TS cell. */
 395                                ts += TS_SZ;
 396                                priv->ts_count++;
 397                                continue;
 398                        }
 399
 400                        ts_remain = 184;
 401                        from_where = ts + 4;
 402                }
 403                /* Synchronize on PUSI, if required. */
 404                if (priv->need_pusi) {
 405                        if (ts[1] & TS_PUSI) {
 406                                /* Find beginning of first ULE SNDU in current TS cell. */
 407                                /* Synchronize continuity counter. */
 408                                priv->tscc = ts[3] & 0x0F;
 409                                /* There is a pointer field here. */
 410                                if (ts[4] > ts_remain) {
 411                                        printk(KERN_ERR "%lu: Invalid ULE packet "
 412                                               "(pointer field %d)\n", priv->ts_count, ts[4]);
 413                                        ts += TS_SZ;
 414                                        priv->ts_count++;
 415                                        continue;
 416                                }
 417                                /* Skip to destination of pointer field. */
 418                                from_where = &ts[5] + ts[4];
 419                                ts_remain -= 1 + ts[4];
 420                                skipped = 0;
 421                        } else {
 422                                skipped++;
 423                                ts += TS_SZ;
 424                                priv->ts_count++;
 425                                continue;
 426                        }
 427                }
 428
 429                if (new_ts) {
 430                        /* Check continuity counter. */
 431                        if ((ts[3] & 0x0F) == priv->tscc)
 432                                priv->tscc = (priv->tscc + 1) & 0x0F;
 433                        else {
 434                                /* TS discontinuity handling: */
 435                                printk(KERN_WARNING "%lu: TS discontinuity: got %#x, "
 436                                       "expected %#x.\n", priv->ts_count, ts[3] & 0x0F, priv->tscc);
 437                                /* Drop partly decoded SNDU, reset state, resync on PUSI. */
 438                                if (priv->ule_skb) {
 439                                        dev_kfree_skb( priv->ule_skb );
 440                                        /* Prepare for next SNDU. */
 441                                        // reset_ule(priv);  moved to below.
 442                                        dev->stats.rx_errors++;
 443                                        dev->stats.rx_frame_errors++;
 444                                }
 445                                reset_ule(priv);
 446                                /* skip to next PUSI. */
 447                                priv->need_pusi = 1;
 448                                continue;
 449                        }
 450                        /* If we still have an incomplete payload, but PUSI is
 451                         * set; some TS cells are missing.
 452                         * This is only possible here, if we missed exactly 16 TS
 453                         * cells (continuity counter wrap). */
 454                        if (ts[1] & TS_PUSI) {
 455                                if (! priv->need_pusi) {
 456                                        if (!(*from_where < (ts_remain-1)) || *from_where != priv->ule_sndu_remain) {
 457                                                /* Pointer field is invalid.  Drop this TS cell and any started ULE SNDU. */
 458                                                printk(KERN_WARNING "%lu: Invalid pointer "
 459                                                       "field: %u.\n", priv->ts_count, *from_where);
 460
 461                                                /* Drop partly decoded SNDU, reset state, resync on PUSI. */
 462                                                if (priv->ule_skb) {
 463                                                        error = true;
 464                                                        dev_kfree_skb(priv->ule_skb);
 465                                                }
 466
 467                                                if (error || priv->ule_sndu_remain) {
 468                                                        dev->stats.rx_errors++;
 469                                                        dev->stats.rx_frame_errors++;
 470                                                        error = false;
 471                                                }
 472
 473                                                reset_ule(priv);
 474                                                priv->need_pusi = 1;
 475                                                continue;
 476                                        }
 477                                        /* Skip pointer field (we're processing a
 478                                         * packed payload). */
 479                                        from_where += 1;
 480                                        ts_remain -= 1;
 481                                } else
 482                                        priv->need_pusi = 0;
 483
 484                                if (priv->ule_sndu_remain > 183) {
 485                                        /* Current SNDU lacks more data than there could be available in the
 486                                         * current TS cell. */
 487                                        dev->stats.rx_errors++;
 488                                        dev->stats.rx_length_errors++;
 489                                        printk(KERN_WARNING "%lu: Expected %d more SNDU bytes, but "
 490                                               "got PUSI (pf %d, ts_remain %d).  Flushing incomplete payload.\n",
 491                                               priv->ts_count, priv->ule_sndu_remain, ts[4], ts_remain);
 492                                        dev_kfree_skb(priv->ule_skb);
 493                                        /* Prepare for next SNDU. */
 494                                        reset_ule(priv);
 495                                        /* Resync: go to where pointer field points to: start of next ULE SNDU. */
 496                                        from_where += ts[4];
 497                                        ts_remain -= ts[4];
 498                                }
 499                        }
 500                }
 501
 502                /* Check if new payload needs to be started. */
 503                if (priv->ule_skb == NULL) {
 504                        /* Start a new payload with skb.
 505                         * Find ULE header.  It is only guaranteed that the
 506                         * length field (2 bytes) is contained in the current
 507                         * TS.
 508                         * Check ts_remain has to be >= 2 here. */
 509                        if (ts_remain < 2) {
 510                                printk(KERN_WARNING "Invalid payload packing: only %d "
 511                                       "bytes left in TS.  Resyncing.\n", ts_remain);
 512                                priv->ule_sndu_len = 0;
 513                                priv->need_pusi = 1;
 514                                ts += TS_SZ;
 515                                continue;
 516                        }
 517
 518                        if (! priv->ule_sndu_len) {
 519                                /* Got at least two bytes, thus extrace the SNDU length. */
 520                                priv->ule_sndu_len = from_where[0] << 8 | from_where[1];
 521                                if (priv->ule_sndu_len & 0x8000) {
 522                                        /* D-Bit is set: no dest mac present. */
 523                                        priv->ule_sndu_len &= 0x7FFF;
 524                                        priv->ule_dbit = 1;
 525                                } else
 526                                        priv->ule_dbit = 0;
 527
 528                                if (priv->ule_sndu_len < 5) {
 529                                        printk(KERN_WARNING "%lu: Invalid ULE SNDU length %u. "
 530                                               "Resyncing.\n", priv->ts_count, priv->ule_sndu_len);
 531                                        dev->stats.rx_errors++;
 532                                        dev->stats.rx_length_errors++;
 533                                        priv->ule_sndu_len = 0;
 534                                        priv->need_pusi = 1;
 535                                        new_ts = 1;
 536                                        ts += TS_SZ;
 537                                        priv->ts_count++;
 538                                        continue;
 539                                }
 540                                ts_remain -= 2; /* consume the 2 bytes SNDU length. */
 541                                from_where += 2;
 542                        }
 543
 544                        priv->ule_sndu_remain = priv->ule_sndu_len + 2;
 545                        /*
 546                         * State of current TS:
 547                         *   ts_remain (remaining bytes in the current TS cell)
 548                         *   0  ule_type is not available now, we need the next TS cell
 549                         *   1  the first byte of the ule_type is present
 550                         * >=2  full ULE header present, maybe some payload data as well.
 551                         */
 552                        switch (ts_remain) {
 553                                case 1:
 554                                        priv->ule_sndu_remain--;
 555                                        priv->ule_sndu_type = from_where[0] << 8;
 556                                        priv->ule_sndu_type_1 = 1; /* first byte of ule_type is set. */
 557                                        ts_remain -= 1; from_where += 1;
 558                                        /* Continue w/ next TS. */
 559                                case 0:
 560                                        new_ts = 1;
 561                                        ts += TS_SZ;
 562                                        priv->ts_count++;
 563                                        continue;
 564
 565                                default: /* complete ULE header is present in current TS. */
 566                                        /* Extract ULE type field. */
 567                                        if (priv->ule_sndu_type_1) {
 568                                                priv->ule_sndu_type_1 = 0;
 569                                                priv->ule_sndu_type |= from_where[0];
 570                                                from_where += 1; /* points to payload start. */
 571                                                ts_remain -= 1;
 572                                        } else {
 573                                                /* Complete type is present in new TS. */
 574                                                priv->ule_sndu_type = from_where[0] << 8 | from_where[1];
 575                                                from_where += 2; /* points to payload start. */
 576                                                ts_remain -= 2;
 577                                        }
 578                                        break;
 579                        }
 580
 581                        /* Allocate the skb (decoder target buffer) with the correct size, as follows:
 582                         * prepare for the largest case: bridged SNDU with MAC address (dbit = 0). */
 583                        priv->ule_skb = dev_alloc_skb( priv->ule_sndu_len + ETH_HLEN + ETH_ALEN );
 584                        if (priv->ule_skb == NULL) {
 585                                printk(KERN_NOTICE "%s: Memory squeeze, dropping packet.\n",
 586                                       dev->name);
 587                                dev->stats.rx_dropped++;
 588                                return;
 589                        }
 590
 591                        /* This includes the CRC32 _and_ dest mac, if !dbit. */
 592                        priv->ule_sndu_remain = priv->ule_sndu_len;
 593                        priv->ule_skb->dev = dev;
 594                        /* Leave space for Ethernet or bridged SNDU header (eth hdr plus one MAC addr). */
 595                        skb_reserve( priv->ule_skb, ETH_HLEN + ETH_ALEN );
 596                }
 597
 598                /* Copy data into our current skb. */
 599                how_much = min(priv->ule_sndu_remain, (int)ts_remain);
 600                memcpy(skb_put(priv->ule_skb, how_much), from_where, how_much);
 601                priv->ule_sndu_remain -= how_much;
 602                ts_remain -= how_much;
 603                from_where += how_much;
 604
 605                /* Check for complete payload. */
 606                if (priv->ule_sndu_remain <= 0) {
 607                        /* Check CRC32, we've got it in our skb already. */
 608                        __be16 ulen = htons(priv->ule_sndu_len);
 609                        __be16 utype = htons(priv->ule_sndu_type);
 610                        const u8 *tail;
 611                        struct kvec iov[3] = {
 612                                { &ulen, sizeof ulen },
 613                                { &utype, sizeof utype },
 614                                { priv->ule_skb->data, priv->ule_skb->len - 4 }
 615                        };
 616                        u32 ule_crc = ~0L, expected_crc;
 617                        if (priv->ule_dbit) {
 618                                /* Set D-bit for CRC32 verification,
 619                                 * if it was set originally. */
 620                                ulen |= htons(0x8000);
 621                        }
 622
 623                        ule_crc = iov_crc32(ule_crc, iov, 3);
 624                        tail = skb_tail_pointer(priv->ule_skb);
 625                        expected_crc = *(tail - 4) << 24 |
 626                                       *(tail - 3) << 16 |
 627                                       *(tail - 2) << 8 |
 628                                       *(tail - 1);
 629                        if (ule_crc != expected_crc) {
 630                                printk(KERN_WARNING "%lu: CRC32 check FAILED: %08x / %08x, SNDU len %d type %#x, ts_remain %d, next 2: %x.\n",
 631                                       priv->ts_count, ule_crc, expected_crc, priv->ule_sndu_len, priv->ule_sndu_type, ts_remain, ts_remain > 2 ? *(unsigned short *)from_where : 0);
 632
 633#ifdef ULE_DEBUG
 634                                hexdump( iov[0].iov_base, iov[0].iov_len );
 635                                hexdump( iov[1].iov_base, iov[1].iov_len );
 636                                hexdump( iov[2].iov_base, iov[2].iov_len );
 637
 638                                if (ule_where == ule_hist) {
 639                                        hexdump( &ule_hist[98*TS_SZ], TS_SZ );
 640                                        hexdump( &ule_hist[99*TS_SZ], TS_SZ );
 641                                } else if (ule_where == &ule_hist[TS_SZ]) {
 642                                        hexdump( &ule_hist[99*TS_SZ], TS_SZ );
 643                                        hexdump( ule_hist, TS_SZ );
 644                                } else {
 645                                        hexdump( ule_where - TS_SZ - TS_SZ, TS_SZ );
 646                                        hexdump( ule_where - TS_SZ, TS_SZ );
 647                                }
 648                                ule_dump = 1;
 649#endif
 650
 651                                dev->stats.rx_errors++;
 652                                dev->stats.rx_crc_errors++;
 653                                dev_kfree_skb(priv->ule_skb);
 654                        } else {
 655                                /* CRC32 verified OK. */
 656                                u8 dest_addr[ETH_ALEN];
 657                                static const u8 bc_addr[ETH_ALEN] =
 658                                        { [ 0 ... ETH_ALEN-1] = 0xff };
 659
 660                                /* CRC32 was OK. Remove it from skb. */
 661                                priv->ule_skb->tail -= 4;
 662                                priv->ule_skb->len -= 4;
 663
 664                                if (!priv->ule_dbit) {
 665                                        /*
 666                                         * The destination MAC address is the
 667                                         * next data in the skb.  It comes
 668                                         * before any extension headers.
 669                                         *
 670                                         * Check if the payload of this SNDU
 671                                         * should be passed up the stack.
 672                                         */
 673                                        register int drop = 0;
 674                                        if (priv->rx_mode != RX_MODE_PROMISC) {
 675                                                if (priv->ule_skb->data[0] & 0x01) {
 676                                                        /* multicast or broadcast */
 677                                                        if (memcmp(priv->ule_skb->data, bc_addr, ETH_ALEN)) {
 678                                                                /* multicast */
 679                                                                if (priv->rx_mode == RX_MODE_MULTI) {
 680                                                                        int i;
 681                                                                        for(i = 0; i < priv->multi_num && memcmp(priv->ule_skb->data, priv->multi_macs[i], ETH_ALEN); i++)
 682                                                                                ;
 683                                                                        if (i == priv->multi_num)
 684                                                                                drop = 1;
 685                                                                } else if (priv->rx_mode != RX_MODE_ALL_MULTI)
 686                                                                        drop = 1; /* no broadcast; */
 687                                                                /* else: all multicast mode: accept all multicast packets */
 688                                                        }
 689                                                        /* else: broadcast */
 690                                                }
 691                                                else if (memcmp(priv->ule_skb->data, dev->dev_addr, ETH_ALEN))
 692                                                        drop = 1;
 693                                                /* else: destination address matches the MAC address of our receiver device */
 694                                        }
 695                                        /* else: promiscuous mode; pass everything up the stack */
 696
 697                                        if (drop) {
 698#ifdef ULE_DEBUG
 699                                                dprintk("Dropping SNDU: MAC destination address does not match: dest addr: "MAC_ADDR_PRINTFMT", dev addr: "MAC_ADDR_PRINTFMT"\n",
 700                                                        MAX_ADDR_PRINTFMT_ARGS(priv->ule_skb->data), MAX_ADDR_PRINTFMT_ARGS(dev->dev_addr));
 701#endif
 702                                                dev_kfree_skb(priv->ule_skb);
 703                                                goto sndu_done;
 704                                        }
 705                                        else
 706                                        {
 707                                                skb_copy_from_linear_data(priv->ule_skb,
 708                                                              dest_addr,
 709                                                              ETH_ALEN);
 710                                                skb_pull(priv->ule_skb, ETH_ALEN);
 711                                        }
 712                                }
 713
 714                                /* Handle ULE Extension Headers. */
 715                                if (priv->ule_sndu_type < 1536) {
 716                                        /* There is an extension header.  Handle it accordingly. */
 717                                        int l = handle_ule_extensions(priv);
 718                                        if (l < 0) {
 719                                                /* Mandatory extension header unknown or TEST SNDU.  Drop it. */
 720                                                // printk( KERN_WARNING "Dropping SNDU, extension headers.\n" );
 721                                                dev_kfree_skb(priv->ule_skb);
 722                                                goto sndu_done;
 723                                        }
 724                                        skb_pull(priv->ule_skb, l);
 725                                }
 726
 727                                /*
 728                                 * Construct/assure correct ethernet header.
 729                                 * Note: in bridged mode (priv->ule_bridged !=
 730                                 * 0) we already have the (original) ethernet
 731                                 * header at the start of the payload (after
 732                                 * optional dest. address and any extension
 733                                 * headers).
 734                                 */
 735
 736                                if (!priv->ule_bridged) {
 737                                        skb_push(priv->ule_skb, ETH_HLEN);
 738                                        ethh = (struct ethhdr *)priv->ule_skb->data;
 739                                        if (!priv->ule_dbit) {
 740                                                 /* dest_addr buffer is only valid if priv->ule_dbit == 0 */
 741                                                memcpy(ethh->h_dest, dest_addr, ETH_ALEN);
 742                                                memset(ethh->h_source, 0, ETH_ALEN);
 743                                        }
 744                                        else /* zeroize source and dest */
 745                                                memset( ethh, 0, ETH_ALEN*2 );
 746
 747                                        ethh->h_proto = htons(priv->ule_sndu_type);
 748                                }
 749                                /* else:  skb is in correct state; nothing to do. */
 750                                priv->ule_bridged = 0;
 751
 752                                /* Stuff into kernel's protocol stack. */
 753                                priv->ule_skb->protocol = dvb_net_eth_type_trans(priv->ule_skb, dev);
 754                                /* If D-bit is set (i.e. destination MAC address not present),
 755                                 * receive the packet anyhow. */
 756                                /* if (priv->ule_dbit && skb->pkt_type == PACKET_OTHERHOST)
 757                                        priv->ule_skb->pkt_type = PACKET_HOST; */
 758                                dev->stats.rx_packets++;
 759                                dev->stats.rx_bytes += priv->ule_skb->len;
 760                                netif_rx(priv->ule_skb);
 761                        }
 762                        sndu_done:
 763                        /* Prepare for next SNDU. */
 764                        reset_ule(priv);
 765                }
 766
 767                /* More data in current TS (look at the bytes following the CRC32)? */
 768                if (ts_remain >= 2 && *((unsigned short *)from_where) != 0xFFFF) {
 769                        /* Next ULE SNDU starts right there. */
 770                        new_ts = 0;
 771                        priv->ule_skb = NULL;
 772                        priv->ule_sndu_type_1 = 0;
 773                        priv->ule_sndu_len = 0;
 774                        // printk(KERN_WARNING "More data in current TS: [%#x %#x %#x %#x]\n",
 775                        //      *(from_where + 0), *(from_where + 1),
 776                        //      *(from_where + 2), *(from_where + 3));
 777                        // printk(KERN_WARNING "ts @ %p, stopped @ %p:\n", ts, from_where + 0);
 778                        // hexdump(ts, 188);
 779                } else {
 780                        new_ts = 1;
 781                        ts += TS_SZ;
 782                        priv->ts_count++;
 783                        if (priv->ule_skb == NULL) {
 784                                priv->need_pusi = 1;
 785                                priv->ule_sndu_type_1 = 0;
 786                                priv->ule_sndu_len = 0;
 787                        }
 788                }
 789        }       /* for all available TS cells */
 790}
 791
 792static int dvb_net_ts_callback(const u8 *buffer1, size_t buffer1_len,
 793                               const u8 *buffer2, size_t buffer2_len,
 794                               struct dmx_ts_feed *feed, enum dmx_success success)
 795{
 796        struct net_device *dev = feed->priv;
 797
 798        if (buffer2)
 799                printk(KERN_WARNING "buffer2 not NULL: %p.\n", buffer2);
 800        if (buffer1_len > 32768)
 801                printk(KERN_WARNING "length > 32k: %zu.\n", buffer1_len);
 802        /* printk("TS callback: %u bytes, %u TS cells @ %p.\n",
 803                  buffer1_len, buffer1_len / TS_SZ, buffer1); */
 804        dvb_net_ule(dev, buffer1, buffer1_len);
 805        return 0;
 806}
 807
 808
 809static void dvb_net_sec(struct net_device *dev,
 810                        const u8 *pkt, int pkt_len)
 811{
 812        u8 *eth;
 813        struct sk_buff *skb;
 814        struct net_device_stats *stats = &dev->stats;
 815        int snap = 0;
 816
 817        /* note: pkt_len includes a 32bit checksum */
 818        if (pkt_len < 16) {
 819                printk("%s: IP/MPE packet length = %d too small.\n",
 820                        dev->name, pkt_len);
 821                stats->rx_errors++;
 822                stats->rx_length_errors++;
 823                return;
 824        }
 825/* it seems some ISPs manage to screw up here, so we have to
 826 * relax the error checks... */
 827#if 0
 828        if ((pkt[5] & 0xfd) != 0xc1) {
 829                /* drop scrambled or broken packets */
 830#else
 831        if ((pkt[5] & 0x3c) != 0x00) {
 832                /* drop scrambled */
 833#endif
 834                stats->rx_errors++;
 835                stats->rx_crc_errors++;
 836                return;
 837        }
 838        if (pkt[5] & 0x02) {
 839                /* handle LLC/SNAP, see rfc-1042 */
 840                if (pkt_len < 24 || memcmp(&pkt[12], "\xaa\xaa\x03\0\0\0", 6)) {
 841                        stats->rx_dropped++;
 842                        return;
 843                }
 844                snap = 8;
 845        }
 846        if (pkt[7]) {
 847                /* FIXME: assemble datagram from multiple sections */
 848                stats->rx_errors++;
 849                stats->rx_frame_errors++;
 850                return;
 851        }
 852
 853        /* we have 14 byte ethernet header (ip header follows);
 854         * 12 byte MPE header; 4 byte checksum; + 2 byte alignment, 8 byte LLC/SNAP
 855         */
 856        if (!(skb = dev_alloc_skb(pkt_len - 4 - 12 + 14 + 2 - snap))) {
 857                //printk(KERN_NOTICE "%s: Memory squeeze, dropping packet.\n", dev->name);
 858                stats->rx_dropped++;
 859                return;
 860        }
 861        skb_reserve(skb, 2);    /* longword align L3 header */
 862        skb->dev = dev;
 863
 864        /* copy L3 payload */
 865        eth = (u8 *) skb_put(skb, pkt_len - 12 - 4 + 14 - snap);
 866        memcpy(eth + 14, pkt + 12 + snap, pkt_len - 12 - 4 - snap);
 867
 868        /* create ethernet header: */
 869        eth[0]=pkt[0x0b];
 870        eth[1]=pkt[0x0a];
 871        eth[2]=pkt[0x09];
 872        eth[3]=pkt[0x08];
 873        eth[4]=pkt[0x04];
 874        eth[5]=pkt[0x03];
 875
 876        eth[6]=eth[7]=eth[8]=eth[9]=eth[10]=eth[11]=0;
 877
 878        if (snap) {
 879                eth[12] = pkt[18];
 880                eth[13] = pkt[19];
 881        } else {
 882                /* protocol numbers are from rfc-1700 or
 883                 * http://www.iana.org/assignments/ethernet-numbers
 884                 */
 885                if (pkt[12] >> 4 == 6) { /* version field from IP header */
 886                        eth[12] = 0x86; /* IPv6 */
 887                        eth[13] = 0xdd;
 888                } else {
 889                        eth[12] = 0x08; /* IPv4 */
 890                        eth[13] = 0x00;
 891                }
 892        }
 893
 894        skb->protocol = dvb_net_eth_type_trans(skb, dev);
 895
 896        stats->rx_packets++;
 897        stats->rx_bytes+=skb->len;
 898        netif_rx(skb);
 899}
 900
 901static int dvb_net_sec_callback(const u8 *buffer1, size_t buffer1_len,
 902                 const u8 *buffer2, size_t buffer2_len,
 903                 struct dmx_section_filter *filter,
 904                 enum dmx_success success)
 905{
 906        struct net_device *dev = filter->priv;
 907
 908        /**
 909         * we rely on the DVB API definition where exactly one complete
 910         * section is delivered in buffer1
 911         */
 912        dvb_net_sec (dev, buffer1, buffer1_len);
 913        return 0;
 914}
 915
 916static int dvb_net_tx(struct sk_buff *skb, struct net_device *dev)
 917{
 918        dev_kfree_skb(skb);
 919        return NETDEV_TX_OK;
 920}
 921
 922static u8 mask_normal[6]={0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
 923static u8 mask_allmulti[6]={0xff, 0xff, 0xff, 0x00, 0x00, 0x00};
 924static u8 mac_allmulti[6]={0x01, 0x00, 0x5e, 0x00, 0x00, 0x00};
 925static u8 mask_promisc[6]={0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
 926
 927static int dvb_net_filter_sec_set(struct net_device *dev,
 928                   struct dmx_section_filter **secfilter,
 929                   u8 *mac, u8 *mac_mask)
 930{
 931        struct dvb_net_priv *priv = netdev_priv(dev);
 932        int ret;
 933
 934        *secfilter=NULL;
 935        ret = priv->secfeed->allocate_filter(priv->secfeed, secfilter);
 936        if (ret<0) {
 937                printk("%s: could not get filter\n", dev->name);
 938                return ret;
 939        }
 940
 941        (*secfilter)->priv=(void *) dev;
 942
 943        memset((*secfilter)->filter_value, 0x00, DMX_MAX_FILTER_SIZE);
 944        memset((*secfilter)->filter_mask,  0x00, DMX_MAX_FILTER_SIZE);
 945        memset((*secfilter)->filter_mode,  0xff, DMX_MAX_FILTER_SIZE);
 946
 947        (*secfilter)->filter_value[0]=0x3e;
 948        (*secfilter)->filter_value[3]=mac[5];
 949        (*secfilter)->filter_value[4]=mac[4];
 950        (*secfilter)->filter_value[8]=mac[3];
 951        (*secfilter)->filter_value[9]=mac[2];
 952        (*secfilter)->filter_value[10]=mac[1];
 953        (*secfilter)->filter_value[11]=mac[0];
 954
 955        (*secfilter)->filter_mask[0] = 0xff;
 956        (*secfilter)->filter_mask[3] = mac_mask[5];
 957        (*secfilter)->filter_mask[4] = mac_mask[4];
 958        (*secfilter)->filter_mask[8] = mac_mask[3];
 959        (*secfilter)->filter_mask[9] = mac_mask[2];
 960        (*secfilter)->filter_mask[10] = mac_mask[1];
 961        (*secfilter)->filter_mask[11]=mac_mask[0];
 962
 963        dprintk("%s: filter mac=%pM\n", dev->name, mac);
 964        dprintk("%s: filter mask=%pM\n", dev->name, mac_mask);
 965
 966        return 0;
 967}
 968
 969static int dvb_net_feed_start(struct net_device *dev)
 970{
 971        int ret = 0, i;
 972        struct dvb_net_priv *priv = netdev_priv(dev);
 973        struct dmx_demux *demux = priv->demux;
 974        unsigned char *mac = (unsigned char *) dev->dev_addr;
 975
 976        dprintk("%s: rx_mode %i\n", __func__, priv->rx_mode);
 977        mutex_lock(&priv->mutex);
 978        if (priv->tsfeed || priv->secfeed || priv->secfilter || priv->multi_secfilter[0])
 979                printk("%s: BUG %d\n", __func__, __LINE__);
 980
 981        priv->secfeed=NULL;
 982        priv->secfilter=NULL;
 983        priv->tsfeed = NULL;
 984
 985        if (priv->feedtype == DVB_NET_FEEDTYPE_MPE) {
 986                dprintk("%s: alloc secfeed\n", __func__);
 987                ret=demux->allocate_section_feed(demux, &priv->secfeed,
 988                                         dvb_net_sec_callback);
 989                if (ret<0) {
 990                        printk("%s: could not allocate section feed\n", dev->name);
 991                        goto error;
 992                }
 993
 994                ret = priv->secfeed->set(priv->secfeed, priv->pid, 32768, 1);
 995
 996                if (ret<0) {
 997                        printk("%s: could not set section feed\n", dev->name);
 998                        priv->demux->release_section_feed(priv->demux, priv->secfeed);
 999                        priv->secfeed=NULL;
1000                        goto error;
1001                }
1002
1003                if (priv->rx_mode != RX_MODE_PROMISC) {
1004                        dprintk("%s: set secfilter\n", __func__);
1005                        dvb_net_filter_sec_set(dev, &priv->secfilter, mac, mask_normal);
1006                }
1007
1008                switch (priv->rx_mode) {
1009                case RX_MODE_MULTI:
1010                        for (i = 0; i < priv->multi_num; i++) {
1011                                dprintk("%s: set multi_secfilter[%d]\n", __func__, i);
1012                                dvb_net_filter_sec_set(dev, &priv->multi_secfilter[i],
1013                                                       priv->multi_macs[i], mask_normal);
1014                        }
1015                        break;
1016                case RX_MODE_ALL_MULTI:
1017                        priv->multi_num=1;
1018                        dprintk("%s: set multi_secfilter[0]\n", __func__);
1019                        dvb_net_filter_sec_set(dev, &priv->multi_secfilter[0],
1020                                               mac_allmulti, mask_allmulti);
1021                        break;
1022                case RX_MODE_PROMISC:
1023                        priv->multi_num=0;
1024                        dprintk("%s: set secfilter\n", __func__);
1025                        dvb_net_filter_sec_set(dev, &priv->secfilter, mac, mask_promisc);
1026                        break;
1027                }
1028
1029                dprintk("%s: start filtering\n", __func__);
1030                priv->secfeed->start_filtering(priv->secfeed);
1031        } else if (priv->feedtype == DVB_NET_FEEDTYPE_ULE) {
1032                struct timespec timeout = { 0, 10000000 }; // 10 msec
1033
1034                /* we have payloads encapsulated in TS */
1035                dprintk("%s: alloc tsfeed\n", __func__);
1036                ret = demux->allocate_ts_feed(demux, &priv->tsfeed, dvb_net_ts_callback);
1037                if (ret < 0) {
1038                        printk("%s: could not allocate ts feed\n", dev->name);
1039                        goto error;
1040                }
1041
1042                /* Set netdevice pointer for ts decaps callback. */
1043                priv->tsfeed->priv = (void *)dev;
1044                ret = priv->tsfeed->set(priv->tsfeed,
1045                                        priv->pid, /* pid */
1046                                        TS_PACKET, /* type */
1047                                        DMX_TS_PES_OTHER, /* pes type */
1048                                        32768,     /* circular buffer size */
1049                                        timeout    /* timeout */
1050                                        );
1051
1052                if (ret < 0) {
1053                        printk("%s: could not set ts feed\n", dev->name);
1054                        priv->demux->release_ts_feed(priv->demux, priv->tsfeed);
1055                        priv->tsfeed = NULL;
1056                        goto error;
1057                }
1058
1059                dprintk("%s: start filtering\n", __func__);
1060                priv->tsfeed->start_filtering(priv->tsfeed);
1061        } else
1062                ret = -EINVAL;
1063
1064error:
1065        mutex_unlock(&priv->mutex);
1066        return ret;
1067}
1068
1069static int dvb_net_feed_stop(struct net_device *dev)
1070{
1071        struct dvb_net_priv *priv = netdev_priv(dev);
1072        int i, ret = 0;
1073
1074        dprintk("%s\n", __func__);
1075        mutex_lock(&priv->mutex);
1076        if (priv->feedtype == DVB_NET_FEEDTYPE_MPE) {
1077                if (priv->secfeed) {
1078                        if (priv->secfeed->is_filtering) {
1079                                dprintk("%s: stop secfeed\n", __func__);
1080                                priv->secfeed->stop_filtering(priv->secfeed);
1081                        }
1082
1083                        if (priv->secfilter) {
1084                                dprintk("%s: release secfilter\n", __func__);
1085                                priv->secfeed->release_filter(priv->secfeed,
1086                                                              priv->secfilter);
1087                                priv->secfilter=NULL;
1088                        }
1089
1090                        for (i=0; i<priv->multi_num; i++) {
1091                                if (priv->multi_secfilter[i]) {
1092                                        dprintk("%s: release multi_filter[%d]\n",
1093                                                __func__, i);
1094                                        priv->secfeed->release_filter(priv->secfeed,
1095                                                                      priv->multi_secfilter[i]);
1096                                        priv->multi_secfilter[i] = NULL;
1097                                }
1098                        }
1099
1100                        priv->demux->release_section_feed(priv->demux, priv->secfeed);
1101                        priv->secfeed = NULL;
1102                } else
1103                        printk("%s: no feed to stop\n", dev->name);
1104        } else if (priv->feedtype == DVB_NET_FEEDTYPE_ULE) {
1105                if (priv->tsfeed) {
1106                        if (priv->tsfeed->is_filtering) {
1107                                dprintk("%s: stop tsfeed\n", __func__);
1108                                priv->tsfeed->stop_filtering(priv->tsfeed);
1109                        }
1110                        priv->demux->release_ts_feed(priv->demux, priv->tsfeed);
1111                        priv->tsfeed = NULL;
1112                }
1113                else
1114                        printk("%s: no ts feed to stop\n", dev->name);
1115        } else
1116                ret = -EINVAL;
1117        mutex_unlock(&priv->mutex);
1118        return ret;
1119}
1120
1121
1122static int dvb_set_mc_filter(struct net_device *dev, unsigned char *addr)
1123{
1124        struct dvb_net_priv *priv = netdev_priv(dev);
1125
1126        if (priv->multi_num == DVB_NET_MULTICAST_MAX)
1127                return -ENOMEM;
1128
1129        memcpy(priv->multi_macs[priv->multi_num], addr, ETH_ALEN);
1130
1131        priv->multi_num++;
1132        return 0;
1133}
1134
1135
1136static void wq_set_multicast_list (struct work_struct *work)
1137{
1138        struct dvb_net_priv *priv =
1139                container_of(work, struct dvb_net_priv, set_multicast_list_wq);
1140        struct net_device *dev = priv->net;
1141
1142        dvb_net_feed_stop(dev);
1143        priv->rx_mode = RX_MODE_UNI;
1144        netif_addr_lock_bh(dev);
1145
1146        if (dev->flags & IFF_PROMISC) {
1147                dprintk("%s: promiscuous mode\n", dev->name);
1148                priv->rx_mode = RX_MODE_PROMISC;
1149        } else if ((dev->flags & IFF_ALLMULTI)) {
1150                dprintk("%s: allmulti mode\n", dev->name);
1151                priv->rx_mode = RX_MODE_ALL_MULTI;
1152        } else if (!netdev_mc_empty(dev)) {
1153                struct netdev_hw_addr *ha;
1154
1155                dprintk("%s: set_mc_list, %d entries\n",
1156                        dev->name, netdev_mc_count(dev));
1157
1158                priv->rx_mode = RX_MODE_MULTI;
1159                priv->multi_num = 0;
1160
1161                netdev_for_each_mc_addr(ha, dev)
1162                        dvb_set_mc_filter(dev, ha->addr);
1163        }
1164
1165        netif_addr_unlock_bh(dev);
1166        dvb_net_feed_start(dev);
1167}
1168
1169
1170static void dvb_net_set_multicast_list (struct net_device *dev)
1171{
1172        struct dvb_net_priv *priv = netdev_priv(dev);
1173        schedule_work(&priv->set_multicast_list_wq);
1174}
1175
1176
1177static void wq_restart_net_feed (struct work_struct *work)
1178{
1179        struct dvb_net_priv *priv =
1180                container_of(work, struct dvb_net_priv, restart_net_feed_wq);
1181        struct net_device *dev = priv->net;
1182
1183        if (netif_running(dev)) {
1184                dvb_net_feed_stop(dev);
1185                dvb_net_feed_start(dev);
1186        }
1187}
1188
1189
1190static int dvb_net_set_mac (struct net_device *dev, void *p)
1191{
1192        struct dvb_net_priv *priv = netdev_priv(dev);
1193        struct sockaddr *addr=p;
1194
1195        memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
1196
1197        if (netif_running(dev))
1198                schedule_work(&priv->restart_net_feed_wq);
1199
1200        return 0;
1201}
1202
1203
1204static int dvb_net_open(struct net_device *dev)
1205{
1206        struct dvb_net_priv *priv = netdev_priv(dev);
1207
1208        priv->in_use++;
1209        dvb_net_feed_start(dev);
1210        return 0;
1211}
1212
1213
1214static int dvb_net_stop(struct net_device *dev)
1215{
1216        struct dvb_net_priv *priv = netdev_priv(dev);
1217
1218        priv->in_use--;
1219        return dvb_net_feed_stop(dev);
1220}
1221
1222static const struct header_ops dvb_header_ops = {
1223        .create         = eth_header,
1224        .parse          = eth_header_parse,
1225        .rebuild        = eth_rebuild_header,
1226};
1227
1228
1229static const struct net_device_ops dvb_netdev_ops = {
1230        .ndo_open               = dvb_net_open,
1231        .ndo_stop               = dvb_net_stop,
1232        .ndo_start_xmit         = dvb_net_tx,
1233        .ndo_set_multicast_list = dvb_net_set_multicast_list,
1234        .ndo_set_mac_address    = dvb_net_set_mac,
1235        .ndo_change_mtu         = eth_change_mtu,
1236        .ndo_validate_addr      = eth_validate_addr,
1237};
1238
1239static void dvb_net_setup(struct net_device *dev)
1240{
1241        ether_setup(dev);
1242
1243        dev->header_ops         = &dvb_header_ops;
1244        dev->netdev_ops         = &dvb_netdev_ops;
1245        dev->mtu                = 4096;
1246
1247        dev->flags |= IFF_NOARP;
1248}
1249
1250static int get_if(struct dvb_net *dvbnet)
1251{
1252        int i;
1253
1254        for (i=0; i<DVB_NET_DEVICES_MAX; i++)
1255                if (!dvbnet->state[i])
1256                        break;
1257
1258        if (i == DVB_NET_DEVICES_MAX)
1259                return -1;
1260
1261        dvbnet->state[i]=1;
1262        return i;
1263}
1264
1265static int dvb_net_add_if(struct dvb_net *dvbnet, u16 pid, u8 feedtype)
1266{
1267        struct net_device *net;
1268        struct dvb_net_priv *priv;
1269        int result;
1270        int if_num;
1271
1272        if (feedtype != DVB_NET_FEEDTYPE_MPE && feedtype != DVB_NET_FEEDTYPE_ULE)
1273                return -EINVAL;
1274        if ((if_num = get_if(dvbnet)) < 0)
1275                return -EINVAL;
1276
1277        net = alloc_netdev(sizeof(struct dvb_net_priv), "dvb", dvb_net_setup);
1278        if (!net)
1279                return -ENOMEM;
1280
1281        if (dvbnet->dvbdev->id)
1282                snprintf(net->name, IFNAMSIZ, "dvb%d%u%d",
1283                         dvbnet->dvbdev->adapter->num, dvbnet->dvbdev->id, if_num);
1284        else
1285                /* compatibility fix to keep dvb0_0 format */
1286                snprintf(net->name, IFNAMSIZ, "dvb%d_%d",
1287                         dvbnet->dvbdev->adapter->num, if_num);
1288
1289        net->addr_len = 6;
1290        memcpy(net->dev_addr, dvbnet->dvbdev->adapter->proposed_mac, 6);
1291
1292        dvbnet->device[if_num] = net;
1293
1294        priv = netdev_priv(net);
1295        priv->net = net;
1296        priv->demux = dvbnet->demux;
1297        priv->pid = pid;
1298        priv->rx_mode = RX_MODE_UNI;
1299        priv->need_pusi = 1;
1300        priv->tscc = 0;
1301        priv->feedtype = feedtype;
1302        reset_ule(priv);
1303
1304        INIT_WORK(&priv->set_multicast_list_wq, wq_set_multicast_list);
1305        INIT_WORK(&priv->restart_net_feed_wq, wq_restart_net_feed);
1306        mutex_init(&priv->mutex);
1307
1308        net->base_addr = pid;
1309
1310        if ((result = register_netdev(net)) < 0) {
1311                dvbnet->device[if_num] = NULL;
1312                free_netdev(net);
1313                return result;
1314        }
1315        printk("dvb_net: created network interface %s\n", net->name);
1316
1317        return if_num;
1318}
1319
1320static int dvb_net_remove_if(struct dvb_net *dvbnet, unsigned long num)
1321{
1322        struct net_device *net = dvbnet->device[num];
1323        struct dvb_net_priv *priv;
1324
1325        if (!dvbnet->state[num])
1326                return -EINVAL;
1327        priv = netdev_priv(net);
1328        if (priv->in_use)
1329                return -EBUSY;
1330
1331        dvb_net_stop(net);
1332        flush_work_sync(&priv->set_multicast_list_wq);
1333        flush_work_sync(&priv->restart_net_feed_wq);
1334        printk("dvb_net: removed network interface %s\n", net->name);
1335        unregister_netdev(net);
1336        dvbnet->state[num]=0;
1337        dvbnet->device[num] = NULL;
1338        free_netdev(net);
1339
1340        return 0;
1341}
1342
1343static int dvb_net_do_ioctl(struct file *file,
1344                  unsigned int cmd, void *parg)
1345{
1346        struct dvb_device *dvbdev = file->private_data;
1347        struct dvb_net *dvbnet = dvbdev->priv;
1348
1349        if (((file->f_flags&O_ACCMODE)==O_RDONLY))
1350                return -EPERM;
1351
1352        switch (cmd) {
1353        case NET_ADD_IF:
1354        {
1355                struct dvb_net_if *dvbnetif = parg;
1356                int result;
1357
1358                if (!capable(CAP_SYS_ADMIN))
1359                        return -EPERM;
1360
1361                if (!try_module_get(dvbdev->adapter->module))
1362                        return -EPERM;
1363
1364                result=dvb_net_add_if(dvbnet, dvbnetif->pid, dvbnetif->feedtype);
1365                if (result<0) {
1366                        module_put(dvbdev->adapter->module);
1367                        return result;
1368                }
1369                dvbnetif->if_num=result;
1370                break;
1371        }
1372        case NET_GET_IF:
1373        {
1374                struct net_device *netdev;
1375                struct dvb_net_priv *priv_data;
1376                struct dvb_net_if *dvbnetif = parg;
1377
1378                if (dvbnetif->if_num >= DVB_NET_DEVICES_MAX ||
1379                    !dvbnet->state[dvbnetif->if_num])
1380                        return -EINVAL;
1381
1382                netdev = dvbnet->device[dvbnetif->if_num];
1383
1384                priv_data = netdev_priv(netdev);
1385                dvbnetif->pid=priv_data->pid;
1386                dvbnetif->feedtype=priv_data->feedtype;
1387                break;
1388        }
1389        case NET_REMOVE_IF:
1390        {
1391                int ret;
1392
1393                if (!capable(CAP_SYS_ADMIN))
1394                        return -EPERM;
1395                if ((unsigned long) parg >= DVB_NET_DEVICES_MAX)
1396                        return -EINVAL;
1397                ret = dvb_net_remove_if(dvbnet, (unsigned long) parg);
1398                if (!ret)
1399                        module_put(dvbdev->adapter->module);
1400                return ret;
1401        }
1402
1403        /* binary compatibility cruft */
1404        case __NET_ADD_IF_OLD:
1405        {
1406                struct __dvb_net_if_old *dvbnetif = parg;
1407                int result;
1408
1409                if (!capable(CAP_SYS_ADMIN))
1410                        return -EPERM;
1411
1412                if (!try_module_get(dvbdev->adapter->module))
1413                        return -EPERM;
1414
1415                result=dvb_net_add_if(dvbnet, dvbnetif->pid, DVB_NET_FEEDTYPE_MPE);
1416                if (result<0) {
1417                        module_put(dvbdev->adapter->module);
1418                        return result;
1419                }
1420                dvbnetif->if_num=result;
1421                break;
1422        }
1423        case __NET_GET_IF_OLD:
1424        {
1425                struct net_device *netdev;
1426                struct dvb_net_priv *priv_data;
1427                struct __dvb_net_if_old *dvbnetif = parg;
1428
1429                if (dvbnetif->if_num >= DVB_NET_DEVICES_MAX ||
1430                    !dvbnet->state[dvbnetif->if_num])
1431                        return -EINVAL;
1432
1433                netdev = dvbnet->device[dvbnetif->if_num];
1434
1435                priv_data = netdev_priv(netdev);
1436                dvbnetif->pid=priv_data->pid;
1437                break;
1438        }
1439        default:
1440                return -ENOTTY;
1441        }
1442        return 0;
1443}
1444
1445static long dvb_net_ioctl(struct file *file,
1446              unsigned int cmd, unsigned long arg)
1447{
1448        return dvb_usercopy(file, cmd, arg, dvb_net_do_ioctl);
1449}
1450
1451static int dvb_net_close(struct inode *inode, struct file *file)
1452{
1453        struct dvb_device *dvbdev = file->private_data;
1454        struct dvb_net *dvbnet = dvbdev->priv;
1455
1456        dvb_generic_release(inode, file);
1457
1458        if(dvbdev->users == 1 && dvbnet->exit == 1) {
1459                fops_put(file->f_op);
1460                file->f_op = NULL;
1461                wake_up(&dvbdev->wait_queue);
1462        }
1463        return 0;
1464}
1465
1466
1467static const struct file_operations dvb_net_fops = {
1468        .owner = THIS_MODULE,
1469        .unlocked_ioctl = dvb_net_ioctl,
1470        .open = dvb_generic_open,
1471        .release = dvb_net_close,
1472        .llseek = noop_llseek,
1473};
1474
1475static struct dvb_device dvbdev_net = {
1476        .priv = NULL,
1477        .users = 1,
1478        .writers = 1,
1479        .fops = &dvb_net_fops,
1480};
1481
1482
1483void dvb_net_release (struct dvb_net *dvbnet)
1484{
1485        int i;
1486
1487        dvbnet->exit = 1;
1488        if (dvbnet->dvbdev->users < 1)
1489                wait_event(dvbnet->dvbdev->wait_queue,
1490                                dvbnet->dvbdev->users==1);
1491
1492        dvb_unregister_device(dvbnet->dvbdev);
1493
1494        for (i=0; i<DVB_NET_DEVICES_MAX; i++) {
1495                if (!dvbnet->state[i])
1496                        continue;
1497                dvb_net_remove_if(dvbnet, i);
1498        }
1499}
1500EXPORT_SYMBOL(dvb_net_release);
1501
1502
1503int dvb_net_init (struct dvb_adapter *adap, struct dvb_net *dvbnet,
1504                  struct dmx_demux *dmx)
1505{
1506        int i;
1507
1508        dvbnet->demux = dmx;
1509
1510        for (i=0; i<DVB_NET_DEVICES_MAX; i++)
1511                dvbnet->state[i] = 0;
1512
1513        dvb_register_device (adap, &dvbnet->dvbdev, &dvbdev_net,
1514                             dvbnet, DVB_DEVICE_NET);
1515
1516        return 0;
1517}
1518EXPORT_SYMBOL(dvb_net_init);
1519