/*
 * DO NOT EDIT THIS FILE. It was generated from linux/if_tun.h.
 *
 * Copyright (c) 2013 The Chromium Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

/*
 *  Universal TUN/TAP device driver.
 *  Copyright (C) 1999-2000 Maxim Krasnyansky <max_mk@yahoo.com>
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 *  GNU General Public License for more details.
 */

#include <Python.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <net/if.h>
#include <linux/if_tun.h>

void _init_linux_if_tun_h(PyObject *m) {
  /* Read queue size */
  PyModule_AddIntMacro(m, TUN_READQ_SIZE);
  /* TUN device type flags: deprecated. Use IFF_TUN/IFF_TAP instead. */
  PyModule_AddIntMacro(m, TUN_TUN_DEV);
  PyModule_AddIntMacro(m, TUN_TAP_DEV);
  PyModule_AddIntMacro(m, TUN_TYPE_MASK);

  /* Ioctl defines */
  PyModule_AddIntMacro(m, TUNSETNOCSUM);
  PyModule_AddIntMacro(m, TUNSETDEBUG);
  PyModule_AddIntMacro(m, TUNSETIFF);
  PyModule_AddIntMacro(m, TUNSETPERSIST);
  PyModule_AddIntMacro(m, TUNSETOWNER);
  PyModule_AddIntMacro(m, TUNSETLINK);
  PyModule_AddIntMacro(m, TUNSETGROUP);
  PyModule_AddIntMacro(m, TUNGETFEATURES);
  PyModule_AddIntMacro(m, TUNSETOFFLOAD);
  PyModule_AddIntMacro(m, TUNSETTXFILTER);
  PyModule_AddIntMacro(m, TUNGETIFF);
  PyModule_AddIntMacro(m, TUNGETSNDBUF);
  PyModule_AddIntMacro(m, TUNSETSNDBUF);
  PyModule_AddIntMacro(m, TUNATTACHFILTER);
  PyModule_AddIntMacro(m, TUNDETACHFILTER);
  PyModule_AddIntMacro(m, TUNGETVNETHDRSZ);
  PyModule_AddIntMacro(m, TUNSETVNETHDRSZ);
  PyModule_AddIntMacro(m, TUNSETQUEUE);
  PyModule_AddIntMacro(m, TUNSETIFINDEX);
  PyModule_AddIntMacro(m, TUNGETFILTER);
  PyModule_AddIntMacro(m, TUNSETVNETLE);
  PyModule_AddIntMacro(m, TUNGETVNETLE);

  /* TUNSETIFF ifr flags */
  PyModule_AddIntMacro(m, IFF_TUN);
  PyModule_AddIntMacro(m, IFF_TAP);
  PyModule_AddIntMacro(m, IFF_NO_PI);
  /* This flag has no real effect */
  PyModule_AddIntMacro(m, IFF_ONE_QUEUE);
  PyModule_AddIntMacro(m, IFF_VNET_HDR);
  PyModule_AddIntMacro(m, IFF_TUN_EXCL);
  PyModule_AddIntMacro(m, IFF_MULTI_QUEUE);
  PyModule_AddIntMacro(m, IFF_ATTACH_QUEUE);
  PyModule_AddIntMacro(m, IFF_DETACH_QUEUE);
  /* read-only flag */
  PyModule_AddIntMacro(m, IFF_PERSIST);
  PyModule_AddIntMacro(m, IFF_NOFILTER);

  /* Socket options */
  PyModule_AddIntMacro(m, TUN_TX_TIMESTAMP);

  /* Features for GSO (TUNSETOFFLOAD). */
  PyModule_AddIntMacro(m, TUN_F_CSUM);
  PyModule_AddIntMacro(m, TUN_F_TSO4);
  PyModule_AddIntMacro(m, TUN_F_TSO6);
  PyModule_AddIntMacro(m, TUN_F_TSO_ECN);
  PyModule_AddIntMacro(m, TUN_F_UFO);

  /* Protocol info prepended to the packets (when IFF_NO_PI is not set) */
  PyModule_AddIntMacro(m, TUN_PKT_STRIP);
}
