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_NETCONFMSG 3277c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes 3377c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes# include <stdio.h> 3477c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes# include "test_nlattr.h" 3577c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes# include <linux/netconf.h> 3677c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes# include <linux/rtnetlink.h> 3777c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes 3877c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughesstatic void 3977c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughesinit_netconfmsg(struct nlmsghdr *const nlh, const unsigned int msg_len) 4077c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes{ 4177c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes SET_STRUCT(struct nlmsghdr, nlh, 4277c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes .nlmsg_len = msg_len, 4377c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes .nlmsg_type = RTM_GETNETCONF, 4477c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes .nlmsg_flags = NLM_F_DUMP 4577c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes ); 4677c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes 4777c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes struct netconfmsg *const msg = NLMSG_DATA(nlh); 4877c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes SET_STRUCT(struct netconfmsg, msg, 4977c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes .ncm_family = AF_INET 5077c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes ); 5177c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes} 5277c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes 5377c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughesstatic void 5477c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughesprint_netconfmsg(const unsigned int msg_len) 5577c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes{ 5677c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes printf("{len=%u, type=RTM_GETNETCONF, flags=NLM_F_DUMP" 5777c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes ", seq=0, pid=0}, {ncm_family=AF_INET}", 5877c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes msg_len); 5977c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes} 6077c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes 6177c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughesint 6277c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughesmain(void) 6377c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes{ 6477c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes skip_if_unavailable("/proc/self/fd/"); 6577c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes 6677c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes const int fd = create_nl_socket(NETLINK_ROUTE); 6777c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes 6877c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes const unsigned int hdrlen = sizeof(struct netconfmsg); 6977c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes void *nlh0 = tail_alloc(NLMSG_SPACE(hdrlen)); 7077c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes 7177c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes static char pattern[4096]; 7277c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes fill_memory_ex(pattern, sizeof(pattern), 'a', 'z' - 'a' + 1); 7377c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes 7477c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes const unsigned int nla_type = 0xffff & NLA_TYPE_MASK; 7577c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes char nla_type_str[256]; 7677c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes sprintf(nla_type_str, "%#x /* NETCONFA_??? */", nla_type); 7777c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes TEST_NLATTR_(fd, nlh0, hdrlen, 7877c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes init_netconfmsg, print_netconfmsg, 7977c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes nla_type, nla_type_str, 8077c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes 4, pattern, 4, 8177c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes print_quoted_hex(pattern, 4)); 8277c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes 8377c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes puts("+++ exited with 0 +++"); 8477c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes return 0; 8577c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes} 8677c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes 8777c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes#else 8877c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes 8977c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott HughesSKIP_MAIN_UNDEFINED("HAVE_STRUCT_NETCONFMSG") 9077c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes 9177c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes#endif 92