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
 354#ifdef ULE_DEBUG
 355        /* The code inside ULE_DEBUG keeps a history of the last 100 TS cells processed. */
 356        static unsigned char ule_hist[100*TS_SZ];
 357        static unsigned char *ule_where = ule_hist, ule_dump;
 358#endif
 359
 360        /* For all TS cells in current buffer.
 361         * Appearently, we are called for every single TS cell.
 362         */
 363        for (ts = buf, ts_end = buf + buf_len; ts < ts_end; /* no default incr. */ ) {
 364
 365                if (new_ts) {
 366                        /* We are about to process a new TS cell. */
 367
 368#ifdef ULE_DEBUG
 369                        if (ule_where >= &ule_hist[100*TS_SZ]) ule_where = ule_hist;
 370                        memcpy( ule_where, ts, TS_SZ );
 371                        if (ule_dump) {
 372                                hexdump( ule_where, TS_SZ );
 373                                ule_dump = 0;
 374                        }
 375                        ule_where += TS_SZ;
 376#endif
 377
 378                        /* Check TS error conditions: sync_byte, transport_error_indicator, scrambling_control . */
 379                        if ((ts[0] != TS_SYNC) || (ts[1] & TS_TEI) || ((ts[3] & TS_SC) != 0)) {
 380                                printk(KERN_WARNING "%lu: Invalid TS cell: SYNC %#x, TEI %u, SC %#x.\n",
 381                                       priv->ts_count, ts[0], ts[1] & TS_TEI >> 7, ts[3] & 0xC0 >> 6);
 382
 383                                /* Drop partly decoded SNDU, reset state, resync on PUSI. */
 384                                if (priv->ule_skb) {
 385                                        dev_kfree_skb( priv->ule_skb );
 386                                        /* Prepare for next SNDU. */
 387                                        dev->stats.rx_errors++;
 388                                        dev->stats.rx_frame_errors++;
 389                                }
 390                                reset_ule(priv);
 391                                priv->need_pusi = 1;
 392
 393                                /* Continue with next TS cell. */
 394                                ts += TS_SZ;
 395                                priv->ts_count++;
 396                                continue;
 397                        }
 398
 399                        ts_remain = 184;
 400                        from_where = ts + 4;
 401                }
 402                /* Synchronize on PUSI, if required. */
 403                if (priv->need_pusi) {
 404                        if (ts[1] & TS_PUSI) {
 405                                /* Find beginning of first ULE SNDU in current TS cell. */
 406                                /* Synchronize continuity counter. */
 407                                priv->tscc = ts[3] & 0x0F;
 408                                /* There is a pointer field here. */
 409                                if (ts[4] > ts_remain) {
 410                                        printk(KERN_ERR "%lu: Invalid ULE packet "
 411                                               "(pointer field %d)\n", priv->ts_count, ts[4]);
 412                                        ts += TS_SZ;
 413                                        priv->ts_count++;
 414                                        continue;
 415                                }
 416                                /* Skip to destination of pointer field. */
 417                                from_where = &ts[5] + ts[4];
 418                                ts_remain -= 1 + ts[4];
 419                                skipped = 0;
 420                        } else {
 421                                skipped++;
 422                                ts += TS_SZ;
 423                                priv->ts_count++;
 424                                continue;
 425                        }
 426                }
 427
 428                if (new_ts) {
 429                        /* Check continuity counter. */
 430                        if ((ts[3] & 0x0F) == priv->tscc)
 431                                priv->tscc = (priv->tscc + 1) & 0x0F;
 432                        else {
 433                                /* TS discontinuity handling: */
 434                                printk(KERN_WARNING "%lu: TS discontinuity: got %#x, "
 435                                       "expected %#x.\n", priv->ts_count, ts[3] & 0x0F, priv->tscc);
 436                                /* Drop partly decoded SNDU, reset state, resync on PUSI. */
 437                                if (priv->ule_skb) {
 438                                        dev_kfree_skb( priv->ule_skb );
 439                                        /* Prepare for next SNDU. */
 440                                        // reset_ule(priv);  moved to below.
 441                                        dev->stats.rx_errors++;
 442                                        dev->stats.rx_frame_errors++;
 443                                }
 444                                reset_ule(priv);
 445                                /* skip to next PUSI. */
 446                                priv->need_pusi = 1;
 447                                continue;
 448                        }
 449                        /* If we still have an incomplete payload, but PUSI is
 450                         * set; some TS cells are missing.
 451                         * This is only possible here, if we missed exactly 16 TS
 452                         * cells (continuity counter wrap). */
 453                        if (ts[1] & TS_PUSI) {
 454                                if (! priv->need_pusi) {
 455                                        if (!(*from_where < (ts_remain-1)) || *from_where != priv->ule_sndu_remain) {
 456                                                /* Pointer field is invalid.  Drop this TS cell and any started ULE SNDU. */
 457                                                printk(KERN_WARNING "%lu: Invalid pointer "
 458                                                       "field: %u.\n", priv->ts_count, *from_where);
 459
 460                                                /* Drop partly decoded SNDU, reset state, resync on PUSI. */
 461                                                if (priv->ule_skb) {
 462                                                        dev_kfree_skb( priv->ule_skb );
 463                                                        dev->stats.rx_errors++;
 464                                                        dev->stats.rx_frame_errors++;
 465                                                }
 466                                                reset_ule(priv);
 467                                                priv->need_pusi = 1;
 468                                                continue;
 469                                        }
 470                                        /* Skip pointer field (we're processing a
 471                                         * packed payload). */
 472                                        from_where += 1;
 473                                        ts_remain -= 1;
 474                                } else
 475                                        priv->need_pusi = 0;
 476
 477                                if (priv->ule_sndu_remain > 183) {
 478                                        /* Current SNDU lacks more data than there could be available in the
 479                                         * current TS cell. */
 480                                        dev->stats.rx_errors++;
 481                                        dev->stats.rx_length_errors++;
 482                                        printk(KERN_WARNING "%lu: Expected %d more SNDU bytes, but "
 483                                               "got PUSI (pf %d, ts_remain %d).  Flushing incomplete payload.\n",
 484                                               priv->ts_count, priv->ule_sndu_remain, ts[4], ts_remain);
 485                                        dev_kfree_skb(priv->ule_skb);
 486                                        /* Prepare for next SNDU. */
 487                                        reset_ule(priv);
 488                                        /* Resync: go to where pointer field points to: start of next ULE SNDU. */
 489                                        from_where += ts[4];
 490                                        ts_remain -= ts[4];
 491                                }
 492                        }
 493                }
 494
 495                /* Check if new payload needs to be started. */
 496                if (priv->ule_skb == NULL) {
 497                        /* Start a new payload with skb.
 498                         * Find ULE header.  It is only guaranteed that the
 499                         * length field (2 bytes) is contained in the current
 500                         * TS.
 501                         * Check ts_remain has to be >= 2 here. */
 502                        if (ts_remain < 2) {
 503                                printk(KERN_WARNING "Invalid payload packing: only %d "
 504                                       "bytes left in TS.  Resyncing.\n", ts_remain);
 505                                priv->ule_sndu_len = 0;
 506                                priv->need_pusi = 1;
 507                                continue;
 508                        }
 509
 510                        if (! priv->ule_sndu_len) {
 511                                /* Got at least two bytes, thus extrace the SNDU length. */
 512                                priv->ule_sndu_len = from_where[0] << 8 | from_where[1];
 513                                if (priv->ule_sndu_len & 0x8000) {
 514                                        /* D-Bit is set: no dest mac present. */
 515                                        priv->ule_sndu_len &= 0x7FFF;
 516                                        priv->ule_dbit = 1;
 517                                } else
 518                                        priv->ule_dbit = 0;
 519
 520                                if (priv->ule_sndu_len < 5) {
 521                                        printk(KERN_WARNING "%lu: Invalid ULE SNDU length %u. "
 522                                               "Resyncing.\n", priv->ts_count, priv->ule_sndu_len);
 523                                        dev->stats.rx_errors++;
 524                                        dev->stats.rx_length_errors++;
 525                                        priv->ule_sndu_len = 0;
 526                                        priv->need_pusi = 1;
 527                                        new_ts = 1;
 528                                        ts += TS_SZ;
 529                                        priv->ts_count++;
 530                                        continue;
 531                                }
 532                                ts_remain -= 2; /* consume the 2 bytes SNDU length. */
 533                                from_where += 2;
 534                        }
 535
 536                        /*
 537                         * State of current TS:
 538                         *   ts_remain (remaining bytes in the current TS cell)
 539                         *   0  ule_type is not available now, we need the next TS cell
 540                         *   1  the first byte of the ule_type is present
 541                         * >=2  full ULE header present, maybe some payload data as well.
 542                         */
 543                        switch (ts_remain) {
 544                                case 1:
 545                                        priv->ule_sndu_type = from_where[0] << 8;
 546                                        priv->ule_sndu_type_1 = 1; /* first byte of ule_type is set. */
 547                                        ts_remain -= 1; from_where += 1;
 548                                        /* Continue w/ next TS. */
 549                                case 0:
 550                                        new_ts = 1;
 551                                        ts += TS_SZ;
 552                                        priv->ts_count++;
 553                                        continue;
 554
 555                                default: /* complete ULE header is present in current TS. */
 556                                        /* Extract ULE type field. */
 557                                        if (priv->ule_sndu_type_1) {
 558                                                priv->ule_sndu_type |= from_where[0];
 559                                                from_where += 1; /* points to payload start. */
 560                                                ts_remain -= 1;
 561                                        } else {
 562                                                /* Complete type is present in new TS. */
 563                                                priv->ule_sndu_type = from_where[0] << 8 | from_where[1];
 564                                                from_where += 2; /* points to payload start. */
 565                                                ts_remain -= 2;
 566                                        }
 567                                        break;
 568                        }
 569
 570                        /* Allocate the skb (decoder target buffer) with the correct size, as follows:
 571                         * prepare for the largest case: bridged SNDU with MAC address (dbit = 0). */
 572                        priv->ule_skb = dev_alloc_skb( priv->ule_sndu_len + ETH_HLEN + ETH_ALEN );
 573                        if (priv->ule_skb == NULL) {
 574                                printk(KERN_NOTICE "%s: Memory squeeze, dropping packet.\n",
 575                                       dev->name);
 576                                dev->stats.rx_dropped++;
 577                                return;
 578                        }
 579
 580                        /* This includes the CRC32 _and_ dest mac, if !dbit. */
 581                        priv->ule_sndu_remain = priv->ule_sndu_len;
 582                        priv->ule_skb->dev = dev;
 583                        /* Leave space for Ethernet or bridged SNDU header (eth hdr plus one MAC addr). */
 584                        skb_reserve( priv->ule_skb, ETH_HLEN + ETH_ALEN );
 585                }
 586
 587                /* Copy data into our current skb. */
 588                how_much = min(priv->ule_sndu_remain, (int)ts_remain);
 589                memcpy(skb_put(priv->ule_skb, how_much), from_where, how_much);
 590                priv->ule_sndu_remain -= how_much;
 591                ts_remain -= how_much;
 592                from_where += how_much;
 593
 594                /* Check for complete payload. */
 595                if (priv->ule_sndu_remain <= 0) {
 596                        /* Check CRC32, we've got it in our skb already. */
 597                        __be16 ulen = htons(priv->ule_sndu_len);
 598                        __be16 utype = htons(priv->ule_sndu_type);
 599                        const u8 *tail;
 600                        struct kvec iov[3] = {
 601                                { &ulen, sizeof ulen },
 602                                { &utype, sizeof utype },
 603                                { priv->ule_skb->data, priv->ule_skb->len - 4 }
 604                        };
 605                        u32 ule_crc = ~0L, expected_crc;
 606                        if (priv->ule_dbit) {
 607                                /* Set D-bit for CRC32 verification,
 608                                 * if it was set originally. */
 609                                ulen |= htons(0x8000);
 610                        }
 611
 612                        ule_crc = iov_crc32(ule_crc, iov, 3);
 613                        tail = skb_tail_pointer(priv->ule_skb);
 614                        expected_crc = *(tail - 4) << 24 |
 615                                       *(tail - 3) << 16 |
 616                                       *(tail - 2) << 8 |
 617                                       *(tail - 1);
 618                        if (ule_crc != expected_crc) {
 619                                printk(KERN_WARNING "%lu: CRC32 check FAILED: %08x / %08x, SNDU len %d type %#x, ts_remain %d, next 2: %x.\n",
 620                                       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);
 621
 622#ifdef ULE_DEBUG
 623                                hexdump( iov[0].iov_base, iov[0].iov_len );
 624                                hexdump( iov[1].iov_base, iov[1].iov_len );
 625                                hexdump( iov[2].iov_base, iov[2].iov_len );
 626
 627                                if (ule_where == ule_hist) {
 628                                        hexdump( &ule_hist[98*TS_SZ], TS_SZ );
 629                                        hexdump( &ule_hist[99*TS_SZ], TS_SZ );
 630                                } else if (ule_where == &ule_hist[TS_SZ]) {
 631                                        hexdump( &ule_hist[99*TS_SZ], TS_SZ );
 632                                        hexdump( ule_hist, TS_SZ );
 633                                } else {
 634                                        hexdump( ule_where - TS_SZ - TS_SZ, TS_SZ );
 635                                        hexdump( ule_where - TS_SZ, TS_SZ );
 636                                }
 637                                ule_dump = 1;
 638#endif
 639
 640                                dev->stats.rx_errors++;
 641                                dev->stats.rx_crc_errors++;
 642                                dev_kfree_skb(priv->ule_skb);
 643                        } else {
 644                                /* CRC32 verified OK. */
 645                                u8 dest_addr[ETH_ALEN];
 646                                static const u8 bc_addr[ETH_ALEN] =
 647                                        { [ 0 ... ETH_ALEN-1] = 0xff };
 648
 649                                /* CRC32 was OK. Remove it from skb. */
 650                                priv->ule_skb->tail -= 4;
 651                                priv->ule_skb->len -= 4;
 652
 653                                if (!priv->ule_dbit) {
 654                                        /*
 655                                         * The destination MAC address is the
 656                                         * next data in the skb.  It comes
 657                                         * before any extension headers.
 658                                         *
 659                                         * Check if the payload of this SNDU
 660                                         * should be passed up the stack.
 661                                         */
 662                                        register int drop = 0;
 663                                        if (priv->rx_mode != RX_MODE_PROMISC) {
 664                                                if (priv->ule_skb->data[0] & 0x01) {
 665                                                        /* multicast or broadcast */
 666                                                        if (memcmp(priv->ule_skb->data, bc_addr, ETH_ALEN)) {
 667                                                                /* multicast */
 668                                                                if (priv->rx_mode == RX_MODE_MULTI) {
 669                                                                        int i;
 670                                                                        for(i = 0; i < priv->multi_num && memcmp(priv->ule_skb->data, priv->multi_macs[i], ETH_ALEN); i++)
 671                                                                                ;
 672                                                                        if (i == priv->multi_num)
 673                                                                                drop = 1;
 674                                                                } else if (priv->rx_mode != RX_MODE_ALL_MULTI)
 675                                                                        drop = 1; /* no broadcast; */
 676                                                                /* else: all multicast mode: accept all multicast packets */
 677                                                        }
 678                                                        /* else: broadcast */
 679                                                }
 680                                                else if (memcmp(priv->ule_skb->data, dev->dev_addr, ETH_ALEN))
 681                                                        drop = 1;
 682                                                /* else: destination address matches the MAC address of our receiver device */
 683                                        }
 684                                        /* else: promiscuous mode; pass everything up the stack */
 685
 686                                        if (drop) {
 687#ifdef ULE_DEBUG
 688                                                dprintk("Dropping SNDU: MAC destination address does not match: dest addr: "MAC_ADDR_PRINTFMT", dev addr: "MAC_ADDR_PRINTFMT"\n",
 689                                                        MAX_ADDR_PRINTFMT_ARGS(priv->ule_skb->data), MAX_ADDR_PRINTFMT_ARGS(dev->dev_addr));
 690#endif
 691                                                dev_kfree_skb(priv->ule_skb);
 692                                                goto sndu_done;
 693                                        }
 694                                        else
 695                                        {
 696                                                skb_copy_from_linear_data(priv->ule_skb,
 697                                                              dest_addr,
 698                                                              ETH_ALEN);
 699                                                skb_pull(priv->ule_skb, ETH_ALEN);
 700                                        }
 701                                }
 702
 703                                /* Handle ULE Extension Headers. */
 704                                if (priv->ule_sndu_type < 1536) {
 705                                        /* There is an extension header.  Handle it accordingly. */
 706                                        int l = handle_ule_extensions(priv);
 707                                        if (l < 0) {
 708                                                /* Mandatory extension header unknown or TEST SNDU.  Drop it. */
 709                                                // printk( KERN_WARNING "Dropping SNDU, extension headers.\n" );
 710                                                dev_kfree_skb(priv->ule_skb);
 711                                                goto sndu_done;
 712                                        }
 713                                        skb_pull(priv->ule_skb, l);
 714                                }
 715
 716                                /*
 717                                 * Construct/assure correct ethernet header.
 718                                 * Note: in bridged mode (priv->ule_bridged !=
 719                                 * 0) we already have the (original) ethernet
 720                                 * header at the start of the payload (after
 721                                 * optional dest. address and any extension
 722                                 * headers).
 723                                 */
 724
 725                                if (!priv->ule_bridged) {
 726                                        skb_push(priv->ule_skb, ETH_HLEN);
 727                                        ethh = (struct ethhdr *)priv->ule_skb->data;
 728                                        if (!priv->ule_dbit) {
 729                                                 /* dest_addr buffer is only valid if priv->ule_dbit == 0 */
 730                                                memcpy(ethh->h_dest, dest_addr, ETH_ALEN);
 731                                                memset(ethh->h_source, 0, ETH_ALEN);
 732                                        }
 733                                        else /* zeroize source and dest */
 734                                                memset( ethh, 0, ETH_ALEN*2 );
 735
 736                                        ethh->h_proto = htons(priv->ule_sndu_type);
 737                                }
 738                                /* else:  skb is in correct state; nothing to do. */
 739                                priv->ule_bridged = 0;
 740
 741                                /* Stuff into kernel's protocol stack. */
 742                                priv->ule_skb->protocol = dvb_net_eth_type_trans(priv->ule_skb, dev);
 743                                /* If D-bit is set (i.e. destination MAC address not present),
 744                                 * receive the packet anyhow. */
 745                                /* if (priv->ule_dbit && skb->pkt_type == PACKET_OTHERHOST)
 746                                        priv->ule_skb->pkt_type = PACKET_HOST; */
 747                                dev->stats.rx_packets++;
 748                                dev->stats.rx_bytes += priv->ule_skb->len;
 749                                netif_rx(priv->ule_skb);
 750                        }
 751                        sndu_done:
 752                        /* Prepare for next SNDU. */
 753                        reset_ule(priv);
 754                }
 755
 756                /* More data in current TS (look at the bytes following the CRC32)? */
 757                if (ts_remain >= 2 && *((unsigned short *)from_where) != 0xFFFF) {
 758                        /* Next ULE SNDU starts right there. */
 759                        new_ts = 0;
 760                        priv->ule_skb = NULL;
 761                        priv->ule_sndu_type_1 = 0;
 762                        priv->ule_sndu_len = 0;
 763                        // printk(KERN_WARNING "More data in current TS: [%#x %#x %#x %#x]\n",
 764                        //      *(from_where + 0), *(from_where + 1),
 765                        //      *(from_where + 2), *(from_where + 3));
 766                        // printk(KERN_WARNING "ts @ %p, stopped @ %p:\n", ts, from_where + 0);
 767                        // hexdump(ts, 188);
 768                } else {
 769                        new_ts = 1;
 770                        ts += TS_SZ;
 771                        priv->ts_count++;
 772                        if (priv->ule_skb == NULL) {
 773                                priv->need_pusi = 1;
 774                                priv->ule_sndu_type_1 = 0;
 775                                priv->ule_sndu_len = 0;
 776                        }
 777                }
 778        }       /* for all available TS cells */
 779}
 780
 781static int dvb_net_ts_callback(const u8 *buffer1, size_t buffer1_len,
 782                               const u8 *buffer2, size_t buffer2_len,
 783                               struct dmx_ts_feed *feed, enum dmx_success success)
 784{
 785        struct net_device *dev = feed->priv;
 786
 787        if (buffer2)
 788                printk(KERN_WARNING "buffer2 not NULL: %p.\n", buffer2);
 789        if (buffer1_len > 32768)
 790                printk(KERN_WARNING "length > 32k: %zu.\n", buffer1_len);
 791        /* printk("TS callback: %u bytes, %u TS cells @ %p.\n",
 792                  buffer1_len, buffer1_len / TS_SZ, buffer1); */
 793        dvb_net_ule(dev, buffer1, buffer1_len);
 794        return 0;
 795}
 796
 797
 798static void dvb_net_sec(struct net_device *dev,
 799                        const u8 *pkt, int pkt_len)
 800{
 801        u8 *eth;
 802        struct sk_buff *skb;
 803        struct net_device_stats *stats = &dev->stats;
 804        int snap = 0;
 805
 806        /* note: pkt_len includes a 32bit checksum */
 807        if (pkt_len < 16) {
 808                printk("%s: IP/MPE packet length = %d too small.\n",
 809                        dev->name, pkt_len);
 810                stats->rx_errors++;
 811                stats->rx_length_errors++;
 812                return;
 813        }
 814/* it seems some ISPs manage to screw up here, so we have to
 815 * relax the error checks... */
 816#if 0
 817        if ((pkt[5] & 0xfd) != 0xc1) {
 818                /* drop scrambled or broken packets */
 819#else
 820        if ((pkt[5] & 0x3c) != 0x00) {
 821                /* drop scrambled */
 822#endif
 823                stats->rx_errors++;
 824                stats->rx_crc_errors++;
 825                return;
 826        }
 827        if (pkt[5] & 0x02) {
 828                /* handle LLC/SNAP, see rfc-1042 */
 829                if (pkt_len < 24 || memcmp(&pkt[12], "\xaa\xaa\x03\0\0\0", 6)) {
 830                        stats->rx_dropped++;
 831                        return;
 832                }
 833                snap = 8;
 834        }
 835        if (pkt[7]) {
 836                /* FIXME: assemble datagram from multiple sections */
 837                stats->rx_errors++;
 838                stats->rx_frame_errors++;
 839                return;
 840        }
 841
 842        /* we have 14 byte ethernet header (ip header follows);
 843         * 12 byte MPE header; 4 byte checksum; + 2 byte alignment, 8 byte LLC/SNAP
 844         */
 845        if (!(skb = dev_alloc_skb(pkt_len - 4 - 12 + 14 + 2 - snap))) {
 846                //printk(KERN_NOTICE "%s: Memory squeeze, dropping packet.\n", dev->name);
 847                stats->rx_dropped++;
 848                return;
 849        }
 850        skb_reserve(skb, 2);    /* longword align L3 header */
 851        skb->dev = dev;
 852
 853        /* copy L3 payload */
 854        eth = (u8 *) skb_put(skb, pkt_len - 12 - 4 + 14 - snap);
 855        memcpy(eth + 14, pkt + 12 + snap, pkt_len - 12 - 4 - snap);
 856
 857        /* create ethernet header: */
 858        eth[0]=pkt[0x0b];
 859        eth[1]=pkt[0x0a];
 860        eth[2]=pkt[0x09];
 861        eth[3]=pkt[0x08];
 862        eth[4]=pkt[0x04];
 863        eth[5]=pkt[0x03];
 864
 865        eth[6]=eth[7]=eth[8]=eth[9]=eth[10]=eth[11]=0;
 866
 867        if (snap) {
 868                eth[12] = pkt[18];
 869                eth[13] = pkt[19];
 870        } else {
 871                /* protocol numbers are from rfc-1700 or
 872                 * http://www.iana.org/assignments/ethernet-numbers
 873                 */
 874                if (pkt[12] >> 4 == 6) { /* version field from IP header */
 875                        eth[12] = 0x86; /* IPv6 */
 876                        eth[13] = 0xdd;
 877                } else {
 878                        eth[12] = 0x08; /* IPv4 */
 879                        eth[13] = 0x00;
 880                }
 881        }
 882
 883        skb->protocol = dvb_net_eth_type_trans(skb, dev);
 884
 885        stats->rx_packets++;
 886        stats->rx_bytes+=skb->len;
 887        netif_rx(skb);
 888}
 889
 890static int dvb_net_sec_callback(const u8 *buffer1, size_t buffer1_len,
 891                 const u8 *buffer2, size_t buffer2_len,
 892                 struct dmx_section_filter *filter,
 893                 enum dmx_success success)
 894{
 895        struct net_device *dev = filter->priv;
 896
 897        /**
 898         * we rely on the DVB API definition where exactly one complete
 899         * section is delivered in buffer1
 900         */
 901        dvb_net_sec (dev, buffer1, buffer1_len);
 902        return 0;
 903}
 904
 905static int dvb_net_tx(struct sk_buff *skb, struct net_device *dev)
 906{
 907        dev_kfree_skb(skb);
 908        return NETDEV_TX_OK;
 909}
 910
 911static u8 mask_normal[6]={0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
 912static u8 mask_allmulti[6]={0xff, 0xff, 0xff, 0x00, 0x00, 0x00};
 913static u8 mac_allmulti[6]={0x01, 0x00, 0x5e, 0x00, 0x00, 0x00};
 914static u8 mask_promisc[6]={0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
 915
 916static int dvb_net_filter_sec_set(struct net_device *dev,
 917                   struct dmx_section_filter **secfilter,
 918                   u8 *mac, u8 *mac_mask)
 919{
 920        struct dvb_net_priv *priv = netdev_priv(dev);
 921        int ret;
 922
 923        *secfilter=NULL;
 924        ret = priv->secfeed->allocate_filter(priv->secfeed, secfilter);
 925        if (ret<0) {
 926                printk("%s: could not get filter\n", dev->name);
 927                return ret;
 928        }
 929
 930        (*secfilter)->priv=(void *) dev;
 931
 932        memset((*secfilter)->filter_value, 0x00, DMX_MAX_FILTER_SIZE);
 933        memset((*secfilter)->filter_mask,  0x00, DMX_MAX_FILTER_SIZE);
 934        memset((*secfilter)->filter_mode,  0xff, DMX_MAX_FILTER_SIZE);
 935
 936        (*secfilter)->filter_value[0]=0x3e;
 937        (*secfilter)->filter_value[3]=mac[5];
 938        (*secfilter)->filter_value[4]=mac[4];
 939        (*secfilter)->filter_value[8]=mac[3];
 940        (*secfilter)->filter_value[9]=mac[2];
 941        (*secfilter)->filter_value[10]=mac[1];
 942        (*secfilter)->filter_value[11]=mac[0];
 943
 944        (*secfilter)->filter_mask[0] = 0xff;
 945        (*secfilter)->filter_mask[3] = mac_mask[5];
 946        (*secfilter)->filter_mask[4] = mac_mask[4];
 947        (*secfilter)->filter_mask[8] = mac_mask[3];
 948        (*secfilter)->filter_mask[9] = mac_mask[2];
 949        (*secfilter)->filter_mask[10] = mac_mask[1];
 950        (*secfilter)->filter_mask[11]=mac_mask[0];
 951
 952        dprintk("%s: filter mac=%02x %02x %02x %02x %02x %02x\n",
 953               dev->name, mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
 954        dprintk("%s: filter mask=%02x %02x %02x %02x %02x %02x\n",
 955               dev->name, mac_mask[0], mac_mask[1], mac_mask[2],
 956               mac_mask[3], mac_mask[4], mac_mask[5]);
 957
 958        return 0;
 959}
 960
 961static int dvb_net_feed_start(struct net_device *dev)
 962{
 963        int ret = 0, i;
 964        struct dvb_net_priv *priv = netdev_priv(dev);
 965        struct dmx_demux *demux = priv->demux;
 966        unsigned char *mac = (unsigned char *) dev->dev_addr;
 967
 968        dprintk("%s: rx_mode %i\n", __func__, priv->rx_mode);
 969        mutex_lock(&priv->mutex);
 970        if (priv->tsfeed || priv->secfeed || priv->secfilter || priv->multi_secfilter[0])
 971                printk("%s: BUG %d\n", __func__, __LINE__);
 972
 973        priv->secfeed=NULL;
 974        priv->secfilter=NULL;
 975        priv->tsfeed = NULL;
 976
 977        if (priv->feedtype == DVB_NET_FEEDTYPE_MPE) {
 978                dprintk("%s: alloc secfeed\n", __func__);
 979                ret=demux->allocate_section_feed(demux, &priv->secfeed,
 980                                         dvb_net_sec_callback);
 981                if (ret<0) {
 982                        printk("%s: could not allocate section feed\n", dev->name);
 983                        goto error;
 984                }
 985
 986                ret = priv->secfeed->set(priv->secfeed, priv->pid, 32768, 1);
 987
 988                if (ret<0) {
 989                        printk("%s: could not set section feed\n", dev->name);
 990                        priv->demux->release_section_feed(priv->demux, priv->secfeed);
 991                        priv->secfeed=NULL;
 992                        goto error;
 993                }
 994
 995                if (priv->rx_mode != RX_MODE_PROMISC) {
 996                        dprintk("%s: set secfilter\n", __func__);
 997                        dvb_net_filter_sec_set(dev, &priv->secfilter, mac, mask_normal);
 998                }
 999
1000                switch (priv->rx_mode) {
1001                case RX_MODE_MULTI:
1002                        for (i = 0; i < priv->multi_num; i++) {
1003                                dprintk("%s: set multi_secfilter[%d]\n", __func__, i);
1004                                dvb_net_filter_sec_set(dev, &priv->multi_secfilter[i],
1005                                                       priv->multi_macs[i], mask_normal);
1006                        }
1007                        break;
1008                case RX_MODE_ALL_MULTI:
1009                        priv->multi_num=1;
1010                        dprintk("%s: set multi_secfilter[0]\n", __func__);
1011                        dvb_net_filter_sec_set(dev, &priv->multi_secfilter[0],
1012                                               mac_allmulti, mask_allmulti);
1013                        break;
1014                case RX_MODE_PROMISC:
1015                        priv->multi_num=0;
1016                        dprintk("%s: set secfilter\n", __func__);
1017                        dvb_net_filter_sec_set(dev, &priv->secfilter, mac, mask_promisc);
1018                        break;
1019                }
1020
1021                dprintk("%s: start filtering\n", __func__);
1022                priv->secfeed->start_filtering(priv->secfeed);
1023        } else if (priv->feedtype == DVB_NET_FEEDTYPE_ULE) {
1024                struct timespec timeout = { 0, 10000000 }; // 10 msec
1025
1026                /* we have payloads encapsulated in TS */
1027                dprintk("%s: alloc tsfeed\n", __func__);
1028                ret = demux->allocate_ts_feed(demux, &priv->tsfeed, dvb_net_ts_callback);
1029                if (ret < 0) {
1030                        printk("%s: could not allocate ts feed\n", dev->name);
1031                        goto error;
1032                }
1033
1034                /* Set netdevice pointer for ts decaps callback. */
1035                priv->tsfeed->priv = (void *)dev;
1036                ret = priv->tsfeed->set(priv->tsfeed,
1037                                        priv->pid, /* pid */
1038                                        TS_PACKET, /* type */
1039                                        DMX_TS_PES_OTHER, /* pes type */
1040                                        32768,     /* circular buffer size */
1041                                        timeout    /* timeout */
1042                                        );
1043
1044                if (ret < 0) {
1045                        printk("%s: could not set ts feed\n", dev->name);
1046                        priv->demux->release_ts_feed(priv->demux, priv->tsfeed);
1047                        priv->tsfeed = NULL;
1048                        goto error;
1049                }
1050
1051                dprintk("%s: start filtering\n", __func__);
1052                priv->tsfeed->start_filtering(priv->tsfeed);
1053        } else
1054                ret = -EINVAL;
1055
1056error:
1057        mutex_unlock(&priv->mutex);
1058        return ret;
1059}
1060
1061static int dvb_net_feed_stop(struct net_device *dev)
1062{
1063        struct dvb_net_priv *priv = netdev_priv(dev);
1064        int i, ret = 0;
1065
1066        dprintk("%s\n", __func__);
1067        mutex_lock(&priv->mutex);
1068        if (priv->feedtype == DVB_NET_FEEDTYPE_MPE) {
1069                if (priv->secfeed) {
1070                        if (priv->secfeed->is_filtering) {
1071                                dprintk("%s: stop secfeed\n", __func__);
1072                                priv->secfeed->stop_filtering(priv->secfeed);
1073                        }
1074
1075                        if (priv->secfilter) {
1076                                dprintk("%s: release secfilter\n", __func__);
1077                                priv->secfeed->release_filter(priv->secfeed,
1078                                                              priv->secfilter);
1079                                priv->secfilter=NULL;
1080                        }
1081
1082                        for (i=0; i<priv->multi_num; i++) {
1083                                if (priv->multi_secfilter[i]) {
1084                                        dprintk("%s: release multi_filter[%d]\n",
1085                                                __func__, i);
1086                                        priv->secfeed->release_filter(priv->secfeed,
1087                                                                      priv->multi_secfilter[i]);
1088                                        priv->multi_secfilter[i] = NULL;
1089                                }
1090                        }
1091
1092                        priv->demux->release_section_feed(priv->demux, priv->secfeed);
1093                        priv->secfeed = NULL;
1094                } else
1095                        printk("%s: no feed to stop\n", dev->name);
1096        } else if (priv->feedtype == DVB_NET_FEEDTYPE_ULE) {
1097                if (priv->tsfeed) {
1098                        if (priv->tsfeed->is_filtering) {
1099                                dprintk("%s: stop tsfeed\n", __func__);
1100                                priv->tsfeed->stop_filtering(priv->tsfeed);
1101                        }
1102                        priv->demux->release_ts_feed(priv->demux, priv->tsfeed);
1103                        priv->tsfeed = NULL;
1104                }
1105                else
1106                        printk("%s: no ts feed to stop\n", dev->name);
1107        } else
1108                ret = -EINVAL;
1109        mutex_unlock(&priv->mutex);
1110        return ret;
1111}
1112
1113
1114static int dvb_set_mc_filter (struct net_device *dev, struct dev_mc_list *mc)
1115{
1116        struct dvb_net_priv *priv = netdev_priv(dev);
1117
1118        if (priv->multi_num == DVB_NET_MULTICAST_MAX)
1119                return -ENOMEM;
1120
1121        memcpy(priv->multi_macs[priv->multi_num], mc->dmi_addr, 6);
1122
1123        priv->multi_num++;
1124        return 0;
1125}
1126
1127
1128static void wq_set_multicast_list (struct work_struct *work)
1129{
1130        struct dvb_net_priv *priv =
1131                container_of(work, struct dvb_net_priv, set_multicast_list_wq);
1132        struct net_device *dev = priv->net;
1133
1134        dvb_net_feed_stop(dev);
1135        priv->rx_mode = RX_MODE_UNI;
1136        netif_addr_lock_bh(dev);
1137
1138        if (dev->flags & IFF_PROMISC) {
1139                dprintk("%s: promiscuous mode\n", dev->name);
1140                priv->rx_mode = RX_MODE_PROMISC;
1141        } else if ((dev->flags & IFF_ALLMULTI)) {
1142                dprintk("%s: allmulti mode\n", dev->name);
1143                priv->rx_mode = RX_MODE_ALL_MULTI;
1144        } else if (dev->mc_count) {
1145                int mci;
1146                struct dev_mc_list *mc;
1147
1148                dprintk("%s: set_mc_list, %d entries\n",
1149                        dev->name, dev->mc_count);
1150
1151                priv->rx_mode = RX_MODE_MULTI;
1152                priv->multi_num = 0;
1153
1154                for (mci = 0, mc=dev->mc_list;
1155                     mci < dev->mc_count;
1156                     mc = mc->next, mci++) {
1157                        dvb_set_mc_filter(dev, mc);
1158                }
1159        }
1160
1161        netif_addr_unlock_bh(dev);
1162        dvb_net_feed_start(dev);
1163}
1164
1165
1166static void dvb_net_set_multicast_list (struct net_device *dev)
1167{
1168        struct dvb_net_priv *priv = netdev_priv(dev);
1169        schedule_work(&priv->set_multicast_list_wq);
1170}
1171
1172
1173static void wq_restart_net_feed (struct work_struct *work)
1174{
1175        struct dvb_net_priv *priv =
1176                container_of(work, struct dvb_net_priv, restart_net_feed_wq);
1177        struct net_device *dev = priv->net;
1178
1179        if (netif_running(dev)) {
1180                dvb_net_feed_stop(dev);
1181                dvb_net_feed_start(dev);
1182        }
1183}
1184
1185
1186static int dvb_net_set_mac (struct net_device *dev, void *p)
1187{
1188        struct dvb_net_priv *priv = netdev_priv(dev);
1189        struct sockaddr *addr=p;
1190
1191        memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
1192
1193        if (netif_running(dev))
1194                schedule_work(&priv->restart_net_feed_wq);
1195
1196        return 0;
1197}
1198
1199
1200static int dvb_net_open(struct net_device *dev)
1201{
1202        struct dvb_net_priv *priv = netdev_priv(dev);
1203
1204        priv->in_use++;
1205        dvb_net_feed_start(dev);
1206        return 0;
1207}
1208
1209
1210static int dvb_net_stop(struct net_device *dev)
1211{
1212        struct dvb_net_priv *priv = netdev_priv(dev);
1213
1214        priv->in_use--;
1215        return dvb_net_feed_stop(dev);
1216}
1217
1218static const struct header_ops dvb_header_ops = {
1219        .create         = eth_header,
1220        .parse          = eth_header_parse,
1221        .rebuild        = eth_rebuild_header,
1222};
1223
1224
1225static const struct net_device_ops dvb_netdev_ops = {
1226        .ndo_open               = dvb_net_open,
1227        .ndo_stop               = dvb_net_stop,
1228        .ndo_start_xmit         = dvb_net_tx,
1229        .ndo_set_multicast_list = dvb_net_set_multicast_list,
1230        .ndo_set_mac_address    = dvb_net_set_mac,
1231        .ndo_change_mtu         = eth_change_mtu,
1232        .ndo_validate_addr      = eth_validate_addr,
1233};
1234
1235static void dvb_net_setup(struct net_device *dev)
1236{
1237        ether_setup(dev);
1238
1239        dev->header_ops         = &dvb_header_ops;
1240        dev->netdev_ops         = &dvb_netdev_ops;
1241        dev->mtu                = 4096;
1242        dev->mc_count           = 0;
1243
1244        dev->flags |= IFF_NOARP;
1245}
1246
1247static int get_if(struct dvb_net *dvbnet)
1248{
1249        int i;
1250
1251        for (i=0; i<DVB_NET_DEVICES_MAX; i++)
1252                if (!dvbnet->state[i])
1253                        break;
1254
1255        if (i == DVB_NET_DEVICES_MAX)
1256                return -1;
1257
1258        dvbnet->state[i]=1;
1259        return i;
1260}
1261
1262static int dvb_net_add_if(struct dvb_net *dvbnet, u16 pid, u8 feedtype)
1263{
1264        struct net_device *net;
1265        struct dvb_net_priv *priv;
1266        int result;
1267        int if_num;
1268
1269        if (feedtype != DVB_NET_FEEDTYPE_MPE && feedtype != DVB_NET_FEEDTYPE_ULE)
1270                return -EINVAL;
1271        if ((if_num = get_if(dvbnet)) < 0)
1272                return -EINVAL;
1273
1274        net = alloc_netdev(sizeof(struct dvb_net_priv), "dvb", dvb_net_setup);
1275        if (!net)
1276                return -ENOMEM;
1277
1278        if (dvbnet->dvbdev->id)
1279                snprintf(net->name, IFNAMSIZ, "dvb%d%u%d",
1280                         dvbnet->dvbdev->adapter->num, dvbnet->dvbdev->id, if_num);
1281        else
1282                /* compatibility fix to keep dvb0_0 format */
1283                snprintf(net->name, IFNAMSIZ, "dvb%d_%d",
1284                         dvbnet->dvbdev->adapter->num, if_num);
1285
1286        net->addr_len = 6;
1287        memcpy(net->dev_addr, dvbnet->dvbdev->adapter->proposed_mac, 6);
1288
1289        dvbnet->device[if_num] = net;
1290
1291        priv = netdev_priv(net);
1292        priv->net = net;
1293        priv->demux = dvbnet->demux;
1294        priv->pid = pid;
1295        priv->rx_mode = RX_MODE_UNI;
1296        priv->need_pusi = 1;
1297        priv->tscc = 0;
1298        priv->feedtype = feedtype;
1299        reset_ule(priv);
1300
1301        INIT_WORK(&priv->set_multicast_list_wq, wq_set_multicast_list);
1302        INIT_WORK(&priv->restart_net_feed_wq, wq_restart_net_feed);
1303        mutex_init(&priv->mutex);
1304
1305        net->base_addr = pid;
1306
1307        if ((result = register_netdev(net)) < 0) {
1308                dvbnet->device[if_num] = NULL;
1309                free_netdev(net);
1310                return result;
1311        }
1312        printk("dvb_net: created network interface %s\n", net->name);
1313
1314        return if_num;
1315}
1316
1317static int dvb_net_remove_if(struct dvb_net *dvbnet, unsigned long num)
1318{
1319        struct net_device *net = dvbnet->device[num];
1320        struct dvb_net_priv *priv;
1321
1322        if (!dvbnet->state[num])
1323                return -EINVAL;
1324        priv = netdev_priv(net);
1325        if (priv->in_use)
1326                return -EBUSY;
1327
1328        dvb_net_stop(net);
1329        flush_scheduled_work();
1330        printk("dvb_net: removed network interface %s\n", net->name);
1331        unregister_netdev(net);
1332        dvbnet->state[num]=0;
1333        dvbnet->device[num] = NULL;
1334        free_netdev(net);
1335
1336        return 0;
1337}
1338
1339static int dvb_net_do_ioctl(struct inode *inode, struct file *file,
1340                  unsigned int cmd, void *parg)
1341{
1342        struct dvb_device *dvbdev = file->private_data;
1343        struct dvb_net *dvbnet = dvbdev->priv;
1344
1345        if (((file->f_flags&O_ACCMODE)==O_RDONLY))
1346                return -EPERM;
1347
1348        switch (cmd) {
1349        case NET_ADD_IF:
1350        {
1351                struct dvb_net_if *dvbnetif = parg;
1352                int result;
1353
1354                if (!capable(CAP_SYS_ADMIN))
1355                        return -EPERM;
1356
1357                if (!try_module_get(dvbdev->adapter->module))
1358                        return -EPERM;
1359
1360                result=dvb_net_add_if(dvbnet, dvbnetif->pid, dvbnetif->feedtype);
1361                if (result<0) {
1362                        module_put(dvbdev->adapter->module);
1363                        return result;
1364                }
1365                dvbnetif->if_num=result;
1366                break;
1367        }
1368        case NET_GET_IF:
1369        {
1370                struct net_device *netdev;
1371                struct dvb_net_priv *priv_data;
1372                struct dvb_net_if *dvbnetif = parg;
1373
1374                if (dvbnetif->if_num >= DVB_NET_DEVICES_MAX ||
1375                    !dvbnet->state[dvbnetif->if_num])
1376                        return -EINVAL;
1377
1378                netdev = dvbnet->device[dvbnetif->if_num];
1379
1380                priv_data = netdev_priv(netdev);
1381                dvbnetif->pid=priv_data->pid;
1382                dvbnetif->feedtype=priv_data->feedtype;
1383                break;
1384        }
1385        case NET_REMOVE_IF:
1386        {
1387                int ret;
1388
1389                if (!capable(CAP_SYS_ADMIN))
1390                        return -EPERM;
1391                if ((unsigned long) parg >= DVB_NET_DEVICES_MAX)
1392                        return -EINVAL;
1393                ret = dvb_net_remove_if(dvbnet, (unsigned long) parg);
1394                if (!ret)
1395                        module_put(dvbdev->adapter->module);
1396                return ret;
1397        }
1398
1399        /* binary compatiblity cruft */
1400        case __NET_ADD_IF_OLD:
1401        {
1402                struct __dvb_net_if_old *dvbnetif = parg;
1403                int result;
1404
1405                if (!capable(CAP_SYS_ADMIN))
1406                        return -EPERM;
1407
1408                if (!try_module_get(dvbdev->adapter->module))
1409                        return -EPERM;
1410
1411                result=dvb_net_add_if(dvbnet, dvbnetif->pid, DVB_NET_FEEDTYPE_MPE);
1412                if (result<0) {
1413                        module_put(dvbdev->adapter->module);
1414                        return result;
1415                }
1416                dvbnetif->if_num=result;
1417                break;
1418        }
1419        case __NET_GET_IF_OLD:
1420        {
1421                struct net_device *netdev;
1422                struct dvb_net_priv *priv_data;
1423                struct __dvb_net_if_old *dvbnetif = parg;
1424
1425                if (dvbnetif->if_num >= DVB_NET_DEVICES_MAX ||
1426                    !dvbnet->state[dvbnetif->if_num])
1427                        return -EINVAL;
1428
1429                netdev = dvbnet->device[dvbnetif->if_num];
1430
1431                priv_data = netdev_priv(netdev);
1432                dvbnetif->pid=priv_data->pid;
1433                break;
1434        }
1435        default:
1436                return -ENOTTY;
1437        }
1438        return 0;
1439}
1440
1441static int dvb_net_ioctl(struct inode *inode, struct file *file,
1442              unsigned int cmd, unsigned long arg)
1443{
1444        return dvb_usercopy(inode, file, cmd, arg, dvb_net_do_ioctl);
1445}
1446
1447static int dvb_net_close(struct inode *inode, struct file *file)
1448{
1449        struct dvb_device *dvbdev = file->private_data;
1450        struct dvb_net *dvbnet = dvbdev->priv;
1451
1452        dvb_generic_release(inode, file);
1453
1454        if(dvbdev->users == 1 && dvbnet->exit == 1) {
1455                fops_put(file->f_op);
1456                file->f_op = NULL;
1457                wake_up(&dvbdev->wait_queue);
1458        }
1459        return 0;
1460}
1461
1462
1463static const struct file_operations dvb_net_fops = {
1464        .owner = THIS_MODULE,
1465        .ioctl = dvb_net_ioctl,
1466        .open = dvb_generic_open,
1467        .release = dvb_net_close,
1468};
1469
1470static struct dvb_device dvbdev_net = {
1471        .priv = NULL,
1472        .users = 1,
1473        .writers = 1,
1474        .fops = &dvb_net_fops,
1475};
1476
1477
1478void dvb_net_release (struct dvb_net *dvbnet)
1479{
1480        int i;
1481
1482        dvbnet->exit = 1;
1483        if (dvbnet->dvbdev->users < 1)
1484                wait_event(dvbnet->dvbdev->wait_queue,
1485                                dvbnet->dvbdev->users==1);
1486
1487        dvb_unregister_device(dvbnet->dvbdev);
1488
1489        for (i=0; i<DVB_NET_DEVICES_MAX; i++) {
1490                if (!dvbnet->state[i])
1491                        continue;
1492                dvb_net_remove_if(dvbnet, i);
1493        }
1494}
1495EXPORT_SYMBOL(dvb_net_release);
1496
1497
1498int dvb_net_init (struct dvb_adapter *adap, struct dvb_net *dvbnet,
1499                  struct dmx_demux *dmx)
1500{
1501        int i;
1502
1503        dvbnet->demux = dmx;
1504
1505        for (i=0; i<DVB_NET_DEVICES_MAX; i++)
1506                dvbnet->state[i] = 0;
1507
1508        dvb_register_device (adap, &dvbnet->dvbdev, &dvbdev_net,
1509                             dvbnet, DVB_DEVICE_NET);
1510
1511        return 0;
1512}
1513EXPORT_SYMBOL(dvb_net_init);
1514