1bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes/*
2bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes * Copyright (c) 2017 JingPiao Chen <chenjingpiao@gmail.com>
3bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes * Copyright (c) 2017 The strace developers.
4bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes * All rights reserved.
5bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes *
6bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes * Redistribution and use in source and binary forms, with or without
7bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes * modification, are permitted provided that the following conditions
8bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes * are met:
9bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes * 1. Redistributions of source code must retain the above copyright
10bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes *    notice, this list of conditions and the following disclaimer.
11bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes * 2. Redistributions in binary form must reproduce the above copyright
12bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes *    notice, this list of conditions and the following disclaimer in the
13bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes *    documentation and/or other materials provided with the distribution.
14bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes * 3. The name of the author may not be used to endorse or promote products
15bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes *    derived from this software without specific prior written permission.
16bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes *
17bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes */
28bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes
29bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes#include "tests.h"
30bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes
31bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes#ifdef HAVE_STRUCT_BR_PORT_MSG
32bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes
33bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes# include <stdio.h>
34bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes# include "test_nlattr.h"
35bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes# include <arpa/inet.h>
36bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes# include <linux/if_bridge.h>
37bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes# include <linux/rtnetlink.h>
38bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes
39bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes# ifndef MDB_TEMPORARY
40bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes#  define MDB_TEMPORARY 0
41bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes# endif
42bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes# ifndef MDBA_MDB_ENTRY_INFO
43bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes#  define MDBA_MDB_ENTRY_INFO 1
44bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes# endif
45bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes# ifndef MDBA_MDB_EATTR_TIMER
46bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes#  define MDBA_MDB_EATTR_TIMER 1
47bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes# endif
48bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes
49bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughesconst unsigned int hdrlen = sizeof(struct br_port_msg);
50bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes
51bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughesstatic void
52bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughesinit_br_port_msg(struct nlmsghdr *const nlh, const unsigned int msg_len)
53bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes{
54bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes	unsigned int len = msg_len;
55bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes
56bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes	SET_STRUCT(struct nlmsghdr, nlh,
57bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes		.nlmsg_len = len,
58bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes		.nlmsg_type = RTM_GETMDB,
59bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes		.nlmsg_flags = NLM_F_DUMP
60bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes	);
61bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes
62bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes	struct br_port_msg *const msg = NLMSG_DATA(nlh);
63bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes	SET_STRUCT(struct br_port_msg, msg,
64bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes		.family = AF_UNIX,
65bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes		.ifindex = ifindex_lo()
66bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes	);
67bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes
68bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes	struct nlattr *nla = NLMSG_ATTR(nlh, sizeof(*msg));
69bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes	len -= NLMSG_SPACE(hdrlen);
70bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes	SET_STRUCT(struct nlattr, nla,
71bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes		.nla_len = len,
72bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes		.nla_type = MDBA_MDB
73bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes	);
74bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes
75bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes	nla = nla + 1;
76bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes	len -= NLA_HDRLEN;
77bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes	SET_STRUCT(struct nlattr, nla,
78bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes		.nla_len = len,
79bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes		.nla_type = MDBA_MDB_ENTRY
80bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes	);
81bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes}
82bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes
83bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughesstatic void
84bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughesprint_br_port_msg(const unsigned int msg_len)
85bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes{
86bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes	printf("{len=%u, type=RTM_GETMDB, flags=NLM_F_DUMP"
87bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes	       ", seq=0, pid=0}, {family=AF_UNIX"
88bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes	       ", ifindex=" IFINDEX_LO_STR "}"
89bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes	       ", {{nla_len=%u, nla_type=MDBA_MDB}"
90bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes	       ", {{nla_len=%u, nla_type=MDBA_MDB_ENTRY}",
91bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes	       msg_len, msg_len - NLMSG_SPACE(hdrlen),
92bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes	       msg_len - NLMSG_SPACE(hdrlen) - NLA_HDRLEN);
93bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes}
94bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes
95bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughesint
96bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughesmain(void)
97bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes{
98bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes	skip_if_unavailable("/proc/self/fd/");
99bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes
100bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes	const int fd = create_nl_socket(NETLINK_ROUTE);
101bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes
102bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes	void *nlh0 = tail_alloc(NLMSG_SPACE(hdrlen));
103bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes
104bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes	static char pattern[4096];
105bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes	fill_memory_ex(pattern, sizeof(pattern), 'a', 'z' - 'a' + 1);
106bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes
107bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes	const unsigned int nla_type = 0xffff & NLA_TYPE_MASK;
108bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes	char nla_type_str[256];
109bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes	sprintf(nla_type_str, "%#x /* MDBA_MDB_ENTRY_??? */", nla_type);
110bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes	TEST_NLATTR_(fd, nlh0 - NLA_HDRLEN * 2, hdrlen + NLA_HDRLEN * 2,
111bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes		     init_br_port_msg, print_br_port_msg,
112bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes		     nla_type, nla_type_str,
113bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes		     4, pattern, 4,
114bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes		     print_quoted_hex(pattern, 4);
115bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes		     printf("}}"));
116bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes
117bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes# ifdef HAVE_STRUCT_BR_MDB_ENTRY
118bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes	struct br_mdb_entry entry = {
119bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes		.ifindex = ifindex_lo(),
120bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes		.state = MDB_TEMPORARY,
121bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes#  ifdef HAVE_STRUCT_BR_MDB_ENTRY_FLAGS
122bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes		.flags = MDB_FLAGS_OFFLOAD,
123bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes#  endif
124bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes#  ifdef HAVE_STRUCT_BR_MDB_ENTRY_VID
125bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes		.vid = 0xcdef,
126bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes#  endif
127bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes		.addr = {
128bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes			.proto = htons(AF_UNSPEC)
129bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes		}
130bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes	};
131bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes
132bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes	memcpy(&entry.addr.u, pattern, sizeof(entry.addr.u));
133bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes	TEST_NESTED_NLATTR_OBJECT_EX(fd, nlh0, hdrlen,
134bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes				     init_br_port_msg, print_br_port_msg,
135bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes				     MDBA_MDB_ENTRY_INFO, pattern, entry, 2,
136bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes				     printf("{ifindex=" IFINDEX_LO_STR);
137bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes				     printf(", state=MDB_TEMPORARY");
138bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes#  ifdef HAVE_STRUCT_BR_MDB_ENTRY_FLAGS
139bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes				     printf(", flags=MDB_FLAGS_OFFLOAD");
140bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes#  endif
141bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes#  ifdef HAVE_STRUCT_BR_MDB_ENTRY_VID
142bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes				     PRINT_FIELD_U(", ", entry, vid);
143bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes#  endif
144bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes				     printf(", addr={u=");
145bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes				     print_quoted_hex(&entry.addr.u,
146bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes						      sizeof(entry.addr.u));
147bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes				     printf(", proto=htons(AF_UNSPEC)}}"));
148bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes
149bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes	static const struct nlattr nla = {
150bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes		.nla_len = sizeof(nla),
151bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes		.nla_type = MDBA_MDB_EATTR_TIMER
152bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes	};
153bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes	char buf[NLMSG_ALIGN(sizeof(entry)) + sizeof(nla)];
154bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes	memcpy(buf, &entry, sizeof(entry));
155bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes	memcpy(buf + NLMSG_ALIGN(sizeof(entry)), &nla, sizeof(nla));
156bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes	TEST_NLATTR(fd, nlh0 - NLA_HDRLEN * 2, hdrlen + NLA_HDRLEN * 2,
157bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes		    init_br_port_msg, print_br_port_msg,
158bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes		    MDBA_MDB_ENTRY_INFO, sizeof(buf), buf, sizeof(buf),
159bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes		    printf("{ifindex=" IFINDEX_LO_STR);
160bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes		    printf(", state=MDB_TEMPORARY");
161bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes#  ifdef HAVE_STRUCT_BR_MDB_ENTRY_FLAGS
162bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes		    printf(", flags=MDB_FLAGS_OFFLOAD");
163bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes#  endif
164bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes#  ifdef HAVE_STRUCT_BR_MDB_ENTRY_VID
165bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes		    PRINT_FIELD_U(", ", entry, vid);
166bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes#  endif
167bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes		    printf(", addr={u=");
168bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes		    print_quoted_hex(&entry.addr.u, sizeof(entry.addr.u));
169bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes		    printf(", proto=htons(AF_UNSPEC)}}"
170bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes			   ", {nla_len=%u, nla_type=MDBA_MDB_EATTR_TIMER}}}",
171bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes			   nla.nla_len));
172bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes# endif /* HAVE_STRUCT_BR_MDB_ENTRY */
173bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes
174bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes	puts("+++ exited with 0 +++");
175bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes	return 0;
176bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes}
177bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes
178bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes#else
179bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes
180bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott HughesSKIP_MAIN_UNDEFINED("HAVE_STRUCT_BR_PORT_MSG")
181bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes
182bbf97dc20c4ee0e36b4628fe03e0e7db5a11d469Elliott Hughes#endif
183