177c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes/* 277c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes * Copyright (c) 2017 JingPiao Chen <chenjingpiao@gmail.com> 377c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes * Copyright (c) 2017 The strace developers. 477c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes * All rights reserved. 577c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes * 677c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes * Redistribution and use in source and binary forms, with or without 777c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes * modification, are permitted provided that the following conditions 877c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes * are met: 977c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes * 1. Redistributions of source code must retain the above copyright 1077c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes * notice, this list of conditions and the following disclaimer. 1177c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes * 2. Redistributions in binary form must reproduce the above copyright 1277c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes * notice, this list of conditions and the following disclaimer in the 1377c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes * documentation and/or other materials provided with the distribution. 1477c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes * 3. The name of the author may not be used to endorse or promote products 1577c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes * derived from this software without specific prior written permission. 1677c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes * 1777c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 1877c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 1977c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 2077c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 2177c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 2277c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2377c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2477c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2577c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 2677c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2777c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes */ 2877c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes 2977c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes#include "tests.h" 3077c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes 3177c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes#ifdef HAVE_STRUCT_BR_PORT_MSG 3277c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes 3377c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes# include <stdio.h> 3477c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes# include <netinet/in.h> 3577c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes# include "test_nlattr.h" 3677c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes# include <linux/if_bridge.h> 3777c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes# include <linux/rtnetlink.h> 3877c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes 3977c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughesstatic void 4077c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughesinit_br_port_msg(struct nlmsghdr *const nlh, const unsigned int msg_len) 4177c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes{ 4277c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes SET_STRUCT(struct nlmsghdr, nlh, 4377c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes .nlmsg_len = msg_len, 4477c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes .nlmsg_type = RTM_GETMDB, 4577c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes .nlmsg_flags = NLM_F_DUMP 4677c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes ); 4777c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes 4877c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes struct br_port_msg *const msg = NLMSG_DATA(nlh); 4977c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes SET_STRUCT(struct br_port_msg, msg, 5077c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes .family = AF_UNIX, 5177c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes .ifindex = ifindex_lo() 5277c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes ); 5377c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes} 5477c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes 5577c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughesstatic void 5677c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughesprint_br_port_msg(const unsigned int msg_len) 5777c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes{ 5877c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes printf("{len=%u, type=RTM_GETMDB, flags=NLM_F_DUMP" 5977c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes ", seq=0, pid=0}, {family=AF_UNIX" 6077c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes ", ifindex=" IFINDEX_LO_STR "}", 6177c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes msg_len); 6277c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes} 6377c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes 6477c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughesint 6577c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughesmain(void) 6677c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes{ 6777c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes skip_if_unavailable("/proc/self/fd/"); 6877c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes 6977c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes const int fd = create_nl_socket(NETLINK_ROUTE); 7077c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes 7177c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes const unsigned int hdrlen = sizeof(struct br_port_msg); 7277c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes void *nlh0 = tail_alloc(NLMSG_SPACE(hdrlen)); 7377c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes 7477c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes static char pattern[4096]; 7577c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes fill_memory_ex(pattern, sizeof(pattern), 'a', 'z' - 'a' + 1); 7677c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes 7777c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes const unsigned int nla_type = 0xffff & NLA_TYPE_MASK; 7877c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes char nla_type_str[256]; 7977c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes sprintf(nla_type_str, "%#x /* MDBA_??? */", nla_type); 8077c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes TEST_NLATTR_(fd, nlh0, hdrlen, 8177c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes init_br_port_msg, print_br_port_msg, 8277c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes nla_type, nla_type_str, 8377c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes 4, pattern, 4, 8477c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes print_quoted_hex(pattern, 4)); 8577c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes 8677c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes puts("+++ exited with 0 +++"); 8777c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes return 0; 8877c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes} 8977c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes 9077c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes#else 9177c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes 9277c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott HughesSKIP_MAIN_UNDEFINED("HAVE_STRUCT_BR_PORT_MSG") 9377c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes 9477c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes#endif 95