ユーザ用ツール

サイト用ツール


mae3xx_devel:use_pyroute2:start

pyroute2 のよるネットワーク処理

アプリケーションを作成していて、下記のような処理をしたくなることも多いと思います。

  • ネットワークインターフェース の状態を取得
  • ネットワークイベント(インターフェースの UP/DOWN、PPP の接続・切断) の取得

安直に実装する場合、ifconfig, ip コマンドなどを実行して出力をパースする、という実装をしてしまうことも多いですが、
pyroute2 を利用することで Kernel からの Netlink Event を利用してイベントドリブンで処理をすることができます。


利用方法

pyroute2.IPDB モジュールを利用します。

In [1]: import pyroute2

In [2]: ipdb=pyroute2.IPDB()


インターフェース一覧の取得

In [14]: interfaces = dir(ipdb.interfaces)

In [15]: interfaces
Out[15]: 
['br0',
 'br1',
 'docker0',
 'enp30s0',
 'enp36s0',
 'lo',
 'lxcbr0',
 'lxdbr0',
... 中略 ...
 'virbr0',
 'wg0',
 'wg1']


あるインターフェースの情報取得

br0 の情報を取得してみます。

In [25]: br0 = ipdb.interfaces.br0

In [26]: dir(br0)
Out[26]: 
['address',
 'bond_active_slave',
 'bond_ad_actor_sys_prio',
 'bond_ad_actor_system',
 'bond_ad_info',
 'bond_ad_lacp_rate',
 'bond_ad_select',
 'bond_ad_user_port_key',
 'bond_all_slaves_active',
 'bond_arp_all_targets',
 'bond_arp_interval',
 'bond_arp_ip_target',
 'bond_arp_validate',
 'bond_downdelay',
 'bond_fail_over_mac',
 'bond_lp_interval',
 'bond_miimon',
 'bond_min_links',
 'bond_mode',
 'bond_num_peer_notif',
 'bond_packets_per_slave',
 'bond_primary',
 'bond_primary_reselect',
 'bond_resend_igmp',
 'bond_tlb_dynamic_lb',
 'bond_unspec',
 'bond_updelay',
 'bond_use_carrier',
 'bond_xmit_hash_policy',
 'br_ageing_time',
 'br_bridge_id',
 'br_fdb_flush',
 'br_forward_delay',
 'br_gc_timer',
 'br_group_addr',
 'br_group_fwd_mask',
 'br_hello_time',
 'br_hello_timer',
 'br_max_age',
 'br_mcast_hash_elasticity',
 'br_mcast_hash_max',
 'br_mcast_igmp_version',
 'br_mcast_last_member_cnt',
 'br_mcast_last_member_intvl',
 'br_mcast_membership_intvl',
 'br_mcast_mld_version',
 'br_mcast_querier',
 'br_mcast_querier_intvl',
 'br_mcast_query_intvl',
 'br_mcast_query_response_intvl',
 'br_mcast_query_use_ifaddr',
 'br_mcast_router',
 'br_mcast_snooping',
 'br_mcast_startup_query_cnt',
 'br_mcast_startup_query_intvl',
 'br_mcast_stats_enabled',
 'br_nf_call_arptables',
 'br_nf_call_ip6tables',
 'br_nf_call_iptables',
 'br_pad',
 'br_priority',
 'br_root_id',
 'br_root_path_cost',
 'br_root_port',
 'br_stp_state',
 'br_tcn_timer',
 'br_topology_change',
 'br_topology_change_detected',
 'br_topology_change_timer',
 'br_unspec',
 'br_vlan_default_pvid',
 'br_vlan_filtering',
 'br_vlan_protocol',
 'br_vlan_stats_enabled',
 'broadcast',
 'brport_bcast_flood',
 'brport_bridge_id',
 'brport_config_pending',
 'brport_cost',
 'brport_designated_cost',
 'brport_designated_port',
 'brport_fast_leave',
 'brport_flush',
 'brport_forward_delay_timer',
 'brport_guard',
 'brport_hold_timer',
 'brport_id',
 'brport_learning',
 'brport_learning_sync',
 'brport_mcast_flood',
 'brport_mcast_to_ucast',
 'brport_message_age_timer',
 'brport_mode',
 'brport_multicast_router',
 'brport_no',
 'brport_pad',
 'brport_priority',
 'brport_protect',
 'brport_proxyarp',
 'brport_proxyarp_wifi',
 'brport_root_id',
 'brport_state',
 'brport_topology_change_ack',
 'brport_unicast_flood',
 'brport_unspec',
 'brport_vlan_tunnel',
 'carrier',
 'carrier_changes',
 'carrier_down_count',
 'carrier_up_count',
 'cost',
 'ext_mask',
 'family',
 'flags',
 'gid',
 'gre_collect_metadata',
 'gre_encap_dport',
 'gre_encap_flags',
 'gre_encap_limit',
 'gre_encap_sport',
 'gre_encap_type',
 'gre_flags',
 'gre_flowinfo',
 'gre_fwmark',
 'gre_iflags',
 'gre_ignore_df',
 'gre_ikey',
 'gre_link',
 'gre_local',
 'gre_oflags',
 'gre_okey',
 'gre_pmtudisc',
 'gre_remote',
 'gre_tos',
 'gre_ttl',
 'gre_unspec',
 'group',
 'gso_max_segs',
 'gso_max_size',
 'if_netnsid',
 'ifalias',
 'ifi_type',
 'ifname',
 'ifr',
 'index',
 'ip6gre_encap_dport',
 'ip6gre_encap_flags',
 'ip6gre_encap_limit',
 'ip6gre_encap_sport',
 'ip6gre_encap_type',
 'ip6gre_flags',
 'ip6gre_flowinfo',
 'ip6gre_iflags',
 'ip6gre_ikey',
 'ip6gre_link',
 'ip6gre_local',
 'ip6gre_oflags',
 'ip6gre_okey',
 'ip6gre_pmtudisc',
 'ip6gre_remote',
 'ip6gre_tos',
 'ip6gre_ttl',
 'ip6gre_unspec',
 'ipaddr',
 'ipdb_priority',
 'ipdb_scope',
 'ipvlan_mode',
 'ipvlan_unspec',
 'kind',
 'link',
 'link_netnsid',
 'linkmode',
 'macvlan_flags',
 'macvlan_macaddr',
 'macvlan_macaddr_count',
 'macvlan_macaddr_data',
 'macvlan_macaddr_mode',
 'macvlan_mode',
 'macvlan_unspec',
 'macvtap_flags',
 'macvtap_macaddr',
 'macvtap_macaddr_count',
 'macvtap_macaddr_data',
 'macvtap_macaddr_mode',
 'macvtap_mode',
 'macvtap_unspec',
 'master',
 'mode',
 'mtu',
 'neighbours',
 'net_ns_fd',
 'net_ns_pid',
 'new_ifindex',
 'new_netnsid',
 'num_rx_queues',
 'num_tx_queues',
 'num_vf',
 'operstate',
 'pad',
 'peer',
 'phys_port_id',
 'phys_port_name',
 'phys_switch_id',
 'port_self',
 'ports',
 'priority',
 'promiscuity',
 'proto_down',
 'qdisc',
 'state',
 'txqlen',
 'uid',
 'unknown',
 'unspec',
 'vf_ports',
 'vfinfo_list',
 'vlan_flags',
 'vlan_id',
 'vlan_protocol',
 'vlans',
 'vrf_table',
 'vrf_unspec',
 'vti_ikey',
 'vti_link',
 'vti_local',
 'vti_okey',
 'vti_remote',
 'vti_unspec',
 'vxlan_ageing',
 'vxlan_collect_metadata',
 'vxlan_df',
 'vxlan_gbp',
 'vxlan_gpe',
 'vxlan_group',
 'vxlan_group6',
 'vxlan_id',
 'vxlan_l2miss',
 'vxlan_l3miss',
 'vxlan_label',
 'vxlan_learning',
 'vxlan_limit',
 'vxlan_link',
 'vxlan_local',
 'vxlan_local6',
 'vxlan_port',
 'vxlan_port_range',
 'vxlan_proxy',
 'vxlan_remcsum_nopartial',
 'vxlan_remcsum_rx',
 'vxlan_remcsum_tx',
 'vxlan_rsc',
 'vxlan_tos',
 'vxlan_ttl',
 'vxlan_ttl_inherit',
 'vxlan_udp_csum',
 'vxlan_udp_zero_csum6_rx',
 'vxlan_udp_zero_csum6_tx',
 'vxlan_unspec',
 'weight',
 'wireless',
 'xdp']

br0 関係で取得できる全情報のキーは上記の通りのようです。

たとえば、インターフェースがリンクアップしているかどうかは、operstate で取得できます。

In [27]: br0.operstate
Out[27]: 'UP'

IP Address は、ipaddr で取得できます。

In [39]: ipdb.interfaces.lo.ipaddr
Out[39]: (('127.0.0.1', 8), ('::1', 128))


eventloop() によりイベントが発生するたびに処理が可能です。

In [40]: for event in ipdb.eventloop():
    ...:     print(event)
    ...: 
{'family': 2, '__pad': (), 'ifindex': 4, 'state': 4, 'flags': 0, 'ndm_type': 1, 'attrs': [('NDA_DST', '192.168.103.161'), ('NDA_LLADDR', '64:31:50:d2:4d:0a'), ('NDA_PROBES', 1), ('NDA_CACHEINFO', {'ndm_confirmed': 1637, 'ndm_used': 2851, 'ndm_updated': 0, 'ndm_refcnt': 1})], 'header': {'length': 76, 'type': 28, 'flags': 0, 'sequence_number': 0, 'pid': 0, 'error': None, 'stats': Stats(qsize=0, delta=0, delay=0)}, 'event': 'RTM_NEWNEIGH'}
{'family': 2, '__pad': (), 'ifindex': 4, 'state': 16, 'flags': 0, 'ndm_type': 1, 'attrs': [('NDA_DST', '192.168.103.191'), ('NDA_LLADDR', '00:e0:4c:68:02:00'), ('NDA_PROBES', 1), ('NDA_CACHEINFO', {'ndm_confirmed': 523, 'ndm_used': 523, 'ndm_updated': 0, 'ndm_refcnt': 2})], 'header': {'length': 76, 'type': 28, 'flags': 0, 'sequence_number': 0, 'pid': 0, 'error': None, 'stats': Stats(qsize=0, delta=0, delay=0)}, 'event': 'RTM_NEWNEIGH'}
{'family': 2, '__pad': (), 'ifindex': 4, 'state': 2, 'flags': 0, 'ndm_type': 1, 'attrs': [('NDA_DST', '192.168.103.191'), ('NDA_LLADDR', '00:e0:4c:68:02:00'), ('NDA_PROBES', 1), ('NDA_CACHEINFO', {'ndm_confirmed': 0, 'ndm_used': 523, 'ndm_updated': 0, 'ndm_refcnt': 2})], 'header': {'length': 76, 'type': 28, 'flags': 0, 'sequence_number': 0, 'pid': 0, 'error': None, 'stats': Stats(qsize=0, delta=0, delay=0)}, 'event': 'RTM_NEWNEIGH'}
...

event には下記のようなものがあります。([参照] https://linuxjm.osdn.jp/html/LDP_man-pages/man7/rtnetlink.7.html)

event 内容
RTM_NEWLINKネットワークインターフェースの生成
RTM_DELLINKネットワークインターフェースの削除
RTM_NEWADDRインターフェースの IP アドレスの追加
RTM_DELADDRインターフェースの IP アドレスの削除
RTM_NEWROUTEネットワーク経路の生成
RTM_DELROUTEネットワーク経路の削除
RTM_NEWNEIGH近傍テーブル (neighbor table) のエントリー (例えば ARP エントリー) の追加
RTM_DELNEIGH近傍テーブル (neighbor table) のエントリー (例えば ARP エントリー) の削除
RTM_NEWRULEルーティングルールの追加
RTM_DELRULEルーティングルールの削除
RTM_NEWQDISCキューイングルールの追加
RTM_DELQDISCキューイングルールの削除
RTM_NEWTCLASSトラフィッククラスの追加
RTM_DELTCLASSトラフィッククラスの削除
RTM_NEWTFILTERトラフィックフィルターの追加
RTM_DELTFILTERトラフィックフィルターの削除


PPP の接続・切断の監視をする場合、次のようなスクリプトでイベントをフィルタリングすることで監視ができます。

#! /usr/bin/env python3

import pprint
import pyroute2

pp = pprint.PrettyPrinter(indent=2)
ipdb = pyroute2.IPDB()

for event in ipdb.eventloop():
    for attr in event.get("attrs", []):
        if attr[0] == "IFLA_IFNAME" and attr[1].startswith("ppp"):
            print("- event : {}".format(event["event"]))
            pp.pprint(event)
            print("")


実際に PPP 接続を行ってみると、次のようにイベントが飛んできます。

  • 接続時
- event : RTM_NEWLINK
{ '__align': (),
  'attrs': [ ('IFLA_IFNAME', 'ppp0'),
             ('IFLA_TXQLEN', 3),
             ('IFLA_OPERSTATE', 'DOWN'),
             ('IFLA_LINKMODE', 0),
             ('IFLA_MTU', 1500),
             ('UNKNOWN', {'header': {'length': 8, 'type': 50}}),
             ('UNKNOWN', {'header': {'length': 8, 'type': 51}}),
             ('IFLA_GROUP', 0),
             ('IFLA_PROMISCUITY', 0),
             ('IFLA_NUM_TX_QUEUES', 1),
             ('IFLA_GSO_MAX_SEGS', 65535),
             ('IFLA_GSO_MAX_SIZE', 65536),
             ('IFLA_CARRIER', 1),
             ('IFLA_QDISC', 'noop'),
             ('IFLA_CARRIER_CHANGES', 0),
             ('IFLA_PROTO_DOWN', 0),
             ('IFLA_CARRIER_UP_COUNT', 0),
             ('IFLA_CARRIER_DOWN_COUNT', 0),
             ('IFLA_MAP', {'mem_start': 0, 'mem_end': 0, 'base_addr': 0, 'irq': 0, 'dma': 0, 'port': 0}),
             ('IFLA_STATS64', {'rx_packets': 0, 'tx_packets': 0, 'rx_bytes': 0, 'tx_bytes': 0, 'rx_errors': 0, 'tx_errors': 0, 'rx_dropped': 0, 'tx_dropped': 0, 'multicast': 0, 'collisions': 0, 'rx_length_errors': 0, 'rx_over_errors': 0, 'rx_crc_errors': 0, 'rx_frame_errors': 0, 'rx_fifo_errors': 0, 'rx_missed_errors': 0, 'tx_aborted_errors': 0, 'tx_carrier_errors': 0, 'tx_fifo_errors': 0, 'tx_heartbeat_errors': 0, 'tx_window_errors': 0, 'rx_compressed': 0, 'tx_compressed': 0}),
             ('IFLA_STATS', {'rx_packets': 0, 'tx_packets': 0, 'rx_bytes': 0, 'tx_bytes': 0, 'rx_errors': 0, 'tx_errors': 0, 'rx_dropped': 0, 'tx_dropped': 0, 'multicast': 0, 'collisions': 0, 'rx_length_errors': 0, 'rx_over_errors': 0, 'rx_crc_errors': 0, 'rx_frame_errors': 0, 'rx_fifo_errors': 0, 'rx_missed_errors': 0, 'tx_aborted_errors': 0, 'tx_carrier_errors': 0, 'tx_fifo_errors': 0, 'tx_heartbeat_errors': 0, 'tx_window_errors': 0, 'rx_compressed': 0, 'tx_compressed': 0}),
             ('IFLA_XDP', '05:00:02:00:00:00:00:00'),
             ('IFLA_LINKINFO', {'attrs': [('IFLA_INFO_KIND', 'ppp'), ('IFLA_INFO_DATA', '')]}),
             ('IFLA_AF_SPEC', {'attrs': [('AF_INET', {'dummy': 65668, 'forwarding': 1, 'mc_forwarding': 0, 'proxy_arp': 0, 'accept_redirects': 1, 'secure_redirects': 1, 'send_redirects': 1, 'shared_media': 1, 'rp_filter': 1, 'accept_source_route': 1, 'bootp_relay': 0, 'log_martians': 0, 'tag': 0, 'arpfilter': 0, 'medium_id': 0, 'noxfrm': 0, 'nopolicy': 0, 'force_igmp_version': 0, 'arp_announce': 0, 'arp_ignore': 0, 'promote_secondaries': 0, 'arp_accept': 0, 'arp_notify': 0, 'accept_local': 0, 'src_vmark': 0, 'proxy_arp_pvlan': 0, 'route_localnet': 0, 'igmpv2_unsolicited_report_interval': 10000, 'igmpv3_unsolicited_report_interval': 1000}), ('AF_INET6', {'attrs': [('IFLA_INET6_FLAGS', 0), ('IFLA_INET6_CACHEINFO', {'max_reasm_len': 65535, 'tstamp': 2027016, 'reachable_time': 38528, 'retrans_time': 1000}), ('IFLA_INET6_CONF', {'forwarding': 1, 'hop_limit': 64, 'mtu': 1500, 'accept_ra': 1, 'accept_redirects': 1, 'autoconf': 1, 'dad_transmits': 1, 'router_solicitations': 4294967295, 'router_solicitation_interval': 4000, 'router_solicitation_delay': 1000, 'use_tempaddr': 2, 'temp_valid_lft': 604800, 'temp_preferred_lft': 86400, 'regen_max_retry': 3, 'max_desync_factor': 600, 'max_addresses': 16, 'force_mld_version': 0, 'accept_ra_defrtr': 1, 'accept_ra_pinfo': 1, 'accept_ra_rtr_pref': 1, 'router_probe_interval': 60000, 'accept_ra_rt_info_max_plen': 0, 'proxy_ndp': 0, 'optimistic_dad': 0, 'accept_source_route': 0, 'mc_forwarding': 0, 'disable_ipv6': 0, 'accept_dad': 4294967295, 'force_tllao': 0, 'ndisc_notify': 0}), ('IFLA_INET6_STATS', {'num': 37, 'inpkts': 0, 'inoctets': 0, 'indelivers': 0, 'outforwdatagrams': 0, 'outpkts': 0, 'outoctets': 0, 'inhdrerrors': 0, 'intoobigerrors': 0, 'innoroutes': 0, 'inaddrerrors': 0, 'inunknownprotos': 0, 'intruncatedpkts': 0, 'indiscards': 0, 'outdiscards': 0, 'outnoroutes': 0, 'reasmtimeout': 0, 'reasmreqds': 0, 'reasmoks': 0, 'reasmfails': 0, 'fragoks': 0, 'fragfails': 0, 'fragcreates': 0, 'inmcastpkts': 0, 'outmcastpkts': 0, 'inbcastpkts': 0, 'outbcastpkts': 0, 'inmcastoctets': 0, 'outmcastoctets': 0, 'inbcastoctets': 0, 'outbcastoctets': 0, 'csumerrors': 0, 'noectpkts': 0, 'ect1pkts': 0, 'ect0pkts': 0, 'cepkts': 0}), ('IFLA_INET6_ICMP6STATS', {'num': 6, 'inmsgs': 0, 'inerrors': 0, 'outmsgs': 0, 'outerrors': 0, 'csumerrors': 0}), ('IFLA_INET6_TOKEN', '::'), ('IFLA_INET6_ADDR_GEN_MODE', 0)]})]})],
  'change': 4294967295,
  'event': 'RTM_NEWLINK',
  'family': 0,
  'flags': 4240,
  'header': { 'error': None,
              'flags': 0,
              'length': 1304,
              'pid': 0,
              'sequence_number': 0,
              'stats': Stats(qsize=0, delta=0, delay=0),
              'type': 16},
  'ifi_type': 512,
  'index': 10,
  'state': 'down'}

- event : RTM_NEWLINK
{ '__align': (),
  'attrs': [ ('IFLA_IFNAME', 'ppp0'),
             ('IFLA_TXQLEN', 3),
             ('IFLA_OPERSTATE', 'UNKNOWN'),
             ('IFLA_LINKMODE', 0),
             ('IFLA_MTU', 1500),
             ('UNKNOWN', {'header': {'length': 8, 'type': 50}}),
             ('UNKNOWN', {'header': {'length': 8, 'type': 51}}),
             ('IFLA_GROUP', 0),
             ('IFLA_PROMISCUITY', 0),
             ('IFLA_NUM_TX_QUEUES', 1),
             ('IFLA_GSO_MAX_SEGS', 65535),
             ('IFLA_GSO_MAX_SIZE', 65536),
             ('IFLA_CARRIER', 1),
             ('IFLA_QDISC', 'pfifo_fast'),
             ('IFLA_CARRIER_CHANGES', 0),
             ('IFLA_PROTO_DOWN', 0),
             ('IFLA_CARRIER_UP_COUNT', 0),
             ('IFLA_CARRIER_DOWN_COUNT', 0),
             ('IFLA_MAP', {'mem_start': 0, 'mem_end': 0, 'base_addr': 0, 'irq': 0, 'dma': 0, 'port': 0}),
             ('IFLA_STATS64', {'rx_packets': 4, 'tx_packets': 4, 'rx_bytes': 52, 'tx_bytes': 58, 'rx_errors': 0, 'tx_errors': 0, 'rx_dropped': 0, 'tx_dropped': 0, 'multicast': 0, 'collisions': 0, 'rx_length_errors': 0, 'rx_over_errors': 0, 'rx_crc_errors': 0, 'rx_frame_errors': 0, 'rx_fifo_errors': 0, 'rx_missed_errors': 0, 'tx_aborted_errors': 0, 'tx_carrier_errors': 0, 'tx_fifo_errors': 0, 'tx_heartbeat_errors': 0, 'tx_window_errors': 0, 'rx_compressed': 0, 'tx_compressed': 0}),
             ('IFLA_STATS', {'rx_packets': 4, 'tx_packets': 4, 'rx_bytes': 52, 'tx_bytes': 58, 'rx_errors': 0, 'tx_errors': 0, 'rx_dropped': 0, 'tx_dropped': 0, 'multicast': 0, 'collisions': 0, 'rx_length_errors': 0, 'rx_over_errors': 0, 'rx_crc_errors': 0, 'rx_frame_errors': 0, 'rx_fifo_errors': 0, 'rx_missed_errors': 0, 'tx_aborted_errors': 0, 'tx_carrier_errors': 0, 'tx_fifo_errors': 0, 'tx_heartbeat_errors': 0, 'tx_window_errors': 0, 'rx_compressed': 0, 'tx_compressed': 0}),
             ('IFLA_XDP', '05:00:02:00:00:00:00:00'),
             ('IFLA_LINKINFO', {'attrs': [('IFLA_INFO_KIND', 'ppp'), ('IFLA_INFO_DATA', '')]}),
             ('IFLA_AF_SPEC', {'attrs': [('AF_INET', {'dummy': 65668, 'forwarding': 1, 'mc_forwarding': 0, 'proxy_arp': 0, 'accept_redirects': 1, 'secure_redirects': 1, 'send_redirects': 1, 'shared_media': 1, 'rp_filter': 1, 'accept_source_route': 1, 'bootp_relay': 0, 'log_martians': 0, 'tag': 0, 'arpfilter': 0, 'medium_id': 0, 'noxfrm': 0, 'nopolicy': 0, 'force_igmp_version': 0, 'arp_announce': 0, 'arp_ignore': 0, 'promote_secondaries': 0, 'arp_accept': 0, 'arp_notify': 0, 'accept_local': 0, 'src_vmark': 0, 'proxy_arp_pvlan': 0, 'route_localnet': 0, 'igmpv2_unsolicited_report_interval': 10000, 'igmpv3_unsolicited_report_interval': 1000}), ('AF_INET6', {'attrs': [('IFLA_INET6_FLAGS', 0), ('IFLA_INET6_CACHEINFO', {'max_reasm_len': 65535, 'tstamp': 2027016, 'reachable_time': 38528, 'retrans_time': 1000}), ('IFLA_INET6_CONF', {'forwarding': 1, 'hop_limit': 64, 'mtu': 1500, 'accept_ra': 1, 'accept_redirects': 1, 'autoconf': 1, 'dad_transmits': 1, 'router_solicitations': 4294967295, 'router_solicitation_interval': 4000, 'router_solicitation_delay': 1000, 'use_tempaddr': 2, 'temp_valid_lft': 604800, 'temp_preferred_lft': 86400, 'regen_max_retry': 3, 'max_desync_factor': 600, 'max_addresses': 16, 'force_mld_version': 0, 'accept_ra_defrtr': 1, 'accept_ra_pinfo': 1, 'accept_ra_rtr_pref': 1, 'router_probe_interval': 60000, 'accept_ra_rt_info_max_plen': 0, 'proxy_ndp': 0, 'optimistic_dad': 0, 'accept_source_route': 0, 'mc_forwarding': 0, 'disable_ipv6': 0, 'accept_dad': 4294967295, 'force_tllao': 0, 'ndisc_notify': 0}), ('IFLA_INET6_STATS', {'num': 37, 'inpkts': 0, 'inoctets': 0, 'indelivers': 0, 'outforwdatagrams': 0, 'outpkts': 0, 'outoctets': 0, 'inhdrerrors': 0, 'intoobigerrors': 0, 'innoroutes': 0, 'inaddrerrors': 0, 'inunknownprotos': 0, 'intruncatedpkts': 0, 'indiscards': 0, 'outdiscards': 0, 'outnoroutes': 0, 'reasmtimeout': 0, 'reasmreqds': 0, 'reasmoks': 0, 'reasmfails': 0, 'fragoks': 0, 'fragfails': 0, 'fragcreates': 0, 'inmcastpkts': 0, 'outmcastpkts': 0, 'inbcastpkts': 0, 'outbcastpkts': 0, 'inmcastoctets': 0, 'outmcastoctets': 0, 'inbcastoctets': 0, 'outbcastoctets': 0, 'csumerrors': 0, 'noectpkts': 0, 'ect1pkts': 0, 'ect0pkts': 0, 'cepkts': 0}), ('IFLA_INET6_ICMP6STATS', {'num': 6, 'inmsgs': 0, 'inerrors': 0, 'outmsgs': 0, 'outerrors': 0, 'csumerrors': 0}), ('IFLA_INET6_TOKEN', '::'), ('IFLA_INET6_ADDR_GEN_MODE', 0)]})]})],
  'change': 1,
  'event': 'RTM_NEWLINK',
  'family': 0,
  'flags': 69841,
  'header': { 'error': None,
              'flags': 0,
              'length': 1308,
              'pid': 0,
              'sequence_number': 0,
              'stats': Stats(qsize=3, delta=-1, delay=0),
              'type': 16},
  'ifi_type': 512,
  'index': 10,
  'state': 'up'}
  • 切断時
- event : RTM_NEWLINK
{ '__align': (),
  'attrs': [ ('IFLA_IFNAME', 'ppp0'),
             ('IFLA_TXQLEN', 3),
             ('IFLA_OPERSTATE', 'DOWN'),
             ('IFLA_LINKMODE', 0),
             ('IFLA_MTU', 1500),
             ('UNKNOWN', {'header': {'length': 8, 'type': 50}}),
             ('UNKNOWN', {'header': {'length': 8, 'type': 51}}),
             ('IFLA_GROUP', 0),
             ('IFLA_PROMISCUITY', 0),
             ('IFLA_NUM_TX_QUEUES', 1),
             ('IFLA_GSO_MAX_SEGS', 65535),
             ('IFLA_GSO_MAX_SIZE', 65536),
             ('IFLA_CARRIER', 1),
             ('IFLA_QDISC', 'pfifo_fast'),
             ('IFLA_CARRIER_CHANGES', 0),
             ('IFLA_PROTO_DOWN', 0),
             ('IFLA_CARRIER_UP_COUNT', 0),
             ('IFLA_CARRIER_DOWN_COUNT', 0),
             ('IFLA_MAP', {'mem_start': 0, 'mem_end': 0, 'base_addr': 0, 'irq': 0, 'dma': 0, 'port': 0}),
             ('IFLA_STATS64', {'rx_packets': 4, 'tx_packets': 4, 'rx_bytes': 52, 'tx_bytes': 58, 'rx_errors': 0, 'tx_errors': 0, 'rx_dropped': 0, 'tx_dropped': 0, 'multicast': 0, 'collisions': 0, 'rx_length_errors': 0, 'rx_over_errors': 0, 'rx_crc_errors': 0, 'rx_frame_errors': 0, 'rx_fifo_errors': 0, 'rx_missed_errors': 0, 'tx_aborted_errors': 0, 'tx_carrier_errors': 0, 'tx_fifo_errors': 0, 'tx_heartbeat_errors': 0, 'tx_window_errors': 0, 'rx_compressed': 0, 'tx_compressed': 0}),
             ('IFLA_STATS', {'rx_packets': 4, 'tx_packets': 4, 'rx_bytes': 52, 'tx_bytes': 58, 'rx_errors': 0, 'tx_errors': 0, 'rx_dropped': 0, 'tx_dropped': 0, 'multicast': 0, 'collisions': 0, 'rx_length_errors': 0, 'rx_over_errors': 0, 'rx_crc_errors': 0, 'rx_frame_errors': 0, 'rx_fifo_errors': 0, 'rx_missed_errors': 0, 'tx_aborted_errors': 0, 'tx_carrier_errors': 0, 'tx_fifo_errors': 0, 'tx_heartbeat_errors': 0, 'tx_window_errors': 0, 'rx_compressed': 0, 'tx_compressed': 0}),
             ('IFLA_XDP', '05:00:02:00:00:00:00:00'),
             ('IFLA_LINKINFO', {'attrs': [('IFLA_INFO_KIND', 'ppp'), ('IFLA_INFO_DATA', '')]}),
             ('IFLA_AF_SPEC', {'attrs': [('AF_INET', {'dummy': 65668, 'forwarding': 1, 'mc_forwarding': 0, 'proxy_arp': 0, 'accept_redirects': 1, 'secure_redirects': 1, 'send_redirects': 1, 'shared_media': 1, 'rp_filter': 1, 'accept_source_route': 1, 'bootp_relay': 0, 'log_martians': 0, 'tag': 0, 'arpfilter': 0, 'medium_id': 0, 'noxfrm': 0, 'nopolicy': 0, 'force_igmp_version': 0, 'arp_announce': 0, 'arp_ignore': 0, 'promote_secondaries': 0, 'arp_accept': 0, 'arp_notify': 0, 'accept_local': 0, 'src_vmark': 0, 'proxy_arp_pvlan': 0, 'route_localnet': 0, 'igmpv2_unsolicited_report_interval': 10000, 'igmpv3_unsolicited_report_interval': 1000}), ('AF_INET6', {'attrs': [('IFLA_INET6_FLAGS', 2147483648), ('IFLA_INET6_CACHEINFO', {'max_reasm_len': 65535, 'tstamp': 2027124, 'reachable_time': 37988, 'retrans_time': 1000}), ('IFLA_INET6_CONF', {'forwarding': 1, 'hop_limit': 64, 'mtu': 1500, 'accept_ra': 1, 'accept_redirects': 1, 'autoconf': 1, 'dad_transmits': 1, 'router_solicitations': 4294967295, 'router_solicitation_interval': 4000, 'router_solicitation_delay': 1000, 'use_tempaddr': 2, 'temp_valid_lft': 604800, 'temp_preferred_lft': 86400, 'regen_max_retry': 3, 'max_desync_factor': 600, 'max_addresses': 16, 'force_mld_version': 0, 'accept_ra_defrtr': 1, 'accept_ra_pinfo': 1, 'accept_ra_rtr_pref': 1, 'router_probe_interval': 60000, 'accept_ra_rt_info_max_plen': 0, 'proxy_ndp': 0, 'optimistic_dad': 0, 'accept_source_route': 0, 'mc_forwarding': 0, 'disable_ipv6': 0, 'accept_dad': 4294967295, 'force_tllao': 0, 'ndisc_notify': 0}), ('IFLA_INET6_STATS', {'num': 37, 'inpkts': 0, 'inoctets': 0, 'indelivers': 0, 'outforwdatagrams': 0, 'outpkts': 0, 'outoctets': 0, 'inhdrerrors': 0, 'intoobigerrors': 0, 'innoroutes': 0, 'inaddrerrors': 0, 'inunknownprotos': 0, 'intruncatedpkts': 0, 'indiscards': 0, 'outdiscards': 0, 'outnoroutes': 0, 'reasmtimeout': 0, 'reasmreqds': 0, 'reasmoks': 0, 'reasmfails': 0, 'fragoks': 0, 'fragfails': 0, 'fragcreates': 0, 'inmcastpkts': 0, 'outmcastpkts': 0, 'inbcastpkts': 0, 'outbcastpkts': 0, 'inmcastoctets': 0, 'outmcastoctets': 0, 'inbcastoctets': 0, 'outbcastoctets': 0, 'csumerrors': 0, 'noectpkts': 0, 'ect1pkts': 0, 'ect0pkts': 0, 'cepkts': 0}), ('IFLA_INET6_ICMP6STATS', {'num': 6, 'inmsgs': 0, 'inerrors': 0, 'outmsgs': 0, 'outerrors': 0, 'csumerrors': 0}), ('IFLA_INET6_TOKEN', '::'), ('IFLA_INET6_ADDR_GEN_MODE', 0)]})]})],
  'change': 1,
  'event': 'RTM_NEWLINK',
  'family': 0,
  'flags': 4240,
  'header': { 'error': None,
              'flags': 0,
              'length': 1308,
              'pid': 0,
              'sequence_number': 0,
              'stats': Stats(qsize=0, delta=0, delay=0),
              'type': 16},
  'ifi_type': 512,
  'index': 10,
  'state': 'down'}

- event : RTM_DELLINK
{ '__align': (),
  'attrs': [ ('IFLA_IFNAME', 'ppp0'),
             ('IFLA_TXQLEN', 3),
             ('IFLA_OPERSTATE', 'DOWN'),
             ('IFLA_LINKMODE', 0),
             ('IFLA_MTU', 1500),
             ('UNKNOWN', {'header': {'length': 8, 'type': 50}}),
             ('UNKNOWN', {'header': {'length': 8, 'type': 51}}),
             ('IFLA_GROUP', 0),
             ('IFLA_PROMISCUITY', 0),
             ('IFLA_NUM_TX_QUEUES', 1),
             ('IFLA_GSO_MAX_SEGS', 65535),
             ('IFLA_GSO_MAX_SIZE', 65536),
             ('IFLA_CARRIER', 1),
             ('IFLA_QDISC', 'noop'),
             ('IFLA_CARRIER_CHANGES', 0),
             ('IFLA_PROTO_DOWN', 0),
             ('IFLA_CARRIER_UP_COUNT', 0),
             ('IFLA_CARRIER_DOWN_COUNT', 0),
             ('IFLA_MAP', {'mem_start': 0, 'mem_end': 0, 'base_addr': 0, 'irq': 0, 'dma': 0, 'port': 0}),
             ('IFLA_STATS64', {'rx_packets': 4, 'tx_packets': 4, 'rx_bytes': 52, 'tx_bytes': 58, 'rx_errors': 0, 'tx_errors': 0, 'rx_dropped': 0, 'tx_dropped': 0, 'multicast': 0, 'collisions': 0, 'rx_length_errors': 0, 'rx_over_errors': 0, 'rx_crc_errors': 0, 'rx_frame_errors': 0, 'rx_fifo_errors': 0, 'rx_missed_errors': 0, 'tx_aborted_errors': 0, 'tx_carrier_errors': 0, 'tx_fifo_errors': 0, 'tx_heartbeat_errors': 0, 'tx_window_errors': 0, 'rx_compressed': 0, 'tx_compressed': 0}),
             ('IFLA_STATS', {'rx_packets': 4, 'tx_packets': 4, 'rx_bytes': 52, 'tx_bytes': 58, 'rx_errors': 0, 'tx_errors': 0, 'rx_dropped': 0, 'tx_dropped': 0, 'multicast': 0, 'collisions': 0, 'rx_length_errors': 0, 'rx_over_errors': 0, 'rx_crc_errors': 0, 'rx_frame_errors': 0, 'rx_fifo_errors': 0, 'rx_missed_errors': 0, 'tx_aborted_errors': 0, 'tx_carrier_errors': 0, 'tx_fifo_errors': 0, 'tx_heartbeat_errors': 0, 'tx_window_errors': 0, 'rx_compressed': 0, 'tx_compressed': 0}),
             ('IFLA_XDP', '05:00:02:00:00:00:00:00'),
             ('IFLA_LINKINFO', {'attrs': [('IFLA_INFO_KIND', 'ppp'), ('IFLA_INFO_DATA', '')]}),
             ('IFLA_AF_SPEC', {'attrs': []})],
  'change': 4294967295,
  'event': 'RTM_DELLINK',
  'family': 0,
  'flags': 4240,
  'header': { 'error': None,
              'flags': 0,
              'length': 548,
              'pid': 0,
              'sequence_number': 0,
              'stats': Stats(qsize=0, delta=0, delay=0),
              'type': 17},
  'ifi_type': 512,
  'index': 10,
  'state': 'down'}

PPP 接続時には RTM_NEWLINK (state : 'down') → RTM_NEWLINK (state : 'up')、切断時には RTM_NEWLINK (state : 'down') → RTM_DELLINK の順序で event が来ますので、
ifconfig などで polling せずにイベントドリブンでの PPP 接続監視・制御をすることができます。

mae3xx_devel/use_pyroute2/start.txt · 最終更新: 2020/03/23 22:07 by admin