/*
 * DO NOT EDIT THIS FILE. It was generated from linux/if.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.
 */

/*
 * INET         An implementation of the TCP/IP protocol suite for the LINUX
 *              operating system.  INET is implemented using the  BSD Socket
 *              interface as the means of communication with the user level.
 *
 *              Global definitions for the INET interface module.
 *
 * Version:     @(#)if.h        1.0.2   04/18/93
 *
 * Authors:     Original taken from Berkeley UNIX 4.3, (c) UCB 1982-1988
 *              Ross Biro
 *              Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
 *
 *              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.
 */

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

void _init_linux_if_h(PyObject *m) {
  PyModule_AddIntMacro(m, IFNAMSIZ);
  PyModule_AddIntMacro(m, IFALIASZ);

  /* Standard interface flags (netdevice->flags). */
  PyModule_AddIntMacro(m, IFF_UP);
  PyModule_AddIntMacro(m, IFF_BROADCAST);
  PyModule_AddIntMacro(m, IFF_DEBUG);
  PyModule_AddIntMacro(m, IFF_LOOPBACK);
  PyModule_AddIntMacro(m, IFF_POINTOPOINT);
  PyModule_AddIntMacro(m, IFF_NOTRAILERS);
  PyModule_AddIntMacro(m, IFF_RUNNING);
  PyModule_AddIntMacro(m, IFF_NOARP);
  PyModule_AddIntMacro(m, IFF_PROMISC);
  PyModule_AddIntMacro(m, IFF_ALLMULTI);

  PyModule_AddIntMacro(m, IFF_MASTER);
  PyModule_AddIntMacro(m, IFF_SLAVE);

  PyModule_AddIntMacro(m, IFF_MULTICAST);

  PyModule_AddIntMacro(m, IFF_PORTSEL);
  PyModule_AddIntMacro(m, IFF_AUTOMEDIA);
  PyModule_AddIntMacro(m, IFF_DYNAMIC);

  PyModule_AddIntMacro(m, IFF_LOWER_UP);
  PyModule_AddIntMacro(m, IFF_DORMANT);

  PyModule_AddIntMacro(m, IFF_ECHO);

  PyModule_AddIntMacro(m, IFF_VOLATILE);

  /* Private (from user) interface flags (netdevice->priv_flags). */
  PyModule_AddIntMacro(m, IFF_802_1Q_VLAN);
  PyModule_AddIntMacro(m, IFF_EBRIDGE);
  PyModule_AddIntMacro(m, IFF_SLAVE_INACTIVE);
  PyModule_AddIntMacro(m, IFF_MASTER_8023AD);
  PyModule_AddIntMacro(m, IFF_MASTER_ALB);
  PyModule_AddIntMacro(m, IFF_BONDING);
  PyModule_AddIntMacro(m, IFF_SLAVE_NEEDARP);
  PyModule_AddIntMacro(m, IFF_ISATAP);
  PyModule_AddIntMacro(m, IFF_MASTER_ARPMON);
  PyModule_AddIntMacro(m, IFF_WAN_HDLC);
  PyModule_AddIntMacro(m, IFF_XMIT_DST_RELEASE);
  PyModule_AddIntMacro(m, IFF_DONT_BRIDGE);
  PyModule_AddIntMacro(m, IFF_DISABLE_NETPOLL);
  PyModule_AddIntMacro(m, IFF_MACVLAN_PORT);
  PyModule_AddIntMacro(m, IFF_BRIDGE_PORT);
  PyModule_AddIntMacro(m, IFF_OVS_DATAPATH);
  PyModule_AddIntMacro(m, IFF_TX_SKB_SHARING);
  PyModule_AddIntMacro(m, IFF_UNICAST_FLT);
  PyModule_AddIntMacro(m, IFF_TEAM_PORT);
  PyModule_AddIntMacro(m, IFF_SUPP_NOFCS);

  PyModule_AddIntMacro(m, IF_GET_IFACE);
  PyModule_AddIntMacro(m, IF_GET_PROTO);

  /* For definitions see hdlc.h */
  PyModule_AddIntMacro(m, IF_IFACE_V35);
  PyModule_AddIntMacro(m, IF_IFACE_V24);
  PyModule_AddIntMacro(m, IF_IFACE_X21);
  PyModule_AddIntMacro(m, IF_IFACE_T1);
  PyModule_AddIntMacro(m, IF_IFACE_E1);
  PyModule_AddIntMacro(m, IF_IFACE_SYNC_SERIAL);
  PyModule_AddIntMacro(m, IF_IFACE_X21D);

  /* For definitions see hdlc.h */
  PyModule_AddIntMacro(m, IF_PROTO_HDLC);
  PyModule_AddIntMacro(m, IF_PROTO_PPP);
  PyModule_AddIntMacro(m, IF_PROTO_CISCO);
  PyModule_AddIntMacro(m, IF_PROTO_FR);
  PyModule_AddIntMacro(m, IF_PROTO_FR_ADD_PVC);
  PyModule_AddIntMacro(m, IF_PROTO_FR_DEL_PVC);
  PyModule_AddIntMacro(m, IF_PROTO_X25);
  PyModule_AddIntMacro(m, IF_PROTO_HDLC_ETH);
  PyModule_AddIntMacro(m, IF_PROTO_FR_ADD_ETH_PVC);
  PyModule_AddIntMacro(m, IF_PROTO_FR_DEL_ETH_PVC);
  PyModule_AddIntMacro(m, IF_PROTO_FR_PVC);
  PyModule_AddIntMacro(m, IF_PROTO_FR_ETH_PVC);
  PyModule_AddIntMacro(m, IF_PROTO_RAW);

  /* RFC 2863 operational status */
  PyModule_AddIntMacro(m, IF_OPER_UNKNOWN);
  PyModule_AddIntMacro(m, IF_OPER_NOTPRESENT);
  PyModule_AddIntMacro(m, IF_OPER_DOWN);
  PyModule_AddIntMacro(m, IF_OPER_LOWERLAYERDOWN);
  PyModule_AddIntMacro(m, IF_OPER_TESTING);
  PyModule_AddIntMacro(m, IF_OPER_DORMANT);
  PyModule_AddIntMacro(m, IF_OPER_UP);

  /* link modes */
  PyModule_AddIntMacro(m, IF_LINK_MODE_DEFAULT);
  PyModule_AddIntMacro(m, IF_LINK_MODE_DORMANT);
}
