1 diff --git a/Makefile b/Makefile
2 index c65dd39..f672a45 100644
5 @@ -9,7 +9,8 @@ CTLSOURCES = ctl_main.c ctl_cli_wrap.c ctl_socket_client.c
6 CTLOBJECTS = $(CTLSOURCES:.c=.o)
9 -CFLAGS = -Wall -Werror -O2 -g -D_REENTRANT -D__LINUX__ -DVERSION=$(version) -DBUILD=$(build) -I. -I./include
10 +CFLAGS = -Wall -Werror -fno-strict-aliasing -O2 -g -D_REENTRANT -D__LINUX__ \
11 + -DVERSION=$(version) -DBUILD=$(build) -I. -I./include -I./rstplib
15 diff --git a/bridge-stp b/bridge-stp
16 index 49d5a41..5e663a9 100755
19 @@ -53,9 +53,9 @@ start() {
23 - exec /sbin/rstpctl $bridge on ;;
24 + exec /sbin/rstpctl rstp $bridge on ;;
26 - exec /sbin/rstpctl $bridge off ;;
27 + exec /sbin/rstpctl rstp $bridge off ;;
29 echo "Unknown action:" $2
30 echo "Usage: bridge-stp <bridge> {start|stop}"
31 diff --git a/bridge_track.c b/bridge_track.c
32 index c685935..f5efa3f 100644
35 @@ -449,7 +449,7 @@ void bridge_bpdu_rcv(int if_index, const unsigned char *data, int len)
36 struct ifdata *ifc = find_if(if_index);
38 LOG("ifindex %d, len %d", if_index, len);
40 + if (!ifc || !ifc->master)
44 diff --git a/brmon.c b/brmon.c
45 index d29e7f5..fd4dacd 100644
50 static const char SNAPSHOT[] = "v0.1";
53 -/* RFC 2863 operational status */
58 - IF_OPER_LOWERLAYERDOWN,
66 - IF_LINK_MODE_DEFAULT,
67 - IF_LINK_MODE_DORMANT, /* limit upward transition to dormant */
70 -static const char *port_states[] = {
71 - [BR_STATE_DISABLED] = "disabled",
72 - [BR_STATE_LISTENING] = "listening",
73 - [BR_STATE_LEARNING] = "learning",
74 - [BR_STATE_FORWARDING] = "forwarding",
75 - [BR_STATE_BLOCKING] = "blocking",
78 +static int is_up(const struct ifinfomsg *ifi)
80 + return (ifi->ifi_flags & IFF_UP) && (ifi->ifi_flags & IFF_RUNNING);
83 static int dump_msg(const struct sockaddr_nl *who, struct nlmsghdr *n,
85 @@ -64,25 +42,16 @@ static int dump_msg(const struct sockaddr_nl *who, struct nlmsghdr *n,
86 struct ifinfomsg *ifi = NLMSG_DATA(n);
87 struct rtattr * tb[IFLA_MAX+1];
88 int len = n->nlmsg_len;
91 - int af_family = ifi->ifi_family;
93 if (n->nlmsg_type == NLMSG_DONE)
97 len -= NLMSG_LENGTH(sizeof(*ifi));
105 - if (filter.ifindex && ifi->ifi_index != filter.ifindex)
108 - if (filter.up && !(ifi->ifi_flags&IFF_UP))
111 if (ifi->ifi_family != AF_BRIDGE && ifi->ifi_family != AF_UNSPEC)
114 @@ -93,73 +62,41 @@ static int dump_msg(const struct sockaddr_nl *who, struct nlmsghdr *n,
115 parse_rtattr(tb, IFLA_MAX, IFLA_RTA(ifi), len);
117 /* Check if we got this from bonding */
118 - if (tb[IFLA_MASTER] && af_family != AF_BRIDGE)
120 + if (tb[IFLA_MASTER] && ifi->ifi_family != AF_BRIDGE)
123 + /* Check if hearing our own state changes */
124 + if (n->nlmsg_type == RTM_NEWLINK && tb[IFLA_PROTINFO]) {
125 + uint8_t state = *(uint8_t *)RTA_DATA(tb[IFLA_PROTINFO]);
127 + if (state != BR_STATE_DISABLED)
131 if (tb[IFLA_IFNAME] == NULL) {
132 - fprintf(stderr, "BUG: nil ifname\n");
134 + fprintf(stderr, "BUG: nil ifname\n");
138 if (n->nlmsg_type == RTM_DELLINK)
139 - fprintf(fp, "Deleted ");
140 + fprintf(fp, "Deleted ");
142 fprintf(fp, "%d: %s ", ifi->ifi_index,
143 - tb[IFLA_IFNAME] ? (char*)RTA_DATA(tb[IFLA_IFNAME]) : "<nil>");
146 - if (tb[IFLA_OPERSTATE]) {
147 - int state = *(int*)RTA_DATA(tb[IFLA_OPERSTATE]);
149 - case IF_OPER_UNKNOWN:
150 - fprintf(fp, "Unknown "); break;
151 - case IF_OPER_NOTPRESENT:
152 - fprintf(fp, "Not Present "); break;
154 - fprintf(fp, "Down "); break;
155 - case IF_OPER_LOWERLAYERDOWN:
156 - fprintf(fp, "Lowerlayerdown "); break;
157 - case IF_OPER_TESTING:
158 - fprintf(fp, "Testing "); break;
159 - case IF_OPER_DORMANT:
160 - fprintf(fp, "Dormant "); break;
162 - fprintf(fp, "Up "); break;
164 - fprintf(fp, "State(%d) ", state);
169 - fprintf(fp, "mtu %u ", *(int*)RTA_DATA(tb[IFLA_MTU]));
170 + (const char*)RTA_DATA(tb[IFLA_IFNAME]));
172 if (tb[IFLA_MASTER]) {
173 - fprintf(fp, "master %s ",
174 - if_indextoname(*(int*)RTA_DATA(tb[IFLA_MASTER]), b1));
177 - if (tb[IFLA_PROTINFO]) {
178 - uint8_t state = *(uint8_t *)RTA_DATA(tb[IFLA_PROTINFO]);
179 - if (state <= BR_STATE_BLOCKING)
180 - fprintf(fp, "state %s", port_states[state]);
182 - fprintf(fp, "state (%d)", state);
183 + master = *(int*)RTA_DATA(tb[IFLA_MASTER]);
184 + fprintf(fp, "master %s ", if_indextoname(master, b1));
191 - int newlink = (n->nlmsg_type == RTM_NEWLINK);
193 - if (newlink && tb[IFLA_OPERSTATE]) {
194 - int state = *(int*)RTA_DATA(tb[IFLA_OPERSTATE]);
195 - up = (state == IF_OPER_UP) || (state == IF_OPER_UNKNOWN);
198 - bridge_notify((tb[IFLA_MASTER]?*(int*)RTA_DATA(tb[IFLA_MASTER]):-1),
199 - ifi->ifi_index, newlink, up);
203 + bridge_notify(master, ifi->ifi_index,
204 + (n->nlmsg_type == RTM_NEWLINK),
210 @@ -252,7 +189,7 @@ int init_bridge_ops(void)
211 fprintf(stderr, "Couldn't open rtnl socket for monitoring\n");
216 if (rtnl_open(&rth_state, 0) < 0) {
217 fprintf(stderr, "Couldn't open rtnl socket for setting state\n");
219 @@ -262,7 +199,7 @@ int init_bridge_ops(void)
220 fprintf(stderr, "Cannot send dump request: %m\n");
225 if (rtnl_dump_filter(&rth, dump_msg, stdout, NULL, NULL) < 0) {
226 fprintf(stderr, "Dump terminated\n");
228 @@ -276,10 +213,10 @@ int init_bridge_ops(void)
229 br_handler.fd = rth.fd;
230 br_handler.arg = NULL;
231 br_handler.handler = br_ev_handler;
234 if (add_epoll(&br_handler) < 0)
241 diff --git a/include/linux/llc.h b/include/linux/llc.h
242 index 09f2e6d..6bb32fe 100644
243 --- a/include/linux/llc.h
244 +++ b/include/linux/llc.h
245 @@ -49,9 +49,9 @@ enum llc_sockopts {
248 #define LLC_SAP_NULL 0x00 /* NULL SAP. */
249 -#define LLC_SAP_LLC 0x02 /* LLC Sublayer Managment. */
250 +#define LLC_SAP_LLC 0x02 /* LLC Sublayer Management. */
251 #define LLC_SAP_SNA 0x04 /* SNA Path Control. */
252 -#define LLC_SAP_PNM 0x0E /* Proway Network Managment. */
253 +#define LLC_SAP_PNM 0x0E /* Proway Network Management. */
254 #define LLC_SAP_IP 0x06 /* TCP/IP. */
255 #define LLC_SAP_BSPAN 0x42 /* Bridge Spanning Tree Proto */
256 #define LLC_SAP_MMS 0x4E /* Manufacturing Message Srv. */
257 @@ -70,11 +70,4 @@ enum llc_sockopts {
258 #define LLC_SAP_RM 0xD4 /* Resource Management */
259 #define LLC_SAP_GLOBAL 0xFF /* Global SAP. */
262 -#define LLC_SAP_DYN_START 0xC0
263 -#define LLC_SAP_DYN_STOP 0xDE
264 -#define LLC_SAP_DYN_TRIES 4
266 -#define llc_ui_skb_cb(__skb) ((struct sockaddr_llc *)&((__skb)->cb[0]))
267 -#endif /* __KERNEL__ */
268 #endif /* __LINUX_LLC_H */
269 diff --git a/include/linux/rtnetlink.h b/include/linux/rtnetlink.h
270 index 5e33a20..ba9e46c 100644
271 --- a/include/linux/rtnetlink.h
272 +++ b/include/linux/rtnetlink.h
274 #ifndef __LINUX_RTNETLINK_H
275 #define __LINUX_RTNETLINK_H
277 +#include <linux/types.h>
278 #include <linux/netlink.h>
279 +#include <linux/if_link.h>
280 +#include <linux/if_addr.h>
281 +#include <linux/neighbour.h>
284 * Routing/neighbour discovery messages.
285 @@ -80,8 +84,6 @@ enum {
288 #define RTM_NEWPREFIX RTM_NEWPREFIX
289 - RTM_GETPREFIX = 54,
290 -#define RTM_GETPREFIX RTM_GETPREFIX
292 RTM_GETMULTICAST = 58,
293 #define RTM_GETMULTICAST RTM_GETMULTICAST
294 @@ -96,6 +98,21 @@ enum {
296 #define RTM_SETNEIGHTBL RTM_SETNEIGHTBL
298 + RTM_NEWNDUSEROPT = 68,
299 +#define RTM_NEWNDUSEROPT RTM_NEWNDUSEROPT
301 + RTM_NEWADDRLABEL = 72,
302 +#define RTM_NEWADDRLABEL RTM_NEWADDRLABEL
304 +#define RTM_NEWADDRLABEL RTM_NEWADDRLABEL
306 +#define RTM_GETADDRLABEL RTM_GETADDRLABEL
309 +#define RTM_GETDCB RTM_GETDCB
311 +#define RTM_SETDCB RTM_SETDCB
314 #define RTM_MAX (((__RTM_MAX + 3) & ~3) - 1)
316 @@ -235,13 +252,12 @@ enum rt_class_t
319 /* User defined values */
320 + RT_TABLE_COMPAT=252,
321 RT_TABLE_DEFAULT=253,
325 + RT_TABLE_MAX=0xFFFFFFFF
327 -#define RT_TABLE_MAX (__RT_TABLE_MAX - 1)
331 /* Routing message attributes */
332 @@ -258,11 +274,12 @@ enum rtattr_type_t
337 + RTA_PROTOINFO, /* no longer used */
342 + RTA_SESSION, /* no longer used */
343 + RTA_MP_ALGO, /* no longer used */
348 @@ -351,6 +368,8 @@ enum
349 #define RTAX_INITCWND RTAX_INITCWND
351 #define RTAX_FEATURES RTAX_FEATURES
353 +#define RTAX_RTO_MIN RTAX_RTO_MIN
357 @@ -383,226 +402,6 @@ struct rta_session
362 -/*********************************************************
363 - * Interface address.
368 - unsigned char ifa_family;
369 - unsigned char ifa_prefixlen; /* The prefix length */
370 - unsigned char ifa_flags; /* Flags */
371 - unsigned char ifa_scope; /* See above */
372 - int ifa_index; /* Link index */
388 -#define IFA_MAX (__IFA_MAX - 1)
392 -#define IFA_F_SECONDARY 0x01
393 -#define IFA_F_TEMPORARY IFA_F_SECONDARY
395 -#define IFA_F_DEPRECATED 0x20
396 -#define IFA_F_TENTATIVE 0x40
397 -#define IFA_F_PERMANENT 0x80
399 -struct ifa_cacheinfo
401 - __u32 ifa_prefered;
403 - __u32 cstamp; /* created timestamp, hundredths of seconds */
404 - __u32 tstamp; /* updated timestamp, hundredths of seconds */
408 -#define IFA_RTA(r) ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifaddrmsg))))
409 -#define IFA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ifaddrmsg))
413 - IFA_ADDRESS is prefix address, rather than local interface address.
414 - It makes no difference for normally configured broadcast interfaces,
415 - but for point-to-point IFA_ADDRESS is DESTINATION address,
416 - local address is supplied in IFA_LOCAL attribute.
419 -/**************************************************************
420 - * Neighbour discovery.
425 - unsigned char ndm_family;
426 - unsigned char ndm_pad1;
427 - unsigned short ndm_pad2;
428 - int ndm_ifindex; /* Link index */
444 -#define NDA_MAX (__NDA_MAX - 1)
446 -#define NDA_RTA(r) ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ndmsg))))
447 -#define NDA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ndmsg))
450 - * Neighbor Cache Entry Flags
453 -#define NTF_PROXY 0x08 /* == ATF_PUBL */
454 -#define NTF_ROUTER 0x80
457 - * Neighbor Cache Entry States.
460 -#define NUD_INCOMPLETE 0x01
461 -#define NUD_REACHABLE 0x02
462 -#define NUD_STALE 0x04
463 -#define NUD_DELAY 0x08
464 -#define NUD_PROBE 0x10
465 -#define NUD_FAILED 0x20
468 -#define NUD_NOARP 0x40
469 -#define NUD_PERMANENT 0x80
470 -#define NUD_NONE 0x00
473 -struct nda_cacheinfo
475 - __u32 ndm_confirmed;
482 -/*****************************************************************
483 - * Neighbour tables specific messages.
485 - * To retrieve the neighbour tables send RTM_GETNEIGHTBL with the
486 - * NLM_F_DUMP flag set. Every neighbour table configuration is
487 - * spread over multiple messages to avoid running into message
488 - * size limits on systems with many interfaces. The first message
489 - * in the sequence transports all not device specific data such as
490 - * statistics, configuration, and the default parameter set.
491 - * This message is followed by 0..n messages carrying device
492 - * specific parameter sets.
493 - * Although the ordering should be sufficient, NDTA_NAME can be
494 - * used to identify sequences. The initial message can be identified
495 - * by checking for NDTA_CONFIG. The device specific messages do
496 - * not contain this TLV but have NDTPA_IFINDEX set to the
497 - * corresponding interface index.
499 - * To change neighbour table attributes, send RTM_SETNEIGHTBL
500 - * with NDTA_NAME set. Changeable attribute include NDTA_THRESH[1-3],
501 - * NDTA_GC_INTERVAL, and all TLVs in NDTA_PARMS unless marked
502 - * otherwise. Device specific parameter sets can be changed by
503 - * setting NDTPA_IFINDEX to the interface index of the corresponding
510 - __u64 ndts_destroys;
511 - __u64 ndts_hash_grows;
512 - __u64 ndts_res_failed;
513 - __u64 ndts_lookups;
515 - __u64 ndts_rcv_probes_mcast;
516 - __u64 ndts_rcv_probes_ucast;
517 - __u64 ndts_periodic_gc_runs;
518 - __u64 ndts_forced_gc_runs;
523 - NDTPA_IFINDEX, /* u32, unchangeable */
524 - NDTPA_REFCNT, /* u32, read-only */
525 - NDTPA_REACHABLE_TIME, /* u64, read-only, msecs */
526 - NDTPA_BASE_REACHABLE_TIME, /* u64, msecs */
527 - NDTPA_RETRANS_TIME, /* u64, msecs */
528 - NDTPA_GC_STALETIME, /* u64, msecs */
529 - NDTPA_DELAY_PROBE_TIME, /* u64, msecs */
530 - NDTPA_QUEUE_LEN, /* u32 */
531 - NDTPA_APP_PROBES, /* u32 */
532 - NDTPA_UCAST_PROBES, /* u32 */
533 - NDTPA_MCAST_PROBES, /* u32 */
534 - NDTPA_ANYCAST_DELAY, /* u64, msecs */
535 - NDTPA_PROXY_DELAY, /* u64, msecs */
536 - NDTPA_PROXY_QLEN, /* u32 */
537 - NDTPA_LOCKTIME, /* u64, msecs */
540 -#define NDTPA_MAX (__NDTPA_MAX - 1)
551 - __u16 ndtc_key_len;
552 - __u16 ndtc_entry_size;
553 - __u32 ndtc_entries;
554 - __u32 ndtc_last_flush; /* delta to now in msecs */
555 - __u32 ndtc_last_rand; /* delta to now in msecs */
556 - __u32 ndtc_hash_rnd;
557 - __u32 ndtc_hash_mask;
558 - __u32 ndtc_hash_chain_gc;
559 - __u32 ndtc_proxy_qlen;
564 - NDTA_NAME, /* char *, unchangeable */
565 - NDTA_THRESH1, /* u32 */
566 - NDTA_THRESH2, /* u32 */
567 - NDTA_THRESH3, /* u32 */
568 - NDTA_CONFIG, /* struct ndt_config, read-only */
569 - NDTA_PARMS, /* nested TLV NDTPA_* */
570 - NDTA_STATS, /* struct ndt_stats, read-only */
571 - NDTA_GC_INTERVAL, /* u64, msecs */
574 -#define NDTA_MAX (__NDTA_MAX - 1)
576 -#define NDTA_RTA(r) ((struct rtattr*)(((char*)(r)) + \
577 - NLMSG_ALIGN(sizeof(struct ndtmsg))))
578 -#define NDTA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ndtmsg))
582 * General form of address family dependent message.
584 @@ -663,138 +462,6 @@ struct prefix_cacheinfo
588 -/* The struct should be in sync with struct net_device_stats */
589 -struct rtnl_link_stats
591 - __u32 rx_packets; /* total packets received */
592 - __u32 tx_packets; /* total packets transmitted */
593 - __u32 rx_bytes; /* total bytes received */
594 - __u32 tx_bytes; /* total bytes transmitted */
595 - __u32 rx_errors; /* bad packets received */
596 - __u32 tx_errors; /* packet transmit problems */
597 - __u32 rx_dropped; /* no space in linux buffers */
598 - __u32 tx_dropped; /* no space available in linux */
599 - __u32 multicast; /* multicast packets received */
602 - /* detailed rx_errors: */
603 - __u32 rx_length_errors;
604 - __u32 rx_over_errors; /* receiver ring buff overflow */
605 - __u32 rx_crc_errors; /* recved pkt with crc error */
606 - __u32 rx_frame_errors; /* recv'd frame alignment error */
607 - __u32 rx_fifo_errors; /* recv'r fifo overrun */
608 - __u32 rx_missed_errors; /* receiver missed packet */
610 - /* detailed tx_errors */
611 - __u32 tx_aborted_errors;
612 - __u32 tx_carrier_errors;
613 - __u32 tx_fifo_errors;
614 - __u32 tx_heartbeat_errors;
615 - __u32 tx_window_errors;
617 - /* for cslip etc */
618 - __u32 rx_compressed;
619 - __u32 tx_compressed;
622 -/* The struct should be in sync with struct ifmap */
623 -struct rtnl_link_ifmap
644 -#define IFLA_COST IFLA_COST
646 -#define IFLA_PRIORITY IFLA_PRIORITY
648 -#define IFLA_MASTER IFLA_MASTER
649 - IFLA_WIRELESS, /* Wireless Extension event - see wireless.h */
650 -#define IFLA_WIRELESS IFLA_WIRELESS
651 - IFLA_PROTINFO, /* Protocol specific information for a link */
652 -#define IFLA_PROTINFO IFLA_PROTINFO
654 -#define IFLA_TXQLEN IFLA_TXQLEN
656 -#define IFLA_MAP IFLA_MAP
658 -#define IFLA_WEIGHT IFLA_WEIGHT
665 -#define IFLA_MAX (__IFLA_MAX - 1)
667 -#define IFLA_RTA(r) ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifinfomsg))))
668 -#define IFLA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ifinfomsg))
674 - The only change is:
675 - IFF_LOOPBACK, IFF_BROADCAST and IFF_POINTOPOINT are
676 - more not changeable by user. They describe link media
677 - characteristics and set by device driver.
680 - - Combination IFF_BROADCAST|IFF_POINTOPOINT is invalid
681 - - If neither of these three flags are set;
682 - the interface is NBMA.
684 - - IFF_MULTICAST does not mean anything special:
685 - multicasts can be used on all not-NBMA links.
686 - IFF_MULTICAST means that this media uses special encapsulation
687 - for multicast frames. Apparently, all IFF_POINTOPOINT and
688 - IFF_BROADCAST devices are able to use multicasts too.
692 - For usual devices it is equal ifi_index.
693 - If it is a "virtual interface" (f.e. tunnel), ifi_link
694 - can point to real physical interface (f.e. for bandwidth calculations),
695 - or maybe 0, what means, that real media is unknown (usual
696 - for IPIP tunnels, when route to endpoint is allowed to change)
699 -/* Subtype attributes for IFLA_PROTINFO */
703 - IFLA_INET6_FLAGS, /* link flags */
704 - IFLA_INET6_CONF, /* sysctl parameters */
705 - IFLA_INET6_STATS, /* statistics */
706 - IFLA_INET6_MCAST, /* MC things. What of them? */
707 - IFLA_INET6_CACHEINFO, /* time values and max reasm size */
711 -#define IFLA_INET6_MAX (__IFLA_INET6_MAX - 1)
713 -struct ifla_cacheinfo
715 - __u32 max_reasm_len;
716 - __u32 tstamp; /* ipv6InterfaceTable updated timestamp */
717 - __u32 reachable_time;
718 - __u32 retrans_time;
721 /*****************************************************************
722 * Traffic control messages.
723 @@ -821,6 +488,7 @@ enum
731 @@ -829,6 +497,32 @@ enum
732 #define TCA_RTA(r) ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct tcmsg))))
733 #define TCA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct tcmsg))
735 +/********************************************************************
736 + * Neighbor Discovery userland options
741 + unsigned char nduseropt_family;
742 + unsigned char nduseropt_pad1;
743 + unsigned short nduseropt_opts_len; /* Total length of options */
744 + int nduseropt_ifindex;
745 + __u8 nduseropt_icmp_type;
746 + __u8 nduseropt_icmp_code;
747 + unsigned short nduseropt_pad2;
748 + unsigned int nduseropt_pad3;
749 + /* Followed by one or more ND options */
759 +#define NDUSEROPT_MAX (__NDUSEROPT_MAX - 1)
761 /* RTnetlink multicast groups - backwards compatibility for userspace */
762 #define RTMGRP_LINK 1
763 #define RTMGRP_NOTIFY 2
764 @@ -883,10 +577,19 @@ enum rtnetlink_groups {
766 RTNLGRP_DECnet_ROUTE,
767 #define RTNLGRP_DECnet_ROUTE RTNLGRP_DECnet_ROUTE
769 + RTNLGRP_DECnet_RULE,
770 +#define RTNLGRP_DECnet_RULE RTNLGRP_DECnet_RULE
773 #define RTNLGRP_IPV6_PREFIX RTNLGRP_IPV6_PREFIX
775 +#define RTNLGRP_IPV6_RULE RTNLGRP_IPV6_RULE
776 + RTNLGRP_ND_USEROPT,
777 +#define RTNLGRP_ND_USEROPT RTNLGRP_ND_USEROPT
778 + RTNLGRP_PHONET_IFADDR,
779 +#define RTNLGRP_PHONET_IFADDR RTNLGRP_PHONET_IFADDR
780 + RTNLGRP_PHONET_ROUTE,
781 +#define RTNLGRP_PHONET_ROUTE RTNLGRP_PHONET_ROUTE
784 #define RTNLGRP_MAX (__RTNLGRP_MAX - 1)